如何基于自定义字段在WooCommerce中动态修改变体商品前端价格
解决方案
原代码仅通过woocommerce_get_price_html修改了可变商品的静态价格区间,但变体选中后的动态价格由WooCommerce专属的变体价格钩子控制,且未覆盖购物车、结算页的实际交易价格计算逻辑。以下是完整实现代码,覆盖所有需求场景:
// 1. 修改变体的显示价格(商品详情页选中变体后生效) function custom_variation_price( $price, $variation, $product ) { // 仅前台生效,后台保留原价格 if ( is_admin() ) return $price; // 获取父商品的base price自定义字段 $base_price = get_post_meta( $product->get_id(), '_base_price', true ); if ( isset( $base_price ) && $base_price > 0 ) { $price = floatval( $price ) * floatval( $base_price ); } return $price; } add_filter( 'woocommerce_variation_prices_price', 'custom_variation_price', 10, 3 ); add_filter( 'woocommerce_variation_prices_regular_price', 'custom_variation_price', 10, 3 ); // 2. 清除价格缓存,确保修改实时生效 function clear_variation_price_cache() { wc_delete_product_transients( get_the_ID() ); } add_action( 'woocommerce_before_single_product', 'clear_variation_price_cache' ); // 3. 保存自定义价格到购物车项,确保结算时使用修改后的价格 function add_custom_price_to_cart_item( $cart_item_data, $product_id, $variation_id ) { if ( $variation_id ) { $parent_product_id = wp_get_post_parent_id( $variation_id ); $base_price = get_post_meta( $parent_product_id, '_base_price', true ); if ( isset( $base_price ) && $base_price > 0 ) { $variation = wc_get_product( $variation_id ); $original_price = $variation->get_price(); $custom_price = floatval( $original_price ) * floatval( $base_price ); // 保存自定义价格到购物车项 $cart_item_data['custom_price'] = $custom_price; $cart_item_data['unique_key'] = md5( microtime().rand() ); // 确保变体唯一标识 } } return $cart_item_data; } add_filter( 'woocommerce_add_cart_item_data', 'add_custom_price_to_cart_item', 10, 3 ); // 4. 从会话中恢复自定义价格 function restore_custom_price_from_session( $cart_item, $values ) { if ( isset( $values['custom_price'] ) ) { $cart_item['data']->set_price( $values['custom_price'] ); } return $cart_item; } add_filter( 'woocommerce_get_cart_item_from_session', 'restore_custom_price_from_session', 10, 2 ); // 5. 修改购物车和结算页的价格显示 function custom_cart_item_price_display( $price, $cart_item ) { if ( isset( $cart_item['custom_price'] ) ) { $price = wc_price( $cart_item['custom_price'] ); } return $price; } add_filter( 'woocommerce_cart_item_price', 'custom_cart_item_price_display', 10, 2 ); add_filter( 'woocommerce_cart_item_subtotal', 'custom_cart_item_price_display', 10, 2 );
代码说明:
- 变体动态价格修改:通过
woocommerce_variation_prices_price和woocommerce_variation_prices_regular_price钩子,直接修改变体的价格计算逻辑,选中变体后自动显示计算后的价格。 - 缓存清除:WooCommerce会缓存变体价格,添加
clear_variation_price_cache确保修改实时生效。 - 购物车价格处理:通过
woocommerce_add_cart_item_data将自定义价格存入购物车项,再通过woocommerce_get_cart_item_from_session恢复,确保结算时使用修改后的价格。 - 前台限制:所有修改都添加了
is_admin()判断,后台管理面板的变体价格保持不变。
内容的提问来源于stack exchange,提问作者kirtan ajudiya
相关产品推荐
相关产品推荐

