Wie bekomme ich alle Kinder und Enkelkinder eines hierarchischen benutzerdefinierten Beitragstyps?

8

Ich muss alle Unterbeiträge einer bestimmten (Root-) übergeordneten ID abrufen.

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

WP-Codex: Die Funktion get_post () hat den Parameter post_parent, aber keinen child_of-Parameter.

Der Vorteil der Funktion get_pages () in Kombination mit dem Parameter child_of ist "... Beachten Sie, dass der Parameter child_of auch" Enkelkinder "der angegebenen ID abruft, nicht nur direkte Nachkommen." *

Paul Geisler
quelle

Antworten:

11

Sie müssen diese Beiträge durchlaufen und dann für jeden Beitrag weitere Abfragen durchführen. Dies wird wiederholt, bis Sie keine Beiträge in einer Abfrage finden.

z.B

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>';

Ja, die obige Funktion ruft sich selbst auf, es ist eine rekursive Funktion. Es ruft sich so lange selbst auf, bis es bis zu einem Punkt reicht, an dem der betrachtete Beitrag keine Kinder mehr hat. Dann kehrt es zurück, ohne sich selbst aufzurufen, und der gesamte Stapel sprudelt zurück, um die Anzahl der Kinder aufzubauen. Sie würden gut daran tun, weitere Forschungen in diesem Bereich durchzuführen.

Beachten Sie, dass das, was Sie möchten, inhärente Kosten verursacht, unabhängig davon, ob Sie rekursive Funktionen verwenden oder nicht, die davon abhängen, wie viele Ebenen von Posts Sie haben. 5 Ebenen von Posts sind teurer als 2 und es handelt sich nicht um eine lineare Skalierung. Je nachdem, wie Sie dies tun, möchten Sie möglicherweise Transienten verwenden, um Ihre Ausgabe zwischenzuspeichern.

Eine andere Möglichkeit, die Kosten zu senken, besteht darin, nur eine bestimmte Anzahl von Ebenen nach unten zu schauen, z. B. Enkelkinder, aber keine Urenkel. Dies kann erreicht werden, indem ein Tiefenparameter übergeben und bei jedem rekursiven Aufruf dekrementiert wird. Stellen Sie dabei sicher, dass zu Beginn ein leeres Array zurückgegeben wird, wenn die Tiefe 0 oder weniger beträgt. Viele Tutorials zu rekursiven Funktionen verwenden dies als Beispiel.

Tom J Nowell
quelle
Das Problem mit diesem Code ist, dass er Ihnen keine korrekte Reihenfolge gibt. Ich bekomme zuerst die gesamte oberste Ebene, danach die gesamte zweite Ebene in einem abgeflachten Array. Irgendwelche Hinweise, wie man das behebt?
dama_do_bling
Dieser Code war nicht dazu gedacht, Sie haben ein anderes Problem, das eine etwas andere Lösung und eine Menge Kontext erfordert
Tom J Nowell
0

Einfach benutzen get_page_children(). Es funktioniert für jeden Beitragstyp (nicht nur für Seiten) und ist im Grunde das, was @TomJNowell in der anderen Frage gezeigt hat, aber bereits vom Kern implementiert.

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

Das obige Beispiel ist wie im Codex. Aus diesem Grund können Sie einfach das globale Abfrageobjekt (oder ein anderes Abfrageobjekt) als Suchbasis verwenden.

Kaiser
quelle
Aber wie benutzt man das für einen anderen Beitragstyp? Es nicht zum Laufen bringen.
dama_do_bling
0

Verwenden Sie den nächsten Shortcode, um alle Kinder und Enkelkinder in einer hierarchischen Ansicht anzuzeigen. Verwendung: [my_children_list] oder [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' );
Adam Pery
quelle