Как убрать определенный способ оплаты для выбранного способа доставки в Woocommerce - 1website

В моем случае необходимо было сделать так, чтобы при выборе способа доставки “Доставка в другие страны” оставался только один способ оплаты (Оплата по счету).

Для этого необходимо вставить следующий код в functions.php вашей темы (если используете активную дочернею тему, то вставить в functions.php дочерней темы):

// отключаем способ оплаты картой Webpay, если клиент выбран способ доставки "в другие страны"

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

// Не в бэкэнде (администратор) и не на странице оплаты заказа
    if( is_admin() ||  is_wc_endpoint_url('order-pay') ) 
        return $available_gateways;

// Получить выбранные способы доставки
    $chosen_shipping_methods = (array) WC()->session->get( 'chosen_shipping_methods' );
    if ( in_array( 'C', $chosen_shipping_methods ) )
    {
        unset( $available_gateways['essl_webpay_gateway'] );
    }
    return $available_gateways;
}

local_pickup:10 – способ доставки.
essl_webpay_gateway – способ оплаты, который необходимо отключить.

Результат:

При выборе других способов доставки отображаются оба варианта оплаты:

В следующем примере будут включены / отключены платежные шлюзы в зависимости от выбранного способа доставки. У нас есть 3 способа доставки и 3 платежных шлюза. Каждый выбранный способ доставки позволяет использовать только один платежный шлюз.

add_filter( 'woocommerce_available_payment_gateways', 'payment_gateways_based_on_chosen_shipping_method' );
function payment_gateways_based_on_chosen_shipping_method( $available_gateways ) {
    
// Не в бэкэнде (администратор) и не на странице оплаты заказа
    if( is_admin() ||  is_wc_endpoint_url('order-pay') ) 
        return $available_gateways;
     
// Получить выбранные способы доставки
    $chosen_shipping_methods = (array) WC()->session->get( 'chosen_shipping_methods' );

    if ( in_array( 'flat_rate:12', $chosen_shipping_methods ) )
    {
        unset( $available_gateways['bacs'] );
        unset( $available_gateways['cod'] );
    }
    elseif ( in_array( 'flat_rate:14', $chosen_shipping_methods ) )
    {
        unset( $available_gateways['bacs'] );
        unset( $available_gateways['paypal'] );
    }
    elseif ( in_array( 'free_shipping:10', $chosen_shipping_methods ) )
    {
        unset( $available_gateways['cod'] );
        unset( $available_gateways['paypal'] );
    }

    return $available_gateways;
}

Еще один вариант. Необходимо при выборе способа доставки “Самовывоз” убрать способ оплаты “Оплату наличными курьеру”. В functions.php дочерней темы вставляем следующий код:

function payment_gateway_disable_country($available_gateways) {

global $woocommerce;

$packages = $woocommerce->shipping->get_packages();

foreach ( $packages as $i => $package ) {
$chosen_method = isset( $woocommerce->session->chosen_shipping_methods[ $i ] ) ?
$woocommerce->session->chosen_shipping_methods[ $i ] : '';

if ('local_pickup:1' == $chosen_method) {
unset($available_gateways['cheque']);
break;
}
}
return $available_gateways;
}
add_filter(
'woocommerce_available_payment_gateways',
'payment_gateway_disable_country'
);

‘local_pickup:1’ – это ID способа доставки “Самовывоз”;
‘cheque’ – это ID способа оплаты “Оплата наличными курьеру”.

При выборе способа доставки “Курьером” – отключаем способ оплаты “Оплата наличными либо картой при самовывозе”. Добавляем следующий код:

if ('flat_rate:2' == $chosen_method) {
unset($available_gateways['cod']);
break;
}

‘flat_rate:2’ – это ID способа доставки “Курьером”;
‘cod’ – это ID способа оплаты “Оплата наличными либо картой при самовывозе”.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Заполните данные ниже, и я свяжусь с вами в ближайшее время
Заказать обратный звонок
Заполните данные ниже, я свяжусь с вами в течение 15 минут в рабочее время
Заказать обратный звонок
Заполните данные ниже, я свяжусь с вами в течение 15 минут в рабочее время
Заказать обратный звонок