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

WooCommerce单个产品页动态定价问题:添加购物车后价格不生效

解决WooCommerce自定义价格无法同步到购物车的问题

你的代码里woocommerce_add_cart_item钩子没生效的核心原因是:钩子注册时机太晚——你把它放在了woocommerce_single_product_summary的回调函数里,这个函数是在产品页面渲染时才执行的,而用户点击“加入购物车”时,这个过滤器还没被注册,自然不会触发价格修改逻辑。另外,直接复用页面渲染时计算的$updated_price也不合理,因为这个变量只对应当前页面的产品,无法适配多产品购物车的场景。

修正方案

  1. 把购物车价格修改的钩子注册移到全局范围,确保WooCommerce初始化时就加载
  2. 在钩子回调中,针对每个购物车项单独计算自定义价格,确保每个产品的价格都能正确更新
  3. 保留产品页面的自定义价格显示逻辑,拆分到独立的函数中

修改后的完整代码

// 注册插件样式和产品页面显示逻辑
function custom_product_page() {
    global $wpdb;
    global $product;
    
    wp_enqueue_style('my-plugin-styles', plugins_url('assets/css/diamond_style.css', __FILE__));

    if (class_exists('WooCommerce') && is_product()) {
        $product = wc_get_product(get_the_ID());

        $product_categories = wp_get_post_terms(get_the_ID(), 'product_cat');
        $is_ring = false;
        foreach ($product_categories as $product_category) {
            if ($product_category->slug === 'rings' || $product_category->slug === 'ring') {
                $is_ring = true;
                break;
            }
        }

        // 仅针对戒指类产品显示自定义价格和信息
        if ($is_ring) {
            // 获取最新金价
            $gold_rate_table = $wpdb->prefix . 'gold_rate';
            $gold_rate = $wpdb->get_var("SELECT final_price FROM $gold_rate_table ORDER BY id DESC LIMIT 1");

            // 获取产品属性
            $net_weight = $product->get_attribute('net-weight-g');
            $regular_price = $product->get_regular_price();
            $gross_weight = $product->get_attribute('gross-weight');

            // 计算更新后的价格
            $updated_price = ($gold_rate * $net_weight) + $regular_price;

            // 显示自定义价格和重量信息
            echo '<p class="productprice">&#8377;' . $updated_price . '</p>';
            echo 'Weight: ' . $gross_weight . ' g';
        }
    }
}
add_action('woocommerce_single_product_summary', 'custom_product_page', 25);

// 全局注册购物车价格修改钩子
function update_cart_item_custom_price($cart_item) {
    global $wpdb;
    
    // 仅处理戒指类产品
    $product_categories = wp_get_post_terms($cart_item['product_id'], 'product_cat');
    $is_ring = false;
    foreach ($product_categories as $product_category) {
        if ($product_category->slug === 'rings' || $product_category->slug === 'ring') {
            $is_ring = true;
            break;
        }
    }

    if ($is_ring) {
        $product = wc_get_product($cart_item['product_id']);
        
        // 获取最新金价
        $gold_rate_table = $wpdb->prefix . 'gold_rate';
        $gold_rate = $wpdb->get_var("SELECT final_price FROM $gold_rate_table ORDER BY id DESC LIMIT 1");

        // 获取产品属性并计算价格
        $net_weight = $product->get_attribute('net-weight-g');
        $regular_price = $product->get_regular_price();
        $updated_price = ($gold_rate * $net_weight) + $regular_price;

        // 更新购物车项价格
        $cart_item['data']->set_price($updated_price);
    }

    return $cart_item;
}
add_filter('woocommerce_add_cart_item', 'update_cart_item_custom_price', 10, 1);

额外提示

  • 建议给$net_weight和$gold_rate添加非空判断,避免因数据缺失导致价格计算错误
  • 如果需要在购物车页面、结算页面也保持这个自定义价格,还需要添加woocommerce_cart_item_price和woocommerce_cart_item_subtotal钩子来同步显示

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 07:05:30