Скрыть раздел полей доставки при оформлении заказа для конкретного метода доставки в WooCommerce

Кто-то задал следующий вопрос, на который я ответил. Потом удалил. Поэтому я публикую вопрос и свой ответ, поскольку это может быть полезно для сообщества:

В WooCommerce я пытаюсь динамически обновить форму флажка, не перезагружая страницу оформления заказа. У меня есть 2 способа доставки: «Доставка» и «Самовывоз». Я пытаюсь отключить только раздел адреса доставки (с помощью флажка «отправить на другой адрес, если выбран метод сбора») и все поля доставки.

Сначала я попробовал это:

add_action( 'woocommerce_after_shipping_rate', 'carrier_custom_fields', 30, 2 );
function carrier_custom_fields( $method, $index ) {
    if( ! is_checkout()) return; // Only on checkout page

    $customer_carrier_method = 'local_pickup:1';


    if( $method->id != $customer_carrier_method ) return; // Only display for "local_pickup"

    $chosen_method_id = WC()->session->chosen_shipping_methods[ $index ];

    // echo $chosen_method_id;

    // If the chosen shipping method is 'legacy_local_pickup' we display
    if($chosen_method_id == $customer_carrier_method ):

        add_filter( 'woocommerce_cart_needs_shipping_address', '__return_false');

    else :
        add_filter( 'woocommerce_cart_needs_shipping_address', '__return_true');


    endif;

}

Затем я попробовал это:

add_action( 'woocommerce_shipping_method_chosen', 'check_if_local_pickup', 10, 1 );
function check_if_local_pickup( $chosen_method ) {
    $chosen_methods = WC()->session->get( 'chosen_shipping_methods' );
    $chosen_shipping = $chosen_methods[0]; 
    if ($chosen_shipping == 'local_pickup:1') { 
        add_filter( 'woocommerce_ship_to_different_address_checked', '__return_false' );
        add_filter( 'woocommerce_cart_needs_shipping_address', '__return_false');
        return true;
    }
    else
    {
        add_filter( 'woocommerce_cart_needs_shipping_address', '__return_true');
        return true;

    }
} 

Оба они не работают.

Как скрыть раздел полей доставки для конкретного выбранного способа доставки в WooCommerce?


person LoicTheAztec    schedule 13.06.2020    source источник


Ответы (1)


PHP не подходит, так как это событие на «стороне клиента» (не на «стороне сервера»), поэтому для этого требуется использовать jQuery. Итак, чтобы скрыть раздел полей доставки для определенного способа доставки, вы будете использовать следующее:

// Auto Show hide checkout shipping fields section based on chosen shipping methods
add_action( 'wp_footer', 'custom_checkout_field_script' );
function custom_checkout_field_script() {
    // Only on checkout page
    if( is_checkout() && ! is_wc_endpoint_url() ):

    // HERE below define your local pickup shipping method
    $local_pickup = 'local_pickup:1';

    // Jquery code start
    ?>
    <script>
        jQuery(function($){
            var a = 'checked',      
                b = 'input#ship-to-different-address-checkbox', 
                c = 'input[name^="shipping_method"]',   
                d = '<?php echo $local_pickup; ?>',     
                e = c + ':' + a
                f = 'div.woocommerce-shipping-fields,' + b;

            // 1. On load: when the chosen shipping method is our defined shipping method
            if( $(e).val() === d ) {
                // Hide shipping fields section
                $(f).hide(); 
            }

            // 2. On shipping method "change" (Live event)
            $( 'form.checkout' ).on( 'change', c, function() {
                // When the chosen shipping method is our defined shipping method
                if( $(e).val() === d ) {
                    // if the checkbox is checked, uncheck it first
                    if ( $(b).prop(a) ) {
                        $(b).click();
                    }

                    // Hide shipping fields section
                    $(f).hide();
                } else if ( $(e).val() !== d ) {
                    // show closed shipping fields section with (unchecked checkbox)
                    $(f).show();                    
                }
            });
        });
    </script>
    <?php
    endif;
}

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

По теме: Как сделать так, чтобы доставка по другому адресу проверялась при использовании бесплатной доставки и фиксированной ставки?

person LoicTheAztec    schedule 13.06.2020
comment
Это здорово и действительно полезно. Но есть проблема, которую я не могу решить. Решение работает как шарм на рабочем столе, но не работает на мобильных устройствах. Я имею в виду, что когда я выбираю Самовывоз на мобильном телефоне, в полях оформления заказа ничего не меняется. Это странное поведение, потому что jquery довольно хорошо работает на мобильных устройствах. Я думал, что это связано с одним устройством, но проверял на трех. - person Victor Sokoliuk; 02.01.2021
comment
@VictorSokoliuk Извините, но он отлично работает на мобильном Google Chrome (и Safari тоже): я только что протестировал это для последней версии WooCommerce на телефоне Android и на iOS (планшет Mac). - person LoicTheAztec; 03.01.2021
comment
Привет, Лоик, мне может понадобиться твоя помощь с моим последним вопросом о WooCommerce. Может быть, вы уже это сделали и у вас есть идея? - person Mr. Jo; 05.05.2021