Отображение настраиваемого сообщения на основе зоны доставки клиента в Woocommerce

В woocommerce мне нужно отображать настраиваемое сообщение на странице корзины или оформления заказа в зависимости от зоны доставки, например «с вас будет взиматься дополнительная плата на 10% за этот почтовый индекс».

Я чувствую, что это легко, но не могу заставить его работать! И это сводит меня с ума! Любая помощь приветствуется.

Мой обходной путь заключается в настройке такого сообщения по умолчанию:

add_filter( 'woocommerce_no_shipping_available_html', 'wf_customize_default_message', 10, 1 );
// For Checkout page
add_filter( 'woocommerce_cart_no_shipping_available_html', 'wf_customize_default_message', 10, 1 );
function wf_customize_default_message( $default_msg ) {
    $zip_array = array(
        '30031',
    );

    if ( in_array( WC()->customer->get_shipping_postcode() , $zip_array) ) {
        $custom_msg = "Call us for quotation - 1-800-XXX-XXXX";
        if( empty( $custom_msg ) ) {
          return $default_msg;
        }
        return $custom_msg;
    }

    return $default_msg;
}

person Camille S.    schedule 10.10.2018    source источник
comment
Привет всем, забыл :)   -  person Camille S.    schedule 10.10.2018
comment
Привет, Лоик, спасибо за быстрый ответ. Я еще не тестировал ваш код, но можно ли адаптировать ваш образец к зонам доставки, которые я создал для одного созданного мной метода доставки? + Мне нужно добавить много почтовых индексов, а не один ... Большое спасибо за вашу помощь!   -  person Camille S.    schedule 10.10.2018
comment
Привет снова, Лоик, я не понимаю, я не вижу твоего первого ответа?   -  person Camille S.    schedule 11.10.2018
comment
Извините, но я думаю, что вы удалили свой ответ ... Не могли бы вы опубликовать его еще раз, пожалуйста?   -  person Camille S.    schedule 11.10.2018
comment
Я сделал другой ответ… более удобный… Использование уведомлений woocommerce не будет работать при оформлении заказа, если пользователь изменит зону доставки.   -  person LoicTheAztec    schedule 11.10.2018
comment
Я еще не тестировал его, но он впечатляет! Большое спасибо !   -  person Camille S.    schedule 11.10.2018


Ответы (2)


Обновлено

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

add_action( 'woocommerce_cart_totals_after_shipping' , 'shipping_zone_targeted_postcodes_custom_notice' );
add_action( 'woocommerce_review_order_after_shipping' , 'shipping_zone_targeted_postcodes_custom_notice' );
function shipping_zone_targeted_postcodes_custom_notice() {
    // HERE DEFINE YOUR SHIPPING ZONE NAME(S)
    $targeted_zones_names = array('France'); // <======  <======  <======  <======  <======  

    // Get the customer shipping zone name
    $chosen_methods    = WC()->session->get( 'chosen_shipping_methods' ); // The chosen shipping mehod
    $chosen_method     = explode(':', reset($chosen_methods) );
    $shipping_zone     = WC_Shipping_Zones::get_zone_by( 'instance_id', $chosen_method[1] );
    $current_zone_name = $shipping_zone->get_zone_name();

    if( in_array( $current_zone_name, $targeted_zones_names ) ){
        echo '<tr class="shipping">
            <td colspan="2" style="text-align:center">' . sprintf(
                __( "You'll be charged %s more for %s zip code", "woocommerce"),
                '<strong>10%</strong>',
                '<strong>' . WC()->customer->get_shipping_postcode() . '</strong>'
            ) . '</td>
        </tr>';
    }
}

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

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

person LoicTheAztec    schedule 10.10.2018

Используя решение @ LoicTheAztec, описанное выше, я изменил его, чтобы он отображал сообщение в зависимости от страны клиента.

add_action( 'woocommerce_cart_totals_after_shipping' , 'out_of_zone_shipping_notice' );
add_action( 'woocommerce_review_order_after_shipping' , 'out_of_zone_shipping_notice' );
function out_of_zone_shipping_notice() {
    // HERE DEFINE YOUR SHIPPING COUNTRY NAMES
    $targeted_country_names = array("CA", "US"); // 

    // Get the customer shipping country
    $shipping_country    = WC()->customer->get_shipping_country();
    
    if( !in_array( $shipping_country, $targeted_country_names ) ){
        echo '<tr class="shipping"><td colspan="2" style="text-align:center">You are outside of our regular shipping zone. Please <a href="../contact/">contact us</a> with your address so we can get an accurate cost to ship.</td></tr>';
    }
}

Чтобы увидеть, в каком формате отображается $ shipping_country, я использовал

echo $shipping_country

чуть ниже $ shipping_country = WC () - ›customer-› get_country ();, чтобы показать на странице корзины фактический синтаксис кода страны, чтобы я мог сопоставить его с if < / em> заявление. Однако этот сегмент кода был удален перед развертыванием, чтобы на экране не появлялись случайные символы для клиента.

person ntk4    schedule 18.12.2020