Диагностика проблемы: зачем нужно отслеживание заказов в реальном времени?
В интернет-магазине на WooCommerce важно оперативно мониторить статус заказов, чтобы своевременно реагировать на оплату, отправку и возможные проблемы. Стандартный функционал WooCommerce обновляет статусы заказов при загрузке страницы администратора, но это не всегда удобно для менеджеров и владельцев магазина.
Если вы замечаете, что статусы заказов в админке обновляются с задержкой, приходится постоянно обновлять страницу вручную или использовать сторонние плагины без контроля, значит, вам нужна настройка отслеживания заказов в реальном времени.
Как реализовать отслеживание заказов в режиме реального времени в WooCommerce
Основная идея решения
Мы настроим AJAX-запросы с периодическим опросом сервера, который будет проверять изменение статусов заказов. Для этого добавим JavaScript в админку, а на PHP стороне создадим обработчик, который вернёт данные о новых или обновлённых заказах.
Пошаговая инструкция
- Добавляем 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();
}- Подключаем скрипт в админке 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'),
]);
}- Создаём файл
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 уведомления | Мгновенные обновления, меньше нагрузки на сервер | Сложнее реализовать, требует дополнительной инфраструктуры |
| Использование готовых плагинов | Быстрое решение, часто с дополнительным функционалом | Может быть избыточным, влияет на производительность, риск конфликтов |