Проблема: необходимость изменить адрес доставки после оформления заказа в WooCommerce
WooCommerce по умолчанию не позволяет покупателям или администраторам менять адрес доставки после оформления заказа через стандартный интерфейс. Это может создавать сложности, если клиент допустил ошибку при вводе адреса или хочет изменить его по другим причинам.
Диагностика проблемы
Проверьте, действительно ли заказ содержит неверный адрес доставки и невозможно ли его изменить через админку:
- Перейдите в WooCommerce → Заказы.
- Откройте нужный заказ и проверьте поля Адрес доставки.
- Попробуйте изменить адрес вручную и сохранить — стандартно это не сохранится или не отобразится в заказе.
Если вы хотите дать клиенту возможность изменить адрес самостоятельно, необходимо реализовать кастомное решение или использовать плагин. В статье рассмотрим именно кодовые решения.
Пошаговое решение: добавить возможность редактирования адреса доставки в админке WooCommerce
1. Добавляем возможность редактирования адреса доставки в мета-боксе заказа
Для этого используем хук woocommerce_admin_order_data_after_shipping_address, чтобы вывести поля редактирования адреса доставки в админке:
add_action('woocommerce_admin_order_data_after_shipping_address', 'wpmod_edit_shipping_address_admin', 10, 1);
function wpmod_edit_shipping_address_admin($order){
$shipping_fields = array(
'shipping_first_name' => 'Имя',
'shipping_last_name' => 'Фамилия',
'shipping_company' => 'Компания',
'shipping_address_1' => 'Адрес 1',
'shipping_address_2' => 'Адрес 2',
'shipping_city' => 'Город',
'shipping_postcode' => 'Почтовый индекс',
'shipping_country' => 'Страна',
'shipping_state' => 'Регион/Область',
);
echo '<div class="edit-shipping-address"><h3>Редактировать адрес доставки</h3><table>';
foreach($shipping_fields as $key => $label){
$value = $order->get_meta('_'.$key) ?: $order->get_shipping_address();
if(in_array($key, ['shipping_country', 'shipping_state'])){
// Для страны и региона можно добавить select, но для простоты - input
echo "<tr><td>{$label}</td><td><input type='text' name='{$key}' value='".esc_attr($order->get_meta('_'.$key))."' /></td></tr>";
} else {
echo "<tr><td>{$label}</td><td><input type='text' name='{$key}' value='".esc_attr($order->get_meta('_'.$key) ?: $order->get_shipping_address())."' /></td></tr>";
}
}
echo '</table></div>';
}2. Сохраняем изменения адреса доставки при обновлении заказа
Используем хук woocommerce_process_shop_order_meta для сохранения данных из полей:
add_action('woocommerce_process_shop_order_meta', 'wpmod_save_shipping_address_admin', 10, 2);
function wpmod_save_shipping_address_admin($order_id, $post){
$order = wc_get_order($order_id);
$fields = [
'shipping_first_name',
'shipping_last_name',
'shipping_company',
'shipping_address_1',
'shipping_address_2',
'shipping_city',
'shipping_postcode',
'shipping_country',
'shipping_state'
];
foreach ($fields as $field) {
if(isset($_POST[$field])){
$value = sanitize_text_field($_POST[$field]);
$order->update_meta_data('_'.$field, $value);
// Также обновим штатные методы
$setter = str_replace('shipping_', 'set_shipping_', $field);
if(method_exists($order, $setter)){
$order->{$setter}($value);
}
}
}
$order->save();
}3. Обновляем вывод адреса доставки в шаблонах и уведомлениях
WooCommerce выводит адрес доставки используя методы $order->get_formatted_shipping_address() и свойства $order->get_shipping_*. После обновления метаданных и методов адрес должен отображаться корректно.
Проверка результата
- Откройте заказ в админке WooCommerce.
- В разделе адреса доставки появится блок с полями для редактирования.
- Измените поля и сохраните заказ.
- Перейдите в публичную часть или уведомление заказа — адрес доставки должен обновиться.
Частые ошибки и их исправление
- Адрес не сохраняется: Проверьте, правильно ли работают функции сохранения, есть ли ошибки PHP, и вызван ли
$order->save(). - Отображается старый адрес: Убедитесь, что обновлены все метаданные и методы объекта заказа.
- Некорректный формат страны или региона: Можно добавить в поля select с перечнем стран и регионов WooCommerce, чтобы избежать опечаток.
- Поля не отображаются в админке: Проверьте правильность использования хука
woocommerce_admin_order_data_after_shipping_addressи нет ли конфликтов с другими плагинами.
Дополнительные советы по безопасности и производительности
- Используйте
sanitize_text_field()для очистки входящих данных. - Ограничьте редактирование адреса доставки только администраторам или менеджерам через проверку прав доступа внутри функций.
- Кэширование адресов в плагинах или темах может требовать очистки после изменений.
- Для массового изменения адресов можно написать WP-CLI команды, чтобы не редактировать вручную.
Альтернативы: плагины и код
| Вариант | Плюсы | Минусы |
|---|---|---|
| Кодовое решение (как в статье) | Гибкость, контроль, отсутствие лишних плагинов | Требует навыков PHP, поддержка на вас |
| Плагины типа "WooCommerce Edit Order" | Простота, готовый интерфейс, поддержка | Потенциальные конфликты, зависимость от стороннего кода |
| Ручное изменение в базе данных | Быстро для одного заказа | Риск ошибок, не рекомендуется |