WooCommerce移除插件过滤器无效,自定义函数重复显示求助
解决WooCommerce中remove_filter无法移除原插件函数的问题
问题根源
remove_filter 失效的核心原因几乎都是执行时机过早:你的移除代码在原插件完成add_filter注册之前就运行了,此时系统还没找到要移除的目标函数,自然不会生效。
解决方案
方法1:延迟执行remove_filter(最常用有效)
利用plugins_loaded钩子,设置比原插件更高的优先级(确保在原插件加载完成后执行移除操作):
// 延迟到所有插件加载完成后再移除原filter add_action('plugins_loaded', 'remove_original_shipping_filter', 20); function remove_original_shipping_filter() { // 必须和原add_filter的优先级、参数数量完全匹配 remove_filter( 'woocommerce_get_order_item_totals', 'aspwc_split_package_total_rows', 10, 3 ); } // 注册你的自定义替换函数 add_filter( 'woocommerce_get_order_item_totals', 'custom_split_package_total_rows', 10, 3 ); function custom_split_package_total_rows( $total_rows, $order, $tax_display ) { if ( get_option( 'advanced_shipping_packages_display_separately', 'no' ) != 'yes' ) { return $total_rows; } /** @var WC_Order $order */ $shipping_items = $order->get_items( 'shipping' ); $key_position = array_search( 'shipping', array_keys( $total_rows ) ); $new_shipping_rows = array(); foreach ( $shipping_items as $item ) { $package_name = $item->get_meta( 'package_name' ) ?: str_replace( ':', '', __( 'Shipping:', 'woocommerce' ) ); $new_shipping_rows[ 'shipping_' . $item->get_id() ] = array( 'label' => $package_name . ': ', 'value' => aspwc_get_shipping_to_display( $item, $order, $tax_display ) . '<br/><strong>via ' . $item->get_name() . '</strong><br/><small>' . $item->get_meta( 'Items' ) . '</small>', ); } if ( ! empty( $new_shipping_rows ) ) { unset( $total_rows['shipping'] ); } array_splice( $total_rows, $key_position, 0, $new_shipping_rows ); return $total_rows; }
方法2:验证原filter的注册状态(排查问题用)
如果方法1无效,可以打印当前钩子的所有回调函数,确认原函数是否已注册:
add_action('woocommerce_get_order_item_totals', 'check_filter_callbacks', 1); function check_filter_callbacks() { global $wp_filter; var_dump($wp_filter['woocommerce_get_order_item_totals']); exit; }
通过输出结果,你可以看到原函数aspwc_split_package_total_rows的注册优先级、参数数量等信息,确保remove_filter的参数完全匹配。
关键注意事项
remove_filter的优先级和参数数量必须与原add_filter完全一致(原代码中是优先级10,3个参数);- 如果原插件是在其他钩子(比如
init)中注册的filter,你可以将plugins_loaded替换为对应钩子,并设置更高的优先级(如20)。
内容的提问来源于stack exchange,提问作者JapeNZ
相关产品推荐
相关产品推荐

