I have a custom user profile field "association_id". I can see the field the underlying wordpess db table (usermeta) with the 'meta_key' as "association_id" and the 'meta_value' whatever that I maintain for each user.

add_action( 'show_user_profile', 'rudr_profile_fields' );
add_action( 'edit_user_profile', 'rudr_profile_fields' );
function rudr_profile_fields( $user ) 
    {
    // let's get custom field values
    $association_id = get_user_meta( $user->ID, 'association_id', true );
    ?>
    <h3>Association Information</h3>
    <table class="form-table">
    <tr>
    <th><label for="association_id">Association_ID</label></th>
    <td>
    <input type="text" name="association_id" id="association_id" value="<?php echo esc_attr( $association_id ) ?>" class="regular-text" />
    <span class="description"><?php _e("Please enter your Association ID (For eg. if RCIC, your license number)."); ?></span>
    </td>
    </tr>
    </table>
    <?php
    }
//avoid self to edit //
//add_action( 'personal_options_update', 'rudr_save_profile_fields' ); //
add_action( 'edit_user_profile_update', 'rudr_save_profile_fields' );
 
function rudr_save_profile_fields( $user_id ) {
    
    if( ! isset( $_POST[ '_wpnonce' ] ) || ! wp_verify_nonce( $_POST[ '_wpnonce' ], 'update-user_' . $user_id ) ) {
        return;
    }
    
    if( ! current_user_can( 'edit_user', $user_id ) ) {
        return;
    }

/* HOLDING SPACE FOR ENHANCED SNIPPED */

//include in the list view of users
add_filter( 'manage_users_columns', 'column_register_association_id' );
add_filter( 'manage_users_custom_column', 'column_display_association_id', 10, 3 );
function column_register_association_id( $columns )
{
    $columns['association_id'] = 'association_id';
    return $columns;
}
 function column_display_association_id( $value, $column_name, $user_id )
{
  $user_info = get_user_meta( $user_id, 'association_id', true );
  if($column_name == 'association_id') return $user_info;
  return $value;
}
//Sort association_id column
function association_id_register_sortable( $columns ) {
   $columns['association_id'] = 'association_id';
   return $columns;
  }

add_filter( 'manage_users_sortable_columns', 'association_id_register_sortable' );
function association_id_orderby( $vars ) {
if ( isset( $vars['orderby'] ) && 'association_id' == $vars['orderby'] ) {
    $vars = array_merge( $vars, array(
    'meta_key' => 'association_id',
    'orderby' => 'meta_value'
   ) );
 }
 return $vars;
}
add_filter( 'request', 'association_id_orderby' );

The preceding works fine and creates a meta key for storing meta value in the metadata wp table.

I want this custom user profile field value that I enter in the user admin page to be unique, verifying with the underlying wordpress database table. So I enhanced the code at the time of creation with the additional lines below. I tried these two snippets in the wordpress child theme, but it throws a critical error. I am on PHP version 8.

I tried two options below at the placeholder location in the above code, replacing the line below.

/* HOLDING SPACE FOR ENHANCED SNIPPED */

Option 1 that I tried.

$checkMeta=$wpdb->get_results("SELECT user_id FROM $wpdb->usermeta WHERE meta_key='association_id' AND meta_value=".$association_id,ARRAY_A);
    if (empty($checkMeta)) {
    update_user_meta( $user_id, 'association_id', sanitize_text_field( $_POST[ 'association_id' ] ) );
    } 

Option 2 that I tried.

$mysqli = new mysqli(SERVER, DBUSER, DBPASS, DATABASE); $result = $mysqli->query("SELECT user_id FROM usermeta WHERE meta_key='association_id' && meta_value=$association_id "); if($result->num_rows == 0) { // row not found, do stuff update_user_meta( $user_id, 'association_id', sanitize_text_field( $_POST[ 'association_id' ] ) ); } else { // row found, do stuff echo ' This ID is already used.'; } $mysqli->close();

Both failed to activate when I tried to create or change the 'association_field' value, throwing critical errors and aborting.

0

There are 0 best solutions below