Удалить платежные шлюзы WooCommerce для определенных групп категорий продуктов

Мне удалось заставить этот код работать для удаления ОДНОГО платежного шлюза на основе одной или нескольких категорий продуктов.

Мне нужна помощь, так это удалить несколько платежных шлюзов. Другими словами; он должен удалить один или несколько платежных шлюзов на основе одной или нескольких категорий продуктов.

Это то, что у меня есть, возможно, оно устарело?

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

person Community    schedule 06.06.2020    source источник


Ответы (1)


Да, можно отключить платежные шлюзы для групп из нескольких категорий продуктов.

1) В отдельной функции ниже мы определяем наши группы категорий продуктов и платежных шлюзов. Категории продуктов могут быть либо термином(ами), идентификатором(ами), слагом(ями), либо именем(ями). Итак, в этой функции мы определяем наши настройки, которые будут использоваться:

// 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) Теперь перехваченная функция, которая удалит на странице оформления заказа платежные шлюзы на основе категорий товаров в корзине, загружая нашу функцию настроек:

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

Код находится в файле functions.php вашей активной дочерней темы (или активной темы). Проверено и работает.

person LoicTheAztec    schedule 06.06.2020