Blog

ブログ

【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ページの子孫ページです';
}
?>

やってみた感想

ネットで調べてみると、直接の親ページだけを判定するコードはたくさん見つかるのですが、親の親のそのまた親まで判定してくれるものはなかなか見つかりません。いつも調べはじめてから「あ、これ違う」「あ、これも違う」と、結局、自分で書くパターンになる気が・・・。固定ページの階層が深いときはぜひこちらのコードを参考にしてください。

Web Designer / Developer

前田 大地

沼津高専中退。デザイン会社、システム開発会社を経てセブンシックスを設立。マーケティング、デザイン、テクノロジーに精通するオールラウンダーとして、県内の中小企業に向けた戦略型ホームページ制作を開始。一方で、都内の広告代理店からの要請で大企業案件にも多数参加。企業が本当に必要とするホームページ制作とは何か、を日々探求している。

Blog top