web-dev-qa-db-fra.com

Utiliser la boucle pour afficher tous les niveaux de sous-pages dans une page parente? À mi-chemin

J'ai besoin de faire en sorte que la boucle passe par tous les enfants d'un parent, tous les enfants de chaque enfant, etc. La raison pour laquelle j'ai besoin de la boucle au lieu d'une balise de liste telle que wp_list_pages est pour pouvoir afficher toutes les informations associées. avec les pages utilisant WP balises et fonctions de modèle. C'est pour un affichage de style vitrine qui a un contenu hiérarchique et est réorganisé, donc les pages> publications pour cet usage.

Je suis allé aussi loin que la boucle pour montrer aux enfants de la page actuelle et une boucle interne pour montrer les petits-enfants, mais il ne s'agit que d'un prototype de force brute, et je dois l'amener au prochain niveau.

Ce que je pense devoir faire, c’est d’utiliser une boucle qui commence par post_parent (pour qu’il affiche des pages enfants), mais insérez une fonction permettant de changer l’ID de publication pour chaque page enfant trouvée, de sorte que la boucle continue d’explorer jusqu’à épuisement, puis reculez d’un niveau, passez au prochain identifiant disponible, etc.

Mon problème est que je ne suis pas assez d'un WP programmeur (ou d'un vrai programmeur du tout) pour le faire fonctionner. Si tout était dans le code, je parierais que je pourrais y arriver, mais WP possède évidemment des fonctions cachées, associées à have_post et à the_post, permettant de faire défiler les identifiants de publication disponibles. intégrer ce dont j'ai besoin.

Voici où je suis en ce moment. Toute aide est la bienvenue!

<?php   
$args = array(
'posts_per_page' => -1,
'post_parent' => $post->ID,
'post_type' => 'page',
'post_status' => '',
'orderby' => 'title',
'order' => 'ASC',);

query_posts($args); ?>

<?php if(have_posts()) : while (have_posts()) : the_post(); ?>

<a href="<?php the_permalink();?>"><?php the_title();?>:</a>

<?php     $inner_query = new WP_Query("post_type=page&posts_per_page=-1&post_parent={$id}&order_by=title&order=ASC"); ?>

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

<a href="<?php the_permalink();?>"><?php the_title();?>:</a>

<?php endwhile; // end inner loop ?>
<?php endwhile; //end outer loop ?>     
<?php endif; // end outer if have_posts?>
4
dains

On dirait que vous recherchez une fonction récursive, c'est-à-dire une fonction qui s'appelle elle-même. Voici un aperçu de la façon dont cela peut être fait:

function wpse13669_show_all_children( $post_id, $current_level ) {
    $children = get_posts( array(
        'post_type' =>'page',
        'posts_per_page' =>-1,
        'post_parent' => $post_id,
        'order_by' => 'title',
        'order' => 'ASC' ) );
    if ( empty($children) ) return;

    echo '<ul class="children level-'.$current_level.'-children">';

    foreach ($children as $child) {

        /* Here would be the point where you
            do whatever you want to display the 
            posts. The variable $current_level can
            be used if you want to style different 
            levels in the hierarchy differently */

            echo '<li>';

        echo '<a href="'.get_permalink($child->ID).'">';
        echo apply_filters( 'the_title', $child->post_title );
        echo '</a>';

        // now call the same function for child of this child
        wpse13669_show_all_children( $child->ID, $current_level+1 );

            echo '</li>';

        }

    echo '</ul>';

    }

Remarque: J'ai modifié mon code pour afficher le type de listes <ul> imbriquées que vous cherchez. Si vous voulez voir comment WordPress fait ce genre de choses en interne (c'est beaucoup plus compliqué que ça, mais ça vaut la peine de savoir si vous devez faire quelque chose de vraiment personnalisé dans votre code), vous devriez chercher dans le code source le class-wp-walker.php, où se trouve la classe Walker qui gère toutes les listes imbriquées (menus, commentaires, listes de pages, etc.) tout au long de WP.

Si vous définissez cette fonction avec la structure de sortie souhaitée et que vous l'appelez simplement depuis votre boucle, elle doit faire ce que vous recherchez. Je mets une variable $ current_level afin que vous puissiez facilement styler des enfants différents de ceux de petits-enfants, etc.

(dans votre boucle principale)

wpse13669_show_all_children( $post->ID, 1 );
7
goldenapples