Диагностика проблемы: зачем удалять закрытые отзывы в WooCommerce
В WooCommerce отзывы клиентов помогают повысить доверие и конверсию, но иногда старые, закрытые или неактивные отзывы перестают быть актуальными, занимают место в базе и замедляют загрузку страниц. Особенно это критично для магазинов с большим числом товаров и отзывов.
Если вы хотите поддерживать базу отзывов в актуальном состоянии, автоматическое удаление закрытых отзывов через определённое время — простой и эффективный способ.
Пошаговое решение: как реализовать автоматическое удаление отзывов по сроку
1. Определение статуса и срока удаления
В WooCommerce отзывы — это комментарии к товарам, у которых тип comment_type = 'review'. Закрытый отзыв мы можем обозначить через кастомное поле, например, review_closed со значением 1. Автоматически удалять отзывы, закрытые старше 30 дней.
2. Добавление метки закрытия отзыва
Для установки статуса «закрыт» добавим мета-поле. Например, через админку или программно:
add_comment_meta($comment_id, 'review_closed', 1, true);3. Создание WP-Cron задачи для удаления
Добавим функцию, которая будет запускаться ежедневно и удалять отзывы, закрытые более 30 дней назад:
function wc_delete_old_closed_reviews() {
global $wpdb;
$days = 30;
$date_threshold = date('Y-m-d H:i:s', strtotime("-{$days} days"));
// Получаем ID комментариев с review_closed = 1 и датой старше threshold
$comment_ids = $wpdb->get_col($wpdb->prepare(
"SELECT comment_ID FROM {$wpdb->comments} c
JOIN {$wpdb->commentmeta} cm ON c.comment_ID = cm.comment_id
WHERE cm.meta_key = 'review_closed' AND cm.meta_value = '1'
AND c.comment_date < %s",
$date_threshold
));
if (!empty($comment_ids)) {
foreach ($comment_ids as $comment_id) {
wp_delete_comment($comment_id, true); // true - безвозвратно
}
}
}
// Планируем событие при активации темы/плагина
if (!wp_next_scheduled('wc_daily_delete_closed_reviews')) {
wp_schedule_event(time(), 'daily', 'wc_daily_delete_closed_reviews');
}
add_action('wc_daily_delete_closed_reviews', 'wc_delete_old_closed_reviews');4. Очистка расписания при деактивации
function wc_clear_delete_closed_reviews_schedule() {
$timestamp = wp_next_scheduled('wc_daily_delete_closed_reviews');
if ($timestamp) {
wp_unschedule_event($timestamp, 'wc_daily_delete_closed_reviews');
}
}
// Добавьте вызов wc_clear_delete_closed_reviews_schedule() при деактивации плагина или темыПроверка результата после внедрения
- Закройте несколько отзывов вручную, добавив мета
review_closed = 1и установите дату их создания на более 30 дней назад (через БД или программно). - Запустите функцию
wc_delete_old_closed_reviews()вручную (через временный вызов в functions.php или WP-CLI). - Проверьте, что отзывы удалены из базы (
wp_commentsиwp_commentmeta). - Убедитесь, что на фронтенде отзывы исчезли и страницы товаров работают без ошибок.
Частые ошибки и как их исправить
- Отзывы не удаляются: Проверьте, что мета
review_closedдействительно есть у отзывов и правильно задано значение '1'. - WP-Cron не срабатывает: Убедитесь, что на сайте посещения или внешние запросы запускают cron, или настройте системный cron для wp-cron.php.
- Удаление происходит, но отзывы остаются на сайте: Проверьте кэш плагинов и браузера, очистите кэш.
- Производительность падает: При большом объёме комментариев оптимизируйте запрос с помощью индексов в БД или пакетной обработки.
Практические советы по безопасности и производительности
- Удаляйте отзывы только с помощью
wp_delete_comment(), чтобы корректно очистить все связанные данные. - Используйте пакетную обработку, если отзывов очень много, чтобы не перегружать сервер.
- Проверяйте права пользователя на изменение отзывов, если добавляете интерфейс для закрытия отзывов.
- Для повышения производительности кэшируйте результаты запросов в transient, если используете дополнительные фильтры.
Сравнение вариантов реализации удаления отзывов
| Метод | Плюсы | Минусы |
|---|---|---|
| Удаление через WP-Cron и кастомное мета-поле | Гибкий контроль, можно настроить сроки и условия | Нужна регистрация и управление cron, требует поддержки |
| Удаление вручную через SQL-запросы | Быстрое удаление большого объёма | Риск повредить данные, сложно автоматизировать |
| Плагины для управления отзывами | Удобный интерфейс, дополнительные функции | Может нагружать сайт, лишний функционал |