web-dev-qa-db-de.com

Wie zeige ich nur Top-Level-Posts in einer Schleife über WP_Query an?

Wie stelle ich meine benutzerdefinierte Schleife so ein, dass nur Beiträge der höchsten Ebene angezeigt werden? Ich habe einen hierarchischen benutzerdefinierten Beitragstyp und auf der Archivseite werden sowohl die übergeordneten als auch die untergeordneten Beiträge angezeigt.

4
torinagrippa

Diese Lösung basiert auf einem Code von Justin Tadlock . pre_get_posts wird aufgerufen, bevor WordPress die Posts der Hauptschleife abruft. Grundsätzlich testen Sie, ob die Seite das Archiv des Beitragstyps ist, und stellen Sie sicher, dass post_parent nicht festgelegt wurde. Dann setzen Sie post_parent auf 0, was der Standardwert für übergeordnete Beiträge auf oberster Ebene ist. Einfach wie Torte.

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

Sie können Ihrer Abfrage einfach post_parent=0 hinzufügen

7
Ryan

Ausgehend von @ Ryans Beitrag lautet der Schlüssel post_parent=0 und post_type='page'.

Sie können jederzeit die SQL-Anforderung des WP_Query-Objekts anzeigen, um zu sehen, welche Argumente Sie hinzufügen müssen, um die gewünschten Ergebnisse zu erzielen.

Dieser Code funktioniert für mich:

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