Проблема: избыточное количество платёжных систем замедляет сайт и усложняет оформление заказа
В WooCommerce часто бывает, что после установки нескольких платёжных шлюзов некоторые из них перестают использоваться, но продолжают загружаться на странице оформления заказа. Это приводит к увеличению времени загрузки, может сбивать пользователей и повышать риск ошибок в процессе оплаты. Автоматическое отключение неиспользуемых платёжных систем помогает оптимизировать производительность и улучшить UX.
Диагностика: как понять, какие платёжные системы не используются
Для начала нужно собрать статистику использования платёжных систем за определённый период (например, месяц). Это позволит определить, какие из них не применялись в заказах. Для диагностики используйте SQL-запрос к базе данных WooCommerce:
SELECT pm.meta_value AS payment_method, COUNT(p.ID) AS orders_count
FROM wp_posts p
INNER 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 > NOW() - INTERVAL 30 DAY
GROUP BY pm.meta_value
ORDER BY orders_count DESC;Этот запрос покажет, какие платёжные методы использовались в заказах за последние 30 дней и с каким количеством.
Пошаговое решение: автоматическое отключение неиспользуемых платёжных систем
1. Создайте таблицу для хранения информации об отключённых платёжных шлюзах
Для хранения информации о том, какие шлюзы отключать, можно использовать опцию в базе данных WordPress:
update_option('wc_disabled_payment_gateways', ['bacs', 'cheque']);2. Фильтр для исключения платёжных систем из списка на фронтенде
Добавьте следующий код в functions.php вашей темы или в отдельный плагин:
add_filter('woocommerce_available_payment_gateways', 'disable_unused_payment_gateways');
function disable_unused_payment_gateways($gateways) {
$disabled = get_option('wc_disabled_payment_gateways', []);
if (empty($disabled)) {
return $gateways;
}
foreach ($disabled as $gateway_id) {
if (isset($gateways[$gateway_id])) {
unset($gateways[$gateway_id]);
}
}
return $gateways;
}3. Автоматизация обновления списка отключаемых методов через WP-CLI или CRON
Для периодического обновления списка неиспользуемых платежных систем напишите скрипт, который проверяет статистику заказов и обновляет опцию:
function update_disabled_payment_gateways() {
global $wpdb;
$threshold = 1; // минимальное количество заказов за период
$period_days = 30;
$results = $wpdb->get_results($wpdb->prepare(
"SELECT pm.meta_value AS payment_method, COUNT(p.ID) AS orders_count
FROM {$wpdb->posts} p
INNER JOIN {$wpdb->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 > NOW() - INTERVAL %d DAY
GROUP BY pm.meta_value",
$period_days
));
$used_methods = array_map(function($item) { return $item->payment_method; }, $results);
$all_gateways = WC()->payment_gateways->payment_gateways();
$disabled = [];
foreach ($all_gateways as $gateway_id => $gateway) {
if (!in_array($gateway_id, $used_methods)) {
$disabled[] = $gateway_id;
}
}
update_option('wc_disabled_payment_gateways', $disabled);
}
// Запускать через CRON или WP-CLI
// add_action('wp_loaded', 'update_disabled_payment_gateways');Проверка результата после внедрения
- Перейдите на страницу оформления заказа и убедитесь, что платёжные методы из списка
wc_disabled_payment_gatewaysотсутствуют в списке выбора. - Проверьте, что остальные платёжные системы работают как раньше.
- Просмотрите логи ошибок и консоль браузера на предмет сбоев.
Частые ошибки и как их исправить
- Платёжный шлюз не отключается: Проверьте правильность ID шлюза. Используйте
var_dump(array_keys(WC()->payment_gateways->payment_gateways()));для списка актуальных ID. - Сбой при вызове функции из-за отсутствия WC(): Убедитесь, что код запускается после инициализации WooCommerce, например, на хуке
woocommerce_loadedили позже. - Удаление важных платёжных систем: Перед автоматическим отключением добавьте проверку на минимальный порог заказов и логи для контроля.
Практические советы по безопасности и производительности
- Не отключайте платёжные методы, если у вас мало данных или нестабильный поток заказов — это может негативно повлиять на UX.
- Запускайте обновление списка отключённых платёжных систем не чаще одного раза в сутки, чтобы не перегружать базу данных.
- Для критичных сайтов используйте резервное копирование опций перед автоматическим обновлением.
- Оптимизируйте SQL-запрос, если база данных большого размера — добавьте индексы по
post_typeиpost_status.
Таблица сравнения способов отключения платёжных систем
| Способ | Плюсы | Минусы | Когда использовать |
|---|---|---|---|
| Ручное отключение в настройках WooCommerce | Просто, без кода | Требует вмешательства, не подходит для динамики | Когда число платёжных систем мало и редко меняется |
| Код с фильтром на основе опции | Автоматизирует отключение, контролируемо | Нужно написать и поддерживать код | Для сайтов со средним количеством платёжных систем |
| Автоматическое обновление через CRON и статистику заказов | Полная автоматизация, актуальные данные | Сложнее в настройке, требуется тестирование | Для крупных магазинов с множеством платёжных методов |