WooCommerce: как разрешить оставлять отзывы только покупателям

Зачем ограничивать отзывы в 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)Готовое решение, поддержкаПлатно, может тормозить сайтПодходит для крупных магазинов
Модификация шаблоновТочный контроль выводаСложно поддерживать, неэффективно для динамических проверокИспользовать совместно с фильтрами
Автоматизация создания резервных копий в WordPress с помощью кода
03.02.2026
Как удалить все неактивные пользователи в WordPress с помощью кода
10.01.2026
WooCommerce: автоматическое отключение неактивных вариаций товаров
25.05.2026
Как создать уникальный вид записи в WordPress с помощью кода
30.01.2026
Как создать автоматические ответы на комментарии в WordPress
30.12.2025