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

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

В WooCommerce отзывы играют важную роль, но иногда требуется автоматическое удаление устаревших или неподходящих отзывов по определённым критериям: например, по статусу заказа (отзыв оставить можно только после доставки), по времени (удалять отзывы старше 1 года), или если отзыв признан спамом. Ручное управление отзывами при большом объеме заказов и отзывов становится трудоемким и неточным.

Как реализовать автоматическое удаление отзывов по статусу заказа и времени

Общее решение через WP-Cron и пользовательскую функцию

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

function wpin_delete_reviews_by_status_and_time() {
    global $wpdb;
    // Получаем ID комментариев-отзывов, связанных с заказами в статусе 'cancelled' старше 30 дней
    $date_limit = date('Y-m-d H:i:s', strtotime('-30 days'));

    $reviews_to_delete = $wpdb->get_col($wpdb->prepare(
        "SELECT c.comment_ID FROM {$wpdb->comments} c
         JOIN {$wpdb->posts} p ON c.comment_post_ID = p.ID
         JOIN {$wpdb->prefix}woocommerce_order_items oi ON oi.order_item_name = p.post_title
         JOIN {$wpdb->prefix}posts o ON o.ID = oi.order_id
         WHERE c.comment_type = 'review'
           AND o.post_status = %s
           AND c.comment_date < %s",
        'wc-cancelled',
        $date_limit
    ));

    if (!empty($reviews_to_delete)) {
        foreach ($reviews_to_delete as $comment_id) {
            wp_delete_comment($comment_id, true); // принудительное удаление
        }
    }
}

// Планируем запуск 1 раз в сутки
if (!wp_next_scheduled('wpin_daily_review_cleanup')) {
    wp_schedule_event(time(), 'daily', 'wpin_daily_review_cleanup');
}
add_action('wpin_daily_review_cleanup', 'wpin_delete_reviews_by_status_and_time');

Объяснение кода

  • Через SQL-запрос выбираются комментарии с типом review, связанные с заказами в статусе wc-cancelled, и дата комментария старше 30 дней.
  • Для каждого такого комментария вызывается wp_delete_comment с параметром true для безвозвратного удаления.
  • Запуск происходит ежедневно через WP-Cron.

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

Чтобы убедиться, что автоматическое удаление работает:

  • Создайте тестовый заказ, измените его статус на «Отменённый» (wc-cancelled), оставьте отзыв к товару, подождите 1 день (или измените дату отзыва вручную в базе на старше 30 дней).
  • Запустите вручную крон-задачу:
do_action('wpin_daily_review_cleanup');
  • Проверьте наличие отзыва в панели администратора: он должен исчезнуть.
  • Проверяйте логи ошибок и базу — комментарий должен быть удалён.

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

  • Неправильные статусы заказов: Проверьте, что статус заказа в запросе указан верно, например, wc-cancelled, а не просто cancelled.
  • Отсутствие комментариев с типом review: Убедитесь, что отзывы WooCommerce действительно имеют этот тип, иначе запрос не найдёт нужных комментариев.
  • WP-Cron не работает: На некоторых серверах WP-Cron требует внешнего вызова или настройки реального cron-задачи.
  • Права пользователя: Функция удаления должна выполняться с правами администратора, иначе wp_delete_comment может не сработать.

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

  • Добавьте проверку nonce и capability, если функция будет запускаться вручную через админку.
  • При большом количестве отзывов разбивайте удаление на партии по 50-100 комментариев, чтобы избежать таймаутов.
  • Логируйте удалённые отзывы в отдельный файл или таблицу для аудита.
  • Настраивайте WP-Cron через системный cron на сервере для надёжности.

Альтернативные методы удаления: плагин vs код

МетодПлюсыМинусы
Кастомный код (WP-Cron + SQL)Полный контроль, гибкость, нет лишних плагиновТребует навыков, возможны ошибки при запросах
Плагин для управления отзывамиУдобный интерфейс, готовые настройки удаленияМожет нагружать сайт, ограниченные сценарии
⭐⭐⭐⭐⭐