Диагностика задачи: зачем ограничивать отмену заказов по ролям
В интернет-магазинах на WooCommerce иногда требуется запретить отмену заказов определенным категориям пользователей, например, гостям, подписчикам или оптовикам. Это может быть связано с внутренними правилами магазина или необходимостью контролировать возвраты и отмены. По умолчанию WooCommerce не предоставляет гибких настроек для этой задачи, поэтому приходится внедрять кастомные решения.
Пошаговое решение: запрет отмены заказов по ролям через фильтр WooCommerce
Для ограничения отмены заказов по ролям пользователей можно использовать хук woocommerce_valid_order_statuses_for_cancel. Этот фильтр позволяет задать, для каких статусов заказов будет активна возможность отмены.
Пример кода для functions.php вашей темы или кастомного плагина:
add_filter('woocommerce_valid_order_statuses_for_cancel', 'custom_limit_order_cancel_by_role', 10, 2);function custom_limit_order_cancel_by_role($statuses, $order) { if (!is_user_logged_in()) { // Для гостей отмена запрещена return []; } $user = wp_get_current_user(); $restricted_roles = ['subscriber', 'wholesale_customer']; // Укажите роли, которым запретить отмену foreach ($restricted_roles as $role) { if (in_array($role, (array)$user->roles)) { return []; // Отмена запрещена для этой роли } } // Для остальных ролей возвращаем стандартные статусы, разрешающие отмену return $statuses;}В этом примере отмена заказов запрещена для гостей и для пользователей с ролями subscriber и wholesale_customer. В остальных случаях WooCommerce будет использовать стандартный список статусов, при которых возможна отмена.
Объяснение кода
woocommerce_valid_order_statuses_for_cancel— фильтр, который изменяет список статусов заказов, для которых доступна отмена.- Функция получает массив статусов и объект заказа, после чего проверяет текущего пользователя и его роли.
- Если роль пользователя совпадает с запрещенной, функция возвращает пустой массив — отмена становится недоступной.
Как проверить, что запрет отмены работает
1. Авторизуйтесь на сайте под пользователем с ролью, которой запрещена отмена (например, subscriber).
2. Перейдите в «Мои заказы» и откройте заказ со статусом, позволяющим отмену (например, «Обработка»).
3. Кнопка или ссылка «Отменить заказ» не должны отображаться.
4. Авторизуйтесь под пользователем с ролью, которой отмена разрешена, и убедитесь, что кнопка доступна.
5. Проверьте, что для гостей (неавторизованных пользователей) отмена заказов невозможна.
Частые ошибки и как их исправить
- Кнопка отмены не исчезает для запрещенных ролей: Проверьте, что код добавлен в активную тему или плагин и что кэш сайта и браузера очищен.
- Роли указаны неверно: Используйте
print_r(wp_get_current_user()->roles)для диагностики текущих ролей пользователя. - Конфликты с другими плагинами: Проверьте, не переопределяют ли другие плагины хук
woocommerce_valid_order_statuses_for_cancel. - Кэширование страницы «Мои заказы»: Если используется кэш на уровне сервера или CDN, отключите его для страниц аккаунта, чтобы видеть актуальное состояние.
Практические советы по безопасности и производительности
- Не используйте
current_user_can()для проверки ролей в этом случае, так как кастомные роли могут не иметь стандартных capability. - Добавляйте код в дочернюю тему или отдельный плагин, чтобы не потерять изменения при обновлении.
- Для масштабных магазинов с большим числом ролей и заказов кэшируйте результаты проверки ролей при помощи transient API, чтобы снизить нагрузку.
- Обязательно тестируйте на staging-сайте перед внедрением на боевой, особенно при изменениях в логике заказов.
Сравнение способов реализации ограничения отмены заказов
| Метод | Описание | Плюсы | Минусы |
|---|---|---|---|
Фильтр woocommerce_valid_order_statuses_for_cancel | Программное ограничение на уровне статусов заказов | Гибко, не требует плагинов, легко кастомизируется | Требует навыков PHP, возможны конфликты с другими плагинами |
| Плагины с настройками ролей | Плагины для управления ролями и правами | Простота использования, графический интерфейс | Могут быть избыточными, нагрузка на систему |
| Изменение шаблонов WooCommerce | Удаление или скрытие кнопки отмены в шаблонах | Простой визуальный результат | Не защищает от прямых запросов, не блокирует отмену серверно |