首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如果购物车中有特定的产品,请禁用所有支付网关

如果购物车中有特定的产品,请禁用所有支付网关
EN

Stack Overflow用户
提问于 2016-08-07 16:56:50
回答 1查看 3K关注 0票数 1

我想在特殊情况下禁用所有付款网关:

我有两个特殊的产品,我不想被合并在结帐与任何其他产品。

让我们说我的496484.是“特殊”产品ID。所有其他产品都是“普通”产品。

  1. 如果这些“特殊”产品中有一个在购物车中,我想要禁用"paypal“。
  2. 如果客户的购物车中同时有一个“特殊”产品和一个“普通”产品,我想禁用所有的支付网关,这样他就不能结账了。

这是我的密码:

代码语言:javascript
复制
//disable add to cart if
add_filter( 'woocommerce_available_payment_gateways', 'filter_gateways', 1);

function filter_gateways( $gateways )
{   
    global $woocommerce;

    foreach ($woocommerce->cart->cart_contents as $key => $values ) {   
        // store product IDs in array   
        $nonPPproducts = array(496,484);        

        if (in_array( $values['product_id'], $nonPPproducts ) ) {
            unset($gateways['cod'], $gateways['bacs'], $gateways['cheque'], $gateways['stripe']);
        } elseif ( in_array( $values['product_id'], $nonPPproducts ) && in_array( $values['product_id'] ) ) {           
            unset($gateways['under-review'], $gateways['cod'], $gateways['bacs'], $gateways['cheque'], $gateways['stripe']);
        }
    }

    return $gateways;   
}

但我不明白为什么唯一的第一个if语句有效…换句话说,无论发生什么情况,除了under-review支付网关之外,所有支付网关都是禁用的。

我做错什么了?

我怎样才能做到这一点?

谢谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-08-07 19:38:18

更新为WooCommerce 3+

首先,我认为代码中的in_array( $values['product_id'] )不是作为一个正确的条件工作的,所以您的else语句永远不是"true“。然后,由于客户可以在他的购物车中有许多项,这取决于客户的后续选择,使用您的代码,将有许多冗余的网关卸载…。

这里是重新检查的代码(您需要在每个语句中放置未设置的网关)

代码语言:javascript
复制
add_filter( 'woocommerce_available_payment_gateways', 'filter_gateways', 1);
function filter_gateways( $gateways ){
    // Not in backend (admin)
    if( is_admin() ) 
        return $gateways;

    // Storing special product IDs in an array
    $non_pp_products = array( 496, 484 );

    // Needed variables
    $is_non_prod = false;
    $is_prod = false;
    $count = 0;

    foreach ( WC()->cart->get_cart() as $cart_item ) {
        // count number of items if needed (optional) 
        $count++;
        $product = $cart_item['data'];
        if( ! empty($product) ){
            $product_id = method_exists( $product, 'get_id' ) ? $product->get_id() : $product->id;
            if ( in_array( $product_id, $non_pp_products ) && ! $is_non_prod ) 
                $is_non_prod = true;

            if ( !in_array( $product_id, $non_pp_products ) && !$is_prod )
                $is_prod = true;

        }
    }
    if ( $is_non_prod && ! $is_prod ) // only special products 
    {
        // unset only paypal;
        unset( $gateways['paypal'] );
    } 
    elseif ( $is_non_prod && $is_prod ) // special and normal products mixed
    {
        // unset ALL GATEWAYS
        unset( $gateways['cod'], 
               $gateways['bacs'], 
               $gateways['cheque'], 
               $gateways['paypal'], 
               $gateways['stripe'], 
               $gateways['under-review'] );
    }
    elseif ( ! $is_non_prod && $is_prod ) // only normal products (optional)
    {
        // (unset something if needed)
    }
    return $gateways; 
}

当然,这段代码会放在您的活动子主题或主题的functions.php文件上。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38816448

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档