Come visualizzare solo i post di primo livello nel loop con WP_Query?

30 set 2011, 17:01:03
Visualizzazioni: 17K
Voti: 8

Come posso impostare il mio loop personalizzato per mostrare solo i post di primo livello? Ho un tipo di post personalizzato gerarchico e la pagina archivio mostra sia i post genitore che quelli figlio.

0
Tutte le risposte alla domanda 3
1
14

Questa soluzione si basa su del codice di Justin Tadlock. pre_get_posts viene chiamato prima che WordPress recuperi i post del loop principale. In sostanza, si verifica se la pagina è un archivio del tipo di post e si assicura che post_parent non sia stato impostato. Quindi si imposta post_parent a 0, che è il genitore predefinito per i post di livello superiore. Semplice come bere un bicchier d'acqua.

<?php
    //pre_get_posts filter è chiamato prima che WordPress recuperi i post
    add_filter( 'pre_get_posts', 'my_get_posts' );
    
    function my_get_posts( $query ) {
        //Se l'utente sta visualizzando il frontend, la pagina è un archivio e post_parent non è impostato e post_type è il tipo di post in questione
        if ( ! is_admin() && is_archive() && false == $query->query_vars['post_parent'] &&  $query->query_vars['post_type'] === 'my_post_type')
            //imposta post_parent a 0, che è il post_parent predefinito per i post di livello superiore
            $query->set( 'post_parent', 0 );
        return $query;
    }
    ?>
30 set 2011 18:14:03
Commenti

Dovresti anche verificare se l'utente si trova nell'area di amministrazione o nel frontend con is_admin(), altrimenti verranno visualizzate solo le pagine di primo livello nell'elenco dei post dell'amministrazione.

Robert Went Robert Went
16 set 2020 18:27:15
2
14

Puoi semplicemente aggiungere post_parent=0 alla tua query

31 ott 2011 04:54:58
Commenti

Sì, è quello che ho pensato inizialmente, ma per qualche motivo non funziona sempre.

MTT MTT
11 nov 2011 20:04:09

$args = array( ... 'post_parent' => 0, .... ); risolve il problema. Veloce e semplice.

Mav2287 Mav2287
17 ago 2019 23:05:32
0

Prendendo spunto dal post di @Ryan, la chiave è impostare post_parent=0 e post_type='page'.

Puoi sempre visualizzare la richiesta SQL dell'oggetto WP_Query per vedere quali argomenti devi aggiungere per ottenere i risultati desiderati.

Questo codice funziona per me:

<?php
$args=array('post_parent' => 0, // obbligatorio
                'post_type' => 'page', // obbligatorio
                'orderby' => 'menu_order', // per visualizzare secondo la gerarchia
                'order' => 'ASC', // per visualizzare secondo la gerarchia
                'posts_per_page' => -1, // per visualizzare tutti perché il default è 10
    );

    $query = new \WP_Query( $args ); 

    /*  Rimuovi il commento per vedere l'SQL risultante per 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>';
        }            
    }
12 gen 2017 13:38:10