Как использовать WP-Cron для автоматического удаления неактуальных отзывов WooCommerce

Диагностика проблемы: зачем автоматически удалять отзывы в WooCommerce

В интернет-магазинах на WooCommerce отзывы покупателей играют важную роль. Однако с течением времени часть отзывов может стать неактуальной: например, устаревшие, с низким рейтингом или содержащие спам. Такие отзывы снижают доверие к магазину и качество пользовательского опыта. Ручное удаление отзывов — трудоемкий процесс, особенно при большом объеме. Поэтому целесообразно настроить автоматическое удаление неактуальных отзывов с помощью WP-Cron.

Как работает WP-Cron и почему он подходит для задачи

WP-Cron — встроенная в WordPress система планировщика событий, позволяющая запускать задачи по расписанию без доступа к системному cron на сервере. Это удобно для автоматизации рутинных процессов, например, очистки базы данных от устаревших отзывов WooCommerce.

Преимущества использования WP-Cron:

  • Не требует доступа к серверному cron;
  • Легко настраивается через код и хуки;
  • Работает в рамках WordPress, учитывая загрузку сайта;
  • Можно легко модифицировать логику удаления.

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

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

В WooCommerce отзывы — это комментарии к продуктам с типом комментария "review". Допустим, мы хотим удалять отзывы старше 1 года с рейтингом ниже 3.

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

    // Получаем ID отзывов старше года с рейтингом ниже 3
    $reviews = $wpdb->get_col(
        $wpdb->prepare(
            "SELECT comment_ID FROM {$wpdb->comments} c
             INNER JOIN {$wpdb->commentmeta} cm ON c.comment_ID = cm.comment_id
             WHERE c.comment_type = 'review'
             AND c.comment_date < %s
             AND cm.meta_key = 'rating'
             AND CAST(cm.meta_value AS UNSIGNED) < 3",
            $date_threshold
        )
    );

    if (!empty($reviews)) {
        foreach ($reviews as $review_id) {
            wp_delete_comment($review_id, true); // Полное удаление
        }
    }
}

2. Регистрируем событие WP-Cron

Добавляем планировщик, который будет запускать функцию ежедневно.

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

add_action('delete_old_low_rating_reviews_event', 'delete_old_low_rating_reviews');

3. Удаляем событие при деактивации темы или плагина

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

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

Чтобы убедиться, что WP-Cron сработал и отзывы удаляются:

  • Проверьте наличие отзывов старше года с рейтингом ниже 3 — они должны исчезнуть после запуска задачи.
  • Для ручного запуска WP-Cron используйте плагин Cron Manager или WP-CLI команду: wp cron event run delete_old_low_rating_reviews_event.
  • Включите логирование в функцию удаления для отслеживания ID удаленных отзывов:
function delete_old_low_rating_reviews() {
    global $wpdb;
    $date_threshold = date('Y-m-d H:i:s', strtotime('-1 year'));
    $reviews = $wpdb->get_col($wpdb->prepare("...", $date_threshold));
    if (!empty($reviews)) {
        foreach ($reviews as $review_id) {
            wp_delete_comment($review_id, true);
            error_log("Удален отзыв ID: " . $review_id);
        }
    }
}

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

  • WP-Cron не срабатывает — проверьте, что на сайте есть трафик, так как WP-Cron запускается при загрузке страниц. Для теста используйте WP-CLI.
  • Отзывы не удаляются — проверьте правильность запроса и наличие мета-ключа rating. Возможно, рейтинг хранится под другим ключом или в другом формате.
  • Удаляются не те отзывы — уточните условия фильтрации в SQL-запросе, проверьте временную зону сайта и формат даты.
  • Производительность падает при удалении — используйте пакетную обработку, удаляйте отзывы частями, чтобы не перегружать БД.

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

  • Используйте транзакции или batch-удаление по 50-100 отзывов за раз, чтобы избежать длительных блокировок базы данных.
  • Проверьте права пользователя, под которым выполняется WP-Cron, чтобы избежать ошибок доступа.
  • Для увеличения надежности запуска используйте системный cron, если есть доступ, и вызывайте wp-cron.php.
  • Если WooCommerce хранит отзывы в сторонних таблицах (редко), учтите это при построении запроса.

Сравнение вариантов реализации очистки отзывов WooCommerce

ВариантОписаниеПлюсыМинусы
WP-Cron + SQL-запросАвтоматизация удаления отзывов по заданным условиямГибкость, не требует внешних плагиновЗависит от трафика сайта, возможна нагрузка на БД
Плагины антиспама и модерации отзывовФильтрация и удаление спам-отзывовПростота установки, готовые решенияМеньше контроля, могут удалять нужные отзывы
Ручное удаление через админку WooCommerceУдаление отзывов вручнуюПолный контрольТрудозатратно при большом количестве
Как автоматизировать работу с медиафайлами в WordPress
30.11.2025
Как отключить автовоспроизведение видео в WordPress
12.02.2026
Автоматическое удаление старых записей в WordPress с помощью WP-Cron
01.05.2026
Как изменить URL товара WooCommerce без потери SEO
22.04.2026
Как избежать проблем с кэшированием в WordPress: практические советы
05.04.2026