WP_Query imbriqués & reset_postdata

Lors de l’utilisation de multiples WP_Query imbriqués les uns dans les autres, il est nécessaire de bien rétablir les informations du post du WP_Query précédent afin de pouvoir utiliser les fonctions WordPress (the_ID(), the_title()…) à l’intérieur de la boucle courante.

Voici un exemple qui explique bien comment utiliser les fonctions reset_postdata() et wp_reset_postdata().

Il va afficher les différents ID de la page courante, des pages enfants et des pages enfants de niveau 2.

<?php
echo 'Current page ID : '.get_the_ID() .'<br>';
$args = array( 'post_type' => 'page', 'posts_per_page' => -1, 'post_parent' => get_the_ID(), 'orderby' => 'menu_order', 'order' => 'ASC');
$level1 = new WP_Query($args);
if($level1->have_posts()) {
    while ($level1->have_posts()) {
        $level1->the_post();
        echo ' -- level1 ID : '.get_the_ID() .'<br>';
        $args = array( 'post_type' => 'page', 'posts_per_page' => -1, 'post_parent' => get_the_ID(), 'orderby' => 'menu_order', 'order' => 'ASC');
        $level2 = new WP_Query($args);
        if($level2->have_posts()) {
            while ($level2->have_posts()) {
                $level2->the_post();
                echo ' -- -- level2 ID : '.get_the_ID() .'<br>';
            }
        }
        $level1->reset_postdata();
        echo ' -- level1 ID : '.get_the_ID() .'<br>';
    }
}
wp_reset_postdata();
echo 'Current page ID : '.get_the_ID() .'<br>';
?>