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

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

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

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

  • Проверьте количество комментариев с типом review (отзывы WooCommerce) в базе данных. Для этого используйте SQL-запрос в phpMyAdmin:
SELECT COUNT(*) FROM wp_comments WHERE comment_type = 'review';
  • Если число отзывов превышает несколько тысяч, а магазин не использует их активно для аналитики, это повод для очистки.
  • Проанализируйте возраст отзывов — выберите отзывы старше 1 года:
SELECT COUNT(*) FROM wp_comments WHERE comment_type = 'review' AND comment_date < NOW() - INTERVAL 1 YEAR;
  • Если большая часть — устаревшие отзывы, можно настроить их автоматическое удаление.

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

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

Добавьте в файл functions.php вашей дочерней темы или в кастомный плагин следующий код. В примере удаляются отзывы старше 365 дней.

function wplog_delete_old_woocommerce_reviews() {
    global $wpdb;
    $days = 365; // сколько дней считать "старыми"
    $wpdb->query(
        $wpdb->prepare(
            "DELETE FROM $wpdb->comments WHERE comment_type = 'review' AND comment_date < NOW() - INTERVAL %d DAY",
            $days
        )
    );
}

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

Добавьте событие, которое будет запускаться ежедневно:

function wplog_schedule_delete_old_reviews() {
    if ( ! wp_next_scheduled( 'wplog_daily_delete_old_reviews' ) ) {
        wp_schedule_event( time(), 'daily', 'wplog_daily_delete_old_reviews' );
    }
}
add_action( 'wp', 'wplog_schedule_delete_old_reviews' );
add_action( 'wplog_daily_delete_old_reviews', 'wplog_delete_old_woocommerce_reviews' );

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

Чтобы избежать дублирования, удалите событие при деактивации плагина или отключении темы:

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

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

  • Запустите функцию вручную (для теста) в админке через WP-CLI или временно вызовом из шаблона:
add_action('admin_init', function() {
    wplog_delete_old_woocommerce_reviews();
});
  • Проверьте количество отзывов до и после удаления SQL-запросом из раздела диагностики.
  • Просмотрите журнал ошибок сервера и логи WP-Cron (например, с помощью плагина WP Crontrol) на предмет выполнения задачи.

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

  • Задача WP-Cron не запускается: WP-Cron зависит от посещений сайта. На малопосещаемых сайтах стоит настроить системный cron, вызывающий wp-cron.php. Например, через crontab:
* * * * * wget -q -O - https://example.com/wp-cron.php?doing_wp_cron >/dev/null 2>&1
  • Удаляются не те комментарии: Проверьте, что comment_type = 'review' — именно так WooCommerce помечает отзывы. Для других типов комментариев используйте соответствующий фильтр.
  • Удаление занимает слишком много времени: Если отзывов очень много, разбейте удаление на части с помощью LIMIT и запускайте в цикле.

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

  • Перед удалением всегда делайте резервное копирование базы, чтобы избежать потери данных.
  • Добавьте логирование в функцию удаления, чтобы отслеживать, сколько записей удалено:
function wplog_delete_old_woocommerce_reviews() {
    global $wpdb;
    $days = 365;
    $deleted = $wpdb->query(
        $wpdb->prepare(
            "DELETE FROM $wpdb->comments WHERE comment_type = 'review' AND comment_date < NOW() - INTERVAL %d DAY",
            $days
        )
    );
    if ( defined('WP_DEBUG') && WP_DEBUG ) {
        error_log('Удалено отзывов старше '.$days.' дней: ' . $deleted);
    }
}
  • Для магазинов с большим количеством отзывов рассмотрите возможность архивации вместо удаления.
  • Для ускорения работы базы создайте индекс по полю comment_type в таблице wp_comments, если его нет.

Сравнение подходов: плагин vs. кастомный код

МетодПлюсыМинусыКомпромисс
Плагин очистки отзывовПростота настройки, готовый интерфейсДополнительная нагрузка, ограниченная гибкостьИспользовать при небольшом объёме отзывов
Кастомный WP-Cron кодВысокая гибкость, минимальная нагрузкаТребует навыков программированияОптимально для крупных магазинов и специфических условий
Добавление уникальных полей в формы WordPress: подробное руководство
28.01.2026
Как использовать WP-Cron для автоматического удаления старой реши в WooCommerce
10.07.2026
Как автоматически изменять meta description в WordPress для улучшения SEO
17.04.2026
Диагностика и решение проблем с нерабочими AJAX-запросами в WordPress
30.04.2026
Как автоматизировать очистку базы данных WordPress от мусорных записей
10.12.2025