如何将另一个插件的过滤器应用于woocommerce?

时间:2019-10-15 16:29:08

标签: php wordpress woocommerce

我一直在尝试从自己的自定义插件内部将过滤器应用于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”,这也可以工作。但是模板路径不会触发。有什么明显的地方我做错了吗?

1 个答案:

答案 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;       

}

现在可以使用。它特定于电子邮件模板路径,但这就是我所需要的。