Диагностика проблемы: зачем и когда отключать отзывы автоматически
В стандартном 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, менее гибкий |
| Ручное закрытие отзывов | Простота, нет кода | Трудоёмко, не автоматично |