私は特定の(ルート)親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の「孫」も取得されることに注意してください。
これらの投稿をループしてから、各投稿に対してさらにクエリを実行し、クエリに投稿が見つからなくなるまで繰り返す必要があります。
例えば.
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パラメータを渡し、再帰呼び出しごとにそれをデクリメントして、depthが0以下の場合は必ず最初に空の配列を返すようにして行うことができます。再帰関数に関する多くのチュートリアルではこれを例として使用しています。
get_page_children()
を使うだけです。これはすべての投稿タイプ(ページだけでなく)に対して機能し、基本的に@TomJNowellが他の質問で示したものですが、すでにcoreによって実装されています。
$children = get_page_children( $post->ID, $GLOBALS['wp_query'] );
上のサンプルはCodexのようなものです。グローバルクエリオブジェクト(または他のクエリオブジェクト)を検索ベースとして使用できるのはそのためです。
次のショートコードを使用して、すべての子供と孫を階層ビューで表示します。使用方法:[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' );