根据父级自动设置页面模板

时间:2012-08-28 作者:alme1304

正如标题所暗示的,我正在尝试将X parent下的每个新页面设置为特定的页面模板。通过函数/插件/代码

例如:如果我制作了一个“swiss cheese”页面,即“chesses”页面的子页面,wp将自动为其分配“cheese”页面模板

2 个回复
SO网友:kaiser

在管理方面,您可以通过编程方式更新page-post\\u类型的元数据:

global $post;
if ( 
    \'swiss_cheese\' === $post->post_parent 
    AND is_admin()
)
    update_post_meta( $post->ID, \'_wp_page_template\', \'some_template.php\' );
在面向访问者的一侧,您只需跳转到模板重定向:

function wpse63267_template_include( $template )
{
    global $post;

    if ( \'swiss_cheese\' === $post->post_parent )
    {
        $new_template = locate_template( array( \'swiss-cheese-template.php\' ) );
        if ( ! empty( $new_template ) ) {
            return $new_template ;
        }
    }
    return $template;
}
add_filter( \'template_include\', \'wpse63267_template_include\', 99 );

SO网友:honk31

我将kaiser的解决方案与我在网上找到的其他解决方案相结合,使其更具动态性和防弹性。

此外,在wp codex中还提到:使用template\\u redirect action hook加载不同的模板不是一个好方法。如果包含另一个模板,然后使用exit()(或die()),则不会运行后续的template\\u重定向挂钩。。。

我让这一切充满活力。您可以说:第X页的子级使用模板Zset 在管理界面中为第X页的子项创建模板,然后使用此模板(正好用于该子项)。

下面是一个解决方案(如果第X页的子项重定向到…)

function jnz_is_child( $pid ) {
    global $post;
    $ancestors = get_post_ancestors( $post->$pid );
    $root = count( $ancestors ) - 1;
    $parent = $ancestors[$root];
    if( is_page() && ( $post->post_parent === $pid || in_array( $pid, $ancestors ) ) ) {
        return true;
    } else {
        return false;
    }
};
function wpse140605_template_redirect( $template ) {
    if ( $template === locate_template(\'page.php\') ) { // if template is not set in admin interface
        if ( jnz_is_child( 656 ) || jnz_is_child( 989 ) ) {
            $new_template = locate_template( array( \'page-whatever.php\' ) ); // if template file exist
            if ( \'\' != $new_template ) {
                return $new_template ;
            }
        }
    }
    return $template;
};
add_filter( \'template_include\', \'wpse140605_template_redirect\', 99 );
所以基本上在第一个函数中jnz_is_child(), 我检查页面是否是第X页的子级(甚至是X的子级…)按页面ID。

在第二个函数中wpse140605_template_redirect() 我做替换(如果是父页面=== 656=== 989: 使用模板page-whatever.php). 当然,第二个函数可以包含多个if / else if 闭包,再加上此函数检查模板文件是否存在。因为如果它不存在,php将抛出一个错误。

第一个函数也可以在主题内的任何其他地方使用(如is_page() 等等)。

这里是另一个if子变量,其中甚至选择了当前元素(is\\u page和is\\u child的组合):

function jnz_is_child( $pid ) {
  global $post;
    $ancestors = get_post_ancestors( $post->$pid );
    if( is_page() && ( is_page( $pid ) || $post->post_parent === $pid || in_array( $pid, $ancestors ) ) ) {
      return true;
    } else {
      return false;
    }
};

结束

相关推荐

Exclude pages by menu order

我有一个“默认页面生成器”的主题激活我已经创建在该文件中,我为每页设置了“menu\\u order”。i want to exclude pages with menu order bigger then 50 from the default wp_list_pages menu是否有方法检查/检索每页的“menu\\u order”?如果有,您能想出一种方法将其集成到wp\\u list\\u pages函数中吗?