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

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

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

Типичные сценарии:

  • Автоматическое удаление отзывов, оставленных к заказам со статусом "завершён" после 30 дней.
  • Удаление отзывов по определённым товарам или категориям спустя период.
  • Очистка отзывов без использования плагинов, чтобы избежать нагрузки на сайт и сохранить контроль над процессом.

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

Для диагностики нужно понять, как отзывы связаны с заказами. WooCommerce использует стандартные комментарии WordPress для хранения отзывов. Для удаления отзывов связанной с заказом, необходимо:

  • Определить ID товаров из заказа.
  • Найти комментарии (отзывы) для этих товаров.
  • Удалить комментарии программно.

Проверка результата:

  • В административной панели WordPress в разделе Отзывы должны отсутствовать удалённые отзывы.
  • На странице товара отзывы должны исчезнуть.

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

1. Добавляем плановое событие (cron) для удаления отзывов

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

if (!wp_next_scheduled('wpdir_delete_old_reviews')) {
    wp_schedule_event(time(), 'daily', 'wpdir_delete_old_reviews');
}

2. Функция удаления отзывов, старше 30 дней, для завершённых заказов

function wpdir_delete_reviews_after_purchase() {
    global $wpdb;
    $days = 30; // количество дней после завершения заказа
    $date_threshold = date('Y-m-d H:i:s', strtotime("-{$days} days"));

    // Получаем ID заказов со статусом completed, завершённых раньше указанной даты
    $order_ids = $wpdb->get_col($wpdb->prepare(
        "SELECT ID FROM {$wpdb->posts} WHERE post_type = 'shop_order' AND post_status = 'wc-completed' AND post_date < %s",
        $date_threshold
    ));

    if (empty($order_ids)) {
        return;
    }

    // Получаем ID товаров из этих заказов
    $order_items = $wpdb->get_col("SELECT order_item_id FROM {$wpdb->prefix}woocommerce_order_items WHERE order_id IN (" . implode(',', array_map('absint', $order_ids)) . ") AND order_item_type = 'line_item'");

    if (empty($order_items)) {
        return;
    }

    // Получаем product_id из order item meta
    $product_ids = $wpdb->get_col("SELECT meta_value FROM {$wpdb->prefix}woocommerce_order_itemmeta WHERE order_item_id IN (" . implode(',', array_map('absint', $order_items)) . ") AND meta_key = '_product_id'");

    if (empty($product_ids)) {
        return;
    }

    // Удаляем отзывы (комментарии) для товаров
    foreach ($product_ids as $product_id) {
        $comments = get_comments(array(
            'post_id' => $product_id,
            'status' => 'approve',
            'type' => 'review',
        ));

        foreach ($comments as $comment) {
            wp_delete_comment($comment->comment_ID, true); // true - удаляем без возможности восстановления
        }
    }
}
add_action('wpdir_delete_old_reviews', 'wpdir_delete_reviews_after_purchase');

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

function wpdir_deactivate() {
    wp_clear_scheduled_hook('wpdir_delete_old_reviews');
}
register_deactivation_hook(__FILE__, 'wpdir_deactivate');

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

  1. Создайте тестовый заказ в WooCommerce и поставьте статус "completed".
  2. Оставьте отзыв к товару из этого заказа.
  3. Измените дату заказа на более раннюю (более 30 дней назад) через phpMyAdmin или SQL.
  4. Принудительно запустите крон-событие: do_action('wpdir_delete_old_reviews'); в functions.php или через WP-CLI.
  5. Проверьте, что отзыв удалён в админке и на странице товара.

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

  • Отзывы не удаляются: Проверьте, что крон-событие действительно запускается. Включите WP_DEBUG и посмотрите логи.
  • ID товаров или заказов не получаются: Убедитесь, что таблицы WooCommerce актуальны, и запросы работают. Можно временно вывести результат var_dump() для отладки.
  • Удаляются не те отзывы: Проверьте, что в функции get_comments() правильно указан тип комментариев 'review'. В WooCommerce отзывы – это тип комментариев с comment_type = 'review'.
  • Крон не срабатывает на хостинге: Используйте WP-CLI или внешние сервисы для запуска wp-cron.

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

  • Запросы к базе данных делайте с фильтрацией и использованием prepare() для защиты от SQL-инъекций.
  • Удаление отзывов массовое – делайте это планово, чтобы не нагружать сервер.
  • Для крупных магазинов лучше разбивать удаление на партии по 50-100 отзывов.
  • Храните резервные копии базы перед массовыми удалениями.
  • Используйте транзиенты или кеширование для оптимизации повторных запросов (если добавите логику фильтрации).

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

МетодПреимуществаНедостаткиКогда использовать
ПлагинПростота установки, готовый интерфейс, поддержкаМогут нагружать сайт, ограничения по настройкамДля пользователей без навыков программирования
Код (как в статье)Контроль, отсутствие лишних нагрузок, гибкостьТребует знаний программирования, возможны ошибкиОпытные разработчики, кастомные задачи
КомпромиссПлагин с возможностью кастомизации через кодМожет усложнить поддержкуКогда нужна гибкость и удобство
Как удалить сообщения об ошибках в WordPress без плагинов
20.03.2026
Автозаполнение метаданных для постов WordPress: примеры и настройка
06.03.2026
WooCommerce: Автоматическое удаление товаров с отсутствующими атрибутами и вариациями
13.05.2026
Как создать собственный тип записи (Custom Post Type) в WordPress с примерами кода
10.03.2026
Как настроить использование Transient API в WordPress для эффективного кэширования
26.03.2026