Проблема: необходимость автоматической смены статуса заказа по событию отзыва
В стандартном WooCommerce нет механизма, который меняет статус заказа после того, как пользователь оставил отзыв на купленный товар. Для магазинов, где важно отслеживать завершение взаимодействия с клиентом, автоматическое обновление статуса заказа после отзыва помогает оптимизировать процесс обработки и дальнейшее взаимодействие.
Диагностика задачи
Если вы хотите, чтобы заказ автоматически переводился, например, в статус completed после того, как клиент оставит отзыв, проверьте:
- Используется ли стандартная система отзывов WooCommerce или сторонний плагин.
- Отслеживается ли связь отзыва с конкретным заказом и товаром.
- Имеется ли возможность получить ID заказа из отзыва.
По умолчанию отзывы в WooCommerce — это комментарии к продуктам, и они не связаны напрямую с заказом. Значит, нужно расширить функционал для связи отзыва и заказа.
Пошаговое решение
1. Добавляем связь отзыва с заказом
Чтобы связать отзыв с заказом, необходимо расширить форму отзыва, добавив скрытое поле с номером заказа. Это можно сделать через фильтр comment_form_defaults и JavaScript на странице товара:
add_filter('comment_form_defaults', function($defaults) {
if (is_product()) {
$order_id = 0;
// Получаем последний заказ текущего пользователя для этого товара
if (is_user_logged_in()) {
$user_id = get_current_user_id();
$product_id = get_the_ID();
$customer_orders = wc_get_orders(array(
'customer_id' => $user_id,
'status' => 'completed',
'limit' => -1
));
foreach ($customer_orders as $order) {
foreach ($order->get_items() as $item) {
if ($item->get_product_id() == $product_id) {
$order_id = $order->get_id();
break 2;
}
}
}
}
$defaults['comment_field'] .= '<input type="hidden" name="order_id" value="'. esc_attr($order_id) .'" />';
}
return $defaults;
});2. Сохраняем order_id в метаотзыва
При сохранении отзыва сохраняем ID заказа в метаданные комментария:
add_action('comment_post', function($comment_id, $comment_approved, $commentdata) {
if (isset($_POST['order_id']) && !empty($_POST['order_id'])) {
$order_id = intval($_POST['order_id']);
add_comment_meta($comment_id, 'order_id', $order_id);
}
}, 10, 3);3. Автоматически меняем статус заказа после публикации отзыва
Добавляем обработчик, который будет срабатывать после публикации комментария (отзыва) и менять статус заказа:
add_action('wp_insert_comment', function($comment_id, $comment_object) {
if ($comment_object->comment_approved != 1) return;
if ($comment_object->comment_type != '') return; // учитываем только отзывы (комментарии без типа)
$order_id = get_comment_meta($comment_id, 'order_id', true);
if ($order_id) {
$order = wc_get_order($order_id);
if ($order && $order->get_status() != 'completed') {
$order->update_status('completed', 'Автоматическое изменение статуса после отзыва');
}
}
}, 10, 2);Проверка результата после внедрения
- Авторизуйтесь под пользователем, который совершал заказ в WooCommerce.
- Перейдите на страницу купленного товара и оставьте отзыв.
- В административной панели перейдите в WooCommerce > Заказы и найдите соответствующий заказ.
- Убедитесь, что статус заказа изменился на
completed(или выбранный вами статус).
Частые ошибки и как их исправить
- Отзыв не связывается с заказом: убедитесь, что пользователь авторизован и заказ с этим товаром действительно существует и имеет нужный статус.
- Статус заказа не меняется: проверьте, что обработчик
wp_insert_commentполучает комментарий с одобренным статусом и чтоupdate_statusвызывается корректно. - Отзывы не появляются сразу: если используется премодерация комментариев, статус отзыва может быть не
1— это блокирует срабатывание автообновления.
Практические советы по безопасности и производительности
- Добавляйте проверку nonce и прав пользователя, если расширяете форму отзывов для защиты от CSRF.
- Кешируйте выборку заказов пользователя при добавлении скрытого поля, чтобы избежать нагрузки при большом числе заказов.
- Ограничьте обработку только нужными типами комментариев и статусами заказов, чтобы не создавать лишних запросов.
Сравнение способов реализации
| Вариант | Плюсы | Минусы |
|---|---|---|
| Ручное изменение статуса | Просто, без кода | Требует времени и внимания менеджера |
| Автоматизация через код (как в статье) | Автоматизация, снижает ошибки, улучшает процессы | Нужно учитывать связь отзывов и заказов, возможно доработка для кастомных сценариев |
| Плагины для связи отзывов и заказов | Готовое решение, поддержка | Может быть избыточно, влияние на производительность, стоимость |