Диагностика проблемы с методами оплаты в WooCommerce
В интернет-магазинах на WooCommerce часто накапливается множество методов оплаты, часть из которых перестают использоваться или становятся недоступными из-за изменений в настройках или платежных системах. Это приводит к путанице для пользователей и может снижать конверсию. Важно своевременно отключать такие методы автоматически, чтобы не держать их в списке выбора и не создавать лишнюю нагрузку на сайт.
Как отключить неактивные методы оплаты программно
WooCommerce позволяет управлять методами оплаты через хук woocommerce_available_payment_gateways. На основе проверки доступности каждого метода можно динамически исключать неактивные.
Пример кода для автоматического отключения методов оплаты без транзакций за последние 30 дней
add_filter('woocommerce_available_payment_gateways', 'disable_inactive_payment_gateways');
function disable_inactive_payment_gateways($available_gateways) {
if (is_admin()) return $available_gateways; // Не менять в админке
global $wpdb;
$inactive_days_limit = 30; // Период без транзакций, после которого отключаем метод
$cutoff_date = date('Y-m-d H:i:s', strtotime("-{$inactive_days_limit} days"));
foreach ($available_gateways as $gateway_id => $gateway) {
// Проверяем есть ли заказы с этим методом оплаты за последние 30 дней
$count = $wpdb->get_var($wpdb->prepare(
"SELECT COUNT(1) FROM {$wpdb->prefix}posts AS posts
INNER JOIN {$wpdb->prefix}postmeta AS meta ON posts.ID = meta.post_id
WHERE posts.post_type = 'shop_order'
AND posts.post_status IN ('wc-completed', 'wc-processing')
AND meta.meta_key = '_payment_method'
AND meta.meta_value = %s
AND posts.post_date >= %s",
$gateway_id, $cutoff_date
));
if (intval($count) === 0) {
unset($available_gateways[$gateway_id]);
}
}
return $available_gateways;
}Этот код исключит из списка оплаты все методы, по которым не было завершённых или в обработке заказов за последние 30 дней.
Пошаговое внедрение решения
- Создайте дочернюю тему или используйте плагин для пользовательских функций (например, Code Snippets).
- Добавьте приведённый выше код в файл
functions.phpили в плагин. - Настройте параметр
$inactive_days_limitпод ваши нужды — 30 дней можно увеличить или уменьшить. - Очистите кеш сайта и браузера.
- Проверьте фронтенд оформления заказа — неактивные методы должны исчезнуть из списка.
Как проверить, что решение работает
- Оформите заказ используя разные методы оплаты.
- Измените дату заказа в базе (если есть тестовая среда) чтобы проверить отключение для методов без заказов.
- Перейдите на страницу оплаты в гостевом режиме — методы с нулевой активностью за период должны отсутствовать.
- Включите режим отладки, чтобы увидеть, какие методы доступны.
Частые ошибки и способы их исправления
- Методы оплаты не отключаются
Проверьте, что статус заказа действительно один изwc-completedилиwc-processing. Возможно, нужны другие статусы. - Код отключает методы в админке
Это может сломать оформление заказов вручную. В коде есть защита черезis_admin(), убедитесь, что она не удалена. - Проблемы с производительностью
Запрос к базе может быть тяжёлым при большом количестве заказов. Рассмотрите кеширование результата или выполнение проверки раз в сутки с сохранением в опции. - Методы оплаты с ошибками после обновления WooCommerce
Проверяйте совместимость хуков и API после обновлений WooCommerce.
Практические советы по безопасности и производительности
- Используйте подготовленные запросы
$wpdb->prepare()для предотвращения SQL-инъекций. - Кешируйте результат подсчёта заказов в transient API, чтобы не запускать тяжёлый запрос на каждой загрузке страницы оплаты.
- Проверяйте, что отключение методов не мешает внутренним процессам, например, если есть заказы на стадии ожидания оплаты.
- Резервное копирование перед изменениями — на случай отката кода.
Сравнение подходов к отключению неактивных методов оплаты
| Метод | Плюсы | Минусы |
|---|---|---|
| Ручное отключение в админке | Простота, не требует кода | Забываются, не автоматизировано |
| Программное отключение по активности (как в статье) | Автоматизация, всегда актуально | Нагрузка на БД, требует поддержки кода |
| Плагины управления методами оплаты | Удобный UI, дополнительные функции | Зависимость от сторонних решений, возможны конфликты |