【WordPress】スラッグを指定してその子孫ページかどうかを判別する条件分岐
前田 大地
WordPressのテーマファイルを作るとき、現在のページが特定のページの子孫ページかを判定するための条件分岐がほしいときがたまにあります。
例えば、現在表示されているページに合わせてグローバルナビゲーションの色を変えたいとき。祖先ページのスラッグが「service」だったら、グロナビの「service」という項目にclassをつけて色を変える、みたいなやつ。
固定ページの階層が浅ければそのまま$post->post_parent
を使って親ページを直接判定すればいいんですけど、階層が深くなってくると、親ページの親ページ、そのまた親ページ、と、どんどんややこしくなるため、判定用の関数を用意したほうが楽です。
私は、固定ページの階層が深くなるような構造のサイトはあまり作らないので、このような条件分岐が必要になったとき、なんかいつも同じようなことを調べてるなあと思い、備忘録として記事にすることにしました。
functions.php
判定用の関数は以下です。functions.phpに書きます。
function is_ancestor_slug( $slug ) { global $post; if ( $post ) { $current_post = $post; while ( $current_post->post_parent ) { $parent = get_post( $current_post->post_parent ); if ( $parent && $parent->post_name === $slug ) { return true; } $current_post = $parent; } } return false; }
現在のページから親を順々に辿っていくので、階層がどんなに深くなっても大丈夫です。
テーマファイル
テーマファイル内でふつうの条件分岐タグみたいな感じで使います。関数に祖先ページのスラッグを渡すと、子孫ページかどうかをtrue / falseで返してくれます。
<?php if ( is_ancestor_slug('service') ) { echo 'このページは、serviceページの子孫ページです'; } ?>
やってみた感想
ネットで調べてみると、直接の親ページだけを判定するコードはたくさん見つかるのですが、親の親のそのまた親まで判定してくれるものはなかなか見つかりません。いつも調べはじめてから「あ、これ違う」「あ、これも違う」と、結局、自分で書くパターンになる気が・・・。固定ページの階層が深いときはぜひこちらのコードを参考にしてください。