Wordpress 子記事を無限階層辿る


追記、それっぽいのがありました

https://wpdocs.osdn.jp/%E9%96%A2%E6%95%B0%E3%83%AA%E3%83%95%E3%82%A1%E3%83%AC%E3%83%B3%E3%82%B9/get_children
get_children()。子供記事持ってるか?チェックくらいならこれがお手軽ですね。。

get_ancestorsの逆が欲しい

親記事IDをもとに、所属する子供を辿りまくりたい。
子記事の親を辿りまくるのはget_ancestorsという便利なものがあるがその逆がない。検索しても引っかからない。
どういうときに使うのか。
子ども記事が条件を満たしている場合のみ、表示するケースに必要になった。
親から辿るコードを書くとどうしても何段階まで、という記述になりがちだしコードも重複が増えたりする。
別に逆順でもシステム構築はできるケースもあるだろうが、、記事をまとめて特別にシュリンクして表示したい要件とか、意外と面倒な処理が必要だったりする。

再帰が最適かどうか悩んでるうちにできたもの

再帰はそれほど見かけないし、なじみがないので読み解くときカロリーが必要だったりする。
ただ、手が動いてなんとなくできた再帰型を掲載。

untara.php
$args_base = array(
    'numberposts'      => -1,
    'post_type'        => 'page',
    'post_parent'        => 0,
);
$mposts = get_posts($args_base);
global $_ret;
global $func_get_familyline;
$func_get_familyline = function($_mposts) {
    global $_ret;
    global $func_get_familyline;
    $args = array(
        'numberposts'      => -1,
        'post_type'        => 'page',
    );
    foreach ($_mposts as $_mpost) {
        $args2 = array(
            'numberposts'      => -1,
            'post_type'        => 'post',
        );
        $args2['meta_query'] = array();
        $args2['meta_query'][] = array(
            'key'     => "belong_page",
            'value'   => $_mpost->ID,
            'compare' => '='
        );
        $myquerytmp = new WP_Query();
        $myquerytmp->query($args2);
        if ($myquerytmp->found_posts) {
            $_ret[$_mpost->ID] = get_posts($args2);
        }
        $args["post_parent"] = $_mpost->ID;
        $func_get_familyline(get_posts($args));
    }
};
$_ret = array();
$ret = $func_get_familyline($mposts);

ページに紐づく投稿が存在する場合のみ、投稿を収集する。
ページの孫やひ孫玄孫までどこまでもpost_parentをたぐって検索する。というような意図。
再帰は引数をちょっと変えて自分を呼びなおすとこだったり、
結果はグローバルで初期化しないと意図しない感じになったり、まあコツがありそう。

美しくない・・ブラッシュアップしたい・・
ただ、コード行数は1/3になったので、まあ。。徐々にね…
子記事まで、孫記事までって決まってるケースでも、やっぱりシステムとしては無限に追えるようにしときたいときにどうぞ。