Woocommerce - 通过插件覆盖模板

时间:2015-08-21 23:49:59

标签: php wordpress woocommerce

我有一个问题:是否有办法通过插件覆盖WooCommerce的默认模板,就像使用主题一样? 我有这段代码:

Class WoocommerceOverride {

    public function woocommerce_locate_template( $template, $template_name, $template_path ) {
        $plugin_path = SPSL_PLUGIN_PATH;
        global $woocommerce;
        $_template = $template;
        if ( ! $template_path ) $template_path = $woocommerce->template_url;
        $plugin_path .= '/woocommerce/';

  // Look within passed path within the theme - this is priority
        $template = locate_template(
            array(
                $template_path . $template_name,
                $template_name
                )
            );

  // Modification: Get the template from this plugin, if it exists
        if ( ! $template && file_exists( $plugin_path . $template_name ) )
            $template = $plugin_path . $template_name;

  // Use default template
        if ( ! $template )
            $template = $_template;

        //echo $template."<br>";

  // Return what we found
        return $template;
    }

}
add_filter( 'woocommerce_locate_template', array('WoocommerceOverride', 'woocommerce_locate_template'), 10, 3 );

此代码的问题在于它只能部分工作。在一些部件上它起作用,在其他部件上它不起作用。例如,我根本无法自定义archive-product.php。无论我在那里写什么,无论是代码还是纯文本,我都不会得到任何结果。 我将完全相同的模板文件从我的插件文件夹复制到我的主题文件夹中,它可以工作。但是,由于我需要将其作为插件,我无法进入主题路线。

非常感谢。

2 个答案:

答案 0 :(得分:0)

几个月前,我有同样的要求。所以在网上搜索了一下,发现有用的代码帮助了我(根据我的要求进行了一些定制)。

有关详细解释的代码,请检查thisthis链接。该方法可能与您当前使用的方法不同,但它会导致插件中的重写woocommerce模板

答案 1 :(得分:0)

您应该尝试在// Use default template代码之前添加以下代码:

if( $template_name == '{template part name}') {
     $template = $plugin_path . $template_name;
}

在我的情况下,{模板部件名称}为global/quantity-input.php

您可以通过将以下行临时添加到代码中来找到确切的模板部件名称:

print_r($template_name);

我知道现在回答这个问题有点晚了,但也许对其他人很有用。并且请记住woocommerce_locate_template已被描述。因此,可能还有更多的“最新”解决方案。