
本文介绍如何在 woocommerce 结算页面中,根据购物车内特定订阅商品 id 动态禁用并隐藏第三方支付插件(如 payrexx)的“允许定期扣款”复选框,全程使用轻量级 jquery + php 钩子实现,无需修改插件源码。
在 WooCommerce 实际运营中,常需对不同订阅产品启用差异化的支付行为控制——例如:某高端年费订阅需禁用自动续订功能(即隐藏并取消勾选 payrexx-allow-recurring 复选框),而其他常规订阅则保持默认启用。由于该复选框由第三方支付插件(如 Payrexx)动态渲染,且其 DOM 在页面加载后才存在,纯 PHP 无法直接修改已输出的 HTML 属性或样式,因此必须结合前端 JavaScript(推荐 jQuery)在 DOM 就绪后进行操作。
以下为安全、可靠、可维护的实现方案:
✅ 推荐做法:使用 wp_add_inline_script() 替代内联
将原始答案中的拼接 HTML 脚本方式升级为 WordPress 官方推荐的脚本注入方式,避免 XSS 风险与执行时机问题:
// 添加到子主题 functions.php
function maybe_hide_recurring_checkbox( $fields ) {
// 确保仅在结算页执行,且购物车非空
if ( ! is_checkout() || WC()->cart->is_empty() ) {
return $fields;
}
$target_product_id = 1631817356; // ? 替换为你需要屏蔽复选框的订阅商品 ID
$has_target_product = false;
foreach ( WC()->cart->get_cart() as $cart_item ) {
if ( $cart_item['product_id'] === $target_product_id ||
$cart_item['data']->get_id() === $target_product_id ) {
$has_target_product = true;
break;
}
}
if ( $has_target_product ) {
// 注入轻量级 jQuery 脚本(确保在 jQuery 加载后执行)
$script = "
jQuery(document).ready(function($) {
const $checkbox = $('#payrexx-allow-recurring');
if ($checkbox.length) {
$checkbox.prop('checked', false).hide();
// 可选:同时禁用以防止 JS 被禁用时用户手动勾选
$checkbox.prop('disabled', true);
}
});";
wp_add_inline_script( 'jquery', $script, 'after' );
}
return $fields;
}
add_filter( 'woocommerce_checkout_fields', 'maybe_hide_recurring_checkbox' );⚠️ 注意事项与最佳实践
- ID 判断优先级:使用 $cart_item['product_id'] 比 $cart_item['data']->get_id() 更稳定(尤其在变体商品场景下);
- 执行时机:务必使用 document.ready 或 jQuery(document).ready(),确保 DOM 已加载完成;
- 兼容性增强:添加 .length 判断防止目标元素不存在时报错;
- 无障碍与可用性:若彻底隐藏,建议同步 disabled="true" 并考虑补充视觉提示(如显示提示文字:“此订阅不支持自动续订”);
- 缓存兼容性:该逻辑运行于用户端,不受服务器端缓存影响;但若使用全页缓存插件(如 WP Rocket),请确保 checkout 页面被排除缓存;
- 调试技巧:可在浏览器控制台执行 $('#payrexx-allow-recurring').length 快速验证元素是否存在。
✅ 替代方案(纯服务端拦截,更安全)
若需从根本上阻止非法请求(如用户绕过 JS 手动提交 payrexx-allow-recurring=1),应在服务端校验:
// 验证订单创建前是否违规启用续订
add_action( 'woocommerce_checkout_process', function() {
if ( isset( $_POST['payrexx-allow-recurring'] ) && '1' === $_POST['payrexx-allow-recurring'] ) {
$cart_contains_blocked = false;
foreach ( WC()->cart->get_cart() as $item ) {
if ( $item['product_id'] == 1631817356 ) {
$cart_contains_blocked = true;
break;
}
}
if ( $cart_contains_blocked ) {
wc_add_notice( '该订阅不支持自动续订,请取消勾选相关选项。', 'error' );
}
}
});综上,JS 是实现 UI 层动态控制的必要手段,PHP 则负责逻辑判断与安全兜底。二者协同,即可稳健满足多订阅差异化支付策略需求。










