WooCommerce: настройка доставки по расписанию с помощью хуков

Диагностика задачи: почему нужна доставка по расписанию?

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

Как реализовать ограничение доставки по расписанию через хуки WooCommerce

Основная идея — использовать фильтр woocommerce_package_rates, чтобы отсеять способы доставки, если текущий день или время не подходят под расписание.

Шаг 1. Определяем расписание доставки

Для примера ограничим доставку с понедельника по пятницу с 9:00 до 18:00. В выходные доставка не доступна.

Шаг 2. Добавляем код в functions.php или в кастомный плагин

add_filter('woocommerce_package_rates', 'filter_shipping_by_schedule', 10, 2);
function filter_shipping_by_schedule($rates, $package) {
    $current_day = date('N'); // 1 (Пн) - 7 (Вс)
    $current_hour = date('G'); // Час в 24-часовом формате без ведущих нулей

    // Разрешаем доставку только с понедельника (1) по пятницу (5)
    if ($current_day < 1 || $current_day > 5) {
        // Удаляем все способы доставки, если сегодня выходной
        return [];
    }

    // Разрешаем доставку только с 9 до 18 часов
    if ($current_hour < 9 || $current_hour >= 18) {
        return [];
    }

    return $rates;
}

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

1. Попробуйте оформить заказ в разное время и в разные дни недели. В выходные и в нерабочие часы доставки способы должны исчезать из списка.

2. Для проверки можно временно подменить время на сервере или в коде вручную задать $current_day и $current_hour.

Частые ошибки и способы их исправления

  • Время сервера не совпадает с вашим часовым поясом. Проверьте часовой пояс в WordPress (Настройки - Общие) и на сервере. Используйте current_time('G') вместо date('G') для корректного времени по настройкам WP.
  • Все способы доставки исчезают всегда. Скорее всего, условие в коде всегда истинно. Проверьте логику условий и временные переменные, добавьте отладочный вывод с помощью error_log().
  • Кэширование страниц мешает обновлению списка способов доставки. Очистите кэш сайта и браузера, отключите плагин кеширования на время теста.

Практические советы по производительности и безопасности

  • Используйте current_time() вместо date() для учёта часового пояса WordPress.
  • Код должен быть максимально лёгким, так как фильтр woocommerce_package_rates вызывается часто.
  • Избегайте прямого вывода из фильтров — используйте логи для отладки.

Дополнительный пример: разрешить доставку в субботу только до 14:00

add_filter('woocommerce_package_rates', 'custom_shipping_schedule', 10, 2);
function custom_shipping_schedule($rates, $package) {
    $current_day = current_time('N');
    $current_hour = current_time('G');

    if ($current_day == 6) { // Суббота
        if ($current_hour >= 14) {
            return [];
        }
    }
    elseif ($current_day == 7) { // Воскресенье
        return [];
    }

    return $rates;
}

Сравнение вариантов реализации расписания доставки

МетодПлюсыМинусы
Плагин расписания доставкиГотовое решение, настройки через UIПлатно, может быть избыточным
Код на хуках (фильтр woocommerce_package_rates)Лёгкий, гибкий, бесплатный, кастомныйНужно писать и тестировать код, нет UI
Изменение способа доставки вручнуюПростоНе автоматизировано, требует ручного контроля
Как создать автоприкрепление файлов к тикетам в WPtickets
03.01.2026
Как добавить вложения в тикеты WPtickets: подробное руководство
12.03.2026
Как создать систему поддержки (тикетов) в WordPress
20.11.2025
Как настроить отправку писем в WordPress без использования PHPMailer
09.12.2025
Как закрыть от индексации страницы тикетов в WordPress
14.08.2026