it-swarm.com.de

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

Ich muss alle Unterbeiträge einer bestimmten (Stamm-) Eltern-ID abrufen.

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

WP-Codex: get_post () function hat den Parameter post_parent aber keinen child_of.

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." *

7
Paul Geisler

Sie müssen diese Beiträge durchlaufen und dann für jeden Beitrag weitere Abfragen durchführen, bis Sie in einer Abfrage keine Beiträge mehr 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 selbst so lange auf, bis es einen Punkt erreicht, 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 das Array von Kindern aufzubauen. Sie tun gut daran, in diesem Bereich weiter zu forschen.

Beachten Sie, dass das, was Sie möchten, mit Kosten verbunden ist, unabhängig davon, ob Sie rekursive Funktionen verwenden oder nicht. Dies hängt davon ab, wie viele Ebenen von Posts Sie haben. 5 Ebenen von Beiträgen 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 zum Zwischenspeichern Ihrer Ausgabe verwenden.

Eine andere Möglichkeit, die Kosten zu senken, besteht darin, nur eine bestimmte Anzahl von Ebenen, z. Enkelkinder, aber keine Urenkel. Dies kann erreicht werden, indem ein Tiefenparameter übergeben und bei jedem rekursiven Aufruf dekrementiert wird, wobei sichergestellt wird, dass zu Beginn ein leeres Array zurückgegeben wird, wenn die Tiefe 0 oder niedriger ist. Viele Tutorials zu rekursiven Funktionen verwenden dies als Beispiel.

9
Tom J Nowell

Verwenden Sie einfach 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 von Core 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 beliebiges anderes Abfrageobjekt) als Suchbasis verwenden.

0
kaiser

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' );
0
Adam Pery