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

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

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

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

1. Подключаемся к хуку изменения статуса заказа

WooCommerce предоставляет хук woocommerce_order_status_changed, который срабатывает при смене статуса заказа. Используем его для запуска нашей функции удаления отзывов.

2. Получаем ID заказа и связанные отзывы

Отзывы в WooCommerce — это комментарии к товарам, а каждый заказ содержит товары. Нужно получить ID товаров из заказа и найти отзывы, которые к ним относятся.

3. Удаляем отзывы программно

Удалим отзывы, связанных с этими товарами, используя встроенную функцию WordPress wp_delete_comment(), перед этим проверив, что отзыв привязан к конкретному заказу (через мета или контекст).

Пример кода для functions.php или кастомного плагина:

add_action('woocommerce_order_status_changed', 'auto_delete_reviews_on_status_change', 10, 4);
function auto_delete_reviews_on_status_change($order_id, $old_status, $new_status, $order) {
    // Статусы, при которых удаляем отзывы
    $statuses_to_delete = array('cancelled', 'refunded');
    if (!in_array($new_status, $statuses_to_delete)) {
        return;
    }

    // Получаем товары из заказа
    $items = $order->get_items();
    $product_ids = array();
    foreach ($items as $item) {
        $product_ids[] = $item->get_product_id();
    }

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

    // Получаем отзывы к этим товарам
    $args = array(
        'post_type' => 'product',
        'post__in' => $product_ids,
        'status' => 'approve',
        'type' => 'review',
        'number' => 0,
    );

    // WP_Comment_Query для получения комментариев-отзывов
    $comment_args = array(
        'post__in' => $product_ids,
        'status' => 'approve',
        'type' => 'review',
        'number' => 0,
    );

    $comments = get_comments($comment_args);

    // Удаляем каждый отзыв
    foreach ($comments as $comment) {
        wp_delete_comment($comment->comment_ID, true);
    }
}

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

1. Создайте тестовый заказ и добавьте к товарам отзывы.

2. Измените статус заказа на "cancelled" или "refunded".

3. Проверьте, что отзывы, связанные с товарами этого заказа, исчезли.

4. Если отзывы остались, проверьте логи ошибок и убедитесь, что функция запускается (например, через error_log()).

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

  • Отзывы не удаляются: Возможно, в коде неправильно указаны параметры запроса get_comments(). Убедитесь, что параметр 'type' => 'review' корректен, или используйте 'type' => '' и фильтруйте вручную.
  • Удаляются все отзывы, а не только связанные с заказом: Проверьте, что фильтрация по товарам работает корректно, используйте post__in в запросе.
  • Ошибка доступа к объекту $order: В хук передается объект заказа, используйте именно его, а не загружайте заново.

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

  • Удаление отзывов — необратимая операция. Рассмотрите возможность их пометки как "спам" или "неактивные", чтобы можно было восстановить в случае ошибки.
  • Для больших заказов с множеством товаров и отзывов лучше использовать WP_Cron и обрабатывать удаление по частям, чтобы избежать таймаутов.
  • Добавьте проверку прав пользователя, если функция запускается из админки, чтобы избежать нежелательных удалений.
  • Логируйте действия удаления в отдельный файл для последующего аудита.

Сравнение вариантов реализации

ВариантПлюсыМинусы
Код на хуке woocommerce_order_status_changedПолный контроль, без сторонних плагинов, быстрое срабатываниеТребует навыков программирования, риск ошибок при неправильном коде
Плагины для модерации отзывовПростота установки, готовый функционалМожет быть избыточно, нагрузка, ограничения по кастомизации
Ручное удаление отзывовПолный контроль, без риска автоматических ошибокТрудозатратно, не подходит для автоматизации
Как удалить кэш в WordPress: практическое руководство
21.11.2025
WooCommerce: автоматическое отключение неактивных купонов
10.06.2026
Как запретить доступ к определённому контенту по ролям в WordPress
19.01.2026
Как добавить дополнительные типы пользователей в WordPress и управлять их правами
11.03.2026
Как разделить двухколоночный контекст в WordPress
09.11.2025