Проблема: необходимость временно отключить платёжные системы в WooCommerce
В некоторых случаях требуется временно отключить одну или несколько платёжных систем в WooCommerce по расписанию. Например, для проведения технического обслуживания платёжного шлюза, смены настроек или предотвращения приёма заказов в нерабочее время. В стандартном WooCommerce нет встроенного функционала для автоматизации этой задачи, поэтому приходится делать это вручную через админку, что неудобно и чревато ошибками.
Диагностика задачи: как понять, что платёжная система неактивна
Перед внедрением автоматического отключения важно проверить, как WooCommerce управляет доступностью платёжных методов. Платёжные системы активируются или отключаются через опции и фильтры. Для проверки текущего состояния методов можно использовать следующий код в functions.php темы или в плагине:
add_action('woocommerce_checkout_process', function() { $available_gateways = WC()->payment_gateways->get_available_payment_gateways(); error_log('Доступные платежные системы: '.implode(", ", array_keys($available_gateways)));});Этот код выведет в лог список доступных платёжных систем при попытке оформления заказа. Если нужный метод отсутствует, значит он отключён.
Пошаговое решение: как автоматически отключать платёжные системы по расписанию
1. Использование WP-Cron для периодического запуска задачи
Для реализации расписания потребуется зарегистрировать собственное событие в WP-Cron, которое будет выполнять отключение или включение платёжных систем в нужное время.
2. Функция для включения/отключения платёжных методов
Реализуем фильтр woocommerce_available_payment_gateways, который позволит динамически скрывать методы в зависимости от текущего времени.
function toggle_payment_gateways_by_schedule($available_gateways) { $current_time = current_time('H:i'); // формат ЧЧ:ММ $disable_start = '23:00'; // время начала отключения $disable_end = '06:00'; if ($current_time >= $disable_start || $current_time <= $disable_end) { // Перечислите ID платёжных систем для отключения $gateways_to_disable = ['cod', 'bacs', 'paypal']; foreach ($gateways_to_disable as $gateway_id) { if (isset($available_gateways[$gateway_id])) { unset($available_gateways[$gateway_id]); } } } return $available_gateways; } add_filter('woocommerce_available_payment_gateways', 'toggle_payment_gateways_by_schedule');В данном примере платёжные методы cod (наложенный платёж), bacs (банковский перевод) и paypal отключаются с 23:00 до 06:00 по серверному времени WordPress.
3. Регистрация кастомного WP-Cron для логирования или расширенного управления
Хотя фильтр выше уже решает задачу, можно добавить WP-Cron, чтобы по расписанию например отправлять логи или изменять опции, если нужно более сложное поведение.
function register_daily_payment_gateways_check() { if (!wp_next_scheduled('daily_payment_gateways_check_event')) { wp_schedule_event(time(), 'daily', 'daily_payment_gateways_check_event'); }} add_action('wp', 'register_daily_payment_gateways_check'); add_action('daily_payment_gateways_check_event', function() { // Можно добавить логику сброса кэша или отправки уведомлений error_log('Ежедневная проверка платёжных систем выполнена');});Проверка результата после внедрения
- Время сервера совпадает с ожиданиями? Проверить через
error_log(current_time('Y-m-d H:i:s'));. - При попытке оформить заказ в период отключения указанные платёжные методы не отображаются в списке.
- Вне указанного времени платёжные системы доступны для выбора.
Для проверки можно вручную менять время на сервере или временно изменять переменные в коде.
Частые ошибки и как исправить
- Неправильное время сервера: убедитесь, что часовой пояс WordPress и сервера совпадают (Настройки → Общие → Часовой пояс).
- Неверные ID платёжных систем: проверьте ID, они чувствительны к регистру и должны совпадать с ключами в
WC()->payment_gateways->payment_gateways(). - Кэширование: если используется кэширование, оно может показывать устаревшие данные. Очистите кэш или отключите его для страниц оформления заказа.
- Проблемы с WP-Cron: если события не выполняются, проверьте, работает ли WP-Cron или настройте системный cron для вызова
wp-cron.php.
Практические советы по безопасности и производительности
- Не храните пароли или чувствительные данные в коде для отключения платёжных систем.
- Оптимизируйте фильтр
woocommerce_available_payment_gateways, чтобы не выполнять тяжелые операции, он вызывается на каждом шаге оформления заказа. - При необходимости интеграции с внешними API для проверки статуса платёжных шлюзов используйте асинхронные запросы через WP-Cron.
- Тестируйте на staging-среде перед внедрением на боевом сайте.
Сравнение способов отключения платёжных систем
| Метод | Преимущества | Недостатки |
|---|---|---|
| Ручное отключение в админке WooCommerce | Просто, не требует кода | Требует постоянного внимания, легко забыть |
Фильтр woocommerce_available_payment_gateways с проверкой времени | Автоматизация, гибкость, не требует плагинов | Зависит от правильного времени сервера и настройки кэша |
| Плагины для расписания отключения платёжных систем | Готовое решение с интерфейсом | Может быть избыточным, нагрузка на сайт, необходимость обновлений |