get_pages( array( ‘child_of’ => $post->ID ) no muestra todos los elementos secundarios

4 minutos de lectura

avatar de usuario
alyssa esperanza

Soy bastante nuevo en wordpress y me pregunto si alguien podría arrojar algo de luz sobre este código. Estoy tratando de enumerar todas las subpáginas en su página principal, aquí está el código con algo de html eliminado:

<?php
$mypages = get_pages( array( 'child_of' => $post->ID ) );

foreach( $mypages as $page ) {      
    $content = $page->post_content;
    if ( ! $content ) // Check for empty page
        continue;

    $content = apply_filters( 'the_content', $content );
?>

<p style="color: white; text-transform: uppercase;"><?php echo $page->post_title; ?></p>

<?php
   }   
?>

El código funciona y se muestran las subpáginas correctas, pero no todas. Se muestran las 7 publicaciones más antiguas, pero ninguna de las páginas más nuevas que creé esta semana. He verificado una y otra vez que todas las páginas nuevas y antiguas sean iguales en todos los sentidos: la misma plantilla, la misma página principal, el mismo creador, el mismo número de pedido y todas publicadas. ¿Alguien tiene una idea de lo que podría estar haciendo mal?

  • ¿Todos ellos tienen contenido?

    – este

    13 de febrero de 2017 a las 17:29

  • sí, todo su contenido también sigue el mismo diseño y todos tienen aproximadamente la misma cantidad de contenido

    – Alyssa Esperanza

    13 de febrero de 2017 a las 17:32

  • ¿Ha intentado usar el parámetro principal en lugar del parámetro secundario? ¿Algún cambio en los resultados?

    – tjfo

    13 de febrero de 2017 a las 17:36

  • Cambié get_pages(array(‘child_of’ => $post->ID ) a get_pages(array(‘parent’ => $post->ID ) y desafortunadamente obtuve el mismo resultado. ¿Es esto de lo que estabas hablando?

    – Alyssa Esperanza

    13 de febrero de 2017 a las 17:42

  • Sí, a eso me refería. ¡Quizás la configuración de la bandera jerárquica en mi respuesta a continuación ayude!

    – tjfo

    13 de febrero de 2017 a las 17:59

avatar de usuario
fresno patel

Pruebe el siguiente código:

$args = array('child_of' => $post->ID,'sort_order' => 'desc',
'sort_column' => 'ID',
);

  • Parece que no puedes usar el número con child_of de acuerdo con los documentos: codex.wordpress.org/Function_Reference/get_pages

    – tjfo

    13 de febrero de 2017 a las 17:54

  • He actualizado mi respuesta, de todos modos lo he intentado con el número y también funciona 🙂

    – Ceniza Patel

    13 de febrero de 2017 a las 18:01

  • Gracias chicos, esta respuesta y los comentarios posteriores me acercaron mucho más a la comprensión del problema.

    – Alyssa Esperanza

    13 de febrero de 2017 a las 18:49

avatar de usuario
Rohil_PHPPrincipiante

Creo que también necesita un argumento adicional para obtener el resultado que está buscando.

$args = array( 
        'child_of' => $post->ID, 
        'parent ' => $post->ID,
        'hierarchical' => 0,
        'sort_column' => 'menu_order', 
        'sort_order' => 'asc'
);
$mypages = get_pages( $args );

Puedes consultar wordpress Doc por su argumento y salida de retorno.

NOTA Si desea ordenar las páginas por fecha, puede cambiar 'sort_column' => 'menu_order', con 'sort_column' => 'post_date',.

También hay otro método para lograr lo mismo y prefiero el siguiente.

<?php

$args = array(
    'post_type'      => 'page',
    'posts_per_page' => -1,
    'post_parent'    => $post->ID,
    'order'          => 'ASC',
    'orderby'        => 'menu_order'
 );

$mypages = new WP_Query( $args );


if ( $mypages->have_posts() ) : ?>

    <?php while ( $mypages->have_posts() ) : $mypages->the_post(); ?>

        <p style="color: white; text-transform: uppercase;"><?php the_title(); ?></p>

    <?php endwhile; ?>

<?php endif; wp_reset_query(); ?>

También puedes usar wp_list_pages para renderizar HTML directo.

  • rohil ella quiere mostrar la última publicación. 🙂

    – Ceniza Patel

    13 de febrero de 2017 a las 18:33

  • @AshPatel Badhu aapne thodi kari ne aapva nu hoy 🙂

    – Rohil_PHPBeginner

    13 de febrero de 2017 a las 18:42

  • @AshPatel 😀 😀

    – Rohil_PHPBeginner

    13 de febrero de 2017 a las 18:59

Intente usar parent en lugar de child_of y establezca jerárquico en falso. De acuerdo con los documentos, parece que el valor jerárquico predeterminado de true can puede afectar los resultados.

<?php
    $mypages = get_pages( array( 'parent' => $post->ID,  'hierarchical' => 0  ) );
?>

Referencia: https://codex.wordpress.org/Function_Reference/get_pages

He solucionado el problema, pero en realidad no tengo idea de por qué funciona. Cualquier comentario sobre por qué esto funcionó sería increíble.

De mi código original, eliminé la sección “si (! $ contenido)”, y todos aparecen, aunque todas las páginas tienen la misma cantidad de contenido.

Entonces, al final, mi código dice:

<?php
$mypages = get_pages( array( 'child_of' => $post->ID ) );

foreach( $mypages as $page ) {      
$content = $page->post_content;
$content = apply_filters( 'the_content', $content );
?>

<p style="color: white; text-transform: uppercase;"><?php echo $page->post_title; ?></p>

<?php
}   
?>

Nunca tuve que cambiar los parámetros de la función get_pages en absoluto.

¿Ha sido útil esta solución?