В чём заключается задача: отключить оплату для заказов с конкретным статусом
В WooCommerce иногда нужно блокировать возможность оплаты для заказов, которые уже находятся в определённом статусе — например, для отменённых, возвратных или ожидающих проверки. Это помогает избежать повторных оплат, особенно если вы используете сторонние способы оплаты или кастомные процессы обработки заказов.
Диагностика проблемы: почему заказ может быть оплачен повторно
Если в вашем магазине WooCommerce клиенты могут повторно оплатить уже отменённые или ожидающие статуса заказы, это происходит из-за того, что метод оплаты не проверяет статус заказа перед включением кнопки оплаты. В стандартном WooCommerce кнопка «Оплатить» доступна для заказов со статусом pending или failed. Если вы используете сторонние статусы или кастомные сценарии, они могут не учитываться.
Проверить текущие статусы заказа можно в админке WooCommerce в разделе Заказы. Обратите внимание, какие статусы появляются и допускают повторную оплату.
Пошаговое решение: как отключить оплату для заказов с выбранным статусом
Для решения задачи нам нужно перехватить процесс отображения кнопки оплаты на странице оплаты заказа и отключить её для заказов с определённым статусом. В WooCommerce для этого удобно использовать фильтр woocommerce_valid_order_statuses_for_payment.
Пример кода, который отключает оплату для заказов со статусом cancelled и refunded:
add_filter('woocommerce_valid_order_statuses_for_payment', 'disable_payment_for_specific_statuses', 10, 2);
function disable_payment_for_specific_statuses($statuses, $order) {
$blocked_statuses = array('cancelled', 'refunded');
if (in_array($order->get_status(), $blocked_statuses)) {
return array(); // Отключаем все статусы для оплаты
}
return $statuses;
}
Этот код нужно добавить в файл functions.php вашей дочерней темы или в кастомный плагин.
Что делает код
- Фильтр
woocommerce_valid_order_statuses_for_paymentвозвращает массив статусов, для которых разрешена оплата. - Если статус заказа в списке заблокированных, функция возвращает пустой массив, отключая возможность оплаты.
Проверка результата после внедрения
- Создайте заказ с одним из заблокированных статусов, например,
cancelled. - Перейдите на страницу оплаты данного заказа (обычно URL вида
/checkout/order-pay/<order_id>/). - Убедитесь, что кнопка оплаты отсутствует или недоступна.
- Создайте заказ с разрешённым статусом (например,
pending) и проверьте, что кнопка оплаты отображается.
Частые ошибки и как исправить
- Кнопка оплаты всё равно отображается для заблокированного статуса
Проверьте, действительно ли статус заказа совпадает с тем, что указан в массиве$blocked_statuses. Используйтеerror_log($order->get_status());для отладки. - Код не работает на странице оплаты
Убедитесь, что код добавлен в правильное место и активирован. Проверьте логи ошибок PHP. - Конфликт с плагинами оплаты
Некоторые плагины могут игнорировать этот фильтр. В таком случае нужно смотреть документацию плагина и искать их хуки для контроля отображения кнопки.
Практические советы по безопасности и производительности
- Не отключайте оплату для статусов, которые могут использоваться клиентом для повторной попытки оплаты — это может сбить покупателя.
- Используйте конкретные статусы, а не общие, чтобы не блокировать оплату случайно.
- Добавьте логирование для отладки, чтобы отслеживать, когда и какие заказы блокируются.
- Не забывайте тестировать на тестовом сайте перед внесением изменений в рабочий магазин.
Сравнение вариантов решения
| Метод | Описание | Плюсы | Минусы |
|---|---|---|---|
Фильтр woocommerce_valid_order_statuses_for_payment | Отключение оплаты через фильтрацию статусов заказа | Лёгкий в реализации, не требует сторонних плагинов | Не всегда учитывается плагинами оплаты |
| JS-скрипт на фронтенде | Скрыть кнопку оплаты через JavaScript | Быстро и просто | Ненадёжно, пользователь может обойти |
| Плагин для управления статусами | Использование готовых решений с настройками | Удобство, поддержка | Могут влиять на производительность, платные |