Я слегка изменил вашу форму:
<?php
// Postcode validation (error message)
if( 'delivery' === WC()->session->get('chosen_shipping') && empty($_POST['postcode']) ) {
?>
<div class="woocommerce"><ul class="woocommerce-error" role="alert"><ul>
<li><?php _e('The postcode is a required field for "Local delivery"'); ?></li>
</ul></div>
<?php
}
?>
<form method="post">
<label><?php _e("Postcode"); ?><br>
<input id="input-postcode" name="postcode" type="text" />
<button name="shipping_type" value="delivery" type="submit"><?php _e("Local delivery"); ?></button>
<button name="shipping_type" value="pickup" type="submit"><?php _e("Local pickup"); ?></button>
</form>
Тогда следующий код будет:
- раннее включение сеанса WooCommerce для пользователя (до первого добавления в корзину )
- получит опубликованные данные для выбора доставки пользователем и введенный почтовый индекс
- предупредит пользователя, когда выбран вариант доставки «доставка» без почтового индекса.
- установит отправленные данные в переменных сеанса WooCommerce
- перенаправит клиента на конкретную c определенную страницу
- установит реальный выбранный WooCommerce метод доставки для корзины и оформления заказа на основе выбора доставки
В первой функции вам нужно будет установить правильный идентификатор тарифа метода доставки для «Доставка» и «Самовывоз». Вы можете заставить их проверить переключатели методов доставки на странице оформления заказа (например, это значение из атрибута name, например name="local_pickup:13"
.
Код:
// Utility function with your shipping method settings
function get_shipping_rates_id_from_chosen( $chosen_shipping ) {
// For "pickup"
if ( 'pickup' === $chosen_shipping ) {
return 'local_pickup:13'; // <== Set your "Local pickup" shipping method rate ID
}
// For delivery
elseif ( 'delivery' === $chosen_shipping ) {
return 'flat_rate:14'; // <== Set your "Flat rate" shipping method rate ID
}
}
add_action('init', 'set_chosen_shipping_type_to_session');
function set_chosen_shipping_type_to_session() {
if ( isset($_POST['shipping_type']) ) {
// Early enable customer WC Session
if ( isset(WC()->session) && ! WC()->session->has_session() ) {
WC()->session->set_customer_session_cookie( true );
}
// Get the chosen shipping type
if ( isset($_POST['shipping_type']) ) {
// Set chosen shipping type in a session variable
WC()->session->set('chosen_shipping', wc_clean($_POST['shipping_type']));
}
// Get the inputed postcode
if ( isset($_POST['postcode']) && ! empty($_POST['postcode']) ) {
// Set chosen postcode in a session variable
WC()->session->set('postcode_input', wc_clean($_POST['postcode']) );
// Set customer shipping postcode
WC()->customer->set_shipping_postcode( wc_clean($_POST['postcode']) );
}
}
}
// redirection after post | Set the chosen shipping method on cart and checkout
add_action('template_redirect', 'action_template_redirect');
function action_template_redirect($shipping) {
// For "Local delivery" without postcode (no redirection)
if( isset($_POST['shipping_type']) && 'delivery' === $_POST['shipping_type']
&& isset($_POST['postcode']) && empty($_POST['postcode']) ) {
return;
}
// Redirection
elseif( isset($_POST['shipping_type']) && WC()->session->get('chosen_shipping') ) {
wp_redirect(home_url('/explore/'));
exit();
}
// Set the chosen shipping method (in cart or checkout)
elseif( is_cart() || ( is_checkout() && ! is_wc_endpoint_url( 'order-received' ) ) ) {
$chosen_shipping = WC()->session->get('chosen_shipping');
// Get the
$shipping_rate_id = get_shipping_rates_id_from_chosen( $chosen_shipping );
// Set for real the chosen shipping method
WC()->session->set( 'chosen_shipping_methods', [$shipping_rate_id] );
}
}
Код входит в functions. php файл вашей активной дочерней темы (или активной темы). Протестировано и работает.
Для почтового индекса вы можете получить значение из W C SESSION через:
$postcode = WC()->session->get( 'postcode_input' );