简体   繁体   English

删除已定义产品类别组的 WooCommerce 支付网关

[英]Remove WooCommerce Payment Gateways for defined groups of product categories

I've manged to get this code to work for removing ONE payment gateway based on one or more product categories.我已经设法让此代码用于删除基于一个或多个产品类别的 ONE 支付网关。

What I need help with is removing multiple payment gateways as well.我需要帮助的是删除多个支付网关 In other words;换句话说; it should remove one or more payment gateways based on one or more product categories.它应该根据一个或多个产品类别删除一个或多个支付网关。

This is what I got, which might be outdated?这是我得到的,可能已经过时了?

add_filter( 'woocommerce_available_payment_gateways', 'remove_gateway_based_on_category' );
function remove_gateway_based_on_category($available_gateways){

    global $woocommerce;

    if (is_admin() && !defined('DOING_AJAX')) return;
    if (!(is_checkout() && !is_wc_endpoint_url())) return;

        $unset = false;
        $category_ids = array( '75' );

    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['cod']);
    return $available_gateways;
}

Yes it's possible to disable payment gateways for groups of multiple product categories.是的,可以为多个产品类别的组禁用支付网关。

1) In the separated function below we define our groups of product categories and payment gateways. 1) 在下面分开的 function 中,我们定义了我们的产品类别和支付网关组。 The product categories can be either term(s) id(s), slug(s) or name(s).产品类别可以是term(s) id(s)、slug(s) 或name(s)。 So in this function we define our settings, to be used:因此,在此 function 中,我们定义了要使用的设置:

// The settings in a function
function defined_categories_remove_payment_gateways() {
    // Below, Define by groups the categories that will removed specific defined payment gateways
    // The categories can be terms Ids, slugs or names
    return array(
        'group_1' => array(
            'categories'  => array( 11, 12, 16 ), // product category terms
            'payment_ids' => array( 'cod' ), // <== payment(s) gateway(s) to be removed
        ),
        'group_2' => array(
            'categories'  => array( 13, 17, 15 ), // product category terms
            'payment_ids' => array( 'bacs', 'cheque' ), // <== payment(s) gateway(s) to be removed
        ),
        'group_3' => array(
            'categories'  => array( 14, 19, 47 ),  // product category terms 
            'payment_ids' => array( 'paypal' ), // <== payment(s) gateway(s) to be removed
        ),
    );
}

2) Now the hooked function that will remove, in checkout page, the payment gateways based on the cart items product categories, loading our settings function: 2) 现在挂钩的 function 将在结帐页面中删除基于购物车项目产品类别的支付网关,加载我们的设置 function:

add_filter( 'woocommerce_available_payment_gateways', 'remove_gateway_based_on_category' );
function remove_gateway_based_on_category( $available_gateways ){
    // Only on checkout page
    if ( is_checkout() && ! is_wc_endpoint_url() ) {
        $settings_data  = defined_categories_remove_payment_gateways(); // Load settings
        $unset_gateways = []; // Initializing

        // 1. Loop through cart items
        foreach ( WC()->cart->get_cart() as $cart_item ) {
            // 2. Loop through category settings
            foreach ( $settings_data as $group_values ) {
                // // Checking the item product category
                if ( has_term( $group_values['categories'], 'product_cat', $cart_item['product_id'] ) ) {
                    // Add the payment gateways Ids to be removed to the array
                    $unset_gateways = array_merge( $unset_gateways, $group_values['payment_ids'] );
                    break; // Stop the loop
                }
            }
        }

        // Check that array of payment Ids is not empty
        if ( count($unset_gateways) > 0 ) {
            // 3. Loop through payment gateways to be removed
            foreach ( array_unique($unset_gateways) as $payment_id ) {
                if( isset($available_gateways[$payment_id]) ) {
                    // Remove the payment gateway
                    unset($available_gateways[$payment_id]); 
                }
            }
        }
    }
    return $available_gateways;
}

Code goes in functions.php file of your active child theme (or active theme).代码进入您的活动子主题(或活动主题)的functions.php 文件。 Tested and works.测试和工作。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 根据 WooCommerce 订单支付中的特定产品标签限制支付网关 - Restrict payment gateways based on specific product tag in WooCommerce order pay 如果在 Woocommerce 中应用了任何优惠券代码,则删除一些支付网关 - Remove some payment gateways if any coupon code is applied in Woocommerce WooCommerce 禁止特定产品类别的 ClearPay 付款 - WooCommerce Disallow ClearPay Payment for specific product categories 根据 Woocommerce 中的购物车总金额添加或删除支付网关 - add or remove payment gateways based on cart total amount in Woocommerce 如果购物车中有特定产品,请删除付款网关(Woocommerce) - Remove payment gateway if specific product is in the cart (Woocommerce) 在 WooCommerce 中显示/隐藏各种产品类别的付款方式 - Show/Hide payment methods for various product categories in WooCommerce 如何在 WooCommerce 中隐藏免费产品的支付网关? - How to hide payment gateways for free products in WooCommerce? 为特定用户禁用 Woocommerce 支付网关 - Disable Woocommerce payment gateways for specific users 允许在 Woocommerce 中结帐非混合定义的产品类别 - Allow proceed to checkout for non mixed defined product categories in Woocommerce Woocommerce 中定义的产品类别中只允许购物车中的一件商品 - Allow only one item in cart from defined product categories in Woocommerce
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM