如何获得分级自定义帖子类型的所有子孙?


8

我需要获取特定(根)父母ID的所有子帖子。

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

WP-Codex:get_post()函数具有post_parent但没有child_of参数。

函数get_pages()与child_of参数的组合的优点是“ ...请注意,child_of参数还将获取给定ID的“孙”,而不仅仅是直接后代。“ *

Answers:


11

您将需要遍历这些帖子,然后对每个帖子进行更多查询,重复进行直到在查询中找不到任何帖子为止。

例如

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

是的,上面的函数调用自身,这是一个递归函数。它会一直调用自己,直到到达要查看的帖子没有子代的位置为止,然后它将返回而不调用自己,整个堆栈将冒泡重新建立子代数组。您最好在这方面做进一步的研究。

请注意,无论您是否使用递归函数,所需的内在成本都取决于您拥有多少级别的帖子。5个级别的帖子的费用将高于2个级别,并且不是线性缩放。您可能要使用瞬态来缓存输出,具体取决于您执行此操作的方式。

降低成本的另一种方法是,仅从职位树上俯视一定数量的层级,例如,孙辈而不是孙辈。可以通过传入depth参数,并在每次递归调用中将其递减,以确保深度为0或更低时在开始时返回一个空数组来实现。许多有关递归函数的教程都以此为例。


这段代码的问题是它没有给您正确的顺序。我首先获得所有顶级,然后在一个扁平阵列中获得所有第二级。关于如何解决的任何线索?
dama_do_bling

这段代码不是要这样做的,您有一个不同的问题,需要稍有不同的解决方案,并且需要使用大量上下文
Tom J Nowell

0

只需使用get_page_children()。它适用于每种帖子类型(不仅是页面),基本上是@TomJNowell在另一个问题中显示的内容,但是已经由core实现了。

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

上面的示例类似于Codex。这就是为什么您可以简单地将全局查询对象(或任何其他查询对象)用作搜索基础。


但是,如何将其用于其他帖子类型?无法正常工作。
dama_do_bling

0

使用下一个简码以分层视图显示所有子代和孙代。用法:[my_children_list]或[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' );
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.