Зачем ограничивать отзывы в WooCommerce только покупателями
Оставлять отзывы на товар могут все пользователи по умолчанию. Это создает риск получения недостоверных отзывов, спама и снижает доверие покупателей. Ограничение возможности оставлять отзывы только тем, кто действительно приобрел товар, помогает повысить качество обратной связи и защищает репутацию магазина.
Диагностика: как понять, что отзывы доступны всем
По умолчанию WooCommerce не проверяет статус заказа при добавлении отзыва. Чтобы убедиться, что отзывы открыты для всех, проверьте настройки:
- В админке WordPress перейдите в
WooCommerce > Настройки > Продукты. - Убедитесь, что опция Разрешить отзывы о продуктах активна.
- Обратите внимание, что там нет отдельной настройки для ограничения отзывов только покупателям.
Если отзывы оставляют даже пользователи без заказов, значит ограничение не настроено.
Пошаговое решение: разрешить отзывы только покупателям
Для реализации ограничения потребуется добавить код, который проверяет, покупал ли пользователь товар, перед разрешением оставить отзыв.
Шаг 1. Добавьте следующий код в файл functions.php вашей темы или в кастомный плагин:
add_filter('comments_open', 'woocommerce_reviews_only_after_purchase', 10, 2);
function woocommerce_reviews_only_after_purchase($open, $post_id) {
if (!is_user_logged_in()) {
return false; // неавторизованные не могут оставлять отзывы
}
$user_id = get_current_user_id();
$product = wc_get_product($post_id);
if (!$product || !$product->is_type('simple') && !$product->is_type('variable')) {
return $open; // оставляем как есть для других типов
}
// Проверяем, есть ли у пользователя завершенный заказ с этим товаром
$customer_orders = wc_get_orders(array(
'customer_id' => $user_id,
'status' => array('completed', 'processing'),
'limit' => -1,
));
foreach ($customer_orders as $order) {
foreach ($order->get_items() as $item) {
if ($item->get_product_id() == $post_id || $item->get_variation_id() == $post_id) {
return $open; // пользователь покупал товар
}
}
}
return false; // пользователь не покупал товар
}Шаг 2. Проверьте, что отзывы отключены для гостей и пользователей без заказов
После добавления кода попробуйте зайти на страницу товара под разными пользователями:
- Гость (неавторизованный) — форма отзыва должна быть скрыта.
- Зарегистрированный пользователь без заказов — форма отзыва недоступна.
- Пользователь с завершенными заказами на товар — форма отзывов доступна.
Проверка результата после внедрения
Чтобы проверить, что ограничение работает корректно:
- Выйдите из системы и откройте страницу товара — форма отзыва должна отсутствовать.
- Войдите под новым пользователем без покупок — форма также не должна отображаться.
- Войдите под покупателем с заказом — форма должна отображаться и принимать отзывы.
- Попробуйте отправить отзыв — он должен корректно сохраняться в базе.
Частые ошибки и как их исправить
- Отзывы не отображаются даже для покупателей: возможно, ID товара не совпадает с item_id из заказа. Проверьте, не используется ли вариация. В коде учтена проверка и вариаций (
get_variation_id()), но для нестандартных типов товаров возможно потребуется доработка. - Отзывы видны гостям: убедитесь, что код добавлен именно в активную тему или плагин, а кеш сайта очищен после изменений.
- Большая нагрузка на сайт при большом количестве заказов: функция
wc_get_ordersс параметромlimit=-1может замедлять сайт. В таком случае стоит реализовать кеширование или оптимизировать запрос, например, проверить наличие заказа через прямой SQL-запрос или meta_query.
Практические советы по безопасности и производительности
- Не храните логику отзывов в шаблонах, используйте хуки и фильтры.
- Добавьте кеширование результатов проверки покупки с помощью transient API, чтобы снизить нагрузку на базу при повторных загрузках страницы.
- Отключите HTML в отзывах, чтобы минимизировать XSS-риски, если не используете проверенные компоненты.
- Используйте SSL для всех страниц с формами отзывов.
Таблица сравнения вариантов реализации ограничения отзывов
| Метод | Плюсы | Минусы | Рекомендации |
|---|---|---|---|
| Код в functions.php | Быстро, бесплатно, гибко | Нужны знания PHP, нагрузка при большом количестве заказов | Использовать кеширование |
| Плагин (например, WooCommerce Verified Reviews) | Готовое решение, поддержка | Платно, может тормозить сайт | Подходит для крупных магазинов |
| Модификация шаблонов | Точный контроль вывода | Сложно поддерживать, неэффективно для динамических проверок | Использовать совместно с фильтрами |