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

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

В WooCommerce отзывы клиентов помогают повысить доверие и конверсию, но иногда старые, закрытые или неактивные отзывы перестают быть актуальными, занимают место в базе и замедляют загрузку страниц. Особенно это критично для магазинов с большим числом товаров и отзывов.

Если вы хотите поддерживать базу отзывов в актуальном состоянии, автоматическое удаление закрытых отзывов через определённое время — простой и эффективный способ.

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

1. Определение статуса и срока удаления

В WooCommerce отзывы — это комментарии к товарам, у которых тип comment_type = 'review'. Закрытый отзыв мы можем обозначить через кастомное поле, например, review_closed со значением 1. Автоматически удалять отзывы, закрытые старше 30 дней.

2. Добавление метки закрытия отзыва

Для установки статуса «закрыт» добавим мета-поле. Например, через админку или программно:

add_comment_meta($comment_id, 'review_closed', 1, true);

3. Создание WP-Cron задачи для удаления

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

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

    // Получаем ID комментариев с review_closed = 1 и датой старше threshold
    $comment_ids = $wpdb->get_col($wpdb->prepare(
        "SELECT comment_ID FROM {$wpdb->comments} c
        JOIN {$wpdb->commentmeta} cm ON c.comment_ID = cm.comment_id
        WHERE cm.meta_key = 'review_closed' AND cm.meta_value = '1'
          AND c.comment_date < %s",
        $date_threshold
    ));

    if (!empty($comment_ids)) {
        foreach ($comment_ids as $comment_id) {
            wp_delete_comment($comment_id, true); // true - безвозвратно
        }
    }
}

// Планируем событие при активации темы/плагина
if (!wp_next_scheduled('wc_daily_delete_closed_reviews')) {
    wp_schedule_event(time(), 'daily', 'wc_daily_delete_closed_reviews');
}
add_action('wc_daily_delete_closed_reviews', 'wc_delete_old_closed_reviews');

4. Очистка расписания при деактивации

function wc_clear_delete_closed_reviews_schedule() {
    $timestamp = wp_next_scheduled('wc_daily_delete_closed_reviews');
    if ($timestamp) {
        wp_unschedule_event($timestamp, 'wc_daily_delete_closed_reviews');
    }
}
// Добавьте вызов wc_clear_delete_closed_reviews_schedule() при деактивации плагина или темы

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

  • Закройте несколько отзывов вручную, добавив мета review_closed = 1 и установите дату их создания на более 30 дней назад (через БД или программно).
  • Запустите функцию wc_delete_old_closed_reviews() вручную (через временный вызов в functions.php или WP-CLI).
  • Проверьте, что отзывы удалены из базы (wp_comments и wp_commentmeta).
  • Убедитесь, что на фронтенде отзывы исчезли и страницы товаров работают без ошибок.

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

  • Отзывы не удаляются: Проверьте, что мета review_closed действительно есть у отзывов и правильно задано значение '1'.
  • WP-Cron не срабатывает: Убедитесь, что на сайте посещения или внешние запросы запускают cron, или настройте системный cron для wp-cron.php.
  • Удаление происходит, но отзывы остаются на сайте: Проверьте кэш плагинов и браузера, очистите кэш.
  • Производительность падает: При большом объёме комментариев оптимизируйте запрос с помощью индексов в БД или пакетной обработки.

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

  • Удаляйте отзывы только с помощью wp_delete_comment(), чтобы корректно очистить все связанные данные.
  • Используйте пакетную обработку, если отзывов очень много, чтобы не перегружать сервер.
  • Проверяйте права пользователя на изменение отзывов, если добавляете интерфейс для закрытия отзывов.
  • Для повышения производительности кэшируйте результаты запросов в transient, если используете дополнительные фильтры.

Сравнение вариантов реализации удаления отзывов

МетодПлюсыМинусы
Удаление через WP-Cron и кастомное мета-полеГибкий контроль, можно настроить сроки и условияНужна регистрация и управление cron, требует поддержки
Удаление вручную через SQL-запросыБыстрое удаление большого объёмаРиск повредить данные, сложно автоматизировать
Плагины для управления отзывамиУдобный интерфейс, дополнительные функцииМожет нагружать сайт, лишний функционал
Как изменить размер изображений в WordPress без потери качества
26.01.2026
WooCommerce: автоматическое удаление неоплаченных заказов через код
30.05.2026
WooCommerce: автоматическая очистка корзины и отслеживание брошенных заказов
23.04.2026
WooCommerce: как массово удалить вариативные товары по атрибуту через код
29.06.2026
Как удалить или отключить комментарии в WordPress на определённых страницах
17.01.2026