web-dev-qa-db-fra.com

Comment afficher uniquement les publications de haut niveau en boucle via WP_Query?

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.

4
torinagrippa

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;
    }
    ?>
10
Manny Fleurmond

Vous pouvez simplement ajouter post_parent=0 à votre requête

7
Ryan

É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>';
        }            
    }
0
alds