Cum să afișezi doar postările de nivel superior în bucla WP_Query?

30 sept. 2011, 17:01:03
Vizualizări: 17K
Voturi: 8

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.

0
Toate răspunsurile la întrebare 3
1
14

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;
    }
    ?>
30 sept. 2011 18:14:03
Comentarii

De asemenea, ar trebui să verifici dacă utilizatorul se află în zona de administrare sau pe frontend cu is_admin(), altfel doar paginile de nivel superior vor fi afișate în lista de postări din administrare.

Robert Went Robert Went
16 sept. 2020 18:27:15
2
14

Puteți adăuga pur și simplu post_parent=0 în interogarea dvs.

31 oct. 2011 04:54:58
Comentarii

Da, la asta m-am gândit și eu prima dată, dar din nu știu ce motiv nu funcționează mereu.

MTT MTT
11 nov. 2011 20:04:09

$args = array( ... 'post_parent' => 0, .... ); funcționează. Rapid și simplu.

Mav2287 Mav2287
17 aug. 2019 23:05:32
0

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>';
        }            
    }
12 ian. 2017 13:38:10