WooCommerce单个产品页动态定价问题:添加购物车后价格不生效
解决WooCommerce自定义价格无法同步到购物车的问题
你的代码里woocommerce_add_cart_item钩子没生效的核心原因是:钩子注册时机太晚——你把它放在了woocommerce_single_product_summary的回调函数里,这个函数是在产品页面渲染时才执行的,而用户点击“加入购物车”时,这个过滤器还没被注册,自然不会触发价格修改逻辑。另外,直接复用页面渲染时计算的$updated_price也不合理,因为这个变量只对应当前页面的产品,无法适配多产品购物车的场景。
修正方案
- 把购物车价格修改的钩子注册移到全局范围,确保WooCommerce初始化时就加载
- 在钩子回调中,针对每个购物车项单独计算自定义价格,确保每个产品的价格都能正确更新
- 保留产品页面的自定义价格显示逻辑,拆分到独立的函数中
修改后的完整代码
// 注册插件样式和产品页面显示逻辑 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">₹' . $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
相关产品推荐
相关产品推荐

