Cum să afișezi doar postările de nivel superior în bucla WP_Query?
Cum pot configura bucla mea personalizată să afișeze doar postările de nivel superior? Am un tip de postare personalizat ierarhic și pagina de arhivă afișează atât postările părinte cât și cele copil.

Această soluție este bazată pe un cod scris de Justin Tadlock. pre_get_posts este apelat înainte ca WordPress să obțină postările din bucla principală. Practic, verifici dacă pagina este arhiva tipului de postare și te asiguri că post_parent nu a fost setat. Apoi setezi post_parent la 0, care este părintele implicit al postărilor de nivel superior. Simplu ca bună ziua.
<?php
//Filtrul pre_get_posts este apelat înainte ca WordPress să obțină postările
add_filter( 'pre_get_posts', 'my_get_posts' );
function my_get_posts( $query ) {
//Dacă utilizatorul vizualizează frontend-ul, pagina este o arhivă și post_parent nu este setat și post_type este tipul de postare în cauză
if ( ! is_admin() && is_archive() && false == $query->query_vars['post_parent'] && $query->query_vars['post_type'] === 'my_post_type')
//Setează post_parent la 0, care este valoarea implicită pentru postările de nivel superior
$query->set( 'post_parent', 0 );
return $query;
}
?>

Extinzând postul lui @Ryan, cheia este setarea post_parent=0
și post_type='page'
.
Puteți oricând să vizualizați cererea SQL a obiectului WP_Query pentru a vedea ce argumente trebuie să adăugați pentru a obține rezultatele dorite.
Acest cod funcționează pentru mine:
<?php
$args=array('post_parent' => 0, // obligatoriu
'post_type' => 'page', // obligatoriu
'orderby' => 'menu_order', // pentru afișare conform ierarhiei
'order' => 'ASC', // pentru afișare conform ierarhiei
'posts_per_page' => -1, // pentru afișarea tuturor deoarece implicit este 10
);
$query = new \WP_Query( $args );
/* Decomentați pentru a vedea SQL-ul rezultat pentru depanare
echo $query->request; die();
//*/
if ( $query->have_posts() ) {
while($query->have_posts()) {
$query->the_post();
$post_id=get_the_ID();
$post=get_post($post_id,'ARRAY_A');
echo $post['ID'].': '.$post['post_title'].'<br>';
}
}
