
本文详解如何正确获取并显示 WooCommerce 可变产品的动态价格(含“Was/Now”促销格式),解决因误用 get_variation_regular_price() 导致的价格静态显示问题。
本文详解如何正确获取并显示 woocommerce 可变产品的动态价格(含“was/now”促销格式),解决因误用 `get_variation_regular_price()` 导致的价格静态显示问题。
在 WooCommerce 中,可变产品(Variable Product)的价格展示需区分两种场景:页面初次加载时的默认价格范围,以及用户切换属性(如尺寸、颜色)后实时更新的单个变体价格。你当前代码中使用了 get_variation_regular_price( 'min', true ) 和 get_variation_regular_price( 'max', true ),这仅能获取所有变体中最低/最高原价,但无法响应前端 JS 触发的变体切换事件——因此价格始终“静态”,不会随用户选择而更新。
真正实现动态价格更新,关键在于:
✅ 前端需依赖 WooCommerce 原生 JS 机制(如 wc-variation-form.js)监听变体变更;
✅ 后端必须为每个变体提供准确的 sale_price 和 regular_price 数据,供 JS 渲染;
✅ 自定义价格 HTML 过滤器(如 woocommerce_get_price_html)仅控制初始状态,不可替代 JS 动态逻辑。
正确做法:修复过滤器 + 启用原生变体价格更新
首先,修正你的 woocommerce_get_price_html 过滤器,明确区分可变/简单产品,并正确调用销售价方法:
add_filter( 'woocommerce_get_price_html', 'revent_custom_variable_product_price_customs', 10, 2 );
function revent_custom_variable_product_price_customs( $price_html, $product ) {
// 确保接收 $product 参数(第二个参数),避免依赖全局变量
if ( ! is_object( $product ) || ! method_exists( $product, 'is_type' ) ) {
return $price_html;
}
if ( $product->is_type( 'variable' ) ) {
// 获取所有变体的 min/max regular & sale 价格(用于初始范围展示)
$min_reg = $product->get_variation_regular_price( 'min', true );
$max_reg = $product->get_variation_regular_price( 'max', true );
$min_sale = $product->get_variation_sale_price( 'min', true );
$max_sale = $product->get_variation_sale_price( 'max', true );
// 判断是否整体有促销(至少一个变体在售)
$has_sale = $min_sale !== '' && $min_sale > 0 && $min_sale <span class="revent_custom_regular_price">Was: %1$s</span> <ins><span class="revent_custom_sale_price">Now: %2$s</span></ins>',
$was_range,
$now_range
);
} else {
// 无促销:显示原价范围
$range = wc_price( $min_reg ) . ( $min_reg !== $max_reg ? '–' . wc_price( $max_reg ) : '' );
$price_html = sprintf( '<span class="revent_custom_regular_price">Now: %1$s</span>', $range );
}
} elseif ( $product->is_on_sale() && $product->get_sale_price() > 0 ) {
// 简单产品促销
$price_html = sprintf(
'<del><span class="revent_custom_regular_price">Was: %1$s</span></del> <ins><span class="revent_custom_sale_price">Now: %2$s</span></ins>',
wc_price( $product->get_regular_price() ),
wc_price( $product->get_sale_price() )
);
}
return '<p class="price">' . $price_html . '</p>';
}
⚠️ 重要注意事项:
- 此代码仅控制页面加载时的初始价格文案,不能替代前端 JS 的实时更新能力;
- 确保你的主题或子主题已正确加载 WooCommerce 核心脚本:
wp_enqueue_script( 'wc-add-to-cart-variation' )(通常由 WooCommerce 自动处理); - 检查变体是否已正确设置
Sale price(而非仅Regular price),否则get_variation_sale_price()将返回空值; - 若仍不更新,请禁用其他价格相关插件或检查浏览器控制台是否有 JS 错误(如
Uncaught TypeError: Cannot read property 'variation' of undefined)。
总结
静态价格的根本原因,是混淆了“服务端价格范围计算”与“客户端实时变体绑定”。修复核心在于:服务端提供准确的 sale_price 数据,前端依靠 WooCommerce 原生 JS 完成动态渲染。切勿尝试用 PHP 过滤器强行模拟 JS 行为——这违背 WooCommerce 架构设计。启用 get_variation_sale_price() 并确保变体数据完整,配合标准 JS 流程,即可实现流畅的 Was/Now 动态价格切换。










