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

咨询WooCommerce购物车页面更新购物车按钮点击后触发的钩子

嘿,针对你想在WooCommerce购物车点击「更新购物车」后运行自定义函数修改总价的需求,我来给你拆解一下关键的钩子和实现方式:

核心钩子推荐

首先,专门对应「更新购物车」按钮点击动作的钩子是 woocommerce_update_cart_action_cart_updated —— 这个钩子会在购物车数量更新完成、系统默认计算完总价之后触发,刚好适合你执行自定义的总价修改逻辑。

另外,如果你的需求是在系统计算总价之前就调整(比如先修改商品价格再让系统计算总价),可以用 woocommerce_before_calculate_totals,但需要额外判断是否是点击了更新购物车按钮(避免其他场景触发)。

具体实现示例

场景1:更新购物车后直接修改总价

比如当购物车商品总数量超过5时,给总价打9折:

add_action( 'woocommerce_update_cart_action_cart_updated', 'custom_adjust_cart_total_after_update' );
function custom_adjust_cart_total_after_update() {
    // 获取当前购物车实例
    $cart = WC()->cart;
    
    // 替换成你的特定条件,比如商品数量、特定商品ID、总金额等
    if ( $cart->get_cart_contents_count() > 5 ) {
        // 获取当前编辑状态的总价(不含税费等额外费用,根据需求调整)
        $current_total = $cart->get_total( 'edit' );
        // 计算新总价,这里打9折
        $new_total = $current_total * 0.9;
        // 设置新的总价
        $cart->set_total( $new_total );
    }
}

场景2:在计算总价前调整商品价格(更灵活)

如果你需要先修改商品单价再让系统自动计算总价,可以用这个方式,同时限制只在点击更新购物车时触发:

add_action( 'woocommerce_before_calculate_totals', 'custom_adjust_prices_before_total_calculation' );
function custom_adjust_prices_before_total_calculation( $cart ) {
    // 防止钩子重复触发导致逻辑混乱
    if ( did_action( 'woocommerce_before_calculate_totals' ) >= 2 ) {
        return;
    }

    // 检查是否是点击了「更新购物车」按钮
    if ( isset( $_POST['update_cart'] ) && $_POST['update_cart'] === __( 'Update cart', 'woocommerce' ) ) {
        // 你的自定义条件,比如某特定商品ID的数量大于3
        $target_product_id = 123;
        $target_quantity = 3;
        $has_target_product = false;

        foreach ( $cart->get_cart() as $cart_item ) {
            if ( $cart_item['product_id'] === $target_product_id && $cart_item['quantity'] > $target_quantity ) {
                $has_target_product = true;
                break;
            }
        }

        // 满足条件时调整所有商品价格
        if ( $has_target_product ) {
            foreach ( $cart->get_cart() as $cart_item ) {
                $product = $cart_item['data'];
                // 保留原价的副本,避免重复修改
                if ( ! $product->get_meta( '_original_price' ) ) {
                    $product->add_meta_data( '_original_price', $product->get_price() );
                }
                $original_price = $product->get_meta( '_original_price' );
                // 打8折
                $product->set_price( $original_price * 0.8 );
            }
        }
    }
}
注意事项
  • 代码可以放在你的主题 functions.php 文件里,或者自定义插件中(更推荐后者,避免主题更新丢失)。
  • 如果涉及税费计算,要确保修改总价后税费会重新计算,set_total() 方法会自动触发相关逻辑,但如果是调整商品价格,woocommerce_before_calculate_totals 会让系统自动重新计算税费和总价。
  • 测试时记得清空缓存,避免旧的购物车数据影响结果。

内容的提问来源于stack exchange,提问作者Manik

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:46:01