WooCommerce: установка и настройка отслеживания заказов в режиме реального времени

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

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

Если вы замечаете, что статусы заказов в админке обновляются с задержкой, приходится постоянно обновлять страницу вручную или использовать сторонние плагины без контроля, значит, вам нужна настройка отслеживания заказов в реальном времени.

Как реализовать отслеживание заказов в режиме реального времени в WooCommerce

Основная идея решения

Мы настроим AJAX-запросы с периодическим опросом сервера, который будет проверять изменение статусов заказов. Для этого добавим JavaScript в админку, а на PHP стороне создадим обработчик, который вернёт данные о новых или обновлённых заказах.

Пошаговая инструкция

  1. Добавляем AJAX обработчик в functions.php вашей темы или в плагине:
add_action('wp_ajax_check_orders_update', 'check_orders_update_callback');
function check_orders_update_callback() {
    // Проверяем права пользователя
    if (!current_user_can('manage_woocommerce')) {
        wp_send_json_error('Доступ запрещён');
        wp_die();
    }

    // Получим последний известный статус заказа и время обновления из запроса
    $last_update = isset($_POST['last_update']) ? sanitize_text_field($_POST['last_update']) : '';

    // Парсим дату, если не указана – берём последние 5 минут
    $date_query = [];
    if ($last_update) {
        $date_query = [
            'after' => $last_update,
            'inclusive' => false,
        ];
    } else {
        $date_query = [
            'after' => date('Y-m-d H:i:s', strtotime('-5 minutes')),
        ];
    }

    // Получаем заказы, которые были изменены после last_update
    $args = [
        'status' => 'any',
        'limit' => 10,
        'orderby' => 'date_modified',
        'order' => 'DESC',
        'date_modified' => $date_query,
    ];

    $orders = wc_get_orders($args);

    $response = [];
    foreach ($orders as $order) {
        $response[] = [
            'id' => $order->get_id(),
            'status' => $order->get_status(),
            'modified' => $order->get_date_modified()->date('Y-m-d H:i:s'),
        ];
    }

    wp_send_json_success(['orders' => $response]);
    wp_die();
}
  1. Подключаем скрипт в админке WooCommerce:
add_action('admin_enqueue_scripts', 'enqueue_orders_check_script');
function enqueue_orders_check_script($hook) {
    if ($hook !== 'woocommerce_page_wc-orders') return; // Только на странице заказов

    wp_enqueue_script('orders-checker', get_template_directory_uri() . '/js/orders-checker.js', ['jquery'], '1.0', true);
    wp_localize_script('orders-checker', 'ordersChecker', [
        'ajaxurl' => admin_url('admin-ajax.php'),
        'nonce' => wp_create_nonce('orders_check_nonce'),
    ]);
}
  1. Создаём файл orders-checker.js в папке js вашей темы с кодом:
jQuery(document).ready(function($) {
    let lastUpdate = '';

    function checkOrders() {
        $.post(ordersChecker.ajaxurl, {
            action: 'check_orders_update',
            last_update: lastUpdate,
            _ajax_nonce: ordersChecker.nonce
        }, function(response) {
            if (response.success) {
                if (response.data.orders.length) {
                    response.data.orders.forEach(function(order) {
                        console.log('Обновлён заказ ID:', order.id, 'Статус:', order.status);
                        // Здесь можно добавить логику обновления интерфейса, уведомлений и т.д.
                        if (order.modified > lastUpdate) {
                            lastUpdate = order.modified;
                        }
                    });
                }
            } else {
                console.error('Ошибка:', response.data);
            }
        });
    }

    // Запускаем проверку каждую минуту
    setInterval(checkOrders, 60000);

    // Первая проверка сразу
    checkOrders();
});

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

  • Откройте в админке WooCommerce страницу заказов.
  • Откройте консоль браузера (F12 > Console).
  • Измените статус любого заказа (например, через другую вкладку или другого пользователя).
  • Через минуту в консоли должны появиться сообщения с обновлённым статусом и ID заказа.
  • Если вы хотите вывести уведомления или обновлять таблицу заказов, добавьте соответствующий JavaScript-код в обработчик.

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

  • Скрипт не запускается на странице заказов
    Проверьте, что условие в enqueue_orders_check_script корректно проверяет хук страницы. Для страницы WooCommerce "Заказы" это woocommerce_page_wc-orders. Используйте console.log($hook) для отладки.
  • Ошибка доступа 403 при AJAX запросе
    Убедитесь, что пользователь имеет права manage_woocommerce, и nonce передаётся и проверяется при необходимости.
  • Проверка не показывает обновления
    Проверьте формат даты в $last_update и корректность параметров date_modified в запросе wc_get_orders. В PHP и JS время должно быть в формате Y-m-d H:i:s.
  • Проблемы с производительностью при большом количестве заказов
    Ограничьте количество заказов в запросе ('limit' => 10), можно увеличить интервал проверки или добавить фильтр по статусам.

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

  • Для безопасности проверяйте права доступа пользователя, который вызывает AJAX.
  • Используйте nonce для предотвращения CSRF атак.
  • Ограничьте частоту AJAX-запросов (например, не чаще 1 раза в минуту).
  • Кэшируйте результаты, если статусы не меняются часто.
  • Для больших магазинов рассмотрите использование WebSocket или сторонних сервисов для push-уведомлений, чтобы уменьшить нагрузку.

Сравнение вариантов реализации отслеживания заказов

МетодПлюсыМинусы
Периодический AJAX опрос (как в статье) Простота внедрения, не требует дополнительных сервисов Нагрузка на сервер при большом количестве заказов, небольшой лаг
WebSocket или серверные push уведомления Мгновенные обновления, меньше нагрузки на сервер Сложнее реализовать, требует дополнительной инфраструктуры
Использование готовых плагинов Быстрое решение, часто с дополнительным функционалом Может быть избыточным, влияет на производительность, риск конфликтов
Как удалить дубликаты постов в WordPress с помощью кода
08.03.2026
Удаление неиспользуемых вариаций товаров в WooCommerce без плагинов
09.05.2026
Как создать эффективный отчет по производительности WordPress
15.04.2026
Как сделать двухуровневую кэшировку в WordPress для ускорения сайта
03.12.2025
Удаление неиспользуемых вариаций товаров в WooCommerce через код
14.05.2026