親要素を指定したページテンプレートを作成する(template_hierarchy)
wordpress4.7の新機能でtemplate_hierarchyというフィルターが追加されていました。
これは読み込むテンプレートを操作できるもので、これは色々おもしろいことができないかなとかんがえていたら
下記の投稿をみつけました。
固定ページで親子関係を作った時にheader内の条件分岐で、子ページすべてに親と同じスタイルシートを追加したい
そういえばページテンプレートで親要素を指定したテンプレートは無いなと思い実装してみることにしました。
functions.phpに
//親要素を指定してテンプレートを読み込む add_filter("page_template_hierarchy","page_chiled_template"); function page_chiled_template(){ $id = get_queried_object_id(); $post = get_post($id); $parent = get_post($post->post_parent); $parent_id = $parent->ID; //親要素のID取得 $parentname = $parent->post_name; //親要素のスラッグ取得 $template = get_page_template_slug(); $pagename = get_query_var('pagename'); if ( ! $pagename && $id ) { // If a static page is set as the front page, $pagename will not be set. Retrieve it from the queried object $post = get_queried_object(); if ( $post ) $pagename = $post->post_name; } $templates = array(); if ( $template && 0 === validate_file( $template ) ) $templates[] = $template; //親要素がある場合page-{parentname}-child.phpを設定 if($parentname){ $parentname_decoded = urldecode( $parentname ); if ( $parentname_decoded !== $parentname ) { $templates[] = "page-{$parentname_decoded}-child.php"; } $templates[] = "page-$parentname-child.php"; } //親要素がある場合page-{id}-child.phpを設定 if ( $parent_id ) $templates[] = "page-$parent_id-child.php"; if ( $pagename ) { $pagename_decoded = urldecode( $pagename ); if ( $pagename_decoded !== $pagename ) { $templates[] = "page-{$pagename_decoded}.php"; } $templates[] = "page-$pagename.php"; } if ( $id ) $templates[] = "page-$id.php"; $templates[] = 'page.php'; return $templates; }
を追加。
parentaという親ページにchild1 child2 child3という固定ページが用意されている場合
page-parenta-child.phpを作成するとchild1 child2 child3に反映されます
優先順位としては
1.固定ページに指定されているテンプレートファイル
2.親ページのページスラッグ+child(page-parent-child.php)
3.親ページのID+child(page-100-child.php)
4.子ページのページスラッグ(page-child1.php)
5.子ページのID(page-200.php)
6.page.php
の順番にしていますが子要素のページテンプレートを優先させたいなら2-3と4-5の位置をずらしてもいいかもしれません。
今回は固定ページ限定で行っていますが、もしカスタム投稿などでページ階層を追加する場合はフィルターのpageの部分を変更してください。