From 06f40d452c41b0335cee6cd37e37daaf844fbbae Mon Sep 17 00:00:00 2001 From: champsupertramp Date: Sat, 27 Aug 2016 21:58:44 +0800 Subject: [PATCH] Fix duplicate profile url slugs and cases --- core/um-actions-profile.php | 1 + core/um-actions-save-profile.php | 62 +++++++++----------------- core/um-filters-user.php | 34 +++++++------- core/um-permalinks.php | 76 ++++++++++++++++++++------------ core/um-user.php | 73 +++++++++++++++++++++++------- 5 files changed, 147 insertions(+), 99 deletions(-) diff --git a/core/um-actions-profile.php b/core/um-actions-profile.php index f4e48401..5d6e1312 100644 --- a/core/um-actions-profile.php +++ b/core/um-actions-profile.php @@ -118,6 +118,7 @@ do_action('um_after_user_updated', um_user('ID') ); do_action('um_after_user_upload', um_user('ID') ); do_action('um_user_after_updating_profile', $to_update ); + do_action('um_update_profile_full_name', $to_update ); if ( !isset( $args['is_signup'] ) ) { $url = $ultimatemember->permalinks->profile_url(); diff --git a/core/um-actions-save-profile.php b/core/um-actions-save-profile.php index 6a167d95..b83a73b4 100644 --- a/core/um-actions-save-profile.php +++ b/core/um-actions-save-profile.php @@ -7,46 +7,6 @@ function um_update_profile_full_name( $changes ) { global $ultimatemember; - if ( isset( $changes['first_name'] ) && isset( $changes['last_name'] ) ) { - - $full_name = $ultimatemember->user->profile['display_name']; - $full_name = $ultimatemember->validation->safe_name_in_url( $full_name ); - - /* duplicate or not */ - if ( $ultimatemember->user->user_has_metadata( 'full_name', $full_name ) ) { - - $duplicates = $ultimatemember->user->user_has_metadata( 'full_name', $full_name ); - if ( !get_option("um_duplicate_name_{$full_name}") ) { - - update_option("um_duplicate_name_{$full_name}", $duplicates ); - $full_name = $full_name . '.' . $duplicates; - - } else { - - if ( um_user('_duplicate_id') ) { - $duplicates = um_user('_duplicate_id'); - } else { - $duplicates = get_option("um_duplicate_name_{$full_name}") + 1; - update_option("um_duplicate_name_{$full_name}", $duplicates ); - update_user_meta( $ultimatemember->user->id, '_duplicate_id', $duplicates ); - } - - $full_name = $full_name . '.' . $duplicates; - - } - - } else { - - if ( um_user('_duplicate_id') && $full_name != str_replace( '.' . um_user('_duplicate_id'), '' , um_user('full_name') ) ) { - $duplicates = um_user('_duplicate_id'); - $full_name = str_replace( '.' . um_user('_duplicate_id'), '', $full_name); - } - } - - update_user_meta( $ultimatemember->user->id, 'full_name', $full_name ); - - - } // Sync display name changes $option = um_get_option('display_name'); @@ -78,6 +38,26 @@ } if ( isset( $update_name ) ) { - wp_update_user( array( 'ID' => $user_id, 'display_name' => $update_name ) ); + + $return = wp_update_user( array( 'ID' => $user_id, 'display_name' => $update_name ) ); + + if( is_wp_error( $return ) ) { + wp_die( $return->get_error_message() ); + } + + } + + if ( isset( $changes['first_name'] ) && isset( $changes['last_name'] ) ) { + + $full_name = $ultimatemember->user->profile['display_name']; + $full_name = $ultimatemember->validation->safe_name_in_url( $full_name ); + + update_user_meta( $ultimatemember->user->id, 'full_name', $full_name ); + + + } + + + } \ No newline at end of file diff --git a/core/um-filters-user.php b/core/um-filters-user.php index b4311010..b64e00c3 100644 --- a/core/um-filters-user.php +++ b/core/um-filters-user.php @@ -83,30 +83,34 @@ global $wpdb; $permalink_base = um_get_option('permalink_base'); - $user_query = new WP_User_Query( + + $user_query = new WP_User_Query( array( 'meta_query' => array( 'relation' => 'AND', array( - 'key' => 'um_user_profile_url_slug_name_'.$raw, - ), - array( - 'key' => 'account_status', - 'value' => 'awaiting_admin_review', - 'compare' => '!=' + 'key' => 'um_user_profile_url_slug_'.$permalink_base, + 'value' => $raw, + 'compare' => '=' ) - ) - ) + ), + 'fields' => array('ID') + ) - ); - $result = current( $user_query->get_results() ); - $slugname = ''; + ); - if( isset( $result->data->ID ) ){ - $slugname = get_user_meta( $result->data->ID, 'um_user_profile_url_slug_name_'.$raw, true ); - $value = $slugname; + if( $user_query->total_users > 0 ){ + + $result = current( $user_query->get_results() ); + $slugname = ''; + + if( isset( $result->ID ) ){ + $slugname = get_user_meta( $result->ID, 'um_user_profile_url_slug_'.$permalink_base, true ); + $value = $slugname; + } } + $value = apply_filters("um_permalink_base_before_filter", $value ); $raw_value = $value; diff --git a/core/um-permalinks.php b/core/um-permalinks.php index f8f7574d..ceb30f13 100644 --- a/core/um-permalinks.php +++ b/core/um-permalinks.php @@ -12,6 +12,8 @@ class UM_Permalinks { add_action('init', array(&$this, 'activate_account_via_email_link'), 1); + add_action('um_user_after_updating_profile', array(&$this, 'profile_url'), 1 ); + remove_action( 'wp_head', 'rel_canonical' ); add_action('wp_head', array(&$this, 'um_rel_canonical_'), 9 ); @@ -232,13 +234,12 @@ class UM_Permalinks { /*** *** @get profile url for set user ***/ - function profile_url() { + function profile_url( $to_updated = null ) { global $ultimatemember, $wpdb; $page_id = $this->core['user']; $profile_url = get_permalink( $page_id ); - $profile_url = apply_filters('um_localize_permalink_filter', $this->core, $page_id, $profile_url ); // Username @@ -262,29 +263,62 @@ class UM_Permalinks { } } + // Permalink base + $permalink_base = um_get_option('permalink_base'); // User ID - if ( um_get_option('permalink_base') == 'user_id' ) { + if ( $permalink_base == 'user_id' ) { $user_in_url = um_user('ID'); } - + // Fisrt and Last name $full_name_permalinks = array( 'name', 'name_dash', 'name_plus' ); - if( in_array( um_get_option( 'permalink_base'), $full_name_permalinks ) ) + if( in_array( $permalink_base, $full_name_permalinks ) ) { - $full_name = um_user( 'full_name' ); - $last_name = um_user( 'last_name' ); + $opt_display_name = um_get_option('display_name'); $first_name = um_user( 'first_name' ); + $last_name = um_user( 'last_name' ); + $full_name = um_user( 'display_name' ); - $count = intval( um_is_meta_value_exists( 'full_name', $full_name ) ); + if( in_array( $permalink_base, array( 'user_login' ) ) ){ + $search = um_user( 'display_name' ); + }else{ + $search = "{$first_name} {$last_name}"; + } + // Remove double spaces + $full_name = preg_replace('/\s+/', ' ', $full_name); + $search = preg_replace('/\s+/', ' ', $search ); + // Check for duplicate names + $args = array( + 'search' => $search, + 'search_columns' => array( 'display_name' ), + 'orderby' => 'registered', + 'order' => 'ASC', + 'fields' => array('user_registered','ID') + ); - if( $count > 1 ) - { - $full_name .= ' ' . um_user( 'ID' ); + $user_query = new WP_User_Query( $args ); + + $duplicate_hash_name = md5( $full_name ); + + if( $user_query->total_users > 1 ){ + + $duplicate_names = $user_query->get_results(); + + $current = current( $duplicate_names ); + + update_option("um_duplicate_name_{$duplicate_hash_name}", $current->ID ); + } - switch( um_get_option('permalink_base') ) + $duplicate_id = get_option("um_duplicate_name_{$duplicate_hash_name}"); + + if( ! empty( $duplicate_id ) && $duplicate_id != um_user('ID') ){ + $full_name = $full_name.' ' . um_user( 'ID' ); + } + + switch( $permalink_base ) { case 'name': // dotted @@ -313,12 +347,6 @@ class UM_Permalinks { $difficulties++; } - - if( $difficulties > 0 ){ - update_user_meta( um_user('ID'), 'um_user_profile_url_slug_name_'.$full_name_slug, $full_name ); - } - - $user_in_url = rawurlencode( $full_name_slug ); break; @@ -350,10 +378,6 @@ class UM_Permalinks { $full_name_slug = str_replace( '.' , '-', $full_name_slug ); $full_name_slug = str_replace( '--' , '-', $full_name_slug ); - if( $difficulties > 0 ){ - update_user_meta( um_user('ID'), 'um_user_profile_url_slug_name_'.$full_name_slug, $full_name ); - } - $user_in_url = rawurlencode( $full_name_slug ); break; @@ -389,20 +413,18 @@ class UM_Permalinks { $full_name_slug = str_replace( '.' , '+', $full_name_slug ); $full_name_slug = str_replace( '++' , '+', $full_name_slug ); - if( $difficulties > 0 ){ - update_user_meta( um_user('ID'), 'um_user_profile_url_slug_name_'.$full_name_slug, $full_name ); - } - $user_in_url = $full_name_slug; break; } } + update_user_meta( um_user('ID'), 'um_user_profile_url_slug_'.$permalink_base, strtolower( $user_in_url ) ); + if ( get_option('permalink_structure') ) { $profile_url = trailingslashit( untrailingslashit( $profile_url ) ); - $profile_url = $profile_url . $user_in_url . '/'; + $profile_url = $profile_url . strtolower( $user_in_url ). '/'; } else { diff --git a/core/um-user.php b/core/um-user.php index 49b8b92a..b99181de 100644 --- a/core/um-user.php +++ b/core/um-user.php @@ -7,6 +7,7 @@ class UM_User { $this->id = 0; $this->usermeta = null; $this->data = null; + $this->profile = null; $this->banned_keys = array( 'metabox','postbox','meta-box', @@ -373,9 +374,10 @@ class UM_User { do_action('um_before_user_role_is_changed'); + $this->profile['role'] = $role; + do_action('um_member_role_upgrade', $role, $this->profile['role'] ); - $this->profile['role'] = $role; $this->update_usermeta_info('role'); do_action('um_after_user_role_is_changed'); @@ -875,10 +877,7 @@ class UM_User { $args['ID'] = $this->id; $changes = apply_filters('um_before_update_profile', $changes, $this->id); - // hook for name changes - do_action('um_update_profile_full_name', $changes ); - - // save or update profile meta + // save or update profile meta foreach( $changes as $key => $value ) { if ( !in_array( $key, $this->update_user_keys ) ) { @@ -929,27 +928,69 @@ class UM_User { function user_exists_by_name( $value ) { global $ultimatemember; + + // Permalink base + $permalink_base = um_get_option('permalink_base'); + + $raw_value = $value; $value = $ultimatemember->validation->safe_name_in_url( $value ); $value = um_clean_user_basename( $value ); - // if duplicate full name, return the user id - if( preg_match( '/( |\.|\-)\d+$/', $value, $matches ) ) - { - return $matches[0]; - } + // Search by Profile Slug + $args = array( + "fields" => array("ID"), + 'meta_query' => array( + 'relation' => 'OR', + array( + 'key' => 'um_user_profile_url_slug_'.$permalink_base, + 'value' => strtolower( $raw_value ), + 'compare' => '=' + + ) + + ) + ); - $ids = get_users(array( 'fields' => 'ID', 'meta_key' => 'full_name','meta_value' => $value ,'meta_compare' => '=') ); - if ( isset( $ids[0] ) && ! empty( $ids[0] ) ){ - return $ids[0]; + + $ids = new WP_User_Query( $args ); + + if( $ids->total_users > 0 ){ + $um_user_query = current( $ids->get_results() ); + return $um_user_query->ID; + } + + // Search by Display Name or ID + $args = array( + "fields" => array("ID"), + "search" => $value, + 'search_columns' => array( 'display_name','ID' ) + ); + + $ids = new WP_User_Query( $args ); + + if( $ids->total_users > 0 ){ + $um_user_query = current( $ids->get_results() ); + return $um_user_query->ID; } + // Search By User Login $value = str_replace(".", "_", $value ); $value = str_replace(" ", "", $value ); - $user = get_user_by( 'login', $value ); - if ( isset( $user->ID ) && $user->ID > 0 ){ - return $user->ID; + $args = array( + "fields" => array("ID"), + "search" => $value, + 'search_columns' => array( + 'user_login', + ) + ); + + $ids = new WP_User_Query( $args ); + + if( $ids->total_users > 0 ){ + $um_user_query = current( $ids->get_results() ); + return $um_user_query->ID; } return false;