generar número único al registrar un usuario

6 mar 2015, 06:23:23
Vistas: 13.7K
Votos: 1

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?

1
Comentarios

¿Puede este número estar basado en el userID? Por ejemplo, ¿2014xxxxuserID?

Krzysiek Dróżdż Krzysiek Dróżdż
6 mar 2015 08:33:56
Todas las respuestas a la pregunta 1
3

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
}
6 mar 2015 12:47:54
Comentarios

¡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?

pakwai122 pakwai122
9 mar 2015 11:01:43

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

David Gard David Gard
9 mar 2015 11:25:16

@pakc1202 - He actualizado la función my_on_user_register() para formatear el número aleatorio como solicitaste, y he añadido una nota sobre cómo mostrarlo en el perfil de Usuario.

David Gard David Gard
9 mar 2015 11:45:12