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

Мне нужно отключить конкретный способ доставки, если пользователь выбрал оплату «Наложенный платеж». Проблема в том, что следующий код работает только в том случае, если я каждый раз сбрасываю переходные процессы WooCommerce и обновляю их. Он не работает при выборе пользователя вперед и назад.

add_filter( 'woocommerce_package_rates', 'alter_shipping_methods', 100 );
function alter_shipping_methods( $rates ) {

    $chosen_gateway = WC()->session->chosen_payment_method;

    // If payment is Cash on delivery remove specific shipping 
    if($chosen_gateway == 'cod') {

        foreach ( $rates as $rate_id => $rate ) {
           if ( $rate->label === 'Hrvatska pošta' ) {
              unset( $rates[ $rate_id ] );
            }
       }

    }

    return $rates;

}

У меня есть этот код, который должен сработать, и я вижу вывод в консоли, когда нажимаю на опции.

jQuery(document.body).on('change', 'input[name="payment_method"]', function() {
    console.log('Payment method changed');
    jQuery('body').trigger('update_checkout');
});

Я пробовал с этим, не работает

function action_woocommerce_checkout_update_order_review($array, $int) {
    WC()->cart->calculate_shipping();
    return;
}
add_action('woocommerce_checkout_update_order_review', 'action_woocommerce_checkout_update_order_review', 10, 2);

И я также пробовал настраиваемый вызов AJAX, который вызывает функцию PHP, и внутри этого фильтра нет результата

add_filter( 'woocommerce_package_rates', 'alter_shipping_methods', 100 );

Что мне попробовать дальше?


person Ivan Topić    schedule 18.05.2018    source источник


Ответы (1)


Обновлено в марте 2019 г.

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

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

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

Вам нужно будет установить в первой функции идентификатор способа доставки, который вы хотите скрыть.

Код:

add_action( 'woocommerce_package_rates','show_hide_shipping_methods', 10, 2 );
function show_hide_shipping_methods( $rates, $package ) {
    // HERE Define your targeted shipping method ID
    $payment_method        = 'cod';

    $chosen_payment_method = WC()->session->get('chosen_payment_method');

    if( $payment_method == $chosen_payment_method ){
        unset($rates['flat_rate:12']);
    }
    return $rates;
}

add_action( 'woocommerce_review_order_before_payment', 'payment_methods_trigger_update_checkout' );
function payment_methods_trigger_update_checkout(){
    // jQuery code
    ?>
    <script type="text/javascript">
        (function($){
            $( 'form.checkout' ).on( 'change blur', 'input[name^="payment_method"]', function() {
                setTimeout(function(){
                    $(document.body).trigger('update_checkout');
                }, 250 );
            });
        })(jQuery);
    </script>
    <?php
}

add_action( 'woocommerce_checkout_update_order_review', 'refresh_shipping_methods' );
function refresh_shipping_methods( $post_data ){
    // HERE Define your targeted shipping method ID
    $payment_method = 'cod';
    $bool           = true;

    if ( WC()->session->get('chosen_payment_method') === $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();
}

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

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

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

Возможно, вам придется очистить корзину перед тестированием этого кода.

person LoicTheAztec    schedule 19.05.2018
comment
Привет, LoicTheAztec, не могли бы вы обновить, чтобы скрыть и другие способы ОПЛАТЫ? - person FilipeOS; 25.03.2019
comment
@FilipeOS Как это (я не понимаю)? … Этот ответ работает как есть. - person LoicTheAztec; 25.03.2019
comment
в соответствии с вашим ответом, если вы выберете метод доставки наложенным платежом, другие способы оплаты все еще будут отображаться, и вы можете запросить наложенный платеж + оплата, например, с помощью PayPal .. Вот почему я хочу скрыть способы оплаты, если выбрана доставка наложенным платежом. - person FilipeOS; 25.03.2019
comment
@FilipeOS К сожалению, код больше не работает ... Я изменил его и удалил ненужный Ajax. Попробуйте и дайте мне обратную связь. - person LoicTheAztec; 25.03.2019
comment
@LoicTheAztec Я установил последнюю версию WP и WC, но после первого выполнения обновление входит в цикл и никогда не останавливается ... есть ли проблема? - person user1142705; 01.06.2020
comment
@ user1142705 Только что протестировал это на последних версиях WP и WC в последней версии темы Storefront, и проблем нет. - person LoicTheAztec; 02.06.2020
comment
Привет, ваш код работает нормально, у меня есть вопрос ... А что, если вы тоже хотите назначить рядом с cod paypal? Так что для конкретной доставки будут доступны 2 способа оплаты. - person Miran Urbas; 11.01.2021