Bagaimana cara mendapatkan semua anak dan cucu dari jenis posting kustom hierarkis?


8

Saya perlu mendapatkan semua sub-posting dari id induk (root) tertentu.

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

WP-Codex: get_post () fungsi memiliki post_parent tetapi tidak ada parameter child_of.

Keuntungan dari fungsi get_pages () dalam kombinasi dengan parameter child_of adalah "... Perhatikan bahwa parameter child_of juga akan mengambil" cucu "dari ID yang diberikan, bukan hanya keturunan langsung." *

Jawaban:


11

Anda perlu mengulangi posting-posting itu dan kemudian melakukan lebih banyak pertanyaan untuk setiap posting, ulangi sampai Anda tidak menemukan posting dalam kueri.

misalnya

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

Ya fungsi di atas memanggil dirinya sendiri, itu adalah fungsi rekursif. Itu akan terus memanggil dirinya sendiri hingga mencapai ke titik di mana pos yang dilihat tidak memiliki anak, maka ia akan kembali tanpa memanggil dirinya sendiri, dan seluruh tumpukan akan kembali membentuk susunan anak-anak. Anda sebaiknya melakukan penelitian lebih lanjut di bidang ini.

Perhatikan bahwa ada biaya yang melekat pada apa yang Anda inginkan, terlepas dari apakah Anda menggunakan fungsi rekursif atau tidak, yang terkait dengan berapa banyak level posting yang Anda miliki. 5 level posting akan lebih mahal dari 2, dan ini bukan skala linear. Anda mungkin ingin menggunakan transien untuk menyimpan cache tergantung pada bagaimana Anda melakukan ini.

Cara lain untuk mengurangi biaya adalah dengan hanya melihat ke bawah pohon posting sejumlah tingkat, misalnya cucu tetapi tidak ada cucu yang hebat. Ini dapat dilakukan dengan mengirimkan parameter kedalaman, dan menurunkannya pada setiap panggilan rekursif, memastikan untuk mengembalikan array kosong di awal jika kedalamannya 0 atau lebih rendah. Banyak tutorial tentang fungsi rekursif menggunakan ini sebagai contoh.


Masalah dengan kode ini adalah tidak memberi Anda pemesanan yang benar; Saya mendapatkan semua level atas terlebih dahulu, lalu semua level kedua setelah dalam satu array yang rata. Adakah petunjuk tentang cara memperbaikinya?
dama_do_bling

Kode ini tidak dimaksudkan untuk melakukan itu, Anda memiliki masalah yang berbeda yang memerlukan solusi yang sedikit berbeda, dan dosis konteks yang lumayan
Tom J Nowell

0

Cukup gunakan get_page_children(). Ini berfungsi untuk setiap jenis posting (tidak hanya halaman) dan pada dasarnya adalah apa yang @TomJNowell tunjukkan dalam pertanyaan lain, tetapi sudah diterapkan oleh inti.

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

Sampel di atas seperti di Codex. Itu sebabnya Anda bisa mengambil objek kueri global (atau objek kueri lainnya) untuk digunakan sebagai basis pencarian.


Tetapi bagaimana Anda menggunakan ini untuk jenis posting yang berbeda? Tidak membuatnya bekerja.
dama_do_bling

0

Gunakan kode pendek berikutnya untuk menampilkan semua anak dan cucu dalam tampilan hierarkis. Penggunaan: [my_children_list] atau [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' );
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.