Отключить способ доставки для определенного способа оплаты в Woocommerce

В Woocommerce я включил 2 способа доставки: бесплатная доставка или фиксированная ставка. Я активировал 2 способа оплаты: банковский перевод (bacs) и PayPal (paypal).

Чего я хочу достичь: если клиент выбирает PayPal в качестве типа оплаты, он должен быть вынужден выбрать «Фиксированная ставка» в качестве способа доставки. «Бесплатная доставка» должна быть скрыта или выделена серым цветом, или что-то в этом роде.

Если выбран банковский перевод, должны быть доступны оба способа доставки.

Любая помощь приветствуется.


person Andy    schedule 10.12.2018    source источник


Ответы (2)


Если кому интересно, нашел решение:

function alter_payment_gateways( $list ){
    // Retrieve chosen shipping options from all possible packages
    $chosen_rates = ( isset( WC()->session ) ) ? WC()->session->get( 'chosen_shipping_methods' ) : array();
    if( in_array( 'free_shipping:1', $chosen_rates ) ) {
        $array_diff = array('WC_Gateway_Paypal');
        $list = array_diff( $list, $array_diff );
    }
    return $list;
}
add_action('woocommerce_payment_gateways', 'alter_payment_gateways');

Этот код отключит PayPal, если покупатель выберет бесплатную доставку.

person Andy    schedule 25.01.2019
comment
Могу я сделать наоборот? Так что, если покупатель нажимает PayPal в качестве способа оплаты, возможность доставки удаляется? Я попытался отредактировать ваш фрагмент, но безуспешно: / - person Vegapunk; 07.12.2020

Обновление 2. Следующий код отключит free_shipping способ доставки (идентификатор метода), если в качестве способа оплаты выбран PayPal:

add_filter( 'woocommerce_package_rates', 'shipping_methods_based_on_chosen_payment', 100, 2 );
function shipping_methods_based_on_chosen_payment( $rates, $package ) {
    // Checking if "paypal" is the chosen payment method
    if ( WC()->session->get( 'chosen_payment_method' ) === 'paypal' ) {
        // Loop through shipping methods rates
        foreach( $rates as $rate_key => $rate ){
            if ( 'free_shipping' === $rate->method_id ) {
                unset($rates[$rate_key]); // Remove 'Free shipping'shipping method
            }
        }
    }
    return $rates;
}

// Enabling, disabling and refreshing session shipping methods data
add_action( 'woocommerce_checkout_update_order_review', 'refresh_shipping_methods', 10, 1 );
function refresh_shipping_methods( $post_data ){
    $bool = true;
    if ( WC()->session->get('chosen_payment_method' ) ) $bool = false;

    // Mandatory to make it work with shipping methods
    foreach ( WC()->cart->get_shipping_packages() as $package_key => $package ){
        WC()->session->set( 'shipping_for_package_' . $package_key, $bool );
    }
    WC()->cart->calculate_shipping();
}

// Jquery script for checkout page
add_action('wp_footer', 'refresh_checkout_on_payment_method_change' );
function refresh_checkout_on_payment_method_change() {
    // Only checkout page
    if( is_checkout() && ! is_wc_endpoint_url() ):
    ?>
    <script type="text/javascript">
    jQuery(function($){
        // On shipping method change
        $('form.checkout').on( 'change', 'input[name^="payment_method"]', function(){
            $('body').trigger('update_checkout'); // Trigger Ajax checkout refresh
        });
    })
    </script>
    <?php
    endif;
}

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

Чтобы получить соответствующие идентификаторы ставок для методов доставки, например flat_rate:12, проверьте с помощью инспектора кода браузера каждый связанный атрибут переключателя name, например:

введите описание изображения здесь


Примечание. Поскольку новые версии WooCommerce меняются, извините, код больше не работает.

person LoicTheAztec    schedule 10.12.2018
comment
Спасибо, но, к сожалению, у меня это не работает. Я изменил "Без отслеживания" в строке 7 на Priority Lieferung (3-5 Werktage), потому что так называется способ доставки. Что еще мне нужно изменить или попробовать? - person Andy; 10.12.2018
comment
Спасибо за разъяснение! Я узнал, что идентификатор тарифа доставки для неотслеживаемого метода доставки - free_shipping: 2, поэтому я вставил его в строку 4 вашего кода вместо flat_rate: 12, верно? Проблема в том, что он удаляет этот способ доставки (неотслеживаемый / Priority Lieferung), даже если в качестве способа оплаты выбран банковский перевод. - person Andy; 12.12.2018
comment
Как мне узнать, что я делаю не так? У меня есть настройка, которая удаляет нижний колонтитул веб-сайта, но я не думаю, что это влияет на ваш код. У меня установлен редактор полей оформления заказа для WooCommerce. - person Andy; 12.12.2018
comment
Я попробовал еще раз, но все равно не работает. Я обновил кешированные данные о доставке, но на странице оформления заказа код для меня не работает должным образом. - person Andy; 19.12.2018
comment
Итак, это работает ... отчасти. У меня работает только при смене страны доставки. Поэтому, когда в качестве страны доставки выбрана Германия и я нажимаю PayPal, ничего не меняется, но когда я меняю страну, скажем, на Норвегию, неотслеживаемый способ доставки исчезает. Есть идеи, что вызывает это? - person Andy; 20.12.2018
comment
Уважаемый @LoicTheAztec, ты как всегда качаешься. Однако у меня есть один вопрос. Я использую предоставленный вами код, и иногда он не работает. Чтобы быть более конкретным, кажется, что способ оплаты, который выбирает пользователь, сохраняется в сеансе и используется после второго изменения раскрывающегося списка способов оплаты. Поэтому в моем коде я хотел бы, чтобы бесплатная доставка была отключена, когда пользователь выбирает оплату наложенным платежом, однако бесплатная доставка не устанавливается, когда пользователь выбирает другой способ оплаты ПОСЛЕ того, как сначала выбрал наложенный платеж. Вы хоть понимаете, почему это происходит? - person Archimidis M; 13.02.2021
comment
@ArchimidisM Теперь я вспоминаю (так что я не качаюсь): Мне никогда не удавалось найти способ заставить его работать… Так что забудьте об этом. - person LoicTheAztec; 13.02.2021
comment
Большое спасибо за ответ @LoicTheAztec - person Archimidis M; 14.02.2021