Làm thế nào để có được tất cả con cháu của một loại bài tùy chỉnh phân cấp?


8

Tôi cần nhận được tất cả các bài đăng phụ của id gốc (gốc) cụ thể.

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

Hàm WP-Codex: get_post () có tham số post_parent nhưng không có tham số child_of.

Ưu điểm của hàm get_pages () kết hợp với tham số child_of là "... Lưu ý rằng tham số child_of cũng sẽ tìm nạp" cháu "của ID đã cho, không chỉ là con cháu trực tiếp." *

Câu trả lời:


11

Bạn sẽ cần lặp lại các bài đăng đó và sau đó thực hiện nhiều truy vấn hơn cho mỗi bài đăng, lặp lại cho đến khi bạn không tìm thấy bài đăng nào trong truy vấn.

ví dụ

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

Có, hàm trên tự gọi, đây là hàm đệ quy. Nó sẽ tiếp tục tự gọi cho đến khi nó đạt đến điểm mà bài đăng đang xem không có con, sau đó nó sẽ quay lại mà không tự gọi, và toàn bộ ngăn xếp sẽ bong bóng trở lại xây dựng mảng trẻ em. Bạn sẽ làm tốt để nghiên cứu sâu hơn trong lĩnh vực này.

Lưu ý rằng có một chi phí vốn có cho những gì bạn muốn, bất kể bạn có sử dụng các hàm đệ quy hay không, có liên quan đến số lượng bài đăng bạn có. 5 cấp độ của bài viết sẽ đắt hơn 2, và nó không phải là một tỷ lệ tuyến tính. Bạn có thể muốn sử dụng tạm thời để lưu trữ đầu ra của mình tùy thuộc vào cách bạn thực hiện việc này.

Một cách khác để giảm chi phí là chỉ nhìn xuống cây bài viết một số cấp độ nhất định, ví dụ như cháu nhưng không có cháu chắt. Điều này có thể được thực hiện bằng cách chuyển vào một tham số độ sâu và giảm nó trên mỗi cuộc gọi đệ quy, đảm bảo trả về một mảng trống khi bắt đầu nếu độ sâu bằng 0 hoặc thấp hơn. Nhiều hướng dẫn về các hàm đệ quy sử dụng điều này làm ví dụ.


Vấn đề với mã này là nó không cung cấp cho bạn thứ tự chính xác; Tôi nhận được tất cả các cấp cao nhất trước, sau đó tất cả các cấp thứ hai sau trong một mảng phẳng. Bất kỳ manh mối về cách khắc phục?
dama_do_ble

Mã này không có ý định làm điều đó, bạn có một vấn đề khác đòi hỏi một giải pháp hơi khác và một bối cảnh khổng lồ
Tom J Nowell

0

Đơn giản chỉ cần sử dụng get_page_children(). Nó hoạt động cho mọi loại bài đăng (không chỉ các trang) và về cơ bản là những gì @TomJNowell đã thể hiện trong câu hỏi khác, nhưng đã được triển khai theo cốt lõi.

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

Trên mẫu giống như trong Codex. Đó là lý do tại sao bạn có thể đơn giản lấy đối tượng truy vấn toàn cầu (hoặc bất kỳ đối tượng truy vấn nào khác) để sử dụng làm cơ sở tìm kiếm.


Nhưng làm thế nào để bạn sử dụng điều này cho một loại bài khác nhau? Không làm cho nó hoạt động.
dama_do_ble

0

Sử dụng shortcode tiếp theo để hiển thị tất cả trẻ em và cháu trong chế độ xem phân cấp. Cách sử dụng: [my_children_list] hoặc [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' );
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.