generar número único al registrar un usuario
Sé que existen userID
y username
en la base de datos, pero necesito un número formateado y único para uso en el mundo físico.
Por ejemplo: "2014xxxx" donde 2014 es el año y xxxx son dígitos generados aleatoriamente al registrar un usuario.
¿Es posible hacer esto?
Si es posible, ¿cuál sería la forma más simple y rápida de implementarlo?
Esto hará lo que deseas, y ambas funciones deben colocarse dentro de tu archivo functions.php.
La función my_random_string()
acepta argumentos, por lo que puedes agregar datos antes/después de la cadena, así como cambiar la longitud de la cadena y los caracteres utilizados para generarla.
/**
* Genera una cadena de caracteres aleatorios
*
* @param array $args Los argumentos a usar para esta función
* @return string|null La cadena aleatoria generada por esta función (solo 'if($args['echo'] === false)')
*/
function my_random_string($args = array()){
$defaults = array( // Establece algunos valores predeterminados para que la función los use
'characters' => '0123456789',
'length' => 10,
'before' => '',
'after' => '',
'echo' => false
);
$args = wp_parse_args($args, $defaults); // Combina los argumentos pasados por el usuario con los predeterminados para generar un array '$args' final
if(absint($args['length']) < 1) // Asegura que la longitud sea válida
return;
$characters_count = strlen($args['characters']); // Cuenta cuántos caracteres se usarán para armar la cadena aleatoria
for($i = 0; $i <= $args['length']; $i++) : // Genera un carácter aleatorio por cada '$args['length']'
$start = mt_rand(0, $characters_count);
$random_string.= substr($args['characters'], $start, 1);
endfor;
$random_string = $args['before'] . $random_string . $args['after']; // Agrega las cadenas 'before' y 'after' a la cadena aleatoria
if($args['echo']) : // Verifica si la cadena aleatoria debe mostrarse o devolverse
echo $random_string;
else :
return $random_string;
endif;
}
Aquí tienes la función my_on_user_register()
, que se ejecuta cada vez que se genera un nuevo usuario y agrega una entrada en la tabla wp_usermeta
con la clave random_number
, aunque obviamente puedes cambiar el nombre de esta clave según sea necesario.
También te recomiendo que eches un vistazo al Codex para la acción user_register
.
/**
* Al registrar un usuario, genera un número aleatorio y agrégalo a la tabla usermeta
*
* @param required integer $user_id El ID del usuario recién registrado
*/
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);
}
Edición
Según tu comentario, la función de devolución de llamada my_on_user_register()
ahora generará un número que comienza con el año actual y termina con una cadena aleatoria de 6 caracteres (solo números).
También puedes usar la siguiente función de devolución de llamada my_extra_user_profile_fields()
para mostrar el número aleatorio en la página de perfil del usuario. Ten en cuenta que este código no permite al usuario editar ese número.
/**
* Muestra datos adicionales en la página de perfil del usuario
*
* @param WP_User $user Propiedades del objeto para el usuario actual que se está mostrando
*/
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('Propiedades Personalizadas'); ?></h3>
<table class="form-table">
<tr>
<th><label for="address"><?php _e('Número Aleatorio'); ?></label></th>
<td><?php echo $random_number; ?></td>
</tr>
</table>
<?php
}

¡Gracias por tu ayuda! Puedo ver el número aleatorio en la base de datos. Aquí está la cuestión, ¿puedo tomar los primeros cuatro dígitos como el año actual y el resto como número aleatorio? También, ¿cómo puedo mostrar el número en la página de perfil del usuario?

@pakc1202 - ¿Quieres poder editar el número aleatorio en la página de perfil, o solo verlo?
