You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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;
}

关键调整说明

  1. 场景区分:

    • 首笔付款通过WC()->cart存在性判断,直接隐藏BACS;
    • 后续付款通过订单付款页面的pay_for_order参数判断,恢复双网关显示。
  2. Tyche Deposit专属判断(可选):
    如果你需要精准识别Tyche Deposit的后续订单,可以在订单后台查看后续付款订单的自定义字段(通过「自定义字段」面板),找到类似_tyche_deposit_recurring_payment或插件专属的元数据键,然后将代码中的判断逻辑替换为:

    if ( $order->get_meta( '_tyche_deposit_recurring_payment' ) === 'yes' ) {
        // 恢复双网关的逻辑
    }
    
  3. 移除金额判断:
    你的原代码用购物车总额做判断,不符合需求逻辑(需求是按付款阶段而非金额控制网关),所以直接移除了金额相关的条件。

内容的提问来源于stack exchange,提问作者user16660074

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 17:30:43