#動機
固定ページは page-$slug.php
みたいな名前を取ったファイルがあれば勝手にテンプレートとして利用されるが、子ページも同じ命名規則が適用されてしまうのだ。
これでは、ファイル名から「子ページなのか親ページなのか」が推測できないので、ページの親子関係をきちんとファイル名で表されるようにしたいよー。
そうすると、いちいち管理画面からテンプレートとして利用するファイルを選ばなきゃいけない… 面倒だしメンテナンス的にも宜しくないと思うので、子ページの命名規則を決めて、勝手にインクルードしてくれるようにしたいところですね!
#子ページの命名規則
普通の子ページ
page-$parent-slug__$child-slug.php
子ページの子ページの子......... の場合
page-$parent-slug__$child-slug__$child-slug.php
例:
company (page-company.php)
└── recruit (page-company__recruit.php)
├── designer (page-company__recruit__designer.php)
└── developer (page-company__recruit__developer.php)
├── backend (page-company__recruit__developer__backend.php)
└── frontend (page-company__recruit__developer__frontend.php)
#やり方
page.php
を開いて、以下を記入。
page.php
<?php namespace Page;
function get_parents( $p, $parents = array() ) {
if ( $p->post_parent ) {
$parent = \get_post( $p->post_parent );
array_unshift( $parents, urldecode( $parent->post_name ) );
return get_parents( $parent, $parents );
}
return $parents;
}
$parents = get_parents( $GLOBALS['post'] );
if ( count( $parents ) ) {
$template_name = 'page-' . implode( '__', $parents ) . '__' . urldecode( $GLOBALS['post']->post_name );
\get_template_part( $template_name );
}
#Bladeテンプレートエンジンを使っている場合
page.php
<?php namespace Page;
function get_parents( $p, $parents = array() ) {
if ( $p->post_parent ) {
$parent = \get_post( $p->post_parent );
array_unshift( $parents, urldecode( $parent->post_name ) );
return get_parents( $parent, $parents );
}
return $parents;
}
$parents = get_parents( $GLOBALS['post'] );
$template_name = false;
if ( count( $parents ) ) {
$template_name = 'page-' . implode( '__', $parents ) . '__' . urldecode( $GLOBALS['post']->post_name );
}
?>
@if($template_name)
@include($template_name)
@endif
ちなみに、Bladeを知らない人はこちらのBlade紹介記事をどうぞ!