Почему нужно автоматизировать отключение платёжных систем?
В интернет-магазинах на WooCommerce бывают ситуации, когда необходимо временно отключить определённые платёжные методы. Например, при техническом обслуживании платёжных шлюзов, проведении акций с ограниченным периодом, или при превышении лимитов транзакций. Ручное переключение неудобно и чревато ошибками.
Автоматизация отключения по расписанию позволяет обеспечить точное соблюдение временных рамок без вмешательства администратора.
Диагностика задачи: как определить необходимость и условия отключения
Первым делом нужно чётко понять:
- Какие платёжные методы требуется отключать (ID методов в WooCommerce).
- В какое время и с какой периодичностью.
- Что должно происходить с этими методами: отключаться полностью или становиться недоступными для выбора на этапе оформления заказа.
Проверить ID платёжных методов можно в админке WooCommerce в разделе WooCommerce → Настройки → Платежи либо вывести их через код:
add_action('admin_init', function() {
$available_gateways = WC()->payment_gateways->get_available_payment_gateways();
error_log(print_r(array_keys($available_gateways), true));
});Пошаговое решение: как автоматически отключать платёжные методы по расписанию
1. Создаём функцию для отключения платёжных систем
Воспользуемся фильтром 'woocommerce_available_payment_gateways', чтобы динамически убрать нужные методы из списка доступных.
function disable_payment_gateways_by_schedule($available_gateways) {
// Определяем ID платёжных методов для отключения
$disable_gateways = array('cod', 'bacs'); // пример: оплата при получении и банковский перевод
// Задаём время отключения: с 23:00 до 06:00
$current_time = current_time('H:i');
if (($current_time >= '23:00') || ($current_time <= '06:00')) {
foreach ($disable_gateways as $gateway_id) {
if (isset($available_gateways[$gateway_id])) {
unset($available_gateways[$gateway_id]);
}
}
}
return $available_gateways;
}
add_filter('woocommerce_available_payment_gateways', 'disable_payment_gateways_by_schedule');2. Настройка расписания по нужному часовому поясу
Функция current_time() возвращает время с учётом часового пояса WordPress, что удобно для локальных настроек сайта. Если нужны более сложные расписания (несколько периодов, дни недели), можно расширить условие, например:
$current_hour = (int) current_time('H');
$current_weekday = (int) current_time('w'); // 0=воскресенье
if (($current_hour >= 23 || $current_hour < 6) && in_array($current_weekday, array(1,2,3,4,5))) {
// отключение по будням ночью
}3. Добавление возможности гибкой настройки через админку
Для удобства можно создать настройки в разделе WooCommerce, где администратор задаст время отключения и методы. Это потребует создания опций и вывода их в настройках, но для простоты можно ограничиться константами в коде.
Проверка результата: как убедиться, что отключение работает
- Перейдите на страницу оформления заказа в разное время суток, чтобы проверить выбор платёжных методов.
- Проверьте, что платёжные методы, указанные для отключения, отсутствуют в списке доступных в заданное время.
- Для отладки добавьте
error_log()внутри функции и смотрите логи (wp-content/debug.log), включивWP_DEBUGиWP_DEBUG_LOGвwp-config.php.
Частые ошибки и как их исправить
- Методы не отключаются: Проверьте правильность ID платёжных методов. Они должны совпадать с ключами из
WC()->payment_gateways->get_available_payment_gateways(). - Время отключения не совпадает: Убедитесь, что часовой пояс сайта настроен верно в Настройки → Общие → Часовой пояс.
- Фильтр не применяется: Возможно, код добавлен в неподходящее место. Рекомендуется использовать файл
functions.phpактивной темы или собственный плагин. - Конфликты с другими плагинами оплаты: Некоторые платёжные плагины могут иметь свои условия отображения. Проверьте совместимость.
Практические советы по безопасности и производительности
- Не храните чувствительные данные в коде. Платёжные методы указывайте через настройки или константы.
- Минимизируйте количество вызовов тяжелых функций внутри фильтра, так как он вызывается при каждом отображении страницы оформления заказа.
- Проверяйте работу на staging-сервере перед запуском в продакшн, чтобы избежать недоступности платежей.
- Для сложных расписаний используйте WP-Cron для включения/отключения методов, изменяя опции или метаданные, а не проверяя время на каждой загрузке страницы.
Сравнение вариантов реализации отключения платёжных систем
| Метод | Описание | Плюсы | Минусы |
|---|---|---|---|
Фильтр woocommerce_available_payment_gateways | Динамическое исключение методов по времени | Простота, гибкость, не требует сторонних плагинов | Вызывается на каждой загрузке, нагрузка при сложных проверках |
| WP-Cron для переключения настроек | Автоматическое включение/отключение методов через изменение опций | Меньшая нагрузка на страницы, чёткое расписание | Сложнее реализовать, требует управления состояниями |
| Плагины с расписанием (если есть) | Готовые решения для расписания отключения | Удобство настройки через UI | Могут быть платными, конфликтовать с другими плагинами |