Проблема: нужно менять статус заказа при смене способа доставки в WooCommerce
По умолчанию WooCommerce не изменяет статус заказа, если пользователь или администратор меняет способ доставки после оформления. Это может приводить к ошибкам в логистике, если, например, выбранный способ доставки требует подтверждения или дополнительных действий.
Чтобы автоматически менять статус заказа при изменении способа доставки, можно добавить кастомный PHP-код, который будет отслеживать изменения и менять статус в зависимости от условий.
Диагностика проблемы
Если вы заметили, что после изменения способа доставки заказ остается со старым статусом (например, «обрабатывается»), хотя логично было бы перевести его в статус «ожидает отправки» или «на проверке», значит нужно внедрять обработку.
Проверьте, как происходит изменение способа доставки:
- Через админку в заказах
- Через пользовательский профиль (если предусмотрено)
- Через API или сторонние плагины
В большинстве случаев отслеживать изменение нужно именно при сохранении заказа в админке, так как пользовательская часть редко предусматривает смену доставки.
Пошаговое решение: добавляем обработку в functions.php
Ниже приведён пример кода, который отслеживает изменение способа доставки и меняет статус заказа на on-hold (ожидает подтверждения) при смене способа доставки:
add_action('woocommerce_process_shop_order_meta', 'wpteam_check_shipping_change_and_update_status', 20, 2);
function wpteam_check_shipping_change_and_update_status($post_id, $post){
$order = wc_get_order($post_id);
if(!$order) return;
// Получаем старые способы доставки из мета
$old_shipping_methods = get_post_meta($post_id, '_old_shipping_methods', true);
// Получаем текущие способы доставки
$current_shipping_methods = array();
foreach($order->get_shipping_methods() as $shipping_item){
$current_shipping_methods[] = $shipping_item->get_method_id();
}
// Сравниваем старые и новые
if($old_shipping_methods && $old_shipping_methods !== $current_shipping_methods){
// Меняем статус заказа
$order->update_status('on-hold', 'Статус изменён автоматически из-за смены способа доставки');
}
// Обновляем мета на текущие методы для следующей проверки
update_post_meta($post_id, '_old_shipping_methods', $current_shipping_methods);
}Объяснение: при каждом сохранении заказа код сравнивает текущие способы доставки с теми, что были при предыдущем сохранении. Если они отличаются, статус меняется на on-hold. Чтобы первый раз сохранить способ доставки, используется метаполе _old_shipping_methods.
Как внедрить
- Открыть
functions.phpвашей дочерней темы или подключаемого плагина. - Вставить код выше.
- Сохранить файл.
- Открыть любой заказ в админке WooCommerce.
- Изменить способ доставки и сохранить заказ.
Проверка результата после внедрения
Чтобы проверить, что код сработал:
- Откройте существующий заказ с любым статусом, например
processing. - Измените способ доставки и сохраните заказ.
- Проверьте, что статус заказа изменился на
on-hold. - В разделе комментариев к заказу появится запись «Статус изменён автоматически из-за смены способа доставки».
Если статус не изменился — проверьте логи ошибок и убедитесь, что код активен и нет конфликтов с другими плагинами.
Частые ошибки и их исправление
- Код не срабатывает при смене доставки: возможно, способ доставки меняется не через админку, а программно. В этом случае нужно расширить обработку, например, через хук
woocommerce_order_edit_statusили кастомные события. - Ошибка в коде PHP: проверьте синтаксис, используйте
error_logдля отладки. - Мета _old_shipping_methods не создаётся: при первом сохранении заказа мета будет пустой, что нормально. При следующем сохранении сравнение уже будет работать.
- Проблемы с правами доступа: убедитесь, что пользователь админки имеет право редактировать заказы.
Практические советы по безопасности и производительности
- Код не влияет на фронтенд, поэтому проблем с производительностью быть не должно.
- Сохраняйте код в дочернюю тему или отдельный плагин, чтобы не потерять изменения при обновлении.
- Не меняйте статус на критический (например,
cancelled) без проверки бизнес-логики. - Добавьте проверку текущего статуса перед сменой, чтобы не менять статус, если это не нужно.
Альтернативные решения: плагин или код
| Способ | Плюсы | Минусы |
|---|---|---|
| Код в functions.php | Лёгкая кастомизация, нет лишних плагинов | Требует навыков программирования, поддержка на вас |
| Плагин для управления статусами заказов | Простота настройки, расширенный функционал | Может быть избыточным, нагрузка, конфликт с другими плагинами |