これらの投稿をループして、各投稿に対してさらにクエリを実行し、クエリで投稿が見つからなくなるまで繰り返します。
例えば
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よりもコストがかかり、線形スケーリングではありません。これをどのように行うかによっては、トランジェントを使用して出力をキャッシュしたい場合があります。
コストを削減するもう1つの方法は、投稿のツリーを特定の数のレベルだけで調べることです。これは、深さパラメータを渡して、再帰呼び出しごとにデクリメントし、深さが0以下の場合は最初に必ず空の配列を返すことで実行できます。再帰関数に関する多くのチュートリアルでは、これを例として使用しています。