Диагностика задачи: почему нужна доставка по расписанию?
Часто интернет-магазинам на 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 |
| Изменение способа доставки вручную | Просто | Не автоматизировано, требует ручного контроля |