Диагностика задачи: зачем отключать платёжные методы по расписанию
В интернет-магазинах на WooCommerce бывают ситуации, когда нужно временно отключить определённые платёжные методы: например, банки могут проводить техническое обслуживание, или магазин временно не принимает оплату через конкретный способ. Встроенного функционала для этого нет, поэтому приходится реализовывать отключение программно.
Если не отключить платёжный метод вовремя, пользователи могут столкнуться с ошибками при оплате, что снижает конверсию и повышает нагрузку на службу поддержки.
Как программно отключить платёжный метод WooCommerce по расписанию
Общая идея решения
Мы будем использовать хук woocommerce_available_payment_gateways, чтобы отключать платёжные методы согласно текущему времени и расписанию, заданному в коде. Расписание можно задать в виде массива с интервалами и ID платёжных методов.
Пример кода для functions.php или собственного плагина
add_filter('woocommerce_available_payment_gateways', 'disable_payment_gateways_by_schedule');
function disable_payment_gateways_by_schedule($gateways) {
// Настройте расписание: ключ - ID платёжного метода, значение - массив интервалов с 'start' и 'end' в формате 'H:i'
$schedule = [
'paypal' => [
['start' => '22:00', 'end' => '23:59'],
['start' => '00:00', 'end' => '06:00']
],
'cod' => [
['start' => '00:00', 'end' => '08:00']
]
];
$current_time = current_time('H:i');
foreach ($schedule as $gateway_id => $intervals) {
if (!isset($gateways[$gateway_id])) {
continue; // если метод не активен
}
foreach ($intervals as $interval) {
$start = $interval['start'];
$end = $interval['end'];
// учёт интервала, переходящего через полночь
if ($start <= $end) {
$in_interval = ($current_time >= $start && $current_time <= $end);
} else {
$in_interval = ($current_time >= $start || $current_time <= $end);
}
if ($in_interval) {
unset($gateways[$gateway_id]);
break; // отключили этот метод, переходим к следующему
}
}
}
return $gateways;
}
Пошаговое руководство по внедрению
- Откройте файл
functions.phpвашей дочерней темы или создайте собственный плагин для кастомного кода. - Скопируйте и вставьте приведённый выше код.
- В массиве
$scheduleукажите ID платёжных методов, которые хотите отключать, и интервалы времени в формате 24чHH:MM. ID методов можно посмотреть в админке WooCommerce или в списке плагинов платёжных систем. - Сохраните изменения.
- Убедитесь, что часовой пояс WordPress настроен правильно (Настройки > Общие).
Как проверить, что отключение работает
- Перейдите в корзину или оформление заказа в разное время, чтобы увидеть, что нужные платёжные методы исчезают из списка.
- Для тестирования можно временно изменить время сервера или подставить в код фиксированное время в
$current_time. - Проверьте консоль браузера и логи WooCommerce на наличие ошибок.
Частые ошибки и способы их устранения
- Платёжный метод не отключается: Проверьте правильность ID метода. Например, PayPal обычно имеет ID
paypal, но у плагинов могут быть свои ID. - Время отображается неправильно: Проверьте часовой пояс в настройках WordPress, используйте
current_time(), а неdate(). - Интервалы, переходящие через полночь, не работают: В коде реализована логика для таких интервалов, если не сработало – проверьте формат времени и сравнение.
- Кэширование мешает обновлению списка платёжных методов: Отключите кэширование страниц или настройте исключения для страниц оформления заказа.
Практические советы по безопасности и производительности
- Не храните расписание в базе данных, если оно меняется редко – так проще и быстрее.
- Для сложных сценариев (например, разные расписания для разных стран) лучше реализовать настройку через опции с кешированием.
- Используйте
current_time('H:i')для корректного учёта часового пояса WordPress. - Избегайте большого количества проверок в фильтре, чтобы не замедлять загрузку страницы оформления заказа.
Сравнение вариантов реализации отключения платёжных методов
| Метод | Плюсы | Минусы | Применимость |
|---|---|---|---|
| Код в functions.php | Простота, контроль, нет лишних плагинов | Требует навыков разработки, изменения в коде | Лучше для разработчиков и точечных задач |
| Плагины планировщиков платёжных методов | Графический интерфейс, удобство | Может быть тяжеловесным, платным, нет гибкости | Подходит для непрофессионалов и крупных магазинов |
| Кастомные решения с настройками в админке | Гибкость, интеграция с UI | Сложнее в реализации, поддержке | Для крупных проектов с командой разработчиков |