如何指示WordPress加载自定义帖子类型的自定义模板

时间:2020-04-09 作者:Jop

我创建了一个插件,该插件创建了一种新的产品类型,称为exploded。对于此产品类型,如果产品与我的产品类型相同,我希望创建一个全新的产品页面。

我尝试了{product type}-add-to-cart过滤器,但这只适用于按钮部分。

我可以替换单个产品文件的内容吗?产品类型是否相等?

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

为了将来的观众,添加此通知。

以下答案假设任何人都具备以下知识

php和基本调试知识:如何var_dump()print_r()Hooks, 何时以及如何正确使用它们,您可以轻松地修改主题文件功能。php有关插件相关开发,请参阅Plugin Handbook您可能需要创建自己的single-product.php 并放入your-theme/woocommerce/single-product.php;

在同一文件夹中再准备两个文件,content-single-exploded.phpcontent-single-other.php 并放置在的同一文件夹中single-product.php如果要控制模板文件中的逻辑single-product.php在模板文件中,可以执行以下操作,这将有助于选择要包含的不同模板文件。

在您的single-product.php, 这里有一个简化的版本来说明这个概念。

// ...
<?php

if( $product->get_type() === \'exploded\' ) {
wc_get_template_part( \'content\', \'single-exploded\' );
} else {
wc_get_template_part( \'content\', \'single-other\' );
}
// ...
?>
方法2(主题或插件)如果要控制插件中的模板,可以使用过滤器template_include 然后做你需要的检查。

您可以将以下代码放入主题函数中。php或您的插件,并尝试加载单个产品页面。

* It is NOT necessary to add the following code inside any action.

// you can use this filter to control the template path and use the plugin template
add_filter( \'template_include\', \'q363767_tweak_template\' );
function q363767_tweak_template( $template ) {
    if( preg_match( \'/single-product.php/\', $template ) ) {
        // do the tweaking and update the path to single-product-explode.php with plugin directory
        // you may do var_dump here to see what is $template eg.
        // var_dump( $template );
        // $template = \'your-template-path\';
    }

    return $template;
}
由于答案是针对模板文件的,因此这种方式将无法按预期工作:

function your_function() {
// not necessary to put the code here 
// XXX
// copy the above code here and run -> will NOT work
// XXX
}
add_action(\'woocommerce_before_single_product\',\'your_function\'); 
因为woocommerce_before_single_product 不是用于控制整个模板,也不是必需的。

相关推荐