Диагностика проблемы: почему нужно отключать неактивные способы оплаты
В интернет-магазинах на WooCommerce часто подключается несколько способов оплаты. Однако не все из них всегда актуальны: например, офлайн-оплата может быть временно недоступна, либо платежный шлюз испытывает технические проблемы. Если неактивные способы оплаты не отключать, пользователь может столкнуться с ошибками на этапе оформления заказа, что снижает конверсию.
Задача — автоматически отключать способы оплаты WooCommerce на основе определённых условий, например, времени суток, настроек или внешних сигналов.
Как определить, что способ оплаты неактивен
Для начала выясним, как WooCommerce хранит и обрабатывает методы оплаты. Все методы оплаты — это классы, наследуемые от WC_Payment_Gateway. Их активность определяется настройками в админке и дополнительной логикой в коде.
Для диагностики используйте следующий код, чтобы вывести все доступные и активные методы оплаты на странице оформления заказа:
add_action('woocommerce_review_order_before_payment', function() {
$available_gateways = WC()->payment_gateways->get_available_payment_gateways();
echo '<pre>';
print_r(array_keys($available_gateways));
echo '</pre>';
});Этот код поможет проверить, какие методы оплаты WooCommerce считает доступными для текущего пользователя и условий.
Пошаговое решение: автоматическое отключение способов оплаты по условию
Рассмотрим задачу: отключить способ оплаты «Чек» (ID cheque) в нерабочие часы (с 22:00 до 08:00).
Добавим следующий код в файл functions.php вашей темы или в кастомный плагин:
add_filter('woocommerce_available_payment_gateways', 'disable_payment_gateway_during_night_hours');
function disable_payment_gateway_during_night_hours($available_gateways) {
$current_hour = (int) current_time('H');
if ($current_hour >= 22 || $current_hour < 8) {
if (isset($available_gateways['cheque'])) {
unset($available_gateways['cheque']);
}
}
return $available_gateways;
}Код проверяет текущее время по часовому поясу сайта и удаляет способ оплаты из списка доступных, если время попадает в заданный интервал.
Расширение логики: отключение по внешнему флагу
Если нужно отключать способ оплаты на основании состояния API платежного шлюза, можно использовать transient или option с флагом. Пример:
add_filter('woocommerce_available_payment_gateways', 'disable_gateway_by_flag');
function disable_gateway_by_flag($available_gateways) {
$disable_cheque = get_option('disable_cheque_payment', 'no');
if ($disable_cheque === 'yes' && isset($available_gateways['cheque'])) {
unset($available_gateways['cheque']);
}
return $available_gateways;
}В админке можно переключать опцию disable_cheque_payment через update_option('disable_cheque_payment', 'yes'); или вручную через базу данных.
Проверка результата
Чтобы проверить, что способ оплаты отключается:
- Перейдите на страницу оформления заказа.
- Убедитесь, что в нужное время способ оплаты «Чек» отсутствует в списке.
- Для отладки временно добавьте
var_dump($available_gateways)внутри фильтра.
Если используется внешний флаг, измените опцию и проверьте, что способ появляется или исчезает.
Частые ошибки и способы их исправления
- Метод оплаты не отключается: Проверьте правильность ID способа оплаты (можно вывести через
print_r(WC()->payment_gateways->payment_gateways())). - Кэширование мешает изменениям: Очистите кэш сайта и браузера, отключите плагины кэширования на время теста.
- Время сервера не совпадает с настройками WordPress: Используйте
current_time('H'), а неdate('H'), чтобы получить время с учётом часового пояса WordPress. - Ошибка PHP при отключении метода: Убедитесь, что проверяете существование ключа перед
unset().
Практические советы для безопасности и производительности
- Не добавляйте сложную логику API проверки внутри фильтра — вместо этого обновляйте флаги через cron или внешние скрипты.
- Минимизируйте количество запросов к базе данных внутри фильтров, кэшируйте результаты.
- Проверяйте, что отключение способов оплаты не ломает логику расчёта заказа и не приводит к ошибкам оформления.
Сравнение подходов отключения способов оплаты
| Метод | Сложность реализации | Гибкость | Производительность |
|---|---|---|---|
Код в фильтре woocommerce_available_payment_gateways | Низкая | Высокая — можно задать любые условия | Высокая, если логика простая |
| Плагины управления способами оплаты | Средняя | Средняя — ограничены функционалом | Средняя — зависит от плагина |
| Отключение в админке вручную | Очень низкая | Низкая — нет автоматизации | Высокая |