【WordPress】固定ページで親子関係を探る

こんにちは!社会人2年目エンジニアの関です!
先日WordPressの開発を行っていたとき、私はあることに気づきました。

「固定ページには親子関係を判定するための関数がない・・・だと・・・!」

そう。私の大好きな「cat_is_ancestor_of」のような関数が、固定ページの場合だとWordPressデフォルトで備わっていなかったのです。
そこで今回は、固定ページの親子関係を判定するための関数を作っていきたいと思います。

固定ページでの親子関係の作り方
WordPressデフォルトの機能として、以前ご紹介したカテゴリー同士での親子関係付けの他に、固定ページでの親子関係付けを行う機能も備わっています。
設定方法はカテゴリのときと同じく、とっても簡単な2ステップのみです。

①子にしたい固定ページの編集画面にアクセスする
②ページ属性>親の入力欄で親にしたい固定ページのタイトルを指定、保存して完了!
※親として選択できる固定ページは「公開中」のもののみです。親子関係付けを行う前に必ず親ページの公開を行ってください。
※カテゴリーのときと同じく、固定ページのURLも階層関係に応じて「親/子/孫/ひ孫/・・・」の形式に変化します。

%e5%9b%ba%e5%ae%9a%e3%83%98%e3%82%9a%e3%83%bc%e3%82%b7%e3%82%99%e3%82%92%e7%b7%a8%e9%9b%86__test01_-_wordpress

親子関係に応じて入力欄の表示や一覧ページの表示が変化するのもなかなか憎いです。

%e3%82%b9%e3%82%af%e3%83%aa%e3%83%bc%e3%83%b3%e3%82%b7%e3%83%a7%e3%83%83%e3%83%88_2016-11-25_9_39_44  

%e5%9b%ba%e5%ae%9a%e3%83%98%e3%82%9a%e3%83%bc%e3%82%b7%e3%82%99__test01_-_wordpress

詳しくは以下の記事をご参照ください。
固定ページの階層化/AdminWeb

親子関係を判定してみる
固定ページに親子関係を付けたところで、実際に親子関係を判定するための関数を実装してみます。

今回目指す仕様は以下の3点です。
①現在表示している固定ページは、指定した固定ページの子孫か否かを判定
②「cat_is_ancestor_of」のようにどんなに関係が離れた子孫(親とひ孫など)でも判定させる
③ページID指定だと開発している環境によって変わってしまう可能性があるのでslug指定

function page_is_ancestor_of($slug){
  // 現在表示しているページ情報を取得
  // get_the_ID()で紹介しているところも多いですが、これでも取得できます
  global $post;
  // 親か判別したい固定ページのslugからページ情報を取得
  $page = get_page_by_path($slug);
  $result = false;
  if(isset($page)){
    // $post->ancestorsで先祖を全て取得した配列(ID配列)を繰り返し処理
    foreach ($post->ancestors as $ancestor) {
      // 表示しているページのIDが含まれていればtrueを返す
      if($ancestor == $page->ID){ $result = true; }
    }
  }
  return $result;
}

これを使って、固定ページ「parent」を先祖に持つか否かを判定させてみると、

// 「parent/children/grandson/great_grandson」のページ
page_is_ancestor_of('parent');
#=> true

// 「sample/other」のページ
page_is_ancestor_of('parent');
#=> false

slug指定するなら親ページのslugと子ページのslugの前方一致でもいいんじゃあ・・・という気がしないでもないですが、とりあえずこれで固定ページの親子関係を判定するための関数ができました。
関連する固定ページの場合にのみ表示させたい項目があるときや、サイドバー・ヘッダー・フッターの出し分けなど、そこそこ必要な場面があると思います。

今回ご紹介した方法はほんの一例なので、他にいい方法をご存知でしたら教えてください。

☆.。:・★.。:*・☆.。:*☆.。:*・★.。:*・☆.。:・★.。:*・☆☆.。:・★.。:*・☆.。:*☆.。:*・★.。:*・☆☆

株式会社リンクバルでは一緒に働くエンジニアを募集中です!
気になった方はコチラまで!

☆.。:・★.。:*・☆.。:*☆.。:*・★.。:*・☆.。:・★.。:*・☆☆.。:・★.。:*・☆.。:*☆.。:*・★.。:*・☆☆