wpfind.ru wordpress wpfind.ru

WooCommerce: автоматическое отключение отзывов после заданного срока

Диагностика проблемы: зачем и когда отключать отзывы автоматически

В стандартном WooCommerce отзывы к товарам остаются открытыми постоянно, что не всегда удобно. Например, если вы хотите принимать отзывы только в течение месяца после покупки, чтобы избежать спама и нерелевантных комментариев позднее. Вопрос: как программно ограничить время, когда покупатель может оставить отзыв?

Проверить, что отзывов можно оставить всегда, просто — зайдите на страницу любого товара и посмотрите, активна ли вкладка «Отзывы» независимо от даты заказа.

Пошаговое решение: как отключить отзывы через 30 дней после покупки

1. Добавляем пользовательское поле с датой покупки к заказу

WooCommerce уже содержит дату заказа, она доступна через объект заказа. Для проверки срока публикации отзыва нам нужна дата завершения заказа.

2. Перехватываем проверку возможности оставлять отзыв

Используем фильтр comments_open, чтобы программно закрывать отзывы в зависимости от даты заказа.

3. Реализация кода

add_filter('comments_open', 'wc_disable_product_reviews_after_period', 10, 2);
function wc_disable_product_reviews_after_period($open, $post_id) {
    if (get_post_type($post_id) !== 'product') {
        return $open; // Не для других типов записей
    }

    // Получаем ID пользователя, если авторизован
    $user_id = get_current_user_id();
    if (!$user_id) {
        return false; // Неавторизованные не могут оставить отзыв
    }

    // Получаем все завершённые заказы пользователя
    $orders = wc_get_orders(array(
        'customer_id' => $user_id,
        'status' => 'completed',
        'limit' => -1,
    ));

    $can_review = false;
    $now = current_time('timestamp');
    $review_window_days = 30; // Период, когда можно оставлять отзыв

    foreach ($orders as $order) {
        // Проверяем, есть ли товар в заказе
        foreach ($order->get_items() as $item) {
            if ($item->get_product_id() == $post_id) {
                $order_date = $order->get_date_completed();
                if (!$order_date) continue;
                $order_timestamp = $order_date->getTimestamp();

                // Проверяем, что сейчас не позднее 30 дней от даты завершения заказа
                if (($now - $order_timestamp) <= $review_window_days * DAY_IN_SECONDS) {
                    $can_review = true;
                    break 2; // Достаточно одного подходящего заказа
                }
            }
        }
    }

    return $can_review;
}

Проверка результата после внедрения

  • Авторизуйтесь под пользователем, который сделал заказ и прошёл не более 30 дней.
  • Перейдите на страницу товара из этого заказа — вкладка «Отзывы» должна быть открыта.
  • Измените дату завершения заказа в админке на более чем 30 дней назад — вкладка «Отзывы» должна исчезнуть, и оставить отзыв будет нельзя.
  • Для неавторизованных пользователей отзывы всегда закрыты.

Частые ошибки и как исправить

  • Отзывы закрыты для всех — возможно, пользователь не авторизован или нет завершённых заказов с товаром. Проверьте, что вход выполнен и есть нужные заказы.
  • Отзывы всегда открыты — убедитесь, что фильтр comments_open срабатывает, нет конфликтов с другими плагинами, которые управляют отзывами.
  • Неверное время — функция использует current_time('timestamp'), убедитесь, что часовой пояс WordPress настроен правильно.

Практические советы по безопасности и производительности

  • Запросы wc_get_orders с параметром limit = -1 могут быть ресурсоёмкими при большом количестве заказов. При необходимости добавьте пагинацию или кэширование результатов.
  • Для дополнительной безопасности отключайте отзывы для неавторизованных пользователей, чтобы избежать спама.
  • Рекомендуется внедрять этот код в дочернюю тему или в кастомный плагин, чтобы не потерять изменения при обновлении WooCommerce.

Альтернативные подходы: плагин, код или компромисс

МетодПреимуществаНедостатки
Кастомный код (как выше)Тонкая настройка, не нагружает систему плагинамиНужны навыки, возможны ошибки при обновлениях
Плагин с ограничением отзывов по времени (не всегда есть)Простота установки, поддержкаМожет конфликтовать с WooCommerce, менее гибкий
Ручное закрытие отзывовПростота, нет кодаТрудоёмко, не автоматично
×

AI-плагин от WPShop.ru

анализирует конкурентов

пишет статьи

готовит SEO

генерирует изображения

и еще кое-что...
WPGPT
Плагин, который наполняет ваш сайт WordPress
Узнать больше