何が言いたいのか分からねーと思うが。要は、固定ページが何千ページもあって階層がたくさんある時に、一覧からページを探すのがしんどいので、親ページを指定してその子ページだけを表示させる、というものを実現したい。
やりたいこと
絞り込み検索に、こんなセレクトボックス↓を追加して、選択した親ページの子ページのみを表示させたい。

セレクトボックスには、「子を持つページ」のみが表示される。自分自身が子ページであったとしても、さらに自分が子ページを持っているならば表示される。

「テスト親」という名前のページを選択してみた。このように、選択したページの子ページに絞られて表示される。素晴らしい!←
ちなみに、孫ページは表示されない。あくまで子ページ(直近の子孫)に絞り込まれる。そうじゃないとあんま意味ない。

完成コード
以下を functions.php
にコピペするだけでとりあえず使える。
解説
↓を魔改造した。
上記記事では、親ページIDを静的に記述したり、深い階層の親ページを取得できなかったりする問題があったので、その辺を解消。
魔改造ポイント
- 固定ページと、階層をもつカスタム投稿タイプすべてで使える
- 子ページをもつ全ての親ページを自動的に取得しセレクトボックスに表示
- 階層がめっちゃ深くても取得できる
- 絞り込み検索した時にセレクトボックスが選択状態になるように
- 一番上の階層のみの表示もできるように
コードについての解説
「子をもつすべてのページ」オブジェクトを取得し、その一覧をセレクトボックスの選択肢として、選択された親ページのIDをもとに子ページに絞り込んで表示するというもの。
まず悩ましいのは、has_children()
みたいな子どもがいるかチェックする関数がないこと。なので、力技で自作。
それを使って子どもを持つページのみの一覧が取得できたら、セレクトボックスを作成して、アクションフック restrict_manage_posts
に引っかける。これでGETパラメータに選択したページのIDを送ることができるようになった。
ちなみに、セレクトボックスのページタイトルで階層を表現しているが、これは get_post_ancestors
で先祖の数を取得して、その数だけダッシュ記号を反復表示させている。
あとは、そのGETパラメータから取得したIDをもとに、MySQLの問い合わせ文を変更し絞り込めばOK。
問い合わせ分文の変更は、フィルターフック posts_where
に引っかける。以上。
暇があったらプラグイン化するから使ってね!