Вопрос или проблема
Я настраиваю сайт с входом в WooCommerce с фронтенда. Я хочу перенаправить клиента непосредственно на регистрацию платежного адреса.
Затем я хочу заполнить поля имени и фамилии плательщика значениями, зарегистрированными при регистрации пользователя.
Этот код работает, но мне нужно обновить страницу адреса доставки, чтобы имя появилось в полях. Почему?
add_action("user_register", "pb_update_user_meta", 10, 2);
function pb_update_user_meta($user_id, $redirect_to) {
global $filled;
$user_id = get_current_user_id();
$filled = get_user_meta( $user_id, 'billing_address_1', true );
if($filled != '') {
$redirect_to = home_url() . '/my-account/';
} else {
$user_first_name = get_user_meta('first_name');
$user_last_name = get_user_meta('last_name');
// настройка имени плательщика
update_user_meta( $user_id, 'billing_first_name', $user_first_name );
update_user_meta( $user_id, 'billing_last_name', $user_last_name );
$redirect_to = home_url() . '/my-account/edit-address/billing/';
}
return $redirect_to;
}
Я также пробовал то же самое, используя фильтр woocommerce_login_redirect, но с тем же результатом.
Извините, я не смог получить переменные $_GET
.
Решением было извлечение значений из базы данных и вставка их в соответствующие места в файле шаблона (form-edit-address.php).
Это работает 🙂
<?php
$user_id = get_current_user_id();
$user_info = get_userdata( $user_id );
$first_name = $user_info->first_name;
$last_name = $user_info->last_name;
?>
<?php do_action("woocommerce_before_edit_address_form_{$load_address}" ); ?>
<?php
foreach ( $address as $key => $field ) :
if ($key == 'billing_first_name' && $field['value'] == '')
woocommerce_form_field( $key, $field, $first_name );
elseif ($key == 'billing_last_name' && $field['value'] == '')
woocommerce_form_field( $key, $field, $last_name );
else
woocommerce_form_field( $key, $field, ! empty( $_POST[ $key ] ) ? wc_clean( $_POST[ $key ] ) : $field['value'] );
endforeach;
...
Ответ или решение
Каждый раз, когда вы работаете с пользовательскими данными в WooCommerce, важно понимать, как правильно обрабатывать регистрацию и перенаправления, чтобы обеспечить максимальную функциональность и удобство пользователя. В данном случае, задача заключается в том, чтобы перенаправить нового пользователя с фронтенда прямо на страницу с редактированием адреса, а также автоматически заполнить поля "Имя" и "Фамилия" на основе данных, вводимых при регистрации.
Проблема и её решение
Как вы отметили, существует проблема с тем, что поля для имени и фамилии не заполняются автоматически при перенаправлении на страницу адреса, а требуют обновления страницы для отображения. Это связано с тем, как данные сохраняются и загружаются в WordPress и WooCommerce.
Ваш код в обработчике user_register
показывает, что вы пытаетесь обновить пользовательские метаданные и затем перенаправить пользователя. Тем не менее, метод get_user_meta
для получения имени и фамилии не передает user_id
в качестве параметра, что может привести к тому, что данные будут извлекаться некорректно.
Вот улучшенная версия вашего кода для обновления пользовательских метаданных и корректного перенаправления:
add_action("user_register", "pb_update_user_meta", 10, 2);
function pb_update_user_meta($user_id) {
// Получаем метаданные пользователя
$user_first_name = get_user_meta($user_id, 'first_name', true);
$user_last_name = get_user_meta($user_id, 'last_name', true);
// Настраиваем метаданные для биллинга
update_user_meta($user_id, 'billing_first_name', $user_first_name);
update_user_meta($user_id, 'billing_last_name', $user_last_name);
// Перенаправляем пользователя на страницу редактирования адреса
wp_safe_redirect(home_url('/my-account/edit-address/billing/'));
exit;
}
Изменения, которые были внесены:
- Упрощен получаемый
user_id
: его нужно извлекать из контекста вызова функции, а не как глобальную переменную. - Функция
get_user_meta
теперь правильно передаетuser_id
при получении имени и фамилии. - Добавлена функция
wp_safe_redirect
, которая более безопасно работает с перенаправлениями на сайт WordPress. - Добавлен вызов
exit;
после перенаправления для предотвращения дальнейшего выполнения кода.
Решение проблемы с отображением данных
Вы также упомянули, что данные отображаются после перезагрузки страницы. Это может быть связано с тем, что WooCommerce в момент загрузки страницы адреса еще не обновил поля ввода. Чтобы избежать этого, вы можете напрямую интегрировать данные в шаблоне form-edit-address.php
, как вы уже сделали. При этом обязательно очищайте переменные для защиты от XSS.
Тем не менее, я рекомендую также убедиться, что в классах ваших форм присутствует состояние, чтобы как только пользователь попадет на страницу, данные загружались из базы данных автоматически.
$user_id = get_current_user_id();
$user_info = get_userdata($user_id);
$first_name = $user_info->first_name;
$last_name = $user_info->last_name;
foreach ( $address as $key => $field ) :
if ($key == 'billing_first_name' && empty($field['value']))
woocommerce_form_field($key, $field, $first_name);
elseif ($key == 'billing_last_name' && empty($field['value']))
woocommerce_form_field($key, $field, $last_name);
else
woocommerce_form_field($key, $field, !empty($_POST[$key]) ? wc_clean($_POST[$key]) : $field['value']);
endforeach;
В этом коде мы проверяем, заполнено ли поле. Если нет, мы подставляем значение из базы данных, что исключает необходимость обновления страницы. Подобный подход будет полезен для повышения стабильности и удобства работы вашего сайта.
Выводы
Таким образом, интеграция данных пользователя с процессом регистрации и обеспечением их отображения на странице редактирования адреса — это задача, требующая внимательного подхода. Корректно используя методы работы с пользовательскими метаданными и перенаправлениями в WooCommerce, вы можете значительно улучшить пользовательский опыт на вашем сайте. Не забывайте также тестировать любые изменения, чтобы гарантировать их корректную работу.