通过unctions.php覆盖CPT模板文件

时间:2017-10-19 作者:Ben Calhoun

好的,我正在尝试重写CPT模板文件。问题是,我正在处理的主题是以一种奇怪的方式设置的(或者至少是以一种我不太清楚的方式设置的),并且希望提取单个cpt的模板文件。php,无论我做什么。即使我为帖子指定了模板部分,单个cpt也会覆盖我选择的模板。

好吧,我开始在函数中重写这个模板。php。经过多次搜寻和反复试验,我发现:

function is_post_type($type){
global $wp_query;
if($type == get_post_type($wp_query->post->ID)) return true;
return false;
}

function template_override() {
  if (is_single() && is_post_type(\'portfolio\')){
  return locate_template(\'template-portfolio.php\');
  }
  if (is_single() && is_post_type(\'product\')){
  return locate_template(\'woocommerce.php\');
  }
}

add_filter(\'template_include\', \'template_override\');
这确实有效。。。但它有一个不幸的副作用,就是现在想用这个自定义模板覆盖我的所有页面。这就是为什么我把这个调用添加到一个主题woocommerce模板文件中,因为我起初以为它只是在搞乱帖子。。。但不,事实证明这会弄乱每一页。所以,很明显,我的代码中有些地方搞砸了。。。我就是不知道是什么。我尝试了大约一百万种其他变体来调用此模板文件,这是迄今为止唯一有效的一种。不幸的是,它似乎压倒了一切。

那么,我错过了什么?

1 个回复
最合适的回答,由SO网友:Jacob Peattie 整理而成

你的template_override() 如果不满足条件,函数不会返回任何内容,这将破坏所有不满足条件的内容。您需要通过以下方式传递现有模板:

function wpse_283378_template_override( $template ) {
    // My conditions.

    return $template;
}
add_filter(\'template_include\', \'wpse_283378_template_override\');
此外,is_post_type()template_override() 是非常通用的函数名称,这会增加与其他插件和主题冲突的风险,请在它们前面加上项目特有的名称。

定义is_post_type() 不管怎么说,这个函数是多余的。只需更换is_single() 具有is_singular( \'portfolio\' ):

function wpse_283378_template_override( $template ) {
    if ( is_singular( \'portfolio\' ) ) {
        $new_template = locate_template( \'template-portfolio.php\' );

        if ( $new_template != \'\' ) {
            return $new_template;
        }
    }

    return $template;
}
add_filter(\'template_include\', \'wpse_283378_template_override\');
请注意,在返回模板文件之前,我还检查了模板文件是否存在,这样,如果模板文件不存在,它将返回默认值,而不是给您一个白色屏幕。

结束

相关推荐