WooCommerce 3.3.5中通过钩子修改商品变体价格失效问题
解决WooCommerce 3.3.5中自定义可变商品价格不生效的问题
你遇到的问题其实是WooCommerce 3.0+版本引入的产品价格缓存机制导致的——可变商品的价格会被缓存到数据库的临时缓存(transient)里,哪怕你修改了钩子逻辑,页面还是会读取旧的缓存值,所以看起来代码没生效。而且你的代码里wc_delete_product_t应该是没写完的缓存清理函数,这也是关键缺失点。
下面给你完整的修复方案:
1. 补全并优化自定义价格代码
把你原来的代码替换成下面的完整版本,我会标注关键改动:
// 拦截可变商品的销售价和常规价 add_filter('woocommerce_variation_prices_price', 'custom_variation_price', 99, 3 ); add_filter('woocommerce_variation_prices_regular_price', 'custom_variation_price', 99, 3 ); function custom_variation_price( $price, $variation, $product ) { // -------------------------- // 这里写你的价格自定义逻辑 // 示例:给所有可变商品价格打9折 $price = $price * 0.9; // -------------------------- // 清除当前产品的所有价格缓存,确保新价格能被读取 wc_delete_product_transients( $product->get_id() ); return $price; } // 额外添加:修改缓存哈希,强制WooCommerce重新生成价格缓存 add_filter( 'woocommerce_get_variation_prices_hash', 'custom_variation_price_hash', 99, 3 ); function custom_variation_price_hash( $hash, $product, $for_display ) { // 添加一个自定义标识到哈希中,只要这个值变了,缓存就会重新生成 $hash[] = 'custom_variation_price_v1'; return $hash; }
代码说明:
- 两个
woocommerce_variation_prices_*钩子分别覆盖销售价和常规价,确保所有价格都被修改; wc_delete_product_transients是完整的缓存清理函数,会删除对应产品的可变价格缓存;woocommerce_get_variation_prices_hash钩子是保险措施:如果缓存没被自动清理,修改哈希值会让WooCommerce认为需要重新计算价格,避免旧缓存残留。
2. 优化缓存清理的性能(可选但推荐)
上面的代码每次加载页面都会清缓存,可能影响性能。建议改成只有当产品保存时才清除缓存,替换成下面的代码组合:
// 拦截可变商品价格 add_filter('woocommerce_variation_prices_price', 'custom_variation_price', 99, 3 ); add_filter('woocommerce_variation_prices_regular_price', 'custom_variation_price', 99, 3 ); function custom_variation_price( $price, $variation, $product ) { // 你的价格自定义逻辑 $price = $price * 0.9; return $price; } // 当可变商品保存时,才清除对应产品的价格缓存 add_action( 'save_post_product', 'clear_variable_product_cache_on_save', 10, 3 ); function clear_variable_product_cache_on_save( $post_id, $post, $update ) { if ( $update ) { $product = wc_get_product( $post_id ); // 只针对可变商品清理缓存 if ( $product && $product->is_type( 'variable' ) ) { wc_delete_product_transients( $post_id ); } } } // 强制缓存哈希更新 add_filter( 'woocommerce_get_variation_prices_hash', 'custom_variation_price_hash', 99, 3 ); function custom_variation_price_hash( $hash, $product, $for_display ) { $hash[] = 'custom_variation_price_v1'; return $hash; }
3. 手动清除现有缓存(如果代码清理没立刻生效)
如果修改代码后还是看不到效果,你可以手动清除WooCommerce缓存:
- 进入WordPress后台 → WooCommerce → 状态 → 工具 → 点击“清除产品缓存”按钮;
- 或者直接在数据库里删除前缀为
_transient_wc_var_prices_的记录(注意备份数据库)。
这样操作后,你的自定义价格逻辑应该就能正常生效了。
内容的提问来源于stack exchange,提问作者Daisy
相关产品推荐
相关产品推荐

