Facebook にシェア
[`evernote` not found]
LINEで送る

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の部分を変更してください。