子页面/子页面是否有默认模板文件?

时间:2012-06-15 作者:timshutes

这似乎是一个非常简单的问题。我正在寻找类似子页面的内容。php或页面子级。php,我可以在主题的子页面上做一些不同的事情。

它们在设计和内容上都非常不同,我不得不使用很多php或CSS。分页子类来完成所有脏活。我在寻找一种更简单的方法。

一个警告-我希望这种情况自动发生,这样我就不必告诉客户“确保在创建子页面时始终选择‘子页面’模板!”这是不稳定的。。

3 个回复
最合适的回答,由SO网友:Pippin 整理而成

子页面没有特定的模板,但您可以使用get_template_part() 作用

首先创建一个名为“content child.php”的文件。

然后创建一个名为“content.php”的文件。

接下来,在页面内部。php,放置此:

if( $post->post_parent !== 0 ) {
    get_template_part(\'content\', \'child\');
} else {
    get_template_part(\'content\');
}
您希望在子页面上显示的任何内容都将放置在内容子页面中。php。您希望在非子页面上显示的任何内容都将放置在内容中。php。

SO网友:OzzyCzech

实际上很容易,将以下代码添加到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

SO网友:comtyler

我对上述Ozzychech解决方案的修改。此函数在主题的根目录中查找名称包含父级slug或父级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\' );

结束