使用带有多个参数和$this的筛选器

时间:2019-10-21 作者:wickywills

我已经看到了关于这一点的各种问题,但我不确定如何在这种特殊情况下应用这些方法。

我正在尝试向插件添加一个过滤器,该插件返回的输出带有apply_filters 挂钩:

public function get_shipment_tracking_column( $order_id ) {
        ob_start();

        $tracking_items = $this->get_tracking_items( $order_id );

        if ( count( $tracking_items ) > 0 ) {
            echo \'<ul>\';

            foreach ( $tracking_items as $tracking_item ) {
                $formatted = $this->get_formatted_tracking_item( $order_id, $tracking_item );
                printf(
                    \'<li><a href="%s" target="_blank">%s</a></li>\',
                    esc_url( $formatted[\'formatted_tracking_link\'] ),
                    esc_html( $tracking_item[\'tracking_number\'] )
                );
            }
            echo \'</ul>\';
        } else {
            echo \'–\';
        }

        return apply_filters( \'woocommerce_shipment_tracking_get_shipment_tracking_column\', ob_get_clean(), $order_id, $tracking_items );
    }
在我的特殊情况下,我需要更改<a> 标记,因此我尝试了以下方法:

add_filter(\'woocommerce_shipment_tracking_get_shipment_tracking_column\', \'woocommerce_shipment_tracking_get_shipment_tracking_column_custom\', 10, 2);
function woocommerce_shipment_tracking_get_shipment_tracking_column_custom($order_id, $tracking_items){
    $tracking_items = $this->get_tracking_items( $order_id );

    if ( count( $tracking_items ) > 0 ) {
        echo \'<ul>\';

        foreach ( $tracking_items as $tracking_item ) {
            $formatted = $this->get_formatted_tracking_item( $order_id, $tracking_item );
            printf(
                \'<li><a href="%s" target="_blank">%s</a></li>\',
                esc_url( $formatted[\'formatted_tracking_link\'] ),
                \'MY NEW TEXT\'
            );
        }
        echo \'</ul>\';
    } else {
        echo \'–\';
    }
}
请注意“我的新文本”。如果我删除函数中的所有内容echo "something", 我真的需要输出特定于订单的信息。如果我不能使用$this.

那么我的问题是,我如何正确使用add_filters 在这种情况下,是否可以使用$this 在my函数中,获取最初发送到此过滤器的订单数据

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

这里有很多基本的错误,表明人们对过滤器是什么以及它们是如何工作的存在误解。

过滤器是拦截和修改值的一种方式。例如:

add_filter( \'my_number\', function( $value ) {
 return $value + 1;
} );
$stuff = apply_filters( \'my_number\' , 5 );
echo $stuff; // outputs 6
这里,我们有数字5,我们给其他代码修改它的机会。请注意所添加的过滤器,它将每个值加1。我们要修改的值作为第一个值传入,这是唯一绝对必要的。然后我们修改它并返回新值。

过滤器可以传递额外的参数,但这些只是额外的信息。它们不能修改,完全是可选的。

$final_result = apply_filters( \'filter name\', $thing_to_be_filtered, $other_parameters_that_are_all_optional, etc.. );
您的代码不执行以下操作:

您的代码没有返回值作为替换,因此PHP将返回null 或空值,又名return \'\';你的代码调用echo 由于没有输出缓冲区,因此输出将直接发送到浏览器,而无需经过适当的过程。出于某种原因,您忽略了第一个值,并将其重命名为$object_id, 第二个值,因此您的所有参数都被关闭了一个。正在筛选的值是HTML,这就是它调用ob_get_clean() 获取发送到输出的HTML的值。这是要筛选的内容,而不是订单ID。对于正在使用的筛选器,您有两个选项可以更改锚定标记:

修改作为第一个值传递的字符串忽略要筛选的值并从头生成一个新值。看起来您试图执行第二个操作,但函数参数错误,没有返回任何内容。我建议使用后一种方法,因为修改HTML字符串既不容易也不可靠。

最后,这里有一个bug:

            $formatted = $this->get_formatted_tracking_item( $order_id, $tracking_item );
$this 只能在对象内部使用,但这是一个标准PHP函数,不是对象。此行将导致PHP致命错误。您需要找到通过WooCommerce支持生成此链接的替代方法。这种bug意味着在PHP/通用编程中函数和对象如何工作的基本原理上存在一些差距,复习一下应该会使所有这些都更加清晰/容易

这里也犯了同样的错误:

$tracking_items = $this->get_tracking_items( $order_id );
然而,自$tracking_items 是通过过滤器的,这一行是不必要的,只需重用它已经获取的跟踪项即可。

相关推荐

wordpress hooks

我目前正在使用woocommerce主题,Hotel(https://woocommerce.com/products/hotel/).我最近刚刚创建了一个主页和一个博客页面,其解释方式如下:https://www.wpbeginner.com/wp-tutorials/how-to-create-a-separate-page-for-blog-posts-in-wordpress/现在我想做的是:创建一个带有固定元素的主页,这些元素永远不会改变(如照片),然后添加一些动态元素(如博客中的帖子)……假设