Создание уникального ID для пользователя

20 сент. 2012 г., 13:49:02
Просмотры: 17K
Голосов: 0

Мне нужно создать сайт с членством, и я хочу, чтобы каждый зарегистрированный пользователь получал автоматический ID номер.

Например:

  • Пользователь 2 - имеет код pay-102

  • Пользователь 3 - имеет код pay-103

Я поискал на форуме и нашел это, это почти то, что мне нужно - Какой самый быстрый способ сгенерировать уникальный ID номер при регистрации пользователя

У меня есть код, который добавит поле в панель пользователя в админке:

function fb_add_custom_user_profile_fields( $user ) {
?>
<h3><?php _e('Дополнительная информация профиля', 'themename'); ?></h3>
<table class="form-table">
    <tr>
        <th>
            <label for="memnumber"><?php _e('Номер участника', 'themename'); ?>
        </label></th>
        <td>
            <input type="text" name="memnumber" id="memnumber" value="<?php echo esc_attr( get_the_author_meta( 'memnumber', $user->ID ) ); ?>" class="regular-text" /><br />
            <span class="description"><?php _e('Пожалуйста, введите ваш номер участника.', 'themename'); ?></span>
        </td>
    </tr>
</table>
<?php }
function fb_save_custom_user_profile_fields( $user_id ) {
if ( !current_user_can( 'edit_user', $user_id ) )
    return FALSE;
update_usermeta( $user_id, 'memnumber', $_POST['memnumber'] );
}
add_action( 'show_user_profile', 'fb_add_custom_user_profile_fields' );
add_action( 'edit_user_profile', 'fb_add_custom_user_profile_fields' );
add_action( 'personal_options_update', 'fb_save_custom_user_profile_fields' );
add_action( 'edit_user_profile_update', 'fb_save_custom_user_profile_fields' );

Как мне заполнить это поле автоматически генерируемым инкрементным номером?

4
Комментарии

Привет, Энди.. Не совсем понимаю, зачем создавать дополнительный уникальный ID для каждого пользователя. Каждый зарегистрированный пользователь в WP уже имеет уникальный ID пользователя? Полагаю, пользователи не должны иметь возможности редактировать свой собственный ID, так как это может вызвать конфликты?

Lars Koudal Lars Koudal
20 сент. 2012 г. 13:52:20

Ещё вопрос: если это поле заполняется из базы данных wp_users, и 'админ' изменит номер на другой, будет ли это изменение сохранено в базе данных?

Andy Andy
20 сент. 2012 г. 13:53:19

Привет, Ларс. У клиента уже есть своя система нумерации участников, и он спросил, можно ли продолжить в том же формате (в идеале - просто изменить номер). Лично я не вижу в этом смысла, так как это странный запрос, но хотел бы узнать, возможно ли это сделать, вызовет ли это какие-то проблемы и т.д...

Andy Andy
20 сент. 2012 г. 13:55:40

Привет, Энди. Я добавил ответ с нужным тебе кодом. Если у клиента нет особых причин для такого запроса, я бы не стал реализовывать этот код. Но это мое мнение :-)

Lars Koudal Lars Koudal
20 сент. 2012 г. 15:03:15
Все ответы на вопрос 2
0

Вот код, который считывает наибольший номер из таблицы метаданных пользователя и затем добавляет +1 к этому номеру. Этот номер сохраняется для каждого нового зарегистрированного пользователя. Код выполняется через хук действия "user_register".

add_action( 'user_register', 'assignuserid');

function assignuserid($user_id) {
   global $wpdb;
   $latestid=$wpdb->get_var("SELECT meta_value from $wpdb->usermeta where meta_key='memnumber' order by meta_value DESC limit 1;");
   update_user_meta( $user_id, 'memnumber', $latestid+1 );
}

Примечание: Если префикс "pay-" фиксированный, он не должен быть частью кода, сохраняющего значение, а только частью вывода. Например:

echo "Ваш ID пользователя: PAY-"+$userid.
20 сент. 2012 г. 14:58:26
1

Вот лучшее решение:

add_filter("user_register", "get_unique");
function get_unique($user_id){
    $prefix = "PAY-";
    do {
        $unique = mt_rand();
        $unique = substr($unique, 0, 3);
        $unique = $prefix . $unique;
    } while (!check_unique($unique));
    return update_usermeta( $user_id, 'memnumber', $unique );//$unique;
}
function check_unique($unique) {
    global $wpdb;
    $result = $wpdb->get_var("SELECT meta_value from $wpdb->usermeta where meta_key='memnumber' AND meta_value = '$unique'");
    if(empty($result))
        return true;
    return false;
}
27 сент. 2014 г. 04:28:57
Комментарии

Пожалуйста, добавьте объяснение к вашему ответу: почему это может решить проблему?

fuxia fuxia
27 сент. 2014 г. 04:39:39