генерация уникального номера при регистрации пользователя
Я знаю, что в базе данных есть userID
и username
, но мне нужен форматированный уникальный номер для использования в реальном мире.
Например: "2014xxxx", где 2014 - год, а xxxx - случайно сгенерированные цифры при регистрации пользователя.
Возможно ли это?
Если возможно, какой самый простой и быстрый способ реализовать это?

Это выполнит то, что вам нужно, и обе функции должны быть размещены в вашем файле functions.php.
Функция my_random_string()
принимает аргументы, поэтому вы можете добавить данные до/после строки, а также изменить длину строки и символы, используемые для генерации строки.
/**
* Генерация строки случайных символов
*
* @param array $args Аргументы для использования в этой функции
* @return string|null Сгенерированная случайная строка (возвращается только если 'if($args['echo'] === false)')
*/
function my_random_string($args = array()){
$defaults = array( // Устанавливаем значения по умолчанию для использования в функции
'characters' => '0123456789',
'length' => 10,
'before' => '',
'after' => '',
'echo' => false
);
$args = wp_parse_args($args, $defaults); // Объединяем переданные аргументы с значениями по умолчанию для формирования итогового массива '$args'
if(absint($args['length']) < 1) // Проверяем, что длина валидна
return;
$characters_count = strlen($args['characters']); // Определяем количество символов, из которых будет собираться случайная строка
for($i = 0; $i <= $args['length']; $i++) : // Генерируем случайный символ для каждого из '$args['length']'
$start = mt_rand(0, $characters_count);
$random_string.= substr($args['characters'], $start, 1);
endfor;
$random_string = $args['before'] . $random_string . $args['after']; // Добавляем строки before и after к случайной строке
if($args['echo']) : // Проверяем, нужно ли выводить случайную строку или возвращать её
echo $random_string;
else :
return $random_string;
endif;
}
Здесь вы видите функцию my_on_user_register()
, которая срабатывает при регистрации нового пользователя и добавляет запись в таблицу wp_usermeta
с ключом random_number
, но, конечно, вы можете изменить название этого ключа по своему усмотрению.
Я также рекомендую вам ознакомиться с Кодексом для действия user_register
.
/**
* При регистрации пользователя генерирует случайное число и добавляет его в таблицу usermeta
*
* @param required integer $user_id ID только что зарегистрированного пользователя
*/
add_action('user_register', 'my_on_user_register');
function my_on_user_register($user_id){
$args = array(
'length' => 6,
'before' => date("Y")
);
$random_number = my_random_string($args);
update_user_meta($user_id, 'random_number', $random_number);
}
Изменения
Согласно вашему комментарию, функция обратного вызова my_on_user_register()
теперь будет генерировать число, начинающееся с текущего года и заканчивающееся случайной 6-значной строкой (состоящей только из цифр).
Вы также можете использовать следующую функцию обратного вызова my_extra_user_profile_fields()
для вывода случайного числа на странице профиля пользователя. Однако обратите внимание, что этот код не позволяет пользователю редактировать это число.
/**
* Выводит дополнительные данные на странице профиля пользователя
*
* @param WP_User $user Объект свойств текущего отображаемого пользователя
*/
add_action('show_user_profile', 'my_extra_user_profile_fields');
add_action('edit_user_profile', 'my_extra_user_profile_fields');
function my_extra_user_profile_fields($user){
$random_number = get_the_author_meta('random_number', $user->ID);
?>
<h3><?php _e('Дополнительные свойства'); ?></h3>
<table class="form-table">
<tr>
<th><label for="address"><?php _e('Случайное число'); ?></label></th>
<td><?php echo $random_number; ?></td>
</tr>
</table>
<?php
}

Спасибо за помощь! Я вижу случайное число в базе данных. Вот в чем вопрос: могу ли я взять первые четыре цифры как текущий год, а остальные оставить как случайное число? Также, как я могу вывести это число на странице профиля пользователя?

@pakc1202 - Вы хотите иметь возможность редактировать случайное число на странице профиля или просто просматривать его?
