WooCommerce订阅价格字符串重复及自定义需求技术问询
问题:YayCurrency+WooCommerce订阅价格字符串冗余重复
我开发的网站用YayCurrency插件支持USD和CAD支付,搭配WooCommerce Subscriptions后,订阅价格显示成了类似“立即支付$XX,且每月1日支付$XX”的冗余格式。目前已经用CSS在部分区域隐藏了重复内容,但想通过代码彻底修改,让价格只显示**对应货币价格 + “每月”**的简洁格式。
尝试过的代码(效果不符合预期)
- 代码1:完全移除周期提示,不符合需求
add_filter( 'woocommerce_subscriptions_product_price_string_inclusions', 'wpd_override_subscription_price_string', 10, 2 ); function wpd_override_subscription_price_string( $include, $product ) { $include['subscription_period'] = false; return $include; }
这段代码关闭了周期相关内容的显示,但我需要保留“每月”的提示,不是彻底删掉。
- 代码2:替换日期为“每月”,但冗余部分仍存在
add_filter( 'woocommerce_subscriptions_product_price_string', 'wpd_change_subscription_product_string', 10, 3 ); function wpd_change_subscription_product_string( $subscription_string, $product, $include ) { if ( $include['subscription_period'] ){ $current_string = 'on the 1st of each month'; $new_string = 'monthly'; $subscription_string = str_replace($current_string, $new_string, $subscription_string); } return $subscription_string; }
这段代码把“每月1日”换成了“每月”,但最终还是显示“$XX now, and $XX monthly”,冗余的“now, and ...”部分没去掉。
解决方案代码
基础版本(价格一致时)
直接构造简洁的价格字符串,保留对应货币价格+“每月”:
add_filter( 'woocommerce_subscriptions_product_price_string', 'custom_simplify_subscription_price_string', 20, 3 ); function custom_simplify_subscription_price_string( $subscription_string, $product, $include ) { // 只处理订阅类型产品 if ( ! $product->is_type( 'subscription' ) ) { return $subscription_string; } // 获取当前货币下的订阅价格(YayCurrency的转换会自动生效) $price = wc_price( $product->get_price() ); // 拼接成简洁格式 $subscription_string = sprintf( '%s 每月', $price ); return $subscription_string; }
把这段代码加到主题的functions.php文件里,或者用自定义代码插件(比如Code Snippets)。优先级设为20是为了确保覆盖原有插件的逻辑。
进阶版本(支持首次付款优惠)
如果你的订阅有首次付款和后续付款价格不同的情况,用这个版本区分显示:
add_filter( 'woocommerce_subscriptions_product_price_string', 'custom_simplify_subscription_price_string', 20, 3 ); function custom_simplify_subscription_price_string( $subscription_string, $product, $include ) { if ( ! $product->is_type( 'subscription' ) ) { return $subscription_string; } // 获取首次付款价格和常规订阅价格(已适配YayCurrency货币转换) $initial_price = wc_price( $product->get_initial_price() ); $regular_price = wc_price( $product->get_price() ); // 价格不同时显示首次+后续,价格一致时只显示统一价格+每月 if ( $initial_price !== $regular_price ) { $subscription_string = sprintf( '首次 %s,之后 %s 每月', $initial_price, $regular_price ); } else { $subscription_string = sprintf( '%s 每月', $regular_price ); } return $subscription_string; }
内容的提问来源于stack exchange,提问作者Heather Hanson
相关产品推荐
相关产品推荐

