Что такое отложенные заказы в WooCommerce и зачем нужен уникальный код
Отложенные заказы — это заказы, которые пользователь создал, но не завершил оформление (например, не оплатил). Для управления такими заказами полезно назначать уникальный код, который позволит быстро идентифицировать и отслеживать каждый из них без путаницы с другими заказами. Особенно это актуально при ручном управлении или интеграции с CRM/ERP системами.
Диагностика проблемы: почему стандартные номера заказов WooCommerce могут быть неудобны для отложенных заказов
По умолчанию WooCommerce использует последовательные номера для заказов, не разделяя оплаченные и отложенные. Это усложняет:
- Отслеживание отложенных заказов в админке
- Автоматическую фильтрацию и обработку через API
- Связь с внешними системами, если нужен специальный идентификатор
Если вы уже пытались реализовать что-то похожее через метаданные или номер заказа, могли столкнуться с конфликтами или дублированием.
Пошаговое решение: добавляем уникальный код для отложенных заказов
1. Создаем уникальный код при создании отложенного заказа
Для отложенных заказов будем использовать статус pending (ожидание оплаты) и при первом сохранении заказа добавим мета-ключ с уникальным кодом.
add_action('woocommerce_checkout_order_processed', 'wpbono_add_unique_code_to_pending_order', 10, 3);
function wpbono_add_unique_code_to_pending_order($order_id, $posted_data, $order) {
if (!$order) return;
// Проверяем статус заказа
if ($order->get_status() === 'pending') {
// Генерируем уникальный код: префикс + timestamp + случайное число
$unique_code = 'PENDING-' . time() . '-' . wp_rand(1000, 9999);
// Сохраняем в мета
update_post_meta($order_id, '_pending_unique_code', $unique_code);
}
}2. Отображаем уникальный код в админке WooCommerce
Чтобы видеть код в списке заказов, добавим колонку в таблицу заказов.
add_filter('manage_edit-shop_order_columns', 'wpbono_add_unique_code_column');
function wpbono_add_unique_code_column($columns) {
$new_columns = array();
foreach ($columns as $key => $column) {
$new_columns[$key] = $column;
if ($key === 'order_status') {
$new_columns['pending_unique_code'] = 'Код отложенного';
}
}
return $new_columns;
}
add_action('manage_shop_order_posts_custom_column', 'wpbono_show_unique_code_column');
function wpbono_show_unique_code_column($column) {
global $post;
if ($column === 'pending_unique_code') {
$code = get_post_meta($post->ID, '_pending_unique_code', true);
if ($code) {
echo esc_html($code);
} else {
echo '-';
}
}
}3. Поиск заказа по уникальному коду
Добавим возможность искать заказ по этому коду прямо из админки:
add_filter('woocommerce_shop_order_search_fields', 'wpbono_add_unique_code_search_field');
function wpbono_add_unique_code_search_field($search_fields) {
$search_fields[] = '_pending_unique_code';
return $search_fields;
}Проверка результата после внедрения
- Создайте новый заказ с оплатой позже (статус pending).
- Откройте админку WooCommerce > Заказы и убедитесь, что в колонке «Код отложенного» появился уникальный код.
- Попробуйте в поиске ввести этот код — должен отобразиться нужный заказ.
- Проверьте, что оплаченные заказы (со статусом processing или completed) не имеют этого кода.
Частые ошибки и как их исправить
- Код не появляется в заказах: Проверьте, что хук
woocommerce_checkout_order_processedсрабатывает и что статус заказа —pending. Возможно, заказ сразу получает другой статус — используйте хукwoocommerce_new_orderили другой подходящий. - Поиск по коду не работает: Убедитесь, что добавили мета-ключ в фильтр
woocommerce_shop_order_search_fieldsи что сохранение кода прошло корректно. - Конфликты с другими плагинами, управляющими заказами: Проверьте совместимость, возможно, другие плагины перезаписывают статус или метаданные.
Практические советы по безопасности и производительности
- Уникальный код генерируется с помощью
time()иwp_rand(), что минимизирует коллизии. Не используйте нестабильные или легко угадываемые коды. - Сохраняйте код только для отложенных заказов, чтобы не перегружать базу лишними данными.
- Если у вас большой магазин, индексируйте мета-ключ
_pending_unique_codeв базе MySQL для ускорения поиска. - Регулярно проверяйте отложенные заказы и удаляйте или архивируйте устаревшие, чтобы не засорять базу.
Таблица сравнения вариантов реализации уникального кода для отложенных заказов
| Способ | Преимущества | Недостатки | Применимость |
|---|---|---|---|
| Мета-ключ с уникальным кодом | Легко реализуется, интегрируется с админкой, поиск работает | Дополнительное поле в базе, нужно индексировать для скорости | Подходит для большинства магазинов |
| Использование пользовательского статуса заказа | Явное разделение отложенных заказов | Сложнее в поддержке, требует доработки плагинов и фильтров | При необходимости сложной логики статусов |
| Внешний уникальный идентификатор (например, UUID) | Максимальная уникальность, подходит для интеграций | Сложнее для пользователей, требует дополнительной генерации | Для крупных проектов и интеграций с CRM |