Получение методов доставки WooCommerce программным путем

16 февр. 2020 г., 00:28:43
Просмотры: 36.5K
Голосов: 2

Как я могу получить методы доставки в моем магазине WooCommerce? У меня на странице оформления заказа отображается следующее:

страница оформления заказа с методами доставки WooCommerce

А в панели администратора это выглядит так:

методы доставки в панели администратора WordPress

Я пробовал использовать:

WC()->shipping->load_shipping_methods()

Но это не возвращает текст/цену для GLS или Click and collect. Возвращаются следующие данные: https://paste.laravel.io/0c1aff96-dbed-452c-856f-6d62b6f1f47e

3
Комментарии

Какой вывод вы получаете при использовании WC()->shipping->get_shipping_methods(); ?

7uc1f3r 7uc1f3r
16 февр. 2020 г. 10:37:43

@L7c1f3r тот же вывод, что и в pastebin..

FooBar FooBar
16 февр. 2020 г. 11:53:47

Я проверил это, и действительно, результат такой же. Если я посмотрю на ваш вывод и сравню его со своим, то увижу, что данные присутствуют, но, например, 'GLS' отсутствует как method_title, а 'Flat rate' отображается там, но то же самое и с моим выводом, так что в этом нет ничего неправильного. 'GLS', оказывается, является меткой. Какова ваша конечная цель, какие данные вы хотите получить и где планируете использовать их в дальнейшем?

7uc1f3r 7uc1f3r
16 февр. 2020 г. 22:27:40
Все ответы на вопрос 1
3

Вам нужно использовать что-то другое, как показано ниже (с комментариями):

// Цикл по пакетам доставки из WC_Session (в некоторых случаях их может быть несколько)
foreach ( WC()->cart->get_shipping_packages() as $package_id => $package ) {
    // Проверяем, существует ли доставка для текущего пакета
    if ( WC()->session->__isset( 'shipping_for_package_'.$package_id ) ) {
        // Цикл по тарифам доставки для текущего пакета
        foreach ( WC()->session->get( 'shipping_for_package_'.$package_id )['rates'] as $shipping_rate_id => $shipping_rate ) {
            $rate_id     = $shipping_rate->get_id(); // то же самое, что и переменная $shipping_rate_id (комбинация метода доставки и ID экземпляра)
            $method_id   = $shipping_rate->get_method_id(); // Слаг метода доставки
            $instance_id = $shipping_rate->get_instance_id(); // ID экземпляра
            $label_name  = $shipping_rate->get_label(); // Название метода в виде метки
            $cost        = $shipping_rate->get_cost(); // Стоимость без налога
            $tax_cost    = $shipping_rate->get_shipping_tax(); // Сумма налога
            $taxes       = $shipping_rate->get_taxes(); // Подробности о налогах (массив)
        }
    }
}

Теперь если сессия покупателя еще не активирована (покупатель еще не добавил товар в корзину), вам нужно принудительно активировать сессию WooCommerce с помощью следующего кода:

// Активация WC_Session для покупателя
add_action( 'init', 'wc_session_enabler' );
function wc_session_enabler() {
    if ( is_user_logged_in() || is_admin() )
        return;

    if ( isset(WC()->session) && ! WC()->session->has_session() ) {
        WC()->session->set_customer_session_cookie( true );
    }
}

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

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

$chosen_shipping_methods = WC()->session->get( 'chosen_shipping_methods' );
17 февр. 2020 г. 15:49:38
Комментарии

Знаете ли вы, работает ли WC()->session->get( 'chosen_shipping_methods' ), если доступен только один способ доставки?

Sam Assoum Sam Assoum
25 янв. 2021 г. 20:16:38

@SamAssoum Да, это работает...

LoicTheAztec LoicTheAztec
25 янв. 2021 г. 22:05:10

Я хочу отобразить выбранный способ доставки в разделе "Мой заказ", который я сделал кастомным. Как я могу вывести выбранный способ доставки из сессии в раздел "Мой заказ"?

Ravi Ravi
7 мар. 2021 г. 17:09:32