Почему важно отключать неиспользуемые способы оплаты в 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 → Настройки → Способы оплаты |