Автоматическое удаление старых отзывов и оценок в WooCommerce

Диагностика проблемы с отзывами и рейтингами в WooCommerce

При активном интернет-магазине на WooCommerce количество отзывов и оценок может существенно увеличиваться. Со временем это приводит к замедлению работы сайта, особенно при большом числе постов и комментариев. Отзывы — это по сути комментарии с метаданными и рейтингами, которые хранятся в базе данных WordPress. Иногда возникает необходимость автоматически удалять старые отзывы (например, старше 1 года), чтобы очистить базу и поддерживать производительность.

Основные признаки, что пора очищать отзывы:

  • Замедление загрузки страниц товаров и админки;
  • Резкое увеличение размера таблиц wp_comments и wp_commentmeta;
  • Высокое потребление ресурсов сервера при выполнении запроса отзывов.

Как определить отзывы к удалению: выборка по дате и типу комментария

Отзывы WooCommerce — это комментарии с типом comment_type = 'review' или пустым значением (зависит от версии WooCommerce). Рейтинг хранится в commentmeta с ключом rating.

Чтобы выбрать отзывы старше определённой даты, используйте дату создания комментария comment_date. Пример выборки для комментариев старше года:

SELECT comment_ID FROM wp_comments WHERE comment_type = 'review' AND comment_date < DATE_SUB(NOW(), INTERVAL 1 YEAR);

Пошаговое решение: автоматическое удаление старых отзывов через WP-Cron

Для автоматизации удаления старых отзывов реализуем функцию в файле functions.php вашей темы или в кастомном плагине.

1. Создайте функцию для удаления отзывов

function wc_delete_old_reviews() {
    global $wpdb;
    $date_limit = date('Y-m-d H:i:s', strtotime('-1 year'));

    // Получаем ID старых отзывов
    $old_reviews = $wpdb->get_col($wpdb->prepare(
        "SELECT comment_ID FROM {$wpdb->comments} WHERE comment_type = 'review' AND comment_date < %s",
        $date_limit
    ));

    if (!empty($old_reviews)) {
        foreach ($old_reviews as $comment_id) {
            wp_delete_comment($comment_id, true); // принудительное удаление
        }
    }
}

2. Создайте WP-Cron задачу для ежемесячного запуска

add_action('wc_delete_old_reviews_event', 'wc_delete_old_reviews');

if (!wp_next_scheduled('wc_delete_old_reviews_event')) {
    wp_schedule_event(time(), 'monthly', 'wc_delete_old_reviews_event');
}

3. Добавьте отмену задачи при деактивации плагина (если используете плагин)

function wc_delete_old_reviews_deactivate() {
    $timestamp = wp_next_scheduled('wc_delete_old_reviews_event');
    if ($timestamp) {
        wp_unschedule_event($timestamp, 'wc_delete_old_reviews_event');
    }
}
register_deactivation_hook(__FILE__, 'wc_delete_old_reviews_deactivate');

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

Чтобы убедиться, что функция работает:

  • Выполните вручную wc_delete_old_reviews() через консоль WP-CLI или временно вызовите функцию в functions.php и обновите сайт.
  • Проверьте таблицы wp_comments и wp_commentmeta, убедитесь, что записи с отзывами старше года удалены.
  • В админке WooCommerce откройте отзывы — старые должны исчезнуть.
  • Для WP-Cron убедитесь, что задача запланирована: wp cron event list (через WP-CLI).

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

  • Отзывы не удаляются: Проверьте, что comment_type действительно равен 'review' на вашем сайте. Иногда WooCommerce использует пустое значение или 'comment'. Можно уточнить запрос.
  • Отзыв удаляется, но рейтинг остаётся: Используйте wp_delete_comment($comment_id, true); для удаления комментария с метаданными.
  • WP-Cron не срабатывает: Убедитесь, что на сайте есть посещения (WP-Cron запускается по триггерам посещений) или настройте системный cron для вызова wp cron event run --due-now.
  • Ошибка в базе данных: Проверьте префиксы таблиц и корректность SQL-запроса.

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

  • Не удаляйте отзывы в пиковое время нагрузки, лучше ставить задачу на ночное время.
  • Для больших магазинов с тысячами отзывов добавьте пакетное удаление (например, по 100 отзывов за раз), чтобы не перегрузить сервер.
  • Включите резервное копирование базы перед автоматическим удалением.
  • Используйте транзакции или проверяйте целостность базы после массовых операций.

Пример пакетного удаления отзывов по 100 штук

function wc_delete_old_reviews_batch($batch_size = 100) {
    global $wpdb;
    $date_limit = date('Y-m-d H:i:s', strtotime('-1 year'));

    $old_reviews = $wpdb->get_col($wpdb->prepare(
        "SELECT comment_ID FROM {$wpdb->comments} WHERE comment_type = 'review' AND comment_date < %s LIMIT %d",
        $date_limit, $batch_size
    ));

    if (!empty($old_reviews)) {
        foreach ($old_reviews as $comment_id) {
            wp_delete_comment($comment_id, true);
        }
        return true; // Есть ещё для удаления
    }
    return false; // Удалено всё
}

Сравнение способов удаления старых отзывов

МетодПлюсыМинусыПрименимость
Ручное удаление через SQLБыстро, без нагрузки на WPРиск нарушить целостность, сложно учитывать метаданныеМаленькие магазины с админским доступом к БД
WP-функции + WP-Cron (код)Безопасно, учитывает все связи, автоматизацияНагрузка при большом объёме, требует настройки cronСредние и крупные магазины
Плагины очистки базыПростота, дополнительные функции оптимизацииМогут быть платными, лишний софтДля неразработчиков и быстрого решения
Автоматическое удаление старых отзывов и оценок в WooCommerce: практическое руководство
18.06.2026
Как удалить, изменить и запретить meta robots в WordPress: практические решения
06.03.2026
Как добавить поддержку WebP в WordPress: бесплатные и коммерческие решения
26.12.2025
Как автоматически удалять старые записи через крон в WordPress: практическое руководство
14.04.2026
Как удалить или изменить название поля в форме регистрации WordPress
11.04.2026
×
Делай сайт лучше!!

-20% на премиум темы и плагины

Использовать скидку ⋙