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

Проблема: как автоматически удалять устаревшие отзывы в WooCommerce

В интернет-магазинах на WooCommerce с большим количеством товаров отзывы накапливаются быстро. Некоторые отзывы со временем теряют актуальность, например, для сезонных товаров или временных акций. Ручное удаление каждого отзыва — неэффективно, нужен автоматический способ очистки старых отзывов по дате.

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

Для начала проверьте, сколько отзывов у вас на сайте и как давно они были оставлены. Это поможет понять, какие отзывы нужно удалять. Отзывы в WooCommerce — это комментарии с типом comment_type = 'review'.

SELECT COUNT(*) FROM wp_comments WHERE comment_type = 'review';
SELECT MIN(comment_date) FROM wp_comments WHERE comment_type = 'review';
SELECT MAX(comment_date) FROM wp_comments WHERE comment_type = 'review';

Если вы видите, что есть отзывы старше, например, 1 года, и хотите их удалять автоматически — можно настроить WP-Cron задачу.

Пошаговое решение: создание автозадачи для удаления отзывов старше N дней

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

function wpassist_delete_old_woocommerce_reviews() {
    global $wpdb;
    $days = 365; // Количество дней для хранения отзывов
    $date_threshold = date('Y-m-d H:i:s', strtotime("-{$days} days"));

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

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

2. Зарегистрируем CRON задачу, которая будет запускаться, например, раз в неделю.

add_action('wpassist_weekly_review_cleanup', 'wpassist_delete_old_woocommerce_reviews');

function wpassist_schedule_review_cleanup() {
    if (!wp_next_scheduled('wpassist_weekly_review_cleanup')) {
        wp_schedule_event(time(), 'weekly', 'wpassist_weekly_review_cleanup');
    }
}
add_action('wp', 'wpassist_schedule_review_cleanup');

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

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

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

  • Зайдите в админку WordPress > Комментарии и отфильтруйте отзывы по дате — старые отзывы должны исчезнуть.
  • Запустите задачу вручную, вызвав функцию wpassist_delete_old_woocommerce_reviews() через WP-CLI или временно добавив вызов в шаблон.
  • Проверьте базу данных — в таблице wp_comments с типом review не должно быть отзывов старше заданного периода.

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

  • Отзывы не удаляются: Проверьте, что используется правильный comment_type — в WooCommerce это review, а не comment.
  • CRON задача не запускается: Убедитесь, что на вашем хостинге работает WP-Cron, или настройте системный cron для вызова wp-cron.php.
  • Удаляются не те отзывы: Проверьте условие в SQL-запросе, чтобы оно корректно фильтровало по дате и типу комментария.
  • Перфоманс замедляется при удалении большого числа отзывов: удаляйте отзывы партиями, например, по 50 штук за раз, чтобы не нагружать сервер.

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

  • Не используйте удаление отзывов без резервного копирования базы данных — на всякий случай.
  • Для сайтов с большим количеством отзывов разбивайте удаление на части с помощью LIMIT в SQL.
  • Следите за временем выполнения CRON задачи, чтобы не превышать лимиты хостинга.
  • Добавьте проверку прав пользователя, если хотите запускать удаление через админку.

Пример удаления отзывов частями

function wpassist_delete_old_reviews_in_batches() {
    global $wpdb;
    $days = 365;
    $date_threshold = date('Y-m-d H:i:s', strtotime("-{$days} days"));
    $batch_size = 50;

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

    if (empty($old_reviews)) {
        return false; // Нет старых отзывов
    }

    foreach ($old_reviews as $comment_id) {
        wp_delete_comment($comment_id, true);
    }
    return true; // Есть что удалять
}

Используйте эту функцию в CRON с повторным запуском, пока не удалятся все старые отзывы.

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

МетодПлюсыМинусыПрименимость
Ручное удаление через админкуПростота, полный контрольТрудоемко, не для большого объемаМалые сайты, единичные случаи
SQL-запросы напрямуюБыстро, без нагрузки PHPРиск ошибок, требуется доступ к БДОпытные админы, разовые операции
Автоматизация через WP-Cron + PHPАвтоматически, гибко, безопасноНагрузка при большом объеме, зависит от WP-CronСредние и крупные сайты
Как создать простой shortcode в WordPress с применением
04.11.2025
WooCommerce: как автоматически входить пользователя после регистрации
01.07.2026
Как удалить пустые записи в WordPress из базы данных
31.01.2026
Автоматическое удаление неактивных заказов в WooCommerce по времени
30.04.2026
Как использовать WPRemark для автоматического модерирования комментариев в WordPress
17.12.2025