Вопрос или проблема
Я использую 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
. Это позволит перехватывать процесс сохранения заказа и обрабатывать данные перед сохранением.
Применение
-
Подключение необходимых хуков:
Вам потребуется использовать хуки, которые воздействуют на момент создания или обновления заказа. Один из таких хуков
woocommerce_process_shop_order_meta
. Этот хук позволяет переопределить информацию заказа непосредственно перед сохранением. -
Реализация функции обработки номера телефона:
Реализовать функцию, которая будет изменять номер телефона, добавляя соответствующий код страны, используя имеющийся в вашем распоряжении код:
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");
}
}
}
-
Функция получения кода страны:
Убедитесь, что функция
get_country_code($billing_country)
реализована. Это обычно простой массив соответствий кодов стран с их цифровыми кодами.
function get_country_code($country) {
$country_codes = array(
'IT' => '39',
// Добавьте другие страны и их коды здесь
);
return isset($country_codes[$country]) ? $country_codes[$country] : false;
}
-
JavaScript для мгновенного обновления (опционально):
Если хотите, чтобы код страны добавлялся сразу при вводе, можно подключить JavaScript, который будет отслеживать изменения в инпуте и динамически изменять его значение. Однако, это потребует также серверной поддержки для корректной обработки данных.
Подводя итог, решение задачи требует применения специфических возможностей WooCommerce по интеграции через хуки и фильтры. Вышеописанные шаги демонстрируют, как можно установить обработку номера телефона на стороне сервера, что обеспечит надежную и корректную работу функционала. Конечно, следует учитывать возможность существования дополнительных расширений или плагинов, которые могут предложить аналогичную функциональность и оценить, насколько они подходят к конкретной инфраструктуре вашего сайта.
Это решение подразумевает, что код, применяемый на стороне сервера, должен быть тщательно протестирован в безопасной среде до развертывания в рабочей версии сайта, чтобы исключить возможные нарушения работы других функций админ-панели.