使用Add_Filter修改类的公共函数

时间:2021-04-27 作者:Chris Pink

我想修改一个类,特别是创建XML对象以通过Xero API发送的公共函数。类的公共函数中有过滤器return apply_filters( \'woocommerce_xero_invoice_to_xml\', $xml, $this ); 但是$这是一个特定于创建类的关键字,所以

add_filter(\'woocommerce_xero_invoice_to_xml\', \'modify_xero_invoice\');

function modify_xero_invoice($xml, $this) {
  //construct the XML
}
我不明白$this 这显然在原始函数中被多次使用。

如何正确使用此过滤器?

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

这意味着类的实例正在传递给过滤器回调。如果类实例包含您可能希望在过滤器中重复使用的属性和方法,这可能很有用。以类为例:

class MyClass {
    public function complicated_process( $value ) {
        // Do something complex with $value.

        return $value;
    }

    public function filterable_process( $raw_value ) {
        $value = $this->complicated_process( $raw_value );

        return apply_filters( \'my_class_filter\', $value, $raw_value, $this );
    }
}
这个类有一个方法,filterable_process() 它接受原始值,使用另一种方法(complicated_process()) 以某种方式更改它,然后返回已处理的值。但是,它还有一个WordPress过滤器,允许您修改返回值。我们可以使用这样的过滤器来添加1 返回值:

add_filter(
    \'my_class_filter\',
    function( $value ) {
        return $value + 1;
    }
);
但是如果我们想添加1 对于原始值,将运行复杂的进程。仅通过筛选$value, 因为它已经被处理过了。然而,在本例中,过滤器还将原始值传递给回调函数,以及MyClass ($this). 这允许我们使用complicated_process() 方法,因为我们可以访问原始类实例:

add_filter(
    \'my_class_filter\',
    function( $value, $raw_value, $my_class ) {
        $value = $raw_value + 1;
        $value = $my_class->complicated_process( $raw_value );

        return $value;
    },
    10,
    3
);
请注意,自$this 是一个保留变量,我在回调函数中接受了类实例,并使用代表该类的变量名。

因此,在您的示例中woocommerce_xero_invoice_to_xml 过滤器传递可以过滤的XML,如下所示$xml, 但它也传递了可能产生XML的类的实例。这取决于类外的细节(这些细节是第三方的,因此与主题无关),在过滤XML时可能很有用。你只需要给它一个不同的变量名$this.

相关推荐

Search with filters

我想在搜索表单中创建三个过滤器,其中包括三个不同的过滤器(标签、类别和帖子)。是否可以创建这些过滤器?如果可能的话,意味着我如何创建它?基本上,我不擅长PHP。所以,请帮我解决这个问题。谢谢