这里有很多基本的错误,表明人们对过滤器是什么以及它们是如何工作的存在误解。
过滤器是拦截和修改值的一种方式。例如:
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
是通过过滤器的,这一行是不必要的,只需重用它已经获取的跟踪项即可。