Сначала выберите способ доставки самовывоз или доставку в WooCommerce. - PullRequest
0 голосов
/ 18 июня 2020

Я создаю веб-сайт с использованием woocommerce, требование состоит в том, чтобы пользователь сначала выбрал тип доставки: самовывоз или доставка на дом на первой странице, а затем go на страницу магазина. если пользователь выбирает самовывоз на первой странице, то на странице оформления заказа я должен предоставить возможность выбрать дату и время.

Я создал первую подобную страницу

<form method="post">
    <input name="postcode" type="text" />
    <button name="shipping" value="delivery" type="submit">Local delivery</button>
    <button name="shipping" value="pickup" type="submit">Local pickup</button>
</form>

и в функции. php

function ff_set_shipping_and_redirect($shipping) {
    WC()->session->set('chosen_shipping_methods', array($shipping));
    wp_redirect(site_url('/explore/'));
    exit;
}

function ff_shipping_init() {
    if (isset($_POST['shipping'])) {
        if ($_POST['shipping'] === "pickup") {
            ff_set_shipping_and_redirect('local_pickup');
        } else if ($_POST['shipping'] === "delivery") {

             ff_set_shipping_and_redirect('local_delivery');
          }
    }
}
add_action('init', 'ff_shipping_init');

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

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

его показывающего пустого массива

любой орган может посоветовать или какое-либо лучшее решение для этого.

1 Ответ

1 голос
/ 19 июня 2020

Я слегка изменил вашу форму:

<?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' );
...