Настройка доставки в woocommerce 2.6 кардинальным образом изменилась. Стала более гибкой, но и более сложной в настройке. Разберемся в тонкостях настройки доставки.
Зоны доставки
Зоны доставки — это определенная территория на которой действует 1 тариф. Например ЮФО, или РО, или Ростов-на-Дону или Октябрьский район (если по районам стоимость доставки должна отличатся).
При создании новой зоны WC предлагает выбрать регионы. Находим Россию. И чуть ниже поле для конкретных почтовых индексов — здесь мы должны прописать необходимые для данной территории индексы. Каждый индекс с новой строки.
Метод доставки
После того как мы создали зону, мы должны применить к ней метод доставки. Есть 3 метода доставки:
- Единая ставка
- Бесплатная доставка
- Самовывоз
Выбирая метод Единая ставка нужно указать стоимость доставки по данной территории. После того как мы завели метод, можно переименовать его с Единая ставка на свое название. Кликнув на ссылку Единая ставка.
Методов можно сделать несколько, например Доставка по данной территории 500 руб, или Самовывоз 0 руб.
После того как мы завели зоны с методами доставки, данные виды доставки будут выводится и учитываться при формировании заказа, в тот момент когда покупатель будет указывать индекс.
Индексы Ростова-на-Дону
344000
344001
344002
344004
344006
344009
344010
344011
344012
344013
344015
344016
344018
344019
344020
344022
344023
344025
344029
344030
344032
344033
344034
344037
344038
344039
344041
344045
344048
344049
344055
344056
344058
344064
344065
344068
344069
344072
344079
344082
344090
344091
344092
344093
344094
344095
344101
344111
344112
344113
344114
344116
Описание метода доставки
Я столкнулся с тем, что нет функции описания метода доставки, на подобии как у методов оплаты. На данный момент нашел единственное решение, но корявое — плагин Shipping Icons and Descriptions for WooCommerce (20+).
Плагин дает возможность прописать описание, но только к 3-м методам доставки: Самовывоз, Единая ставка, Бесплатная доставка.
Это не очень удобно.
Вариант реализации при помощи jquery (работает только при отключении Ajax обновления страницы оформления, как это сделать — описано здесь)
$(document).ready(function() {
$('#shipping_method_0_flat_rate-6').parent('li').append('<div class="payment_box flat_rate"><p class="new">После оформления заказа наш менеджер свяжется с Вами для уточнения стоимости, времени и условий доставки.</p></div>');
$('#shipping_method_0_local_pickup-7').parent('li').append('<div class="payment_box local_pickup"><p class="new">Товар Вы сможете забрать по адресу: ...</p></div>');
$('#shipping_method_0_flat_rate-6').parent('li').click(function() {
$('.payment_box.local_pickup').slideUp(300);
$('.payment_box.flat_rate').slideDown(300);
});
$('#shipping_method_0_local_pickup-7').parent('li').click(function() {
$('.payment_box.flat_rate').slideUp(300);
$('.payment_box.local_pickup').slideDown(300);
});
});
Также скрываем блок который изначально не активен: .payment_box.local_pickup {display: none;}
ID блоков настраиваются индивидуально!
Как сделать один из вариантов доставки изначально активным и скрывать поля доставки при выборе вариант Самовывоз читайте здесь.
Изменять варианты оплаты при разных методах доставки
Я пробовал использовать эту функцию, но в моем случае она функционировала некорректно. Вариант оплаты пропадал и не появлялся при любом методе доставки.
function alter_shipping_methods($available_gateways){
global $woocommerce;
$chosen_titles = array();
$available_methods = $woocommerce->shipping->get_packages();
$chosen_rates = ( isset( $woocommerce->session ) ) ? $woocommerce->session->get( 'chosen_shipping_methods' ) : array();
foreach ($available_methods as $method)
foreach ($chosen_rates as $chosen) {
if( isset( $method['rates'][$chosen] ) ) $chosen_titles[] = $method['rates'][ $chosen ]->label;
}
if( in_array( 'Самовывоз', $chosen_titles ) ) {
unset($available_gateways['paypal']);
}
return $available_gateways;
}
add_action('woocommerce_available_payment_gateways', 'alter_shipping_methods');
Я решил реализовать функционал с помощью jquery
$('input:radio[name="shipping_method[0]"]').on('change', function () {
if ( $("#shipping_method_0_flat_rate-6").prop("checked") ) {
//alert('выбрана Доставка');
$("#ship-to-different-address-checkbox").click(); //Кликаем на Доставку
$("li.payment_method_bacs input").click();
$("li.payment_method_bacs input").click();
$("li.wc_payment_method.payment_method_cod").hide();
}
if ( $("#shipping_method_0_local_pickup-7").prop("checked") ) {
//alert('выбран Самовывоз');
$("#ship-to-different-address-checkbox").click(); //Кликаем на Доставку
$("li.wc_payment_method.payment_method_cod").show();
}
});
Первая строка отслеживает событие изменение метода доставки.
Далее и идет проверка активен ли пункт с определенным методом доставки и в зависимости от этого скрывается ненужные варианты оплаты. Но при этом если вариант оплаты, который будет скрыватся активен, то нужно убрать с него активность. Для этого вызываем триггер — клик по другому варианту доставки и обязательно дважды (с первого раза пункт переключается, но не раскрывается описание метода оплаты).
$(«#ship-to-different-address-checkbox»).click(); — эта строка для открытия/скрытия полей доставки.
Прячем метод платной доставки
В методе бесплатной доставки можно выставить условие по цене с какой суммы она будет предлагаться, а вот в платном варианте доставки нет такой возможности. Скроем ее с помощью jQuery
// Убираем способ платный метод доставки, если сумма более 1000 руб.
var price = $(".order-total span.woocommerce-Price-amount.amount").text();
var numprice = parseInt(price.replace(/\D+/g,""));
if(numprice >= 1000) {
$("#shipping_method_0_flat_rate-7").hide();
$("#shipping_method_0_flat_rate-7").next().hide();
}
Отключаем все методы доставки кроме бесплатной
Если условия заказа соответствуют бесплатной доставке, то логично отключать остальные методы
// Отключаем другие варианты доставки при доставке FREE
function my_hide_shipping_when_free_is_available( $rates ) {
$free = array();
foreach ( $rates as $rate_id => $rate ) {
if ( 'free_shipping' === $rate->method_id ) {
$free[ $rate_id ] = $rate;
break;
}
}
return ! empty( $free ) ? $free : $rates;
}
add_filter( 'woocommerce_package_rates', 'my_hide_shipping_when_free_is_available', 100 );
Пожалуйста, введите адрес для продолжения
С одной из последних версий WC стал требовать чтобы при любых обстоятельствах в платежных полях было поле Страна (в независимости от того что торгуем и доставляем мы только в одной стране).
Решение: включаем это поле (если торгуем в одной стране, то значение будет выбрано сразу) и делаем его невидимым.
//unset($fields['billing']['billing_country']); //Страна
#billing_country_field {display: none;}
Выбор варианта доставки в виде выпадающего списка
Потребность в данной доработке есть тогда, когда на сайте множество вариантов доставки или самовывоза.
Установил плагин Shipping Method Display Style for WooCommerce (2000) единственная функция которого заключается в том, чтобы превращать список пунктов доставки из radio button в select (выпадающий список). Но плагин этого не делал. Пришлось залезть в его недра и вынуть саму его суть.
Чтобы изменить список нужно в шаблоне woocommerce/cart/cart-shipping.php формирование стандартного списка
<ul id="shipping_method" class="woocommerce-shipping-methods">
<?php foreach ( $available_methods as $method ) : ?>
<li>
<?php
if ( 1 < count( $available_methods ) ) {
printf( '<input type="radio" name="shipping_method[%1$d]" data-index="%1$d" id="shipping_method_%1$d_%2$s" value="%3$s" class="shipping_method" %4$s />', $index, esc_attr( sanitize_title( $method->id ) ), esc_attr( $method->id ), checked( $method->id, $chosen_method, false ) ); // WPCS: XSS ok.
} else {
printf( '<input type="hidden" name="shipping_method[%1$d]" data-index="%1$d" id="shipping_method_%1$d_%2$s" value="%3$s" class="shipping_method" />', $index, esc_attr( sanitize_title( $method->id ) ), esc_attr( $method->id ) ); // WPCS: XSS ok.
}
printf( '<label for="shipping_method_%1$s_%2$s">%3$s</label>', $index, esc_attr( sanitize_title( $method->id ) ), wc_cart_totals_shipping_method_label( $method ) ); // WPCS: XSS ok.
do_action( 'woocommerce_after_shipping_rate', $method, $index );
?>
</li>
<?php endforeach; ?>
</ul>
заменить на
<select name="shipping_method[<?php echo esc_attr( $index ); ?>]" data-index="<?php echo esc_attr( $index ); ?>" id="shipping_method_<?php echo esc_attr( $index ); ?>" class="shipping_method">
<?php foreach ( $available_methods as $method ) : ?>
<option value="<?php echo esc_attr( $method->id ); ?>" <?php selected( $method->id, $chosen_method ); ?>><?php echo wp_kses_post( wc_cart_totals_shipping_method_label( $method ) ); ?></option>
<?php endforeach; ?>
</select>
Это работает!
[site-socialshare]