Диагностика проблемы: зачем удалять отзывы после изменения статуса заказа
В 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 | Полный контроль, без сторонних плагинов, быстрое срабатывание | Требует навыков программирования, риск ошибок при неправильном коде |
| Плагины для модерации отзывов | Простота установки, готовый функционал | Может быть избыточно, нагрузка, ограничения по кастомизации |
| Ручное удаление отзывов | Полный контроль, без риска автоматических ошибок | Трудозатратно, не подходит для автоматизации |