wordpresscustomizationusermetadata

Create membership number for existing/new users


I have a membership site with 4000+ users currently on it.

I am needing to give both new/existing users an automatic ID number.

its very similar to this: Create Unique ID for user

However, this only works for new users, I need it to work for the current users too. So for instance, user id 3421 would get membership number 3421.

This is what I have so far: (pretty much all from above link)

function fb_add_custom_user_profile_fields( $user ) { ?>
        <h3><?php _e('Extra Profile Information', 'Avada'); ?></h3>
            <table class="form-table">
                <tr>
                    <th>
                        <label for="memnumber"><?php _e('Membership Number', 'Avada'); ?>
                        </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 />
                    </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' );




    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 );
}

The solution would need to be safe for the current users.

Any advice would be appreciated.


Solution

  • In the end this is how I managed it:

    What I did was:

    1. Ensure Membership Number Matches User ID

      • Set memnumber as the user_id when a user registers.
    2. Update Existing Users

      • Create a one-time function that assigns a membership number to users who don’t have one
    // Display Membership Number in User Profile
    function fb_add_custom_user_profile_fields($user) { ?>
        <h3><?php _e('Extra Profile Information', 'Avada'); ?></h3>
        <table class="form-table">
            <tr>
                <th><label for="memnumber"><?php _e('Membership Number', 'Avada'); ?></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 />
                </td>
            </tr>
        </table>
    <?php }
    
    add_action('show_user_profile', 'fb_add_custom_user_profile_fields');
    add_action('edit_user_profile', 'fb_add_custom_user_profile_fields');
    
    // Save Membership Number (if manually updated)
    function fb_save_custom_user_profile_fields($user_id) {
        if (!current_user_can('edit_user', $user_id)) return false;
        update_user_meta($user_id, 'memnumber', sanitize_text_field($_POST['memnumber']));
    }
    
    add_action('personal_options_update', 'fb_save_custom_user_profile_fields');
    add_action('edit_user_profile_update', 'fb_save_custom_user_profile_fields');
    
    // Assign Membership Number on Registration
    function assignuserid($user_id) {
        if (!get_user_meta($user_id, 'memnumber', true)) {
            update_user_meta($user_id, 'memnumber', $user_id);
        }
    }
    
    add_action('user_register', 'assignuserid');
    
    // One-Time Function to Assign Membership Number to Existing Users
    function assign_existing_users_ids() {
        $users = get_users([
            'meta_key'   => 'memnumber',
            'meta_value' => '',
            'compare'    => 'NOT EXISTS'
        ]);
    
        foreach ($users as $user) {
            update_user_meta($user->ID, 'memnumber', $user->ID);
        }
    }