web-dev-qa-db-fra.com

Comment puis-je lister l'enfant d'une page d'enfant

Je me demandais comment je peux lister l'enfant d'un enfant pages dans wordpress.

Voici ce que j'ai mis en place.

Videos (Parent)
 -Music Videos(child)
  --Video 1 (Child of Child)
  --Video 2 (Child of Child)

 -Performances (Child)
  --Video 1 (Child Of Child)
  --Video 2 (Child Of Child)

Je veux lister tous les "enfants d'enfant" de la page parente "VIDEOS".

Je sais que ce code ne répertorie que les pages "enfants" mais pas l'enfant des enfants.

<?php
$child_pages = $wpdb->get_results("SELECT *    FROM $wpdb->posts WHERE post_parent = ".$post->ID."    AND post_type = 'page' ORDER BY menu_order", 'OBJECT');    ?>
<?php if ( $child_pages ) : foreach ( $child_pages as $pageChild ) : setup_postdata( $pageChild ); ?>
<div class="child-thumb">
<?php echo get_the_post_thumbnail($page->ID, 'thumbnail'); ?>
<a href="<?php echo  get_permalink($pageChild->ID); ?>" rel="bookmark" title="<?php echo $pageChild->post_title; ?>"><?php echo $pageChild->post_title; ?></a>
</div>
<?php endforeach; endif;
?>

Je veux le faire sans rien ajouter à mes functions.php

Que dois-je ajouter pour que cela se produise. J'ai cinq pages d'enfant sous la page parent.

1
Terrell Anderson

Tout d’abord, pourquoi interrogez-vous les publications par votre requête personnalisée? Nous avons WP_Query class et get_posts pour le faire.

$child_pages = $wpdb->get_results("SELECT *    FROM $wpdb->posts WHERE post_parent = ".$post->ID."    AND post_type = 'page' ORDER BY menu_order", 'OBJECT');

est devenu

$pages = get_posts(array(
    'post_type' => 'page',
    'orderby' => 'menu_order'
    'order' => 'ASC'
    'posts_per_page' => -1,
));

Ensuite, vous devez utiliser la fonction get_page_children ( get_page_children sur codex ) pour générer une liste d'arborescence. get_page_children n'interroge pas la base de données chaque fois que nous voulons générer une liste d'enfants, mais utilise la liste de tous les articles stockés dans la variable $pages.

<ul>
    <?php foreach ($pages as $page): ?>
        <?php if ($page->post_parent == 0): ?>
            <li>
                <?php echo $page->post_title; ?>
                <?php $children = get_page_children($page->ID, $pages); ?>
                <ul>
                    <?php foreach ($children as $child): ?>
                        <?php if ($child->post_parent == $page->ID): ?>
                            <li>
                                <?php echo $child->post_title; ?>
                                <?php $granchildren = get_page_children($child->ID, $pages); ?>
                                <ul>
                                    <?php foreach ($granchildren as $grandchild): ?>
                                        <li><?php echo $grandchild->post_title; ?></li>
                                    <?php endforeach; ?>
                                </ul>
                            </li>
                        <?php endif; ?>
                    <?php endforeach; ?>
                </ul>
            </li>
        <?php endif; ?>
    <?php endforeach ?>
</ul>

MODIFIER. Je pense que cela va maintenant correspondre à vos attentes:

<?php $posts = get_posts(array('posts_per_page' => -1, 'post_type' => 'page')); ?>
<?php $children = get_page_children($post->ID, $posts); ?>
<?php foreach ($children as $child): ?>
    <?php if ($child->post_parent == $post->ID): ?>
        <div>
            <h2><?php echo $child->post_title; ?></h2>
            <ul>
                <?php $grandchildren = get_page_children($child->ID, $posts); ?>
                <?php foreach ($grandchildren as $grandchild): ?>
                    <li><?php echo $grandchild->post_title; ?></li>
                <?php endforeach; ?>
            </ul>
        </div>
    <?php endif; ?>
<?php endforeach; ?>

enter image description here

1
Krzysztof Grabania