我一直在做一些研究,WC Bookings团队在实例化一个类时没有将其分配给变量,这似乎是一种不好的做法。
但在这种情况下,知道这一点对我没有帮助。
幸运的是,我能够找到this comment 来自@MikeSchinkel,他在那里教授并演示了如何删除匿名对象过滤器的函数。
这就是我在我的案例中实现它的方式。首先,Mike评论中的原始功能:
if ( ! function_exists( \'remove_anonymous_object_filter\' ) ) {
/**
* Remove an anonymous object filter.
*
* @param string $tag Hook name.
* @param string $class Class name
* @param string $method Method name
*
* @return void
*
*/
function remove_anonymous_object_filter( $tag, $class, $method ) {
$filters = false;
if ( isset( $GLOBALS[\'wp_filter\'][$tag] ) )
$filters = $GLOBALS[\'wp_filter\'][$tag];
if ( $filters )
foreach ( $filters as $priority => $filter ) {
foreach ( $filter as $identifier => $function ) {
if ( ! is_array( $function ) )
continue;
if ( ! $function[\'function\'][0] instanceof $class )
continue;
if ( $method == $function[\'function\'][1] ) {
remove_filter( $tag, array( $function[\'function\'][0], $method ), $priority );
}
}
}
}
}
最后,调用移除过滤器:
add_filter( \'woocommerce_payment_complete_order_status\', \'unhook_booking_complete_order\', 0 );
function unhook_booking_complete_order($status) {
remove_anonymous_object_filter( \'woocommerce_payment_complete_order_status\', \'WC_Booking_Order_Manager\', \'complete_order\' );
return $status;
}
基本上,我们正在过滤
woocommerce_payment_complete_order_status
再次以更高的优先级手动移除过滤器(使用
remove_anonymous_object_filter
函数)基于其挂钩、类名和方法。
所有这些都归功于Mike和启发他的代码的原始答案。