Как отобразить срок доставки в корзине и на оформлении заказа WooCommerce

Когда в магазине есть несколько способов доставки, покупателю обычно не хватает не цены, а понятного срока: сегодня, завтра, 3–5 дней, под заказ. В WooCommerce это можно показать без тяжелых расширений, если срок зависит от выбранного метода доставки, города или суммы заказа. Ниже — рабочий вариант на коде, плюс разбор, где чаще всего ломается логика.

Когда это действительно нужно

Сценарий простой: в корзине и на checkout есть доставка, но пользователь не понимает, когда получит заказ. Из-за этого растут брошенные корзины и вопросы в поддержку. Типичные случаи:

  • курьер по городу — 1–2 дня;
  • ПВЗ — 2–4 дня;
  • доставка в регионы — 5–10 дней;
  • часть товаров делается под заказ и требует отдельного срока.

Если срок зависит только от способа доставки, задачу можно решить через фильтр WooCommerce. Если срок зависит еще и от состава корзины, понадобится чуть больше логики.

Диагностика: что проверить до правки кода

Перед тем как вносить изменения, проверьте, откуда вообще должен браться срок. Это экономит время и помогает не повесить на сайт лишнюю логику.

  • Какие методы доставки используются: фиксированная ставка, бесплатная доставка, самовывоз, интеграция с СДЭК/Boxberry/другим модулем.
  • Есть ли у методов стабильные ID и названия.
  • Нужно ли показывать срок только в корзине, только на checkout или еще в письмах.
  • Меняется ли срок в зависимости от города, региона или суммы заказа.
  • Не кэшируется ли страница корзины сторонним плагином или серверным кэшем.

Если у вас уже есть плагин доставки, сначала посмотрите, не умеет ли он передавать срок сам. Иногда достаточно подхватить его из настроек метода и вывести рядом с ценой.

Подходы: плагин, код или настройка метода доставки

ПодходКогда подходитМинусы
Настройка в плагине доставкиЕсли модуль уже хранит срок и умеет показывать его в интерфейсеЗависимость от конкретного плагина
Код в теме или мини-плагинеЕсли нужен контроль над текстом и логикойНужно аккуратно поддерживать при обновлениях
Отдельный плагин для условий доставкиЕсли срок зависит от сложных правилЛишняя нагрузка и риск конфликтов

Для большинства магазинов практичнее начать с кода: он прозрачнее, проще тестируется и не тащит лишние зависимости.

Пошаговое решение через хуки WooCommerce

Ниже пример, который добавляет срок доставки в корзину и на страницу оформления заказа. Логика завязана на ID метода доставки. Вы можете заменить их на свои значения.

add_filter( 'woocommerce_cart_shipping_method_full_label', 'wpclass_add_delivery_time_to_shipping_label', 10, 2 );
function wpclass_add_delivery_time_to_shipping_label( $label, $method ) {
    $delivery_times = array(
        'flat_rate:1'      => '1–2 дня',
        'local_pickup:2'   => 'сегодня',
        'flat_rate:3'      => '3–5 дней',
    );

    $method_id = $method->id . ':' . $method->instance_id;

    if ( isset( $delivery_times[ $method_id ] ) ) {
        $label .= '<br><small class="shipping-delivery-time">Срок доставки: ' . esc_html( $delivery_times[ $method_id ] ) . '</small>';
    }

    return $label;
}

add_action( 'woocommerce_review_order_after_shipping', 'wpclass_show_delivery_time_notice' );
function wpclass_show_delivery_time_notice() {
    $chosen_methods = WC()->session->get( 'chosen_shipping_methods' );

    if ( empty( $chosen_methods[0] ) ) {
        return;
    }

    $delivery_times = array(
        'flat_rate:1'    => '1–2 дня',
        'local_pickup:2' => 'сегодня',
        'flat_rate:3'    => '3–5 дней',
    );

    $chosen_method = $chosen_methods[0];

    if ( isset( $delivery_times[ $chosen_method ] ) ) {
        echo '<p class="woocommerce-info shipping-delivery-time-notice">Ориентировочный срок доставки: ' . esc_html( $delivery_times[ $chosen_method ] ) . '</p>';
    }
}

Что здесь важно:

  • woocommerce_cart_shipping_method_full_label меняет подпись метода доставки в списке вариантов;
  • woocommerce_review_order_after_shipping выводит отдельное сообщение на checkout;
  • сроки лучше хранить в массиве или в настройках, а не хардкодить в шаблоне.

Если срок зависит от города или региона

Тогда одного ID метода мало. Проще всего использовать зону доставки или метаполе адреса, если оно уже есть в вашей логике. Например, можно проверять индекс, регион или город и подставлять другой текст. Но не пытайтесь вычислять все на фронтенде через JavaScript: при пересчете корзины данные могут расходиться с сервером.

add_filter( 'woocommerce_cart_shipping_method_full_label', 'wpclass_delivery_time_by_city', 10, 2 );
function wpclass_delivery_time_by_city( $label, $method ) {
    if ( ! WC()->customer ) {
        return $label;
    }

    $city = WC()->customer->get_shipping_city();

    if ( 'Москва' === $city && 'flat_rate' === $method->id ) {
        $label .= '<br><small>Срок доставки: 1–2 дня</small>';
    }

    return $label;
}

Этот вариант годится только как пример. В реальном проекте лучше нормализовать названия городов и не полагаться на точное совпадение строки, если данные приходят из разных источников.

Как вывести срок доставки в письме и в карточке заказа

Если менеджеру и клиенту нужен один и тот же текст, его стоит сохранить в заказе. Тогда срок будет виден в админке и в email-уведомлениях, даже если корзина уже изменилась.

add_action( 'woocommerce_checkout_create_order', 'wpclass_save_delivery_time_to_order', 10, 2 );
function wpclass_save_delivery_time_to_order( $order, $data ) {
    $chosen_methods = WC()->session->get( 'chosen_shipping_methods' );

    if ( empty( $chosen_methods[0] ) ) {
        return;
    }

    $delivery_times = array(
        'flat_rate:1'    => '1–2 дня',
        'local_pickup:2' => 'сегодня',
        'flat_rate:3'    => '3–5 дней',
    );

    $chosen_method = $chosen_methods[0];

    if ( isset( $delivery_times[ $chosen_method ] ) ) {
        $order->update_meta_data( '_delivery_time', $delivery_times[ $chosen_method ] );
    }
}

add_action( 'woocommerce_admin_order_data_after_shipping_address', 'wpclass_show_delivery_time_in_admin_order' );
function wpclass_show_delivery_time_in_admin_order( $order ) {
    $delivery_time = $order->get_meta( '_delivery_time' );

    if ( $delivery_time ) {
        echo '<p><strong>Срок доставки:</strong> ' . esc_html( $delivery_time ) . '</p>';
    }
}

Такой подход удобнее, чем вычислять срок каждый раз заново. Заказ хранит уже согласованную информацию, а не текущую версию корзины.

Проверка результата после внедрения

После добавления кода не ограничивайтесь визуальной проверкой на одной странице. Проверьте весь путь заказа:

  • откройте корзину с разными товарами и убедитесь, что срок появляется у нужного метода;
  • переключите способ доставки и проверьте, меняется ли текст;
  • перейдите на checkout и убедитесь, что сообщение не дублируется лишний раз;
  • создайте тестовый заказ и проверьте мета-данные в админке;
  • посмотрите письмо клиенту, если срок должен попадать и туда;
  • очистите кэш страницы и проверьте отображение в приватном окне.

Если используете кэширование, особенно важно проверить пересчет доставки после смены адреса. Иногда фронтенд показывает старый текст, хотя сервер уже выбрал другой метод.

Частые ошибки и как их исправить

Неверный ID метода доставки

Самая частая проблема — код написан для flat_rate:1, а в магазине фактически используется flat_rate:3. Проверьте ID в настройках доставки или временно выведите их в лог.

Срок показывается, но не сохраняется в заказе

Это обычно происходит, если код выводит текст только на фронтенде, но не записывает его в мета заказа. Для стабильной работы сохраняйте значение на этапе оформления.

Дублирование текста на checkout

Если вы одновременно меняете подпись метода и добавляете отдельное уведомление, текст может повторяться. В таком случае оставьте один способ отображения: либо label, либо notice.

Кэш мешает обновлению

Если корзина или checkout кэшируются сторонним плагином, срок может не меняться после смены адреса. Для WooCommerce эти страницы обычно нужно исключать из кэша.

Срок зависит от товара, а код смотрит только на доставку

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

Безопасность и производительность

Здесь нет тяжелых запросов, но есть несколько практических правил:

  • не вставляйте HTML без экранирования — используйте esc_html();
  • не храните логику в шаблонах, если она должна работать после обновления темы;
  • если срок зависит от большого числа условий, вынесите правила в мини-плагин, а не в functions.php;
  • не рассчитывайте срок на клиенте без серверной проверки;
  • если используете сторонний плагин доставки, сначала проверьте его фильтры и настройки, чтобы не дублировать функциональность.

Для магазинов, где много ручной настройки и SEO-чистки, иногда удобнее держать такие правки в отдельном наборе оптимизаций. Если нужен комплексный контроль над дублями, мета-тегами и мелкими техническими настройками, можно посмотреть в сторону Clearfy Pro, но только если это реально закрывает вашу задачу и не добавляет лишний слой абстракции.

Что должно получиться в итоге

После внедрения у покупателя должен быть виден понятный срок доставки там, где он принимает решение: в списке способов доставки, на checkout и, при необходимости, в письме или карточке заказа. Если текст меняется при смене метода доставки и сохраняется в заказе, значит логика работает правильно. Если нет — сначала проверьте ID метода, кэш и момент, когда именно вы сохраняете данные в заказ.

Как разрешить пользователям загружать файлы в WordPress без доступа к админке
14.04.2026
Как отключить и избежать загрузку неиспользуемых шаблонов WordPress
02.02.2026
Как удалить все скрипты и стили в WordPress
04.03.2026
Как удалить неиспользуемые таксономии в WordPress
21.03.2026
Как отобразить срок доставки в корзине и на оформлении заказа WooCommerce
13.08.2026