wpcontrol.ru wordpress WPControl.ru

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

Проблема: необходимость автоматической смены статуса заказа по событию отзыва

В стандартном 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.
  • Кешируйте выборку заказов пользователя при добавлении скрытого поля, чтобы избежать нагрузки при большом числе заказов.
  • Ограничьте обработку только нужными типами комментариев и статусами заказов, чтобы не создавать лишних запросов.

Сравнение способов реализации

ВариантПлюсыМинусы
Ручное изменение статуса Просто, без кода Требует времени и внимания менеджера
Автоматизация через код (как в статье) Автоматизация, снижает ошибки, улучшает процессы Нужно учитывать связь отзывов и заказов, возможно доработка для кастомных сценариев
Плагины для связи отзывов и заказов Готовое решение, поддержка Может быть избыточно, влияние на производительность, стоимость
×
WordPress
дай сайту суперсилу!

Скидки на топовые темы и плагины

Активировать суперсилу ⋙