WooCommerce: автоматическое отключение неиспользуемых способов оплаты

Почему важно отключать неиспользуемые способы оплаты в WooCommerce

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

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

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

  • Проверьте статистику заказов с помощью WooCommerce Reports или сторонних аналитических плагинов.
  • Проанализируйте логи платежных шлюзов — если способ оплаты не обрабатывал транзакций за последний месяц, его можно считать неиспользуемым.
  • Определите способы оплаты с периодом без активности в 30+ дней.

Пример запроса к базе данных для подсчёта заказов по способу оплаты за последний месяц:

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

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

1. Добавляем фильтр для отключения способов оплаты на этапе оформления заказа

В файле functions.php вашей темы или в отдельном плагине добавьте следующий код. Он отключит способы оплаты, если за последние 30 дней по ним не было заказов.

add_filter('woocommerce_available_payment_gateways', 'disable_unused_payment_gateways');

function disable_unused_payment_gateways( $available_gateways ) {
    if ( is_admin() ) return $available_gateways; // не трогаем админку

    global $wpdb;
    $threshold_date = date('Y-m-d H:i:s', strtotime('-30 days'));

    foreach ( $available_gateways as $gateway_id => $gateway ) {
        $count = $wpdb->get_var($wpdb->prepare(
            "SELECT COUNT(*) FROM {$wpdb->prefix}postmeta pm
             JOIN {$wpdb->prefix}posts p ON pm.post_id = p.ID
             WHERE pm.meta_key = '_payment_method'
             AND pm.meta_value = %s
             AND p.post_type = 'shop_order'
             AND p.post_status IN ('wc-completed', 'wc-processing')
             AND p.post_date >= %s",
             $gateway_id, $threshold_date
        ));

        if ( intval($count) === 0 ) {
            unset($available_gateways[$gateway_id]);
        }
    }
    return $available_gateways;
}

2. Кэширование результатов для производительности

Запрос к базе при каждом вызове может замедлять сайт. Добавим transient для кэширования результатов на 1 час:

add_filter('woocommerce_available_payment_gateways', 'disable_unused_payment_gateways_cached');

function disable_unused_payment_gateways_cached( $available_gateways ) {
    if ( is_admin() ) return $available_gateways;

    $cache_key = 'wc_unused_payment_gateways';
    $unused_gateways = get_transient($cache_key);

    if ( false === $unused_gateways ) {
        global $wpdb;
        $threshold_date = date('Y-m-d H:i:s', strtotime('-30 days'));
        $unused_gateways = [];

        foreach ( $available_gateways as $gateway_id => $gateway ) {
            $count = $wpdb->get_var($wpdb->prepare(
                "SELECT COUNT(*) FROM {$wpdb->prefix}postmeta pm
                 JOIN {$wpdb->prefix}posts p ON pm.post_id = p.ID
                 WHERE pm.meta_key = '_payment_method'
                 AND pm.meta_value = %s
                 AND p.post_type = 'shop_order'
                 AND p.post_status IN ('wc-completed', 'wc-processing')
                 AND p.post_date >= %s",
                 $gateway_id, $threshold_date
            ));

            if ( intval($count) === 0 ) {
                $unused_gateways[] = $gateway_id;
            }
        }
        set_transient($cache_key, $unused_gateways, HOUR_IN_SECONDS);
    }

    foreach ( $unused_gateways as $gateway_id ) {
        if ( isset($available_gateways[$gateway_id]) ) {
            unset($available_gateways[$gateway_id]);
        }
    }

    return $available_gateways;
}

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

Чтобы убедиться, что автоматическое отключение работает:

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

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

  • Способы оплаты не отключаются: возможно, код не подключен или кэш не обновился. Очистите transient через delete_transient('wc_unused_payment_gateways') и проверьте, что функция вызывается.
  • Ошибка в SQL-запросе: убедитесь, что префикс таблиц в базе совпадает с $wpdb->prefix.
  • Отключаются нужные способы оплаты: проверьте дату и статус заказов, возможно, для нужных методов отсутствуют заказы с подходящим статусом. Можно расширить список статусов, например, добавить wc-on-hold.
  • Производительность снижается: обязательно используйте transient-кэширование и проверяйте нагрузку на сервер.

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

  • Не храните в транзиенте чувствительные данные, используйте только идентификаторы способов оплаты.
  • Период кэширования подбирайте в зависимости от частоты заказов — для магазинов с низкой активностью можно увеличить до 12 часов.
  • Если на сайте много способов оплаты, подумайте о создании отдельного cron-задачи для предгенерации списка неактивных методов.
  • Проверяйте совместимость с плагинами, которые модифицируют способы оплаты, чтобы избежать конфликтов.

Сравнение способов реализации автоматического отключения способов оплаты

СпособПлюсыМинусыПример
Код в functions.php с кешем transientЛегко настроить, гибко, бесплатноНужен базовый PHP, может быть нагрузка без кешаВ статье выше
Плагин для управления способами оплатыУдобный интерфейс, часто с расширенными настройкамиПлатные, может конфликтовать с кастомным кодомWooCommerce Payment Gateways per Product и др.
Ручное отключение в админкеПросто, не требует кодаТрудоёмко, неудобно при большом количестве способовWooCommerce → Настройки → Способы оплаты
Как добавить пользовательские роли в WordPress с поддержкой AJAX
18.12.2025
Оптимизация базы данных WordPress: эффективные методы и примеры кода
21.11.2025
Как установить и настроить Redis для кэширования в WordPress
14.11.2025
WooCommerce: способы оплаты не отображаются при использовании Strict Checkout — решение проблемы
11.05.2026
WooCommerce: как автоматически удалять неоплаченные заказы после таймаута
11.07.2026

Ресурс в разработке, скоро здесь будет сайт по вордпресс