10
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

WordPressで「子ページ」のデフォルトテンプレートファイルを設定する

Last updated at Posted at 2015-04-30

#動機
固定ページは 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紹介記事をどうぞ!

10
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?