Диагностика задачи: зачем менять статус заказа по устройству
Иногда в WooCommerce возникает потребность автоматически менять статус заказов в зависимости от того, с какого устройства был сделан заказ — мобильного или десктопного. Это полезно, например, для специальных маркетинговых сценариев, при которых мобильные заказы обрабатываются иначе (ускоренная обработка, дополнительные проверки и т.д.).
Задача: по умолчанию WooCommerce ставит статус "обработка" или "ожидание оплаты" для всех заказов. Нужно реализовать автоматическое изменение статуса на другой, если заказ сделан с мобильного устройства.
Как определить устройство клиента в WooCommerce
Определить устройство можно двумя способами:
- По User-Agent HTTP-заголовка — самый распространенный метод;
- Через JavaScript и передача данных на сервер (сложнее, требует AJAX).
Для простоты и надежности используем PHP-библиотеку wp_is_mobile(), встроенную в WordPress. Она определяет мобильные устройства по User-Agent.
Пошаговое решение: изменение статуса заказа при создании
WooCommerce создает заказ при оформлении, инициируя действие woocommerce_thankyou. Можно использовать этот хук для проверки устройства и изменения статуса.
add_action('woocommerce_thankyou', 'change_order_status_based_on_device', 20, 1);
function change_order_status_based_on_device($order_id) {
if (!$order_id) return;
$order = wc_get_order($order_id);
if (!$order) return;
// Если устройство мобильное и статус заказа "processing"
if (wp_is_mobile() && $order->get_status() === 'processing') {
// Изменяем статус на "on-hold" (ожидание)
$order->update_status('on-hold', 'Статус изменён автоматически для мобильного устройства');
}
}
В этом примере, если заказ сделан с мобильного, и статус по умолчанию "processing", мы меняем его на "on-hold". В реальных условиях можно заменить "on-hold" на любой другой статус, например "wc-custom-status" (если создан кастомный).
Проверка результата после внедрения
- Сделайте тестовый заказ с мобильного устройства (смартфон или эмулятор в браузере с мобильным User-Agent).
- Зайдите в админку WooCommerce > Заказы и проверьте статус только что созданного заказа.
- Статус должен автоматически измениться с "processing" на выбранный (например, "on-hold").
- Если заказ сделан с десктопа, статус не меняется.
Частые ошибки и их исправление
- Статус не меняется: проверьте, что хук
woocommerce_thankyouдействительно вызывается, и функция подключена. Включите логи ошибок PHP. - Функция
wp_is_mobile()возвращает неверно: она ориентирована на User-Agent, иногда может ошибаться с планшетами. Для более точного определения используйте сторонние библиотеки (но это усложнит код). - Конфликт с другими плагинами, меняющими статусы: убедитесь, что приоритет хука (20) не конфликтует. Попробуйте увеличить приоритет.
- Проблемы с кэшированием: если на сайте есть кэширование страниц или объектное кэширование, оно может мешать корректной работе статусов. Очистите кэш.
Практические советы по безопасности и производительности
- Не используйте тяжелые определения устройства на каждом заказе — wp_is_mobile() достаточно легковесна.
- Протестируйте на разных браузерах и устройствах, чтобы избежать неправильной логики.
- Для кастомных статусов создавайте их через
register_post_statusи добавляйте в WooCommerce, чтобы не возникало ошибок. - Логируйте изменения статусов для отладки, например через
error_log()или через плагин Clearfy Pro для аудита.
Сравнение вариантов реализации
| Метод | Плюсы | Минусы | Пример кода |
|---|---|---|---|
| wp_is_mobile() | Простое, встроенное в WP, быстрое | Погрешности с планшетами, зависит от User-Agent | В статье выше |
| JavaScript + AJAX | Более точное определение устройства, можно учитывать экран, ориентацию | Сложнее в реализации, требует JS и AJAX | Требует кастомной разработки |
| Сторонние библиотеки (Mobile Detect) | Очень точное определение устройства | Дополнительная нагрузка, нужно подключать библиотеку | https://github.com/serbanghita/Mobile-Detect |