【问题标题】:Disable all payments gateway if there's specifics products in the Cart如果购物车中有特定产品,则禁用所有支付网关
【发布时间】:2016-12-13 11:24:53
【问题描述】:

我想在特殊情况下禁用所有支付网关:
我有 2 种特殊产品,我不想在结帐时与任何其他产品组合。

假设我的 “特殊” 产品 ID 是 496484。所有其他都是“正常”产品。

  1. 如果这些“特殊”产品之一在购物车中,例如,我想禁用“paypal”。

  2. 如果客户的购物车中同时包含 “特殊” 产品和 “普通” 产品,我想禁用 所有支付网关,所以他无法结帐。

这是我的代码:

//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 支付网关之外,所有支付网关都被禁用。

我做错了什么?
我怎样才能做到这一点?

谢谢

【问题讨论】:

  • 1) 使用全局变量; 2) 不推荐使用硬编码值。您还可以在最后一个 if 中为 unset 创建 2 个 wrapper 函数,并使用有意义的名称..
  • 只是好奇,您是否考虑过不允许将其添加到购物车或尝试将其添加到购物车时发出警告?这样做的目的是让客户尽快知道他们不能将订单放在一个购物车中,而不是花时间购物然后被告知他们必须再做一次。
  • @RyanVincent,如果我能做到这一点会更酷
  • @LoicTheAztec 对不同时区的迟到投票感到抱歉:),您的回答完美无缺,没有更改一个字母,非常感谢
  • @AhmedNabil 是的,这也是可能的(如 RyanVincent 所说),例如自动从购物车中删除具有类似条件的产品并向客户发出错误通知。但这不是这个问题的一部分,你可以问另一个问题,包括你的实际工作代码。

标签: php wordpress woocommerce payment-gateway cart


【解决方案1】:

为 WooCommerce 3+ 更新

首先,我认为您的代码中的 in_array( $values['product_id'] ) 不能作为正确的条件工作,因此您的 else 语句永远不会“正确”。然后,由于客户的购物车中可能有许多商品,这取决于客户的连续选择,您的代码将有许多冗余的网关未设置...

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

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 文件中。

【讨论】:

  • 小心 get_cart() 如果它在管理区域中执行会导致问题(破坏菜单并导致致命错误)所以将所有内容包装在一个条件中: if( !is_admin() ) { }
  • @AJD 你说得对,我已经更新了代码。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-15
  • 2021-11-24
  • 2010-11-18
  • 2018-09-30
  • 2021-01-31
  • 1970-01-01
相关资源
最近更新 更多