Comment définir ma boucle personnalisée pour afficher uniquement les publications de niveau supérieur? J'ai un type de message personnalisé hiérarchique et la page d'archive montre les messages parent et enfant.
Cette solution est basée sur du code de Justin Tadlock . pre_get_posts est appelé avant que WordPress obtienne les publications de la boucle principale. En gros, vous testez si la page est l'archive du type de publication et assurez-vous que post_parent n'a pas été défini. Ensuite, vous définissez post_parent sur 0, qui est le parent par défaut des publications de niveau supérieur. C'est de la tarte.
<?php
//pre_get_posts filter is called before WordPress gets posts
add_filter( 'pre_get_posts', 'my_get_posts' );
function my_get_posts( $query ) {
//if page is an archive and post_parent is not set and post_type is the post type in question
if ( is_archive() && false == $query->query_vars['post_parent'] && $query->query_vars['post_type'] == 'my_post_type')
//set post_parent to 0, which is the default post_parent for top level posts
$query->set( 'post_parent', 0 );
return $query;
}
?>
Vous pouvez simplement ajouter post_parent=0
à votre requête
Élaboré à partir du message de @ Ryan, la clé est de configurer post_parent=0
et post_type='page'
.
Vous pouvez toujours afficher la requête SQL de l'objet WP_Query pour voir quels arguments vous devez ajouter pour obtenir les résultats souhaités.
Ce code fonctionne pour moi:
<?php
$args=array('post_parent' => 0, // required
'post_type' => 'page', // required
'orderby' => 'menu_order', // to display according to hierarchy
'order' => 'ASC', // to display according to hierarchy
'posts_per_page' => -1, // to display all because default is 10
);
$query = new \WP_Query( $args );
/* Uncomment to see the resulting SQL to debug
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>';
}
}