You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 17:05:55