Blog スタッフブログ

WEB制作

[WordPress] 親ページ配下(子・孫ページ)をまとめて判定する方法

固定ページをテンプレート内で処理を分けようとしたとき、is_page(‘about’) || is_page(‘company’) || … のように 1ページずつ指定していくと複雑になり管理が難しくなります。

  • 特定ページ配下は全部同じヘッダーやサイドメニューを出したい
  • パンくず・グロナビの「現在地」判定を親単位でやりたい
  • テンプレート分岐を “親ページ基準” にして、保守をラクにしたい

時など

そこで今回は、親ページを1つ指定するだけで、その下層(子・孫…)もまとめて判定できるようにする、functions.php カスタマイズをご紹介します。

■手順

1.functions.php に判定用関数を追加

以下を functions.php に追加します。

/**
 * 親ページ配下(子・孫…)かどうかを判定するヘルパー
 *
 * @param int|string $parent 親ページのID または スラッグ
 * @param bool $include_parent 親ページ自身も true に含めるか(デフォルト true)
 * @return bool
 */
function is_tree_page($parent, $include_parent = true) {
  if (!is_page()) return false;

  // 親IDを確定(ID or slug対応)
  $parent_id = 0;
  if (is_int($parent) || ctype_digit((string)$parent)) {
    $parent_id = (int) $parent;
  } else {
    $obj = get_page_by_path($parent);
    if ($obj) $parent_id = (int) $obj->ID;
  }

  if (!$parent_id) return false;

  $current_id = get_queried_object_id();

  // 親ページ自身も含める
  if ($include_parent && $current_id === $parent_id) return true;

  // 現在ページの祖先(親・祖父…)に、指定した親が含まれているか
  $ancestors = get_post_ancestors($current_id);
  return in_array($parent_id, $ancestors, true);
}

2.テンプレート内で使う

例で /service/ 配下をまとめて判定したいような時はこう書きます。

<?php if ( is_tree_page('service') ) : ?>
<?php endif; ?>

serviceの部分は固定ページのスラッグまたはIDを指定します。