您将需要遍历这些帖子,然后对每个帖子进行更多查询,重复进行直到在查询中找不到任何帖子为止。
例如
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或更低时在开始时返回一个空数组来实现。许多有关递归函数的教程都以此为例。