如何获取一个层次化定制岗位类型的所有子孙?

时间:2013-01-15 作者:Paul Geisler

我需要获得特定(根)父id的所有子帖子。

get_posts( array( \'numberposts\' => -1, \'post_status\' => \'publish\', \'post_type\' => \'microsite\', \'post_parent\' => $root_parent_id, \'suppress_filters\' => false ) );
WP法典:get_post() 函数具有参数的post\\u父级,但没有子级。

函数get\\u pages()与参数的子项相结合的优点是“……请注意,参数的子项\\u还将获取给定ID的“孙子”,而不仅仅是直接子项。”*

5 个回复
最合适的回答,由SO网友:Tom J Nowell 整理而成

您需要在这些帖子上循环,然后对每个帖子进行更多查询,重复操作,直到在查询中找不到帖子为止。

e、 g。

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级员额高,这不是一个线性比例。根据您的操作方式,您可能希望使用瞬态来缓存输出。

另一种降低成本的方法是只查看一定级别的帖子树,例如孙子,而不是曾孙。这可以通过传入一个深度参数来实现,并在每次递归调用时递减,如果深度为0或更低,请确保在开始时返回一个空数组。许多递归函数教程都以此为例。

SO网友:kaiser

简单使用get_page_children(). 它适用于每种帖子类型(不仅仅是页面),基本上就是@TomJNowell在另一个问题中所展示的,但已经由core实现了。

$children = get_page_children( $post->ID, $GLOBALS[\'wp_query\'] );
上面的示例与Codex中的类似。这就是为什么您可以简单地将全局查询对象(或任何其他查询对象)用作搜索基础的原因。

SO网友:Ray

我也有类似的要求,但需要保留层次结构,所以Tom的回答给了我一个良好的开端:

function get_post_offspring($post)
{
    // Function to programmatically walk down a a post\'s descendants

    // Get immediate children of current post 
    // and added to a new object element called children
    $post->children = get_children(array("post_parent" => $post->ID, "post_type" => "page", "post_status" => "publish"));
    
    // if post does not have any children just return the post with
    // with children being an empty array
    if (empty($post->children)) {
        return $post;
    }
    foreach ($post->children as $child) {
        // Foreach child of this post....get the children
        $children = get_children(array("post_parent" => $child->ID, "post_type" => "page", "post_status" => "publish"));
        if (!empty($children)) {
            // if this post has children...then call this function again
            // to assign the children el to this post and walk further down
            // This post\'s offspring

            $child = get_post_offspring($child);
        }
    }

    return $post;
}
现在,我还需要遍历列表,并保持顺序和级别。

function render_list_items($children)
{
    foreach ($children as $child) {
        $has_children = !empty($child->children);

        echo "<li>";
        echo "<a href=\'" . get_permalink($child) . "\'>" . $child->post_title . "</a";
        if ($has_children) {
            // If post has children then create a new <ul> inside current
            // <li> and call function again
            echo "<ul>";
            echo render_list_items($child->children);
            echo "</ul>";
        }

        echo "</li>";
    }

}
所以,把这一切放在一起,我有一些类似的东西:

global $post;

$post_id = $post->ID;

// Get ancestors of current post where the last el of array
// is the topmost parent
$ancestors = get_post_ancestors($post->ID);

$root_id = array_pop($ancestors);
// We now have the root post of this post and descend to grab all its offspring
$root_post = get_post($root_id);

$root_children = get_post_offspring($root_post);



<ul>
    <?php render_list_items($root_children->children); ?>
</ul>

SO网友:Adam Pery

使用“下一个快捷码”在层次视图中显示所有子代和孙代。用法:[my\\u children\\u list]或[my\\u children\\u list page\\u 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\' );

SO网友:GeeC

万一有人无意中发现了这一点,并决定实施选定的答案,get_pages() 使用页面and 分级职位类型。因此,您可以使用get_pages() 使用child_of 参数

结束

相关推荐