我一直在尝试从自己的自定义插件内部将过滤器应用于WooCommerce,但是无论我做什么,该过滤器都不会触发。
在线常见的解决方案不起作用。我尝试过:
我还尝试将过滤器附加到各种操作点(init,plugins_loaded)和各种优先级(10、20、999)。
为了测试,我创建了一个简单的一页插件。过滤器触发时,应写入error_log。该文件位于/wp-content/plugins/plugintest.php
<?php
/*
* Plugin Name: Plugin TEST
* Description: A simple plugin to test
* Version: 1.0
**/
function my_test_get_template( $template, $template_name, $args ) {
error_log('working ...... FILTER .... ');
return $template;
}
error_log('working ... ');
add_filter( 'woocommerce_locate_template', 'my_test_get_template', 20, 3);
然而,过滤器内部的error_log从未写入,输出仅为
[15-Oct-2019 16:20:52 UTC] working ...
我不明白为什么代码不起作用。我知道WooCommerce处于活动状态,并且与我编写的其他代码(扩展了WC_EMAIL类)一样工作。而且我可以毫无问题地过滤“ woocommerce_email_classes”,这也可以工作。但是模板路径不会触发。有什么明显的地方我做错了吗?
答案 0 :(得分:0)
因此,我没有使过滤器正常工作,但找到了解决方法。在电子邮件类中,我没有在路径上应用过滤器,而是添加了一个模板库,该模板库检查主题中是否有文件,如果没有,则使用插件文件。这样可以通过主题覆盖插件模板。
在我添加的自定义WooCommerce电子邮件的构造调用中:
$this->template_base = $this->get_template_path();
调用此函数:
public function get_template_path() {
// are we looking for html or plain?
$template = ($this->get_option( 'email_type' ) == 'html') ? $this->template_html : $this->template_plain;
// path to theme woocommerce file overrides
$theme_path = get_stylesheet_directory() . '/woocommerce/';
//plugin path
$plugin_path = plugin_dir_path( dirname( __FILE__ ) ) . 'templates/';
// if we have a theme file let's use it, otherwise revert to plugin file
$path = (file_exists($theme_path . $template) ) ? $theme_path : $plugin_path;
return $path;
}
现在可以使用。它特定于电子邮件模板路径,但这就是我所需要的。