WordPress WooCommerce中Tyche Deposit插件定期付款网关设置失效问题
解决Tyche Deposit定期付款的支付网关控制问题
你的代码只对首笔付款生效,是因为后续定期付款不走购物车流程,WC()->cart对象不存在,导致基于购物车总额的判断逻辑完全失效。要实现首笔付款仅支持Stripe、后续付款支持Stripe+BACS的需求,需要区分「首笔购物车结账」和「后续订单付款」两种场景来处理:
解决方案代码
将以下代码替换你原有的函数,添加到主题的functions.php文件中:
add_filter( 'woocommerce_available_payment_gateways', 'tyche_deposit_control_payment_gateways' ); function tyche_deposit_control_payment_gateways( $available_gateways ) { // 跳过后台操作,只处理前端场景 if ( is_admin() && ! defined( 'DOING_AJAX' ) ) { return $available_gateways; } // 场景1:首笔付款(购物车结账流程) if ( isset( WC()->cart ) && ! WC()->cart->is_empty() ) { // 隐藏BACS,仅保留Stripe if ( isset( $available_gateways['bacs'] ) ) { unset( $available_gateways['bacs'] ); } return $available_gateways; } // 场景2:后续定期付款(订单付款页面) if ( isset( $_GET['pay_for_order'] ) && isset( $_GET['key'] ) ) { $order = wc_get_order( wc_get_order_id_by_order_key( $_GET['key'] ) ); if ( $order ) { // 检查是否为Tyche Deposit的后续定期付款订单 // 若Tyche Deposit在后续订单中添加了自定义元数据,可替换为对应判断 // 示例:if ( $order->get_meta( '_tyche_deposit_recurring_payment' ) ) { // 这里默认所有订单付款页面都放开双网关,你可根据实际情况调整判断条件 $gateways = WC_Payment_Gateways::instance(); // 恢复BACS(如果网关本身可用) if ( $gateways->get_gateway( 'bacs' )->is_available() ) { $available_gateways['bacs'] = $gateways->get_gateway( 'bacs' ); } // 确保Stripe可用 if ( $gateways->get_gateway( 'stripe' )->is_available() ) { $available_gateways['stripe'] = $gateways->get_gateway( 'stripe' ); } } } return $available_gateways; }
关键调整说明
场景区分:
- 首笔付款通过
WC()->cart存在性判断,直接隐藏BACS; - 后续付款通过订单付款页面的
pay_for_order参数判断,恢复双网关显示。
- 首笔付款通过
Tyche Deposit专属判断(可选):
如果你需要精准识别Tyche Deposit的后续订单,可以在订单后台查看后续付款订单的自定义字段(通过「自定义字段」面板),找到类似_tyche_deposit_recurring_payment或插件专属的元数据键,然后将代码中的判断逻辑替换为:if ( $order->get_meta( '_tyche_deposit_recurring_payment' ) === 'yes' ) { // 恢复双网关的逻辑 }移除金额判断:
你的原代码用购物车总额做判断,不符合需求逻辑(需求是按付款阶段而非金额控制网关),所以直接移除了金额相关的条件。
内容的提问来源于stack exchange,提问作者user16660074
相关产品推荐
相关产品推荐

