問題
把握に問題があるのは、「どうすればXを実行できますか」です。これは1ステップのアクションではなく、複数ステップのプロセスであり、分解する必要があります。
これを行う必要はありません:
get all the posts that are a child of X ordered by meta
これを行う必要があります:
get all the posts that are a child of X
for each child, get all the posts that are a child
foreach child of that child get all the posts that are a child
...
hmmm we don't have any more children left
Take our list of posts and order them by meta
一般的な解決策
そのため、ハードコーディングせずに、最後まで到達するまで無限に行う方法を理解するには、再帰関数を理解する必要があります。
例えば
function make_zero( $amount ) {
$amount = $amount - 1;
if ( $amount > 1 ){
return make_zero( $amount );
}
return $amount;
}
解決のためにこの問題に再帰を適用する
ですから、あなたの親は$parid
であり、あなたの投稿メタにはのキーがあり$metakey
ます。
子を取得するために関数に渡します。
$children = get_children_with_meta( $parid, $metakey );
次に、$ children配列をソートします。キーは投稿IDになり、値はメタ値になります。
asort($children);
そして、関数を次のように定義します。
function get_children_with_meta( $parent_id, $metakey ) {
$q = new WP_Query( array( 'post_parent' => $parent_id, 'meta_key' => $metakey ));
if ( $q->have_posts() ) {
$children - array();
while ( $q->have_posts() ) {
$q->the_post();
$meta_value = get_post_meta(get_the_ID(), $metakey, true );
$children[get_the_ID() ] = $meta_value;
}
return $children;
} else {
// there are no children!!
return array();
}
}
これにより、投稿IDと値の配列が、最低から最高の順に並べられます。他のPHPソート関数を使用して、最高から最低まで並べ替えることができます。
今、子供たちの子供たちはどうですか?
ループの途中で、親IDではなく子を渡す再帰呼び出しを行う必要があります。
したがって、この:
$q->the_post();
$meta_value = get_post_meta(get_the_ID(), $metakey, true );
$children[get_the_ID() ] = $meta_value;
これになる:
$q->the_post();
$meta_value = get_post_meta(get_the_ID(), $metakey, true );
$children[get_the_ID() ] = $meta_value;
// now get the childrens children
$grandchildren = get_children_with_meta( get_the_ID(), $metakey );
// merge the grandchildren and the children into the same list
$children = array_merge( $children, $grandchildren );
この変更により、関数は子、子の子、子の子の子を取得するようになりました。
最後に、配列の値をトリムして、次のようなIDを取得できます。
$post_ids = array_keys( $children );
$q = new WP_Query( array( 'post__in' => $post_ids );
// etc
この戦略を使用すると、メタキー値を他のメトリックに置き換えるか、他の方法で再帰関数を使用できます。
完全なコードは数秒の基本的な理解と簡単なコピーペーストのみを必要とするため、コードの完全なコピーペーストブロックであなたの知性をin辱しません。
長所
- すべての投稿タイプおよびデータ形式の修正が有効
- ネストされたマークアップを生成するように変更できます
- 返された配列を一時的に配置することにより、簡単にキャッシュして高速化する
- WP_Queryの最後にページングを適用することにより、ページングでセットアップできます
遭遇する問題
- あなたは彼らを見つけるまで子供の数を知る方法がないので、パフォーマンスのコストはスケーリングしません
- あなたが望むものは多くのクエリを生成し、潜在的な深さのために本質的にコストがかかります。
私の推薦
ページ階層をフラットにするか、代わりに分類法を使用することをお勧めします。たとえば、投稿を評価する場合は、1、2、3、4、5などの用語でページ評価の分類を行います。これにより、すぐに投稿の一覧が表示されます。
または、navメニューを使用して、この問題を完全に回避します