Почему важно отключать отзывы на товары по расписанию
В интернет-магазинах на WooCommerce отзывы помогают пользователям принимать решение, но иногда требуется ограничить возможность оставлять отзывы спустя определённое время после покупки или публикации товара. Это актуально, если вы хотите снизить нагрузку на модерацию, избежать старых неактуальных отзывов или ограничить спам в долгосрочной перспективе.
Диагностика проблемы: как понять, что отзывы не отключены вовремя
Проверьте, включены ли отзывы на товары старше нужного срока:
- Перейдите в админку WooCommerce → Товары → выберите товар;
- Проверьте вкладку «Обсуждение» — активна ли опция «Разрешить отзывы»;
- Проверьте наличие отзывов на страницах товаров, которым больше нужного срока;
- Оцените, приходят ли новые отзывы на устаревшие товары;
- Проверьте кэш сайта и плагинов (если отзывы не отключаются визуально, возможно, кэш мешает).
Пошаговое решение: отключение отзывов по дате создания товара
Для отключения отзывов на товары старше заданного количества дней используем хук woocommerce_product_is_reviewable. Он позволяет динамически управлять возможностью оставлять отзывы. Пример кода, который отключает отзывы на товарах старше 30 дней:
add_filter('woocommerce_product_is_reviewable', 'disable_reviews_after_days', 10, 2);
function disable_reviews_after_days($is_reviewable, $product) {
$days_limit = 30; // Количество дней
$post_date = get_post_time('U', false, $product->get_id());
$now = current_time('timestamp');
if (($now - $post_date) > ($days_limit * DAY_IN_SECONDS)) {
return false; // Отключаем отзывы
}
return $is_reviewable;
}Этот код добавьте в файл functions.php активной темы или в кастомный плагин.
Как работает код
- Получаем дату публикации товара в формате UNIX timestamp;
- Сравниваем с текущим временем;
- Если прошло больше 30 дней, возвращаем
false, что отключает отзывы; - Иначе оставляем текущий статус.
Проверка результата после внедрения
Чтобы убедиться, что отзывы отключены на старых товарах:
- Очистите кэш сайта и браузера;
- Откройте страницу товара старше 30 дней и попробуйте оставить отзыв — форма должна отсутствовать;
- Откройте товар моложе 30 дней — форма для отзывов должна быть доступна;
- Проверьте через консоль разработчика, что элементы формы действительно отсутствуют;
- Если используете кэширование или CDN, обновите кэш.
Частые ошибки и как их исправить
- Отзывы не отключаются: Проверьте, не кешируется ли страница товара. Очистите кэш или временно отключите плагины кэширования.
- Код добавлен в неправильный файл: Поместите код в
functions.phpактивной темы или в отдельный плагин, чтобы избежать конфликтов. - Неверный подсчёт времени: Используйте
current_time('timestamp')вместоtime(), чтобы учитывать часовой пояс WordPress. - Отзывы отключены для всех товаров: Проверьте правильность условия в коде, чтобы не возвращать
falseдля всех товаров. - Проблемы с кастомными типами товаров: Данный код работает с WooCommerce стандартными товарами. Для кастомных типов нужно адаптировать логику.
Практические советы по производительности и безопасности
- Код основан на фильтре, он не влияет на базу данных и безопасен с точки зрения производительности.
- Избегайте прямых изменений в ядре WooCommerce или темы, используйте хуки.
- Для больших магазинов с тысячами товаров можно добавить кеширование результата проверки, например, использовать
transient, чтобы не считать дату при каждом запросе. - Регулярно проверяйте совместимость с обновлениями WooCommerce и WordPress.
Альтернативные варианты реализации
| Метод | Плюсы | Минусы |
|---|---|---|
Использование фильтра woocommerce_product_is_reviewable | Простота, не требует изменений базы, гибкость | Отзывы отображаются на странице, но форма скрывается |
Программное отключение через обновление мета поля _comments_open | Отзывы полностью отключены в базе | Необходимо периодически запускать скрипт или WP-Cron |
| Плагины управления отзывами с расписанием | Готовые решения с UI | Могут замедлить сайт, платные опции |
Пример кода для периодической деактивации отзывов через WP-Cron
function wpdisable_old_reviews() {
$days_limit = 30;
$args = [
'post_type' => 'product',
'date_query' => [
[
'column' => 'post_date',
'before' => "$days_limit days ago",
]
],
'posts_per_page' => -1,
'fields' => 'ids',
];
$query = new WP_Query($args);
foreach ($query->posts as $product_id) {
// Отключаем отзывы
update_post_meta($product_id, '_comments_open', 'closed');
}
}
if (!wp_next_scheduled('wpdisable_old_reviews_hook')) {
wp_schedule_event(time(), 'daily', 'wpdisable_old_reviews_hook');
}
add_action('wpdisable_old_reviews_hook', 'wpdisable_old_reviews');Этот скрипт отключает комментарии (отзывы) для товаров старше 30 дней, выполняясь ежедневно.
Обратите внимание, что после выполнения этого кода форма отзывов полностью исчезнет, а не только станет недоступной для новых отзывов.