Диагностика задачи: зачем и когда нужно отключать платежные системы автоматически
В WooCommerce иногда возникает необходимость временно отключать определённые платёжные методы. Например, для проведения технического обслуживания, обновления API платёжных шлюзов, или в период нерабочих часов. Ручное отключение неудобно и чревато ошибками, поэтому автоматизация поможет избежать сбоев и снизить нагрузку на поддержку.
Обзор стандартных методов управления платёжными системами в WooCommerce
WooCommerce позволяет включать или отключать платёжные методы в настройках, но нет встроенного функционала по автоматическому планированию этих действий. Для реализации автоматического отключения потребуется вмешательство через код и использование WP-Cron для запуска задач по расписанию.
Пошаговое решение: как запрограммировать автоматическое отключение платёжных методов
1. Создаём функцию для отключения платёжных методов
Для начала реализуем функцию, которая будет отключать нужные платёжные методы при их вызове. Это делается через фильтр woocommerce_available_payment_gateways.
function wpshab_disable_payment_gateways_by_schedule( $available_gateways ) {
$current_time = current_time( 'H:i' );
$disable_start = '22:00'; // время начала отключения
$disable_end = '06:00'; // время окончания отключения
// Проверяем, находится ли текущее время в интервале отключения
if ( $current_time >= $disable_start || $current_time <= $disable_end ) {
// Здесь указываем ID платёжных методов для отключения
$gateways_to_disable = array( 'cod', 'bacs' );
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', 'wpshab_disable_payment_gateways_by_schedule' );2. Используем WP-Cron для отключения платежных методов по расписанию без постоянной проверки
Фильтр выше проверяет время при каждом вызове. Для снижения нагрузки можно использовать WP-Cron, чтобы раз в сутки или по другому расписанию менять опции в базе, например, включать или выключать платежные методы через опции или пользовательские флаги.
Пример регистрации WP-Cron задачи:
function wpshab_schedule_payment_gateways_toggle() {
if ( ! wp_next_scheduled( 'wpshab_toggle_payment_gateways_hook' ) ) {
wp_schedule_event( strtotime( '22:00:00' ), 'daily', 'wpshab_toggle_payment_gateways_hook' );
wp_schedule_event( strtotime( '06:00:00' ), 'daily', 'wpshab_toggle_payment_gateways_hook' );
}
}
add_action( 'wp', 'wpshab_schedule_payment_gateways_toggle' );
function wpshab_toggle_payment_gateways() {
$current_time = current_time( 'H:i' );
if ( $current_time === '22:00' ) {
update_option( 'wpshab_payment_gateways_enabled', false );
} elseif ( $current_time === '06:00' ) {
update_option( 'wpshab_payment_gateways_enabled', true );
}
}
add_action( 'wpshab_toggle_payment_gateways_hook', 'wpshab_toggle_payment_gateways' );3. Модифицируем фильтр платёжных методов с учётом настройки из WP-Cron
function wpshab_disable_payment_gateways_by_option( $available_gateways ) {
$enabled = get_option( 'wpshab_payment_gateways_enabled', true );
if ( ! $enabled ) {
$gateways_to_disable = array( 'cod', 'bacs' );
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', 'wpshab_disable_payment_gateways_by_option' );Проверка результата: как убедиться, что платёжные методы отключаются согласно расписанию
- Установите на сайте плагин
Query Monitorи проверьте, что фильтрwoocommerce_available_payment_gatewaysприменяется и отключает нужные методы. - В указанное время переходите в корзину и оформляйте заказ — отключённые методы не должны отображаться.
- Проверьте опцию
wpshab_payment_gateways_enabledв базе через phpMyAdmin или консоль WP-CLI, чтобы увидеть, что она меняется в соответствии с расписанием.
Частые ошибки и пути их исправления
- WP-Cron не запускается: В настройках хостинга или плагина кэширования может быть отключён WP-Cron. Проверьте, что
DISABLE_WP_CRONвwp-config.phpне установлена вtrue, или настройте системный cron для запускаwp-cron.php. - Неправильный формат времени: Функция
current_time( 'H:i' )возвращает время в формате 24 часа, учитывайте временную зону WordPress. - Идентификаторы платёжных методов указаны неверно: Узнайте ID методов через инспектор в настройках WooCommerce или функцию
print_r(WC()->payment_gateways->payment_gateways()). - Фильтр применяется дважды: Следите за тем, чтобы не было нескольких фильтров с изменением одних и тех же платёжных методов, это может приводить к конфликтам.
Практические советы по безопасности и производительности
- Избегайте частых проверок времени в фильтрах — лучше использовать WP-Cron для изменения состояния один раз в заданное время.
- Всегда тестируйте расписание на тестовом сайте, чтобы не потерять платежи из-за ошибочного отключения.
- Для более сложных сценариев используйте плагины, например, Clearfy Pro, который помогает автоматизировать и оптимизировать настройки WooCommerce.
- Храните настройки расписания в опциях, а не в transient, чтобы состояние не зависело от кеша.
Сравнение подходов отключения платёжных методов
| Метод | Плюсы | Минусы |
|---|---|---|
| Фильтр с проверкой времени в реальном времени | Простая реализация, не требует планировщика | Нагрузка при каждом вызове, неэффективно для большого трафика |
| WP-Cron с обновлением опции | Меньшая нагрузка, точечное изменение состояния | Зависит от корректной работы WP-Cron, возможно задержки |
| Внешний системный cron + API | Максимальная точность, не зависит от WP-Cron | Сложнее в настройке, требует доступа к хостингу |