WooCommerce: автоматическое заполнение адреса доставки по email покупателя

Диагностика проблемы: почему стоит автоматизировать ввод адреса по email

В интернет-магазинах на WooCommerce часто пользователи вводят email и затем должны вручную заполнить адрес доставки. Это увеличивает время оформления заказа и повышает вероятность ошибок. Автоматическое заполнение адреса по email сокращает количество действий пользователя и снижает количество брошенных корзин.

Как автоматически подставлять адрес по email в WooCommerce: пошаговое решение

1. Использование пользовательских метаданных для хранения адреса

Для автоматического заполнения адреса нужно хранить связь email — адрес. Это можно сделать как в базе данных, так и с помощью сторонних API (например, сервисов для автозаполнения).

В этом примере рассмотрим простой вариант с пользовательским метаполем, где для каждого email мы заранее зададим адрес.

2. Добавляем фильтр для автозаполнения полей адреса на странице оформления заказа

Используем хук woocommerce_checkout_get_value, чтобы подставить значения полей адреса при вводе email.

add_filter('woocommerce_checkout_get_value', 'auto_fill_address_by_email', 10, 2);
function auto_fill_address_by_email($input, $key) {
    if (!empty($_POST['billing_email'])) {
        $email = sanitize_email($_POST['billing_email']);
        // Здесь пример массива email => адрес
        $address_book = [
            'client1@example.com' => [
                'first_name' => 'Иван',
                'last_name' => 'Иванов',
                'address_1' => 'ул. Ленина, д. 10',
                'city' => 'Москва',
                'postcode' => '101000',
                'country' => 'RU',
                'state' => 'MOW'
            ],
            'client2@example.com' => [
                'first_name' => 'Анна',
                'last_name' => 'Петрова',
                'address_1' => 'пр. Мира, д. 5',
                'city' => 'Санкт-Петербург',
                'postcode' => '190000',
                'country' => 'RU',
                'state' => 'SPE'
            ]
        ];
        if (isset($address_book[$email]) && isset($address_book[$email][$key])) {
            return $address_book[$email][$key];
        }
    }
    return $input;
}

3. Обработка AJAX для динамического обновления адреса при изменении email

Чтобы не требовать перезагрузки страницы, добавим AJAX-запрос, который будет подтягивать адрес при вводе email.

add_action('wp_ajax_get_address_by_email', 'ajax_get_address_by_email');
add_action('wp_ajax_nopriv_get_address_by_email', 'ajax_get_address_by_email');
function ajax_get_address_by_email() {
    $email = isset($_POST['email']) ? sanitize_email($_POST['email']) : '';
    $address_book = [
        'client1@example.com' => [
            'first_name' => 'Иван',
            'last_name' => 'Иванов',
            'address_1' => 'ул. Ленина, д. 10',
            'city' => 'Москва',
            'postcode' => '101000',
            'country' => 'RU',
            'state' => 'MOW'
        ],
        'client2@example.com' => [
            'first_name' => 'Анна',
            'last_name' => 'Петрова',
            'address_1' => 'пр. Мира, д. 5',
            'city' => 'Санкт-Петербург',
            'postcode' => '190000',
            'country' => 'RU',
            'state' => 'SPE'
        ]
    ];
    if (isset($address_book[$email])) {
        wp_send_json_success($address_book[$email]);
    } else {
        wp_send_json_error('Адрес не найден');
    }
}

На стороне клиента добавьте скрипт, который при изменении email отправляет AJAX и заполняет поля:

jQuery(document).ready(function($) {
    $('#billing_email').on('change', function() {
        var email = $(this).val();
        $.post(wc_checkout_params.ajax_url, {
            action: 'get_address_by_email',
            email: email
        }, function(response) {
            if(response.success) {
                var data = response.data;
                $('#billing_first_name').val(data.first_name);
                $('#billing_last_name').val(data.last_name);
                $('#billing_address_1').val(data.address_1);
                $('#billing_city').val(data.city);
                $('#billing_postcode').val(data.postcode);
                $('#billing_country').val(data.country).trigger('change');
                $('#billing_state').val(data.state).trigger('change');
            }
        });
    });
});

Как проверить, что автозаполнение заработало

  • Откройте страницу оформления заказа WooCommerce.
  • Введите в поле email один из адресов, например client1@example.com.
  • Проверьте, что остальные поля адреса заполняются автоматически без перезагрузки страницы.
  • Попробуйте ввести неизвестный email — поля должны остаться пустыми.

Частые ошибки и как их исправить

  • Поля не заполняются после ввода email: проверьте правильность подключенного скрипта и наличие локализации wc_checkout_params.ajax_url.
  • Адрес из массива не подставляется: убедитесь, что ключи массива совпадают с названиями полей WooCommerce, например billing_first_name — в фильтре используется first_name, нужно привести к нужному формату.
  • AJAX возвращает ошибку 0 или 500: проверьте, подключен ли хук wp_ajax_nopriv_ для неавторизованных пользователей.
  • Поля не обновляют значения после подстановки: некоторые селекты требуют триггера события change для обновления UI (например, страны и регионы).

Практические советы по безопасности и производительности

  • Всегда используйте sanitize_email() при работе с email, чтобы избежать инъекций.
  • Не храните большой объём адресов в массиве в коде — лучше использовать отдельную таблицу в базе данных или внешние сервисы.
  • Кэшируйте результаты запросов к внешним API для ускорения автозаполнения.
  • Ограничьте частоту AJAX-запросов, чтобы избежать лишней нагрузки при вводе email.

Сравнение вариантов реализации автозаполнения адреса по email

МетодПреимуществаНедостаткиПример
Жёстко заданный массив в кодеПросто реализовать, не требует базыНеподходяще для большого количества клиентовПример из статьи
Хранение адресов в отдельной таблице БДУдобно масштабировать, можно управлять из админкиНужно писать дополнительный код для CRUD операцийНастраивается через $wpdb
Использование внешних API автозаполненияДанные всегда актуальные, часто с геолокациейЗависимость от стороннего сервиса, возможны ограниченияAPI DaData, Google Places
Как создать интерактивный вопросник в WordPress с помощью Quizle
27.12.2025
Как добавить настройки в панель администратора WordPress
29.11.2025
Как сделать автоматический редирект в WordPress по условиям
04.03.2026
Как использовать REST API в WordPress для создания кастомных решений
16.11.2025
Как добавить автоматическое удаление старых записей через cron в WordPress
31.12.2025