WordPress 管理画面の固定ページ一覧を、子ページに絞りこんで表示させる

2018-05-29

何が言いたいのか分からねーと思うが。要は、固定ページが何千ページもあって階層がたくさんある時に、一覧からページを探すのがしんどいので、親ページを指定してその子ページだけを表示させる、というものを実現したい。

やりたいこと

絞り込み検索に、こんなセレクトボックス↓を追加して、選択した親ページの子ページのみを表示させたい。

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

「テスト親」という名前のページを選択してみた。このように、選択したページの子ページに絞られて表示される。素晴らしい!←

ちなみに、孫ページは表示されない。あくまで子ページ(直近の子孫)に絞り込まれる。そうじゃないとあんま意味ない。

完成コード

以下を functions.php にコピペするだけでとりあえず使える。

解説

↓を魔改造した。

上記記事では、親ページIDを静的に記述したり、深い階層の親ページを取得できなかったりする問題があったので、その辺を解消。

魔改造ポイント

  • 固定ページと、階層をもつカスタム投稿タイプすべてで使える
  • 子ページをもつ全ての親ページを自動的に取得しセレクトボックスに表示
  • 階層がめっちゃ深くても取得できる
  • 絞り込み検索した時にセレクトボックスが選択状態になるように
  • 一番上の階層のみの表示もできるように

コードについての解説

「子をもつすべてのページ」オブジェクトを取得し、その一覧をセレクトボックスの選択肢として、選択された親ページのIDをもとに子ページに絞り込んで表示するというもの。

まず悩ましいのは、has_children() みたいな子どもがいるかチェックする関数がないこと。なので、力技で自作。

それを使って子どもを持つページのみの一覧が取得できたら、セレクトボックスを作成して、アクションフック restrict_manage_posts に引っかける。これでGETパラメータに選択したページのIDを送ることができるようになった。

ちなみに、セレクトボックスのページタイトルで階層を表現しているが、これは get_post_ancestors で先祖の数を取得して、その数だけダッシュ記号を反復表示させている。

あとは、そのGETパラメータから取得したIDをもとに、MySQLの問い合わせ文を変更し絞り込めばOK。

問い合わせ分文の変更は、フィルターフック posts_where に引っかける。以上。

暇があったらプラグイン化するから使ってね!

参考文献