Come ottenere tutti i figli e i nipoti di un tipo di posta personalizzato gerarchico?


8

Devo ottenere tutti i post secondari di un ID genitore specifico (root).

get_posts( array( 'numberposts' => -1, 'post_status' => 'publish', 'post_type' => 'microsite', 'post_parent' => $root_parent_id, 'suppress_filters' => false ) );

WP-Codex: la funzione get_post () ha il parametro post_parent ma nessun parametro child_of.

Il vantaggio della funzione get_pages () in combinazione con il paramenter child_of è "... Nota che il parametro child_of prenderà anche i" nipoti "dell'ID dato, non solo i discendenti diretti." *

Risposte:


11

Dovrai passare in rassegna quei post e quindi fare più query per ogni post, ripetendo fino a quando non trovi nessun post in una query.

per esempio

function get_posts_children($parent_id){
    $children = array();
    // grab the posts children
    $posts = get_posts( array( 'numberposts' => -1, 'post_status' => 'publish', 'post_type' => 'microsite', 'post_parent' => $parent_id, 'suppress_filters' => false ));
    // now grab the grand children
    foreach( $posts as $child ){
        // recursion!! hurrah
        $gchildren = get_posts_children($child->ID);
        // merge the grand children into the children array
        if( !empty($gchildren) ) {
            $children = array_merge($children, $gchildren);
        }
    }
    // merge in the direct descendants we found earlier
    $children = array_merge($children,$posts);
    return $children;
}

// example of using above, lets call it and print out the results
$descendants = get_posts_children($post->ID);
echo '<pre>';
print_r($descendants);
echo '</pre>';

Sì, la funzione precedente si chiama da sola, è una funzione ricorsiva. Continuerà a chiamarsi finché non raggiungerà un punto in cui il post che sta guardando non ha figli, quindi tornerà senza chiamarsi e l'intero stack tornerà indietro costruendo la schiera di bambini. Faresti del bene per fare ulteriori ricerche in questo settore.

Nota che c'è un costo inerente a ciò che vuoi, indipendentemente dal fatto che tu usi o meno funzioni ricorsive, che è legato al numero di post che hai. 5 livelli di post saranno più costosi di 2 e non è un ridimensionamento lineare. È possibile che si desideri utilizzare i transitori per memorizzare nella cache l'output a seconda di come lo si fa.

Un altro modo per ridurre i costi è solo guardando l'albero dei pali un certo numero di livelli, ad esempio nipoti ma non pronipoti. Questo può essere fatto passando un parametro di profondità e decrementandolo ad ogni chiamata ricorsiva, assicurandosi di restituire un array vuoto all'inizio se la profondità è 0 o inferiore. Molti tutorial sulle funzioni ricorsive lo usano come esempio.


Il problema con questo codice è che non ti dà l'ordinamento corretto; Ottengo prima tutto il livello superiore, quindi tutto il secondo livello in un array appiattito. Qualche idea su come risolvere?
dama_do_bling

Questo codice non intendeva farlo, hai un problema diverso che richiede una soluzione leggermente diversa e una forte dose di contesto
Tom J Nowell

0

Basta usare get_page_children(). Funziona con ogni tipo di post (non solo pagine) ed è sostanzialmente quello che @TomJNowell ha mostrato nell'altra domanda, ma già implementato da core.

$children = get_page_children( $post->ID, $GLOBALS['wp_query'] );

Il campione sopra è come nel Codex. Ecco perché puoi semplicemente prendere l'oggetto query globale (o qualsiasi altro oggetto query) da usare come base di ricerca.


Ma come lo usi per un diverso tipo di post? Non farlo funzionare.
dama_do_bling

0

Utilizzare il prossimo shortcode per visualizzare tutti i figli e i nipoti in vista gerarchica. Utilizzo: [my_children_list] o [my_children_list page_id = 123]

function my_children_list_func($atts, $content = null) {
    global $post;

    $a = shortcode_atts( array(
            'page_id' => ''
    ), $atts );

    $args = array( 
            'numberposts' => -1, 
            'post_status' => 'publish', 
            'post_type' => 'microsite', 
            'post_parent' => (isset($a['page_id']) && $a['page_id']) ? $a['page_id'] : $post->ID,
            'suppress_filters' => false 
    );

    $parent = new WP_Query( $args );

    ob_start();

    if ( $parent->have_posts() ) :?>
            <ul>
            <?php while ( $parent->have_posts() ) : $parent->the_post(); ?>
                    <li><a href="<?php the_permalink(); ?>" title="<?php the_title(); ?>"><?php the_title(); ?></a>
                    <?php echo do_shortcode('[tadam_children_list page_id='.get_the_ID().']') ?>
                    </li>
            <?php endwhile;?>
            </ul>
    <?php endif; wp_reset_postdata();

    return ob_get_clean();
}
add_shortcode( 'my_children_list', 'my_children_list_func' );
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.