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>';
?>