2025年の最適解!固定ページの親子関係を判定する安全なコード
現代のWordPressテーマ開発において、固定ページの親子関係を判定する場合、最も安全で確実なのは、WordPressコアに用意されている関数を利用することです。判定に使うべきコア関数:is_page() と get_post_ancestors()
固定ページの親子関係を判定するのに、わざわざオリジナルの関数をfunctions.phpに記述する必要はありません。既存の便利な関数を組み合わせれば、遥かにシンプルに実現できます。以下のコードは、ある固定ページが特定の親ページのスラッグ(またはID)を持っているかどうかを判定し、trueまたはfalseを返すベストプラクティスです。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
/ * 現在の固定ページが特定の親ページの子孫であるかを判定する * * @param string|int $parent_slug_or_id 親ページのIDまたはスラッグ * @return bool 子孫であればtrue、そうでなければfalse */ function is_descendant_of_parent($parent_slug_or_id) { // 1. まず、現在のページが固定ページかどうかをチェックする if (!is_page()) { return false; } // 2. 親ページのIDを取得する if (is_numeric($parent_slug_or_id)) { // IDが渡された場合 $parent_id = (int) $parent_slug_or_id; } else { // スラッグが渡された場合、オブジェクトを取得してIDを取り出す $parent_page = get_page_by_path($parent_slug_or_id); if (!$parent_page) { return false; // 指定された親ページが存在しない } $parent_id = $parent_page->ID; } // 3. 現在のページの先祖(祖先)IDの配列を取得する global $post; $ancestors = get_post_ancestors($post); // 4. 先祖配列の中に親ページのIDが含まれているかチェックする // `in_array`関数を使うことで、ループ処理を回避し、高速に判定できる if (in_array($parent_id, $ancestors)) { return true; } return false; } |
なぜこのコードが優れているのか?
このリライトしたコードは、元のコードが抱えていた問題をスマートに解決しています。①is_page() による安全性の確保
最初に、is_page()を実行することで、そもそも固定ページでなければ即座に false を返し、余計な処理をスキップしています。これは堅牢性を高める上で非常に重要です。②get_post_ancestors() の活用
投稿(固定ページを含む)の先祖IDの配列を一発で取得するコア関数get_post_ancestors()を利用しています。元のコードのように自分でループを回す必要がなく、簡潔で高速な処理を実現しました。③効率的な in_array()
配列の中に目的のIDが含まれているかを判定するのに、PHP標準のin_array()関数を使用。これにより、コードがスッキリし、読みやすく、デバッグしやすいものになっていますね。functions.phpへの実装方法と実践的な活用事例
リライト後の関数を、実際にテーマの functions.php に記述すれば、WordPress全体でどこからでも呼び出しが可能になります。|
1 2 3 4 5 6 7 8 9 10 |
// スラッグが 'company' の親ページ配下にあるかを判定する if (is_descendant_of_parent('company')) { echo '<body class="is-company-sub">'; // 特定のCSSクラスを追加 } // IDが '10' の親ページ配下にあるかを判定する if (is_descendant_of_parent(10)) { // 特定のサイドバーウィジェットを呼び出す処理 dynamic_sidebar('company-sidebar'); } |
応用事例:サイドバーの表示切り替え
例えば、親ページが「サービス(services)」で、その子ページが「プランA」「プランB」とある場合を想定しましょう。「サービス」配下のページにいるときだけ、特別なサイドバーを表示したい場合は、以下のように記述するのが定石です。
|
1 2 3 4 5 6 7 8 9 10 |
// 現在のページが「services」の子孫、または「services」ページ自身であるか <?php if (is_descendant_of_parent('services') || is_page('services')) : ?> <aside id="service-menu" class="widget-area"> <p>サービス関連コンテンツ</p> </aside> <?php endif; ?> |
注意点:固定ページ以外の判定
この関数は、あくまで「固定ページ (Page)」での利用を想定しています。カスタム投稿タイプ(Custom Post Type)で親子関係を判定したい場合は、
get_post_ancestors() はそのまま使えますが、is_page() の代わりに is_singular('カスタム投稿タイプ名') でチェックするなど、適宜修正が必要になります。


コメント