global $wpdb;
if ( !
is_numeric( $user_id ) ) return false;
$meta_key =
preg_replace('|[^a-z0-9_]|i', '',
$meta_key);
/** @todo Might need fix because usermeta data is assumed to be already escaped */
if ( is_string($meta_value) ) $meta_value =
stripslashes($meta_value);
$meta_value =
maybe_serialize($meta_value);
if (empty($meta_value)) { return delete_usermeta($user_id,
$meta_key);
} $cur =
$wpdb->
get_row( $wpdb->
prepare("SELECT * FROM
$wpdb->usermeta WHERE user_id = %d AND meta_key = %s",
$user_id,
$meta_key) );
if ( $cur ) do_action( 'update_usermeta',
$cur->umeta_id,
$user_id,
$meta_key,
$meta_value );
if ( !
$cur ) $wpdb->
insert($wpdb->usermeta,
compact('user_id', 'meta_key', 'meta_value'
) );
elseif ( $cur->meta_value !=
$meta_value ) $wpdb->
update($wpdb->usermeta,
compact('meta_value'
),
compact('user_id', 'meta_key'
) );