Что такое хук customer_save_address и когда он срабатывает в WooCommerce
Хук woocommerce_customer_save_address вызывается при сохранении адреса пользователя в WooCommerce — будь то добавление или обновление адреса для доставки или выставления счета. Это событие полезно для запуска дополнительной логики, например, валидации данных, синхронизации с внешними CRM или модификации метаданных пользователя.
Параметры хука
Хук принимает два параметра:
$user_id— ID пользователя, чей адрес сохраняется.$load_address— тип адреса (billing, shipping).
Диагностика проблемы: почему изменения адреса не обрабатываются автоматически
Если вы пытаетесь добавить обработку адресов через этот хук, но ваши функции не срабатывают, проверьте:
- Правильность подключения функции к хуку через
add_action. - Корректность параметров функции (она должна принимать два аргумента).
- Отсутствие конфликтов с другими плагинами, которые могут прерывать цепочку вызовов.
- Использование актуальной версии WooCommerce, поддерживающей этот хук.
Пошаговое решение: как реализовать обработку адресов через customer_save_address
Пример задачи: нужно валидировать поле телефона при сохранении адреса доставки и сохранять дополнительное мета-поле с отметкой времени обновления.
add_action('woocommerce_customer_save_address', 'custom_customer_save_address_handler', 10, 2);
function custom_customer_save_address_handler($user_id, $load_address) {
// Проверяем, что адрес именно для доставки
if ($load_address !== 'shipping') {
return;
}
// Получаем данные из POST
$phone = isset($_POST['shipping_phone']) ? sanitize_text_field($_POST['shipping_phone']) : '';
// Простая валидация телефона
if (!preg_match('/^\+?\d{10,15}$/', $phone)) {
wc_add_notice('Неверный формат телефона для адреса доставки.', 'error');
return;
}
// Сохраняем дополнительное мета-поле с датой обновления
update_user_meta($user_id, '_shipping_address_updated', current_time('mysql'));
}В этом коде мы привязываемся к хуку, проверяем тип адреса, валидируем телефон и сохраняем мета-данные.
Проверка результата после внедрения
Чтобы убедиться, что обработка работает:
- Измените адрес доставки в личном кабинете WooCommerce.
- Проверьте, что при неверном телефоне появляется сообщение об ошибке.
- Подтвердите, что в базе данных в таблице
wp_usermetaдля пользователя появилось поле_shipping_address_updatedс актуальным временем. - Если используете отладку, можно добавить
error_logвнутри функции для подтверждения вызова.
Частые ошибки и как их исправить
- Функция не вызывается: проверьте регистрацию через
add_action— должна быть именно с приоритетом 10 и принимать 2 параметра. - Неправильный тип адреса: часто забывают проверять
$load_addressи функция срабатывает на все адреса, что может приводить к логическим ошибкам. - Отсутствие валидации данных: данные из
$_POSTвсегда нужно фильтровать и санитизировать, иначе возможны уязвимости. - Конфликт с другими плагинами: отключите сторонние плагины и проверьте, работает ли код без них.
Практические советы по безопасности и производительности
- Используйте
sanitize_text_fieldи другие функции WordPress для очистки входных данных. - Не выполняйте тяжелые операции внутри хука — при необходимости делегируйте в очередь или cron.
- Обязательно проверяйте права пользователя, если работаете с личными данными.
- Для отладки используйте
error_logс понятными сообщениями, не выводите ошибки в публичный вывод.
Сравнение вариантов реализации обработки адресов WooCommerce
| Способ | Плюсы | Минусы |
|---|---|---|
Хук woocommerce_customer_save_address | Прямой вызов при сохранении, доступ к ID пользователя и типу адреса | Ограничен только сохранением адресов, не подходит для других событий |
Фильтр woocommerce_save_account_details_errors | Можно проверять ошибки до сохранения, влиять на процесс | Работает только при сохранении аккаунта, не для всех адресов |
| Кастомный AJAX-запрос | Гибкость, можно обрабатывать данные в реальном времени | Сложнее реализовать, требует дополнительной настройки JS и безопасности |