如何让Woocommerce自定义订阅价格字符串同步生效于购物车及迷你购物车?
解决Woocommerce订阅文本无法同步到购物车的问题
嘿,我来帮你搞定这个问题!你当前的函数只对产品页面的订阅文本生效,因为woocommerce_subscriptions_product_price_string这个钩子只负责产品详情页、产品列表页的文本渲染,而购物车和迷你购物车用的是完全不同的过滤钩子,所以你的修改没同步过去很正常~
解决方案:复用替换逻辑,挂载到购物车相关钩子
我们可以把核心的文本替换逻辑抽成一个独立函数,然后同时挂载到产品页面和购物车的专属钩子上,这样就能覆盖所有场景了:
// 核心的订阅文本替换逻辑,复用所有场景 function custom_subscription_price_string( $price_string, $product = null ) { // 如果没有传入产品对象,尝试从全局变量获取(适配产品页面场景) if ( is_null( $product ) ) { global $product; } // 指定需要修改的产品ID数组 $products_to_change = array( 2212 ); // 检查当前产品是否在目标列表中,且产品对象有效 if ( $product && in_array( $product->get_id(), $products_to_change ) ) { // 替换目标文本 $price_string = str_replace( 'on the 20th day of every 6th month', 'on the 20th November and 20th May', $price_string ); } return $price_string; } // 挂载到产品页面/列表页的钩子 add_filter( 'woocommerce_subscriptions_product_price_string', 'custom_subscription_price_string', 10, 2 ); // 挂载到购物车页面整体订阅文本的钩子 add_filter( 'woocommerce_subscriptions_cart_price_string', 'custom_subscription_price_string', 10, 2 ); // 挂载到单个购物车项(包括迷你购物车)的钩子 add_filter( 'woocommerce_subscriptions_cart_item_price_string', 'custom_subscription_price_string', 10, 2 );
关键说明
- 复用逻辑:把替换逻辑抽成独立函数,避免重复写相同代码,后续修改文本只需要改这一处就行。
- 钩子覆盖:
woocommerce_subscriptions_cart_price_string:负责购物车页面中订阅总价区域的文本显示。woocommerce_subscriptions_cart_item_price_string:负责单个购物车项(包括迷你购物车的每一项)的订阅文本渲染。
- 兼容性优化:用
$product->get_id()替代旧的$product->id,这是Woocommerce 3.0+推荐的写法,适配更高版本的插件。
额外提示
如果修改后还是没看到效果,记得清除WordPress缓存、浏览器缓存,因为Woocommerce可能会缓存订阅价格字符串,清缓存后刷新页面就能看到修改后的文本啦~
内容的提问来源于stack exchange,提问作者Paul VI
相关产品推荐
相关产品推荐

