Автоматическое добавление кода страны к номеру телефона в ручных заказах WooCommerce (админпанель)

Вопрос или проблема

Я использую WordPress 6.7.1 и WooCommerce 9.6.1. При ручном размещении заказа из административной панели WordPress (WooCommerce → Заказы → Добавить заказ) я хочу, чтобы номер телефона автоматически обновлялся с кодом страны на основе страны доставки по умолчанию.

Например, если я введу номер телефона 1234567890, а моя страна доставки по умолчанию — Италия (код страны: +39), номер телефона должен автоматически форматироваться как +391234567890.

На странице оформления заказа я успешно реализовал эту функциональность с использованием следующего кода:

add_action('woocommerce_checkout_update_order_meta', 'add_country_code_to_phone_number');

function add_country_code_to_phone_number($order_id)
{
    $billing_phone = isset($_POST['billing_phone']) ? sanitize_text_field($_POST['billing_phone']) : '';
    $billing_country = isset($_POST['billing_country']) ? sanitize_text_field($_POST['billing_country']) : '';

    if ($billing_phone && $billing_country) {
        $country_code = get_country_code($billing_country);

        if ($country_code) {
            // Normalize phone number: Remove spaces, dashes, or special characters
            $billing_phone = preg_replace('/\s+|-/', '', $billing_phone);

            // Check if the phone number already has a valid country code
            if (!preg_match('/^\+' . preg_quote($country_code, "https://wordpress.stackexchange.com/") . "https://wordpress.stackexchange.com/", $billing_phone)) {
                // Check if phone starts with the country code but missing '+'
                if (preg_match('/^' . preg_quote($country_code, "https://wordpress.stackexchange.com/") . "https://wordpress.stackexchange.com/", $billing_phone)) {
                    $billing_phone="+" . $billing_phone; // Just add '+'
                } else {
                    $billing_phone="+" . $country_code . $billing_phone; // Add full country code
                }
            }

            // Save the corrected phone number
            update_post_meta($order_id, '_billing_phone', $billing_phone);
            update_post_meta($order_id, '_shipping_phone', $billing_phone);
        } else {
            error_log("Country code not found for: $billing_country");
        }
    }
}

Однако я не могу найти способ реализовать это для ручных заказов в панели администратора WordPress. Мне нужно решение, которое:

Автоматически добавляет правильный код страны при ручном создании заказа в панели WooCommerce.
Обновляет поле номера телефона сразу после ввода или перед сохранением заказа.
Существует ли хук или функция, доступные для изменения поля номера телефона на странице создания заказа в админпанели WooCommerce? Любая помощь будет очень признательна!

Спасибо!

Ответ или решение

Конечно, автоматизация добавления кода страны к номеру телефона в WooCommerce при создании заказов вручную в админ-панели WordPress является интересной задачей, которая может существенно упростить процесс обработки заказов. Рассмотрим теоретические аспекты, приведем практическое применение и предложим возможное решение данной задачи.

Теория

WooCommerce, являясь наиболее популярным плагином для электронной коммерции на WordPress, позволяет гибко управлять настройками и расширять функциональность через хуки и фильтры. В стандартной конфигурации админ-панель WooCommerce не обладает встроенной функцией автоматического добавления кода страны к номеру телефона при создании заказа вручную.

В случае оформления заказов через фронтенд, вы применили правильный подход, используя add_action('woocommerce_checkout_update_order_meta', ...) для добавления кода страны. Однако, создание заказа вручную в админ-панели несколько отличается и требует использования других доступных хуков и фильтров.

Пример

Если цель заключается в автоматическом добавлении кода страны, основываясь на стране доставки, то, скорее всего, вам потребуется применить фильтры и хуки, доступные в рамках функционала админ-панели. Традиционные подходы, например, используя JavaScript для изменения содержимого полей, могут быть полезны, но это потребует дополнительной проверки на стороне сервера.

Можно сохранить автоматически код страны, используя фильтры, такие как woocommerce_process_shop_order_meta или save_post_shop_order. Это позволит перехватывать процесс сохранения заказа и обрабатывать данные перед сохранением.

Применение

  1. Подключение необходимых хуков:

    Вам потребуется использовать хуки, которые воздействуют на момент создания или обновления заказа. Один из таких хуков woocommerce_process_shop_order_meta. Этот хук позволяет переопределить информацию заказа непосредственно перед сохранением.

  2. Реализация функции обработки номера телефона:

    Реализовать функцию, которая будет изменять номер телефона, добавляя соответствующий код страны, используя имеющийся в вашем распоряжении код:

add_action('woocommerce_process_shop_order_meta', 'append_country_code_to_phone_number_admin', 10, 2);

function append_country_code_to_phone_number_admin($post_id, $post) {
    // Получение данных номера телефона и страны доставки
    $billing_phone = get_post_meta($post_id, '_billing_phone', true);
    $billing_country = get_post_meta($post_id, '_billing_country', true);

    // Если номер телефона и страна доступны
    if ($billing_phone && $billing_country) {
        $country_code = get_country_code($billing_country);

        if ($country_code) {
            // Нормализация номера телефона: удаление пробелов, дефисов, специальных символов
            $billing_phone = preg_replace('/\s+|-/', '', $billing_phone);

            // Проверка на наличие уже присоединенного корректного кода страны
            if (!preg_match('/^\+' . preg_quote($country_code, '/') . '/', $billing_phone)) {
                $billing_phone = '+' . $country_code . $billing_phone; // Добавить полный код страны
            }

            // Сохранение исправленного номера телефона
            update_post_meta($post_id, '_billing_phone', $billing_phone);
            update_post_meta($post_id, '_shipping_phone', $billing_phone);
        } else {
            error_log("Country code not found for: $billing_country");
        }
    }
}
  1. Функция получения кода страны:

    Убедитесь, что функция get_country_code($billing_country) реализована. Это обычно простой массив соответствий кодов стран с их цифровыми кодами.

function get_country_code($country) {
    $country_codes = array(
        'IT' => '39',
        // Добавьте другие страны и их коды здесь
    );

    return isset($country_codes[$country]) ? $country_codes[$country] : false;
}
  1. JavaScript для мгновенного обновления (опционально):

    Если хотите, чтобы код страны добавлялся сразу при вводе, можно подключить JavaScript, который будет отслеживать изменения в инпуте и динамически изменять его значение. Однако, это потребует также серверной поддержки для корректной обработки данных.

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

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

Оцените материал
Добавить комментарий

Капча загружается...