web-dev-qa-db-ja.com

子ページ/サブページ用のデフォルトのテンプレートファイルはありますか?

これはとても単純な質問のようです。私はsub-page.phpやpage-child.phpのようなものを探しています。そこでは私のテーマの子ページでいくつかの異なることができます。

それらはデザインと内容において十分に異なっているので、私はすべての汚い仕事をするために私は多くのphpかCSS .page-childクラスを使わなければなりません。もっと簡単な方法を探しています。

注意点 - これは自動的に行われるので、クライアントに「サブページを作成するときは必ず「サブページ」テンプレートを必ず選択してください」と伝える必要はありません。これは不安定です。

4
timshutes

子ページ専用のテンプレートはありませんが、 get_template_part() 関数を使用すると、これを簡単に実行できます。

最初に "content-child.php"というファイルを作成してください。

次に "content.php"というファイルを作ります。

次に、page.phpの中に、これを配置します。

if( $post->post_parent !== 0 ) {
    get_template_part('content', 'child');
} else {
    get_template_part('content');
}

子ページに表示したいものはすべてcontent-child.phpの内側に配置されます。子ページ以外に表示したいものはすべてcontent.phpに配置されます。

13
Pippin

それは実際には非常に簡単です、あなたのfunctions.phpにフォローコードを追加してください

add_filter(
    'page_template',
    function ($template) {
        global $post;

        if ($post->post_parent) {

            // get top level parent page
            $parent = get_post(
               reset(array_reverse(get_post_ancestors($post->ID)))
            );

            // or ...
            // when you need closest parent post instead
            // $parent = get_post($post->post_parent);

            $child_template = locate_template(
                [
                    $parent->post_name . '/page-' . $post->post_name . '.php',
                    $parent->post_name . '/page-' . $post->ID . '.php',
                    $parent->post_name . '/page.php',
                ]
            );

            if ($child_template) return $child_template;
        }
        return $template;
    }
);

その後、以下のパターンでテンプレートを準備することができます。

  • [parent-page-slug]/page.php
  • [parent-page-slug]/page-[child-page-slug].php
  • [parent-page-slug]/page-[child-post-id].php
9
OzzyCzech

上記のOzzyCzechのソリューションを修正したものです。この関数は、テーマのルートディレクトリで、名前が親のスラッグまたは親のIDを含むファイルを探します。

  • /theme_root/child-PARENT_SLUG.php
  • /theme_root/child-PARENT_ID.php
function child_templates($template) {
    global $post;

    if ($post->post_parent) {
        // get top level parent page
        $parent = get_post(
            reset(array_reverse(get_post_ancestors($post->ID)))
        );

        // find the child template based on parent's slug or ID
        $child_template = locate_template(
            [
                'child-' . $parent->post_name . '.php',
                'child-' . $parent->ID . '.php',
                'child.php',
            ]
        );

        if ($child_template) return $child_template;
    }

    return $template;
}
add_filter( 'page_template', 'child_templates' );
0
comtyler