Вопрос или проблема
Я добавил дополнительное поле регистрации:
function wooc_extra_register_fields() {
?><p class="form-row form-row-first">
<label for="billing_cpf"><?php _e( 'CPF', 'woocommerce' ); ?> <span class="required">*</span></label>
<input type="text" class="input-text" name="billing_cpf" id="billing_cpf" value="<?php
if ( ! empty( $_POST['billing_cpf'] ) ) esc_attr_e( $_POST['billing_cpf'] ); ?>" />
</p><?php
}
add_action( 'woocommerce_register_form_start', 'wooc_extra_register_fields' );
function wooc_save_extra_register_fields( $customer_id ) {
if ( isset( $_POST['billing_cpf'] ) ) {
update_user_meta( $customer_id, 'billing_cpf', sanitize_text_field( $_POST['billing_cpf'] ) );
}
}
add_action( 'woocommerce_created_customer', 'wooc_save_extra_register_fields' );
Я добавил маску и несколько функций для валидации данных. Эта информация сохраняется и отображается на панели управления WordPress с помощью этого кода:
function theme_add_user_cpf_column( $columns ) {
$columns['billing_cpf'] = __( 'CPF', 'theme' );
return $columns;
}
add_filter( 'manage_users_columns', 'theme_add_user_cpf_column' );
function theme_show_user_cpf_data( $value, $column_name, $user_id ) {
if( 'billing_cpf' == $column_name ) {
return get_user_meta( $user_id, 'billing_cpf', true );
}
}
add_action( 'manage_users_custom_column', 'theme_show_user_cpf_data', 10, 3 );
Все работает нормально, но мне нужно проверить, существует ли мета billing_cpf
перед сохранением (уникальная информация для каждого пользователя). Как я могу это сделать?
$havemeta = get_user_meta($user_id, 'billing_cpf', false);
if ($havemeta)
// do something
} else {
// do something
}
Попробуйте это
Вы можете использовать это
$prev_value = get_post_meta($customer_id, "billing_cpf", true);
if ( isset( $_POST['billing_cpf'] ) && trim($_POST['billing_cpf']) != "" ) {
if($prev_value != "") {
// do something
} else {
// do another thing
}
}
Ответ или решение
Вопрос об уникальной проверке поля ‘billing_cpf’ при регистрации пользователя связан с добавлением дополнительного поля в процессе регистрации WooCommerce и необходимостью удостовериться, что данное значение не было использовано ранее. Давайте разберемся, как этого добиться.
Анализ задачи
В текущей реализации скрипта используется дополнительное поле ‘billing_cpf’, которое необходимо сохранить в пользовательских метаданных после регистрации. Однако возникает необходимость удостовериться, что ‘billing_cpf’ уникален для каждого пользователя, иначе регистрация может привести к конфликтам данных.
Шаги решения
-
Проверка существования значения: Перед обновлением пользовательских метаданных необходимо проверить, существует ли уже такое значение в базе данных, и, если существует, сообщить об этом.
-
Обработчик ошибок: Если значение уже существует, должен быть предусмотрен механизм предупреждения пользователя о том, что введенный ‘CPF’ уже используется.
Реализация
Шаг 1: Проверка перед сохранением
Вы можете использовать функцию get_users()
для поиска среди всех пользователей уже использованного значения ‘billing_cpf’. Например:
function wooc_save_extra_register_fields($customer_id) {
if ( isset($_POST['billing_cpf']) ) {
$new_cpf = sanitize_text_field($_POST['billing_cpf']);
// Поиск пользователей с таким же CPF
$args = array(
'meta_key' => 'billing_cpf',
'meta_value' => $new_cpf,
'exclude' => array($customer_id), // Исключаем текущего пользователя в случае редактирования
);
$users_with_same_cpf = get_users($args);
if ( empty($users_with_same_cpf) ) {
// Если нет пользователей с таким же CPF, сохраняем его
update_user_meta($customer_id, 'billing_cpf', $new_cpf);
} else {
// Вывод сообщения о том, что CPF уже используется
wc_add_notice(__('Этот CPF уже зарегистрирован. Пожалуйста, используйте другой.', 'woocommerce'), 'error');
}
}
}
add_action('woocommerce_created_customer', 'wooc_save_extra_register_fields');
Шаг 2: Улучшение пользовательского опыта
-
Информативные сообщения: WooCommerce предоставляет механизм отображения сообщений с помощью функции
wc_add_notice()
. Это позволяет сообщать пользователю о причинах невозможности сохранения его данных. -
Проверка до отправки формы: Вы также можете предусмотреть дополнительные проверки на стороне клиента с использованием JavaScript, что предотвратит отправку формы при обнаружении дубликатов еще до обращения к серверу.
Заключение
Реализация уникального ‘billing_cpf’ требует проверки существования данного значения до его сохранения. Это обеспечивает целостность данных и предотвращает возможные дубли. Использование get_users()
позволяет эффективно и безопасно выполнять эту проверку в WordPress и WooCommerce. Рассмотренное решение также включает в себя обработку ошибок с информированием пользователя о необходимости использовать уникальное значение.