Диагностика проблемы: зачем отключать отзывы на неактивные товары
В интернет-магазине на WooCommerce количество отзывов может расти, включая отзывы к товарам, которые больше не продаются или сняты с публикации. Это негативно влияет на доверие покупателей и SEO, ведь неактуальные отзывы вводят в заблуждение. Стандартный функционал WooCommerce не предлагает автоматического способа отключать отзывы для таких товаров.
Часто пользователи сталкиваются с проблемой, что отзывы остаются активными на товарах со статусом «черновик» или «в архиве», что нежелательно.
Как автоматически отключить отзывы на неактивные товары с помощью кода
Что считается неактивным товаром
В WooCommerce неактивными будем считать товары с любым статусом, отличным от publish. Например: draft, private, pending, trash.
Решение: отключаем отзывы в шаблоне single-product или в глобальном фильтре
Для отключения отзывов у неактивных товаров можно использовать хук comments_open, который отвечает за возможность оставлять комментарии (отзывы в WooCommerce — это комментарии с типом review).
Добавьте следующий код в файл functions.php вашей темы или в кастомный плагин:
add_filter('comments_open', 'disable_reviews_for_inactive_products', 10, 2);
function disable_reviews_for_inactive_products($open, $post_id) {
if (get_post_type($post_id) !== 'product') {
return $open; // Оставляем как есть для других типов
}
$product = wc_get_product($post_id);
if (!$product) {
return $open;
}
// Проверяем статус товара
$status = get_post_status($post_id);
if ($status !== 'publish') {
return false; // Закрываем отзывы для неактивных товаров
}
return $open;
}
Что делает этот код
- Проверяет, что комментарии запрашиваются для товара WooCommerce.
- Если товар не опубликован, возвращает
false, что отключает возможность оставлять отзывы. - Для активных товаров отзывы остаются доступны.
Проверка результата после внедрения
- Откройте страницу товара со статусом
publish— отзывы должны быть доступны. - Измените статус товара на
draftилиprivate. - Откройте страницу товара и убедитесь, что форма отзывов и вкладка отзывов отсутствуют.
- Попробуйте оставить отзыв через REST API или AJAX — должен быть запрет.
Частые ошибки и как их исправить
- Отзывы видны, хотя товар не опубликован
Возможно, кэш сайта или плагина мешает обновлению. Очистите кэш и проверьте снова. - Отзывы не отключаются для некоторых типов товаров
Убедитесь, что тип записи действительноproduct. Проверьте, не переопределяется ли хук другим плагином. - Код не работает после обновления WooCommerce
Проверьте совместимость функцийwc_get_productи статусов. При необходимости обновите код.
Практические советы по безопасности и производительности
- Добавляйте код через дочернюю тему или кастомный плагин, чтобы не потерять изменения при обновлениях.
- Перед внесением изменений сделайте бэкап сайта.
- Используйте
wp_cache_deleteдля очистки кэша товара при смене статуса, если у вас есть кэширование. - Проверяйте совместимость с плагинами отзывов, если они установлены (например, YITH WooCommerce Review Reminder).
Дополнительные варианты: отключение отзывов через SQL
Если хотите массово отключить отзывы для неактивных товаров в базе, можно выполнить SQL-запрос, который удалит все комментарии с типом review у товаров вне статуса publish:
DELETE c FROM wp_comments c
INNER JOIN wp_posts p ON c.comment_post_ID = p.ID
WHERE p.post_type = 'product'
AND p.post_status != 'publish'
AND c.comment_type = 'review';
Будьте осторожны: перед выполнением сделайте резервную копию базы!
Сравнение способов отключения отзывов
| Метод | Преимущества | Недостатки |
|---|---|---|
| PHP-фильтр comments_open | Гибкий, работает динамически, не требует изменений в базе | Может конфликтовать с плагинами, зависит от правильности статусов |
| SQL-удаление отзывов | Мгновенно очищает базу, подходит для массовой очистки | Разовый, отзывы удаляются без восстановления |