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

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

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

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

Чтобы понять, насколько актуальна задача, проверьте количество отзывов, которые старше определённого времени (например, года), или имеют статус «на модерации» длительное время.

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

Если результат большой, стоит подумать об автоматизации очистки.

Решение: автоматическое удаление отзывов по расписанию с WP-Cron

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

1. Создание функции удаления

function wpmy_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); // true — удаление без возможности восстановления
        }
    }
}

2. Регистрация WP-Cron задачи

function wpmy_schedule_review_cleanup() {
    if (!wp_next_scheduled('wpmy_daily_review_cleanup')) {
        wp_schedule_event(time(), 'daily', 'wpmy_daily_review_cleanup');
    }
}
add_action('wp', 'wpmy_schedule_review_cleanup');

add_action('wpmy_daily_review_cleanup', 'wpmy_delete_old_reviews');

3. Очистка расписания при деактивации плагина или темы

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

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

  • Запустите функцию вручную, вызвав wpmy_delete_old_reviews() через консоль WP-CLI или временно подключив вызов в коде, и проверьте, что отзывы старше года удалились.
  • Проверьте в базе данных таблицу wp_comments, что старые отзывы отсутствуют.
  • Убедитесь, что WP-Cron срабатывает: в логах сервера или через плагин для мониторинга Cron-задач.

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

  • Отзывы не удаляются: Проверьте правильность comment_type = 'review'. В WooCommerce отзывы могут иметь тип comment_type = '' (пустая строка), если отзывы используются как стандартные комментарии. В таком случае замените условие на comment_type = '' или уберите фильтр.
  • WP-Cron не срабатывает: Убедитесь, что на сайте есть трафик (WP-Cron запускается по посещениям). Для теста запустите Cron вручную через WP-CLI: wp cron event run wpmy_daily_review_cleanup.
  • Удаление отзывов вызывает ошибки: Проверьте права пользователя, под которым выполняется код, и наличие резервной копии перед массовым удалением.

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

  • Перед массовым удалением сделайте резервную копию базы данных, чтобы избежать потери важных данных.
  • Для сайтов с большим количеством отзывов используйте пакетное удаление (например, по 100 отзывов за раз), чтобы не перегружать сервер.
  • Добавьте логирование удалённых отзывов в файл или в кастомную таблицу для последующего аудита.
  • Если отзывы используются в SEO, учитывайте, что удаление может повлиять на позиции сайта.

Расширение: удаление отзывов с определённым статусом

Если нужно удалять не только старые отзывы, но и отзывы «на модерации» старше 30 дней:

function wpmy_delete_pending_reviews() {
    global $wpdb;
    $date_limit = date('Y-m-d H:i:s', strtotime('-30 days'));

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

    foreach ($pending_reviews as $comment_id) {
        wp_delete_comment($comment_id, true);
    }
}
add_action('wpmy_daily_review_cleanup', 'wpmy_delete_pending_reviews');

Сравнение подходов к удалению отзывов

МетодПреимуществаНедостатки
Ручное удалениеПростота, контрольТрудоёмко, риск забыть
WP-Cron с кастомным кодомАвтоматизация, гибкость, контрольЗависимость от Cron, требует тестирования
Плагины очисткиУдобство, готовые функцииМогут влиять на производительность, ограниченная кастомизация
Как отключить автообновления WordPress и плагинов с примерами кода
30.11.2025
Оптимизация изображений WordPress: автоматическое изменение размера и сжатие
13.03.2026
WooCommerce: как автоматически удалять незавершённые заказы
01.05.2026
Как создать свой плагин WordPress с нуля: пошаговое руководство
08.11.2025
Автоматическое удаление отсутствующих товаров в WooCommerce
10.05.2026