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, требует тестирования
Плагины очисткиУдобство, готовые функцииМогут влиять на производительность, ограниченная кастомизация
Как закрыть архивы taxonomy WordPress от индексации без поломки фильтрации
04.09.2026
Как создать динамическую функцию фильтра по мета полям в WordPress
22.08.2026
Как отключить Emojicons в WordPress без поломки админки и фронта
27.09.2026
Как удалить неиспользуемые таблицы базы данных WordPress
22.08.2026
WooCommerce: как автоматически удалять незавершённые заказы
10.08.2026