问题描述
我需要得到一个特定 (根) 父 ID 的所有 sub-posts 。
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 的”grandchildren”,而不仅仅是直接后代。」*
最佳解决方案
您将需要循环使用这些帖子,然后对每个帖子进行更多查询,重复,直到您在查询中找不到任何帖子。
例如
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 或更低时在开始时返回一个空数组。关于递归函数的许多教程都以此为例。
参考文献
注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。