如果在 Woocommerce 中应用了任何优惠券代码,请删除一些支付网关

Posted

技术标签:

【中文标题】如果在 Woocommerce 中应用了任何优惠券代码,请删除一些支付网关【英文标题】:Remove some payment gateways if any coupon code is applied in Woocommerce 【发布时间】:2019-02-06 18:11:18 【问题描述】:

我开始从事小型 Woocommerce 项目。我在这家商店有 3 个支付网关:Paypal、信用卡和直接银行转账。

我想要的是:如果使用优惠券代码,我想从可用的支付网关中禁用(或删除)Paypal 和信用卡,并将“直接银行转账”作为可用的支付网关选项。

从结帐页面显示当前状态:

我找到了类似的解决方案,但这是用于根据产品类别删除网关。

add_filter( 'woocommerce_available_payment_gateways', 'unset_payment_gateways_by_category' );

function unset_payment_gateways_by_category( $available_gateways ) 
    global $woocommerce;

    $unset = false;
    $category_ids = array( 8, 37 );

    foreach ( $woocommerce->cart->cart_contents as $key => $values ) 
        $terms = get_the_terms( $values['product_id'], 'product_cat' );    
        foreach ( $terms as $term )         
            if ( in_array( $term->term_id, $category_ids ) ) 
                $unset = true;
                break;
            
        
    
    if ( $unset == true ) 
        unset( $available_gateways['cheque'] );

    return $available_gateways;

所以我认为可以使用此功能,但根据我的问题稍作修改。

感谢任何帮助。

【问题讨论】:

【参考方案1】:

仅当客户至少应用了一个优惠券代码时,以下代码才会删除所有支付网关“直接银行转账” (bacs): p>

add_filter('woocommerce_available_payment_gateways', 'applied_coupons_hide_payment_gateways', 20, 1 );
function applied_coupons_hide_payment_gateways( $available_gateways)
    // Not in backend (admin)
    if( is_admin() ) 
        return $available_gateways;

    // If at least a coupon is applied
    if( sizeof( WC()->cart->get_applied_coupons() ) > 0 )
        // Loop through payment gateways
        foreach ( $available_gateways as $gateway_id => $gateway ) 
            // Remove all payment gateways except BACS (Bank Wire)
            if( $gateway_id != 'bacs' )
                unset($available_gateways[$gateway_id]);
        
    

    return $available_gateways;

代码进入活动子主题(或活动主题)的 function.php 文件中。经过测试并且可以工作。

【讨论】:

【参考方案2】:

给你:

add_filter('woocommerce_available_payment_gateways', 'unset_gatway_by_applied_coupons');

function unset_gatway_by_applied_coupons($available_gateways)


    $coupons = WC()->cart->applied_coupons;

    if (!empty($coupons)) 
        unset($available_gateways['bacs']);
    

    return $available_gateways;

我们在这里所做的是检查是否通过WC()->cart->applied_coupons; 应用了任何优惠券,如果优惠券数组不为空,则将返回优惠券数组删除特定的支付网关

如果您想检查是否应用了某些优惠券并根据您的情况删除网关,您可以使用以下内容:

add_filter('woocommerce_available_payment_gateways', 'unset_gatway_by_applied_coupons');

function unset_gatway_by_applied_coupons($available_gateways)


    $coupons = WC()->cart->applied_coupons;

    foreach ($coupons as $coupon) 

        if ($coupon == 'my_coupon')  //here you can specific your coupon name
            unset($available_gateways['bacs']);
        

    

    return $available_gateways;

当然,这两个功能都经过测试,您只需将它们放入您的functions.php

【讨论】:

以上是关于如果在 Woocommerce 中应用了任何优惠券代码,请删除一些支付网关的主要内容,如果未能解决你的问题,请参考以下文章

如何以编程方式删除 Woocommerce 中应用的折扣券?

Woocommerce:如何在应用/删除优惠券时禁用 AJAX?

在woocommerce中手动对优惠券应用电子邮件限制的代码

仅将 woocommerce 优惠券应用于购物车总数,而非税线

根据在 WooCommerce 中应用的优惠券显示货到付款 (COD)

即使购物车在 WooCommerce 中为空,也可以通过 URL 中的 GET 方法应用优惠券折扣