Автоматическое отключение неактивных платежных методов в WooCommerce

Диагностика проблемы: зачем отключать неактивные методы оплаты

В WooCommerce может накапливаться множество платежных методов, которые не используются из-за изменений в бизнес-процессах, смены провайдеров или тестовых решений. Наличие таких методов в списке на сайте путает пользователей и может привести к ошибкам при оформлении заказа, а также снижает производительность за счет лишних проверок. Автоматическое отключение неактивных платежных методов по времени без ручного вмешательства поможет поддерживать магазин в актуальном состоянии.

Как определить неактивные платежные методы

Для начала нужно понять, какие методы считаются неактивными. Чаще всего это те, которые не использовались для оплаты заказов за последние N дней. Для диагностики используем запрос к базе данных WooCommerce:

SELECT pm.meta_value AS payment_method, COUNT(p.ID) AS orders_count
FROM wp_posts p
JOIN wp_postmeta pm ON p.ID = pm.post_id
WHERE p.post_type = 'shop_order'
  AND p.post_status IN ('wc-completed', 'wc-processing')
  AND pm.meta_key = '_payment_method'
  AND p.post_date > DATE_SUB(NOW(), INTERVAL 30 DAY)
GROUP BY pm.meta_value
ORDER BY orders_count ASC;

Этот запрос показывает количество заказов по каждому методу оплаты за последние 30 дней. Методы с нулевым количеством заказов — кандидаты для отключения.

Пошаговое решение: автоматическое отключение методов оплаты

Шаг 1. Создаем функцию для выявления неактивных методов оплаты

function get_inactive_payment_gateways( $days = 30 ) {
    global $wpdb;
    $query = $wpdb->prepare(
        "SELECT pm.meta_value AS payment_method
         FROM {$wpdb->prefix}posts p
         JOIN {$wpdb->prefix}postmeta pm ON p.ID = pm.post_id
         WHERE p.post_type = 'shop_order'
           AND p.post_status IN ('wc-completed', 'wc-processing')
           AND pm.meta_key = '_payment_method'
           AND p.post_date > DATE_SUB(NOW(), INTERVAL %d DAY)
         GROUP BY pm.meta_value",
        $days
    );
    $results = $wpdb->get_col( $query );

    // Получаем все активные платежные методы
    $available_gateways = WC()->payment_gateways()->get_available_payment_gateways();
    $inactive = [];
    foreach ( $available_gateways as $id => $gateway ) {
        if ( !in_array( $id, $results ) ) {
            $inactive[] = $id;
        }
    }
    return $inactive;
}

Шаг 2. Отключаем неактивные методы на уровне опций WooCommerce

function disable_inactive_payment_gateways() {
    $inactive = get_inactive_payment_gateways(30); // 30 дней
    if ( empty($inactive) ) return;

    $option_name = 'woocommerce_enabled_payment_gateways';
    $enabled = get_option( $option_name, [] );

    $updated = false;
    foreach ( $inactive as $method_id ) {
        if ( in_array( $method_id, $enabled ) ) {
            $enabled = array_diff( $enabled, [$method_id] );
            $updated = true;
        }
    }

    if ( $updated ) {
        update_option( $option_name, $enabled );
    }
}
add_action( 'init', 'disable_inactive_payment_gateways' );

Проверка результата после внедрения

После добавления кода в functions.php или в отдельный плагин:

  • Перейдите в WooCommerce - Настройки - Платежи и убедитесь, что неактивные методы пропали из списка активных.
  • Создайте тестовый заказ и посмотрите, что в списке выбора оплаты отсутствуют отключенные методы.
  • Для отладки можно временно добавить error_log(print_r($inactive, true)); в функцию и проверить логи PHP, какие методы были отключены.

Частые ошибки и как их исправить

  • Не отключаются методы оплаты: Проверьте, что WooCommerce загружен до вызова функции (инициализация на хук init обязательна).
  • Проверьте права доступа: если код запускается в админке, убедитесь, что пользователь имеет права на изменение настроек.
  • Нет данных по заказам: если магазин новый и заказов мало, отключение не сработает — уменьшите период или добавьте дополнительные условия.
  • Кэширование опций: если используется объектный кэш, обновление опций может не сразу отразиться. Очистите кэш после обновления.

Практические советы по безопасности и производительности

  • Запрос к базе на получение методов оплаты выполняется на каждом вызове init. Лучше запускать эту функцию раз в сутки через WP-Cron:
function schedule_disable_payment_gateways() {
    if ( ! wp_next_scheduled( 'daily_disable_inactive_gateways' ) ) {
        wp_schedule_event( time(), 'daily', 'daily_disable_inactive_gateways' );
    }
}
add_action( 'wp', 'schedule_disable_payment_gateways' );

add_action( 'daily_disable_inactive_gateways', 'disable_inactive_payment_gateways' );
  • Храните список отключенных методов в transient для снижения нагрузки на базу.
  • Всегда делайте бэкап опций WooCommerce перед массовым обновлением, чтобы избежать потери настроек.
  • Используйте фильтр woocommerce_payment_gateways для динамического управления методами оплаты, если хотите отключать их только на фронтенде без изменения настроек.

Сравнение подходов отключения методов оплаты

МетодОписаниеПлюсыМинусы
Обновление опции woocommerce_enabled_payment_gatewaysФиксированное отключение в настройкахУбирает метод полностью, не отображается в админке и фронтендеТребует обновления опций, может конфликтовать с плагинами
Фильтр woocommerce_payment_gatewaysДинамическое скрытие без изменения настроекНе меняет настройки, легко отменитьМетод остается активным в настройках, может путать админов
Через WP-CronПериодическое выполнение с обновлением опцийМинимизирует нагрузку, автоматизацияЗадержка обновления, сложнее отлаживать
Автоматическая блокировка неактивных платежных методов в WooCommerce по времени
28.04.2026
Автоматическое создание отчёта по заказам в WordPress с фильтрами и примерами кода
18.02.2026
Как автоматизировать отправку отзывов после заказа WooCommerce
10.04.2026
WooCommerce: как автоматически отключать платёжные методы по расписанию
09.05.2026
Автоматизация обновления метаданных товаров WooCommerce в WordPress
07.04.2026