From 77d3ad9b5662285d48eaaf673a38852b3af00c51 Mon Sep 17 00:00:00 2001 From: Mykyta Synelnikov Date: Sat, 9 Sep 2023 02:21:15 +0300 Subject: [PATCH 1/2] - added hash type for the user permalink like: http://localhost:8000/user/~b866ebabacc30f06c1/; - wpcs + documented new hooks; --- includes/admin/core/class-admin-settings.php | 15 +- includes/core/class-permalinks.php | 26 +- includes/core/class-rewrite.php | 204 ++++++--------- includes/core/class-user.php | 259 +++++++++++------- includes/core/um-filters-user.php | 262 +++++++------------ 5 files changed, 363 insertions(+), 403 deletions(-) diff --git a/includes/admin/core/class-admin-settings.php b/includes/admin/core/class-admin-settings.php index 29b62c94..cabdcb26 100644 --- a/includes/admin/core/class-admin-settings.php +++ b/includes/admin/core/class-admin-settings.php @@ -1019,6 +1019,7 @@ if ( ! class_exists( 'um\admin\core\Admin_Settings' ) ) { 'name_dash' => __( 'First and Last Name with \'-\'', 'ultimate-member' ), 'name_plus' => __( 'First and Last Name with \'+\'', 'ultimate-member' ), 'user_id' => __( 'User ID', 'ultimate-member' ), + 'hash' => __( 'Unique hash string', 'ultimate-member' ), ), 'placeholder' => __( 'Select...', 'ultimate-member' ), ), @@ -2439,9 +2440,11 @@ if ( ! class_exists( 'um\admin\core\Admin_Settings' ) ) { } elseif ( ! empty( $_POST['um_options']['permalink_base'] ) ) { if ( ! empty( $this->need_change_permalinks ) ) { - $users = get_users( array( - 'fields' => 'ids', - ) ); + $users = get_users( + array( + 'fields' => 'ids', + ) + ); if ( ! empty( $users ) ) { foreach ( $users as $user_id ) { UM()->user()->generate_profile_slug( $user_id ); @@ -3701,12 +3704,12 @@ Use Only Cookies: options()->get( 'permalink_base' ); $user_id = $wpdb->get_var( - "SELECT user_id - FROM {$wpdb->usermeta} - WHERE meta_key = 'um_user_profile_url_slug_{$permalink_base}' AND - meta_value = '{$slug}' - ORDER BY umeta_id ASC - LIMIT 1" + $wpdb->prepare( + "SELECT user_id + FROM {$wpdb->usermeta} + WHERE meta_key = %s AND + meta_value = %s + ORDER BY umeta_id ASC + LIMIT 1", + 'um_user_profile_url_slug_' . $permalink_base, + $slug + ) ); if ( ! empty( $user_id ) ) { - return $user_id; + return absint( $user_id ); } return false; @@ -374,9 +378,7 @@ if ( ! class_exists( 'um\core\Permalinks' ) ) { $user_in_url = ''; - $full_name = str_replace( "'", "", $full_name ); - $full_name = str_replace( "&", "", $full_name ); - $full_name = str_replace( "/", "", $full_name ); + $full_name = str_replace( array( "'", '&', '/' ), '', $full_name ); switch ( $permalink_base ) { case 'name': // dotted diff --git a/includes/core/class-rewrite.php b/includes/core/class-rewrite.php index 3cca8331..8595d2b7 100644 --- a/includes/core/class-rewrite.php +++ b/includes/core/class-rewrite.php @@ -1,65 +1,59 @@ config()->permalinks['user'] ) ) { $user_page_id = UM()->config()->permalinks['user']; - $user = get_post( $user_page_id ); + $user = get_post( $user_page_id ); if ( isset( $user->post_name ) ) { - - $user_slug = $user->post_name; + $user_slug = $user->post_name; $newrules[ $user_slug . '/([^/]+)/?$' ] = 'index.php?page_id=' . $user_page_id . '&um_user=$matches[1]'; } @@ -104,12 +96,11 @@ if ( ! class_exists( 'um\core\Rewrite' ) ) { $active_languages = $sitepress->get_active_languages(); foreach ( $active_languages as $language_code => $language ) { - - $lang_post_id = wpml_object_id_filter( $user_page_id, 'post', false, $language_code ); + $lang_post_id = wpml_object_id_filter( $user_page_id, 'post', false, $language_code ); $lang_post_obj = get_post( $lang_post_id ); - if ( isset( $lang_post_obj->post_name ) && $lang_post_obj->post_name != $user->post_name ) { - $user_slug = $lang_post_obj->post_name; + if ( isset( $lang_post_obj->post_name ) && $lang_post_obj->post_name !== $user->post_name ) { + $user_slug = $lang_post_obj->post_name; $newrules[ $user_slug . '/([^/]+)/?$' ] = 'index.php?page_id=' . $lang_post_id . '&um_user=$matches[1]&lang=' . $language_code; } } @@ -117,13 +108,11 @@ if ( ! class_exists( 'um\core\Rewrite' ) ) { } if ( isset( UM()->config()->permalinks['account'] ) ) { - $account_page_id = UM()->config()->permalinks['account']; - $account = get_post( $account_page_id ); + $account = get_post( $account_page_id ); if ( isset( $account->post_name ) ) { - - $account_slug = $account->post_name; + $account_slug = $account->post_name; $newrules[ $account_slug . '/([^/]+)?$' ] = 'index.php?page_id=' . $account_page_id . '&um_tab=$matches[1]'; } @@ -133,12 +122,11 @@ if ( ! class_exists( 'um\core\Rewrite' ) ) { $active_languages = $sitepress->get_active_languages(); foreach ( $active_languages as $language_code => $language ) { - - $lang_post_id = wpml_object_id_filter( $account_page_id, 'post', false, $language_code ); + $lang_post_id = wpml_object_id_filter( $account_page_id, 'post', false, $language_code ); $lang_post_obj = get_post( $lang_post_id ); - if ( isset( $lang_post_obj->post_name ) && $lang_post_obj->post_name != $account->post_name ) { - $account_slug = $lang_post_obj->post_name; + if ( isset( $lang_post_obj->post_name ) && $lang_post_obj->post_name !== $account->post_name ) { + $account_slug = $lang_post_obj->post_name; $newrules[ $account_slug . '/([^/]+)/?$' ] = 'index.php?page_id=' . $lang_post_id . '&um_user=$matches[1]&lang=' . $language_code; } } @@ -148,47 +136,41 @@ if ( ! class_exists( 'um\core\Rewrite' ) ) { return $newrules + $rules; } - /** - * Author page to user profile redirect + * Author page to user profile redirect. */ - function redirect_author_page() { - if ( UM()->options()->get( 'author_redirect' ) && is_author() ) { + public function redirect_author_page() { + if ( is_author() && UM()->options()->get( 'author_redirect' ) ) { $id = get_query_var( 'author' ); um_fetch_user( $id ); - exit( wp_redirect( um_user_profile_url() ) ); + wp_safe_redirect( um_user_profile_url() ); + exit; } } - /** - * Locate/display a profile + * Locate/display a profile. */ - function locate_user_profile() { + public function locate_user_profile() { + $permalink_base = UM()->options()->get( 'permalink_base' ); if ( um_queried_user() && um_is_core_page( 'user' ) ) { - - if ( UM()->options()->get( 'permalink_base' ) == 'user_login' ) { - + if ( 'user_login' === $permalink_base ) { $user_id = username_exists( um_queried_user() ); - //Try if ( ! $user_id ) { - $permalink_base = UM()->options()->get( 'permalink_base' ); - // Search by Profile Slug $args = array( - "fields" => 'ids', + 'fields' => 'ids', 'meta_query' => array( array( - 'key' => 'um_user_profile_url_slug_' . $permalink_base, - 'value' => strtolower( um_queried_user() ), - 'compare' => '=' - ) + 'key' => 'um_user_profile_url_slug_' . $permalink_base, + 'value' => strtolower( um_queried_user() ), + 'compare' => '=', + ), ), - 'number' => 1 + 'number' => 1, ); - $ids = new \WP_User_Query( $args ); if ( $ids->total_users > 0 ) { $user_id = current( $ids->get_results() ); @@ -197,10 +179,10 @@ if ( ! class_exists( 'um\core\Rewrite' ) ) { // Try nice name if ( ! $user_id ) { - $slug = um_queried_user(); - $slug = str_replace( '.', '-', $slug ); + $slug = um_queried_user(); + $slug = str_replace( '.', '-', $slug ); $the_user = get_user_by( 'slug', $slug ); - if ( isset( $the_user->ID ) ){ + if ( isset( $the_user->ID ) ) { $user_id = $the_user->ID; } @@ -211,56 +193,46 @@ if ( ! class_exists( 'um\core\Rewrite' ) ) { if ( ! $user_id ) { $user_id = UM()->user()->user_exists_by_email_as_username( $slug ); } - } - } - if ( UM()->options()->get( 'permalink_base' ) == 'user_id' ) { + if ( 'user_id' === $permalink_base ) { $user_id = UM()->user()->user_exists_by_id( um_queried_user() ); } - if ( in_array( UM()->options()->get( 'permalink_base' ), array( 'name', 'name_dash', 'name_dot', 'name_plus' ) ) ) { + if ( 'hash' === $permalink_base ) { + $user_id = UM()->user()->user_exists_by_hash( um_queried_user() ); + } + + if ( in_array( $permalink_base, array( 'name', 'name_dash', 'name_dot', 'name_plus' ), true ) ) { $user_id = UM()->user()->user_exists_by_name( um_queried_user() ); } /** USER EXISTS SET USER AND CONTINUE **/ - if ( $user_id ) { - + if ( ! empty( $user_id ) ) { um_set_requested_user( $user_id ); - /** - * UM hook + * Fires after setting requested user. * - * @type action - * @title um_access_profile - * @description Action on user access profile - * @input_vars - * [{"var":"$user_id","type":"int","desc":"User ID"}] - * @change_log - * ["Since: 2.0"] - * @usage add_action( 'um_access_profile', 'function_name', 10, 1 ); - * @example - * Some action on user access profile and requested user isset. * add_action( 'um_access_profile', 'my_access_profile', 10, 1 ); * function my_access_profile( $user_id ) { * // your code here * } - * ?> */ do_action( 'um_access_profile', $user_id ); - } else { - - exit( wp_redirect( um_get_core_page( 'user' ) ) ); - + wp_safe_redirect( um_get_core_page( 'user' ) ); + exit; } - } elseif ( um_is_core_page( 'user' ) ) { - if ( is_user_logged_in() ) { // just redirect to their profile - $query = UM()->permalinks()->get_query_array(); $url = um_user_profile_url( um_user( 'ID' ) ); @@ -270,41 +242,33 @@ if ( ! class_exists( 'um\core\Rewrite' ) ) { $url = add_query_arg( $key, $val, $url ); } } - - exit( wp_redirect( $url ) ); - } else { - - /** - * UM hook - * - * @type filter - * @title um_locate_user_profile_not_loggedin__redirect - * @description Change redirect URL from user profile for not logged in user - * @input_vars - * [{"var":"$url","type":"string","desc":"Redirect URL"}] - * @change_log - * ["Since: 2.0"] - * @usage - * - * @example - * - */ - $redirect_to = apply_filters( 'um_locate_user_profile_not_loggedin__redirect', home_url() ); - if ( ! empty( $redirect_to ) ) { - exit( wp_redirect( $redirect_to ) ); - } - + wp_safe_redirect( $url ); + exit; } + /** + * Filters the redirect URL from user profile for not logged-in user. + * + * @param {string} $url Redirect URL. By default, it's a home page. + * + * @return {string} Redirect URL. + * + * @since 1.3.x + * @hook um_locate_user_profile_not_loggedin__redirect + * + * @example Change redirect URL from user profile for not logged-in user to WordPress native login. + * function my_user_profile_not_loggedin__redirect( $url ) { + * // your code here + * $url = wp_login_url(); + * return $url; + * } + * add_filter( 'um_locate_user_profile_not_loggedin__redirect', 'my_user_profile_not_loggedin__redirect' ); + */ + $redirect_to = apply_filters( 'um_locate_user_profile_not_loggedin__redirect', home_url() ); + if ( ! empty( $redirect_to ) ) { + um_safe_redirect( $redirect_to ); + } } - } - } -} \ No newline at end of file +} diff --git a/includes/core/class-user.php b/includes/core/class-user.php index 21276e42..1d7201da 100644 --- a/includes/core/class-user.php +++ b/includes/core/class-user.php @@ -440,11 +440,11 @@ if ( ! class_exists( 'um\core\User' ) ) { $md_data = get_user_meta( $object_id, 'um_member_directory_data', true ); if ( empty( $md_data ) ) { $md_data = array( - 'account_status' => 'approved', - 'hide_in_members' => UM()->member_directory()->get_hide_in_members_default(), - 'profile_photo' => false, - 'cover_photo' => false, - 'verified' => false, + 'account_status' => 'approved', + 'hide_in_members' => UM()->member_directory()->get_hide_in_members_default(), + 'profile_photo' => false, + 'cover_photo' => false, + 'verified' => false, ); } @@ -457,7 +457,7 @@ if ( ! class_exists( 'um\core\User' ) ) { break; case 'synced_gravatar_hashed_id': if ( UM()->options()->get( 'use_gravatars' ) ) { - $profile_photo = get_user_meta( $object_id, 'profile_photo', true ); + $profile_photo = get_user_meta( $object_id, 'profile_photo', true ); $synced_profile_photo = get_user_meta( $object_id, 'synced_profile_photo', true ); $md_data['profile_photo'] = ! empty( $profile_photo ) || ! empty( $synced_profile_photo ); @@ -514,11 +514,11 @@ if ( ! class_exists( 'um\core\User' ) ) { $md_data = get_user_meta( $object_id, 'um_member_directory_data', true ); if ( empty( $md_data ) ) { $md_data = array( - 'account_status' => 'approved', - 'hide_in_members' => UM()->member_directory()->get_hide_in_members_default(), - 'profile_photo' => false, - 'cover_photo' => false, - 'verified' => false, + 'account_status' => 'approved', + 'hide_in_members' => UM()->member_directory()->get_hide_in_members_default(), + 'profile_photo' => false, + 'cover_photo' => false, + 'verified' => false, ); } @@ -527,7 +527,6 @@ if ( ! class_exists( 'um\core\User' ) ) { $md_data['account_status'] = $_meta_value; break; case 'hide_in_members': - $hide_in_members = UM()->member_directory()->get_hide_in_members_default(); if ( ! empty( $_meta_value ) ) { if ( $_meta_value == 'Yes' || $_meta_value == __( 'Yes', 'ultimate-member' ) || @@ -704,14 +703,14 @@ if ( ! class_exists( 'um\core\User' ) ) { * * @return bool|mixed */ - function get_profile_slug( $user_id ) { + public function get_profile_slug( $user_id ) { // Permalink base $permalink_base = UM()->options()->get( 'permalink_base' ); - $profile_slug = get_user_meta( $user_id, "um_user_profile_url_slug_{$permalink_base}", true ); + $profile_slug = get_user_meta( $user_id, "um_user_profile_url_slug_{$permalink_base}", true ); //get default username permalink if it's empty then return false if ( empty( $profile_slug ) ) { - if ( $permalink_base != 'user_login' ) { + if ( 'user_login' !== $permalink_base ) { $profile_slug = get_user_meta( $user_id, 'um_user_profile_url_slug_user_login', true ); } @@ -723,7 +722,6 @@ if ( ! class_exists( 'um\core\User' ) ) { return $profile_slug; } - /** * @param $user_id * @@ -739,6 +737,20 @@ if ( ! class_exists( 'um\core\User' ) ) { return UM()->permalinks()->profile_permalink( $profile_slug ); } + public function generate_user_hash( $user_id ) { + $user_id = absint( $user_id ); + $append = 0; + + while ( 1 ) { + $user_in_url = '~' . substr( strrev( md5( uniqid( 'um_user_hash' . $append, true ) . $user_id ) ), 0, 18 ); + $slug_exists_user_id = UM()->permalinks()->slug_exists_user_id( $user_in_url ); + if ( empty( $slug_exists_user_id ) || $user_id === $slug_exists_user_id ) { + break; + } + $append++; + } + return $user_in_url; + } /** * Generate User Profile Slug and save to meta @@ -746,7 +758,7 @@ if ( ! class_exists( 'um\core\User' ) ) { * @param int $user_id * @param bool $force */ - function generate_profile_slug( $user_id, $force = false ) { + public function generate_profile_slug( $user_id, $force = false ) { $userdata = get_userdata( $user_id ); if ( empty( $userdata ) ) { @@ -757,16 +769,20 @@ if ( ! class_exists( 'um\core\User' ) ) { $current_profile_slug = $this->get_profile_slug( $user_id ); - $user_in_url = ''; + $user_in_url = ''; $permalink_base = UM()->options()->get( 'permalink_base' ); // User ID - if ( $permalink_base == 'user_id' ) { + if ( 'user_id' === $permalink_base ) { $user_in_url = $user_id; } + if ( 'hash' === $permalink_base ) { + $user_in_url = $this->generate_user_hash( $user_id ); + } + // Username - if ( $permalink_base == 'user_login' ) { + if ( 'user_login' === $permalink_base ) { $user_in_url = $userdata->user_login; @@ -790,21 +806,25 @@ if ( ! class_exists( 'um\core\User' ) ) { // Fisrt and Last name $full_name_permalinks = array( 'name', 'name_dash', 'name_plus' ); - if ( in_array( $permalink_base, $full_name_permalinks ) ) { - $separated = array( 'name' => '.', 'name_dash' => '-', 'name_plus' => '+' ); - $separate = $separated[ $permalink_base ]; - $first_name = $userdata->first_name; - $last_name = $userdata->last_name; - $full_name = trim( sprintf( '%s %s', $first_name, $last_name ) ); - $full_name = preg_replace( '/\s+/', ' ', $full_name ); // Remove double spaces + if ( in_array( $permalink_base, $full_name_permalinks, true ) ) { + $separated = array( + 'name' => '.', + 'name_dash' => '-', + 'name_plus' => '+', + ); + $separate = $separated[ $permalink_base ]; + $first_name = $userdata->first_name; + $last_name = $userdata->last_name; + $full_name = trim( sprintf( '%s %s', $first_name, $last_name ) ); + $full_name = preg_replace( '/\s+/', ' ', $full_name ); // Remove double spaces $profile_slug = UM()->permalinks()->profile_slug( $full_name, $first_name, $last_name ); - $append = 0; - $username = $full_name; - $_username = $full_name; + $append = 0; + $username = $full_name; + $_username = $full_name; while ( 1 ) { - $username = $_username . ( empty( $append ) ? '' : " $append" ); + $username = $_username . ( empty( $append ) ? '' : " $append" ); $slug_exists_user_id = UM()->permalinks()->slug_exists_user_id( $profile_slug . ( empty( $append ) ? '' : "{$separate}{$append}" ) ); if ( empty( $slug_exists_user_id ) || $user_id == $slug_exists_user_id ) { break; @@ -839,12 +859,11 @@ if ( ! class_exists( 'um\core\User' ) ) { $user_in_url = apply_filters( 'um_change_user_profile_slug', $user_in_url, $user_id ); - if ( $force || empty( $current_profile_slug ) || $current_profile_slug != $user_in_url ) { + if ( $force || empty( $current_profile_slug ) || $current_profile_slug !== $user_in_url ) { update_user_meta( $user_id, "um_user_profile_url_slug_{$permalink_base}", $user_in_url ); } } - /** * Backend user creation * @@ -961,7 +980,8 @@ if ( ! class_exists( 'um\core\User' ) ) { if ( $userdata !== 'add-new-user' && $userdata !== 'add-existing-user' ) { ?>

- roles ) && count( $userdata->roles ) == 1 ) { $style = 'style="display:none;"'; } - } $class = ( $userdata == 'add-existing-user' ) ? 'um_role_existing_selector_wrapper' : 'um_role_selector_wrapper'; - ob_start(); ?> + ob_start(); + ?> -
> +
>
- id = $user_id; + $this->id = $user_id; $this->usermeta = get_user_meta( $user_id ); - $this->data = get_userdata( $this->id ); + $this->data = get_userdata( $this->id ); } elseif ( is_user_logged_in() && $clean == false ) { - $this->id = get_current_user_id(); - $this->usermeta = get_user_meta($this->id); - $this->data = get_userdata($this->id); + $this->id = get_current_user_id(); + $this->usermeta = get_user_meta( $this->id ); + $this->data = get_userdata( $this->id ); } else { - $this->id = 0; + $this->id = 0; $this->usermeta = null; - $this->data = null; + $this->data = null; } @@ -1203,54 +1224,54 @@ if ( ! class_exists( 'um\core\User' ) ) { // add user data $this->data = $this->toArray( $this->data ); - foreach ( $this->data as $k=>$v ) { - if ( $k == 'roles') { - $this->profile['wp_roles'] = implode(',',$v); - } else if ( is_array( $v ) ) { - foreach($v as $k2 => $v2){ - $this->profile[$k2] = $v2; + foreach ( $this->data as $k => $v ) { + if ( $k == 'roles' ) { + $this->profile['wp_roles'] = implode( ',', $v ); + } elseif ( is_array( $v ) ) { + foreach ( $v as $k2 => $v2 ) { + $this->profile[ $k2 ] = $v2; } } else { - $this->profile[$k] = $v; + $this->profile[ $k ] = $v; } } // add account status - if ( !isset( $this->usermeta['account_status'][0] ) ) { + if ( ! isset( $this->usermeta['account_status'][0] ) ) { $this->usermeta['account_status'][0] = 'approved'; } if ( $this->usermeta['account_status'][0] == 'approved' ) { - $this->usermeta['account_status_name'][0] = __('Approved','ultimate-member'); + $this->usermeta['account_status_name'][0] = __( 'Approved', 'ultimate-member' ); } if ( $this->usermeta['account_status'][0] == 'awaiting_email_confirmation' ) { - $this->usermeta['account_status_name'][0] = __('Awaiting E-mail Confirmation','ultimate-member'); + $this->usermeta['account_status_name'][0] = __( 'Awaiting E-mail Confirmation', 'ultimate-member' ); } if ( $this->usermeta['account_status'][0] == 'awaiting_admin_review' ) { - $this->usermeta['account_status_name'][0] = __('Pending Review','ultimate-member'); + $this->usermeta['account_status_name'][0] = __( 'Pending Review', 'ultimate-member' ); } if ( $this->usermeta['account_status'][0] == 'rejected' ) { - $this->usermeta['account_status_name'][0] = __('Membership Rejected','ultimate-member'); + $this->usermeta['account_status_name'][0] = __( 'Membership Rejected', 'ultimate-member' ); } if ( $this->usermeta['account_status'][0] == 'inactive' ) { - $this->usermeta['account_status_name'][0] = __('Membership Inactive','ultimate-member'); + $this->usermeta['account_status_name'][0] = __( 'Membership Inactive', 'ultimate-member' ); } // add user meta foreach ( $this->usermeta as $k => $v ) { - if ( $k == 'display_name') { + if ( $k == 'display_name' ) { continue; } $this->profile[ $k ] = $v[0]; } // add permissions - $user_role = UM()->roles()->get_priority_user_role( $this->id ); - $this->profile['role'] = $user_role; + $user_role = UM()->roles()->get_priority_user_role( $this->id ); + $this->profile['role'] = $user_role; $this->profile['roles'] = UM()->roles()->get_all_user_roles( $this->id ); $role_meta = UM()->roles()->role_data( $user_role ); @@ -1285,7 +1306,7 @@ if ( ! class_exists( 'um\core\User' ) ) { return array( $key => $item ); }, array_keys( $role_meta ), $role_meta );*/ - $this->profile = array_merge( $this->profile, (array)$role_meta ); + $this->profile = array_merge( $this->profile, (array) $role_meta ); $this->profile['super_admin'] = ( is_super_admin( $this->id ) ) ? 1 : 0; @@ -1296,7 +1317,6 @@ if ( ! class_exists( 'um\core\User' ) ) { $this->setup_cache( $this->id, $this->profile ); } - } } @@ -1307,8 +1327,8 @@ if ( ! class_exists( 'um\core\User' ) ) { * * @param bool $clean */ - function reset( $clean = false ){ - $this->set(0, $clean); + function reset( $clean = false ) { + $this->set( 0, $clean ); } /** @@ -1645,7 +1665,7 @@ if ( ! class_exists( 'um\core\User' ) ) { * */ function approve( $repeat = true ) { - $user_id = um_user('ID'); + $user_id = um_user( 'ID' ); if ( ! $repeat ) { $status = get_user_meta( $user_id, 'account_status', true ); @@ -1828,7 +1848,7 @@ if ( ! class_exists( 'um\core\User' ) ) { if ( is_multisite() ) { if ( ! function_exists( 'wpmu_delete_user' ) ) { - require_once( ABSPATH . 'wp-admin/includes/ms.php' ); + require_once ABSPATH . 'wp-admin/includes/ms.php'; } wpmu_delete_user( $this->id ); @@ -1836,7 +1856,7 @@ if ( ! class_exists( 'um\core\User' ) ) { } else { if ( ! function_exists( 'wp_delete_user' ) ) { - require_once( ABSPATH . 'wp-admin/includes/user.php' ); + require_once ABSPATH . 'wp-admin/includes/user.php'; } wp_delete_user( $this->id ); @@ -1951,10 +1971,15 @@ if ( ! class_exists( 'um\core\User' ) ) { } foreach ( $actions as $id => $arr ) { - $url = add_query_arg( array( 'um_action' => $id, 'uid' => um_profile_id() ) ); + $url = add_query_arg( + array( + 'um_action' => $id, + 'uid' => um_profile_id(), + ) + ); /*$url = add_query_arg( 'um_action', $id ); $url = add_query_arg( 'uid', um_profile_id(), $url );*/ - $items[] = '' . esc_html( $arr['label'] ) . ''; + $items[] = '' . esc_html( $arr['label'] ) . ''; } return $items; } @@ -2202,19 +2227,25 @@ if ( ! class_exists( 'um\core\User' ) ) { $value = UM()->validation()->safe_name_in_url( $value ); - $ids = get_users( array( 'fields' => 'ID', 'meta_key' => $key, 'meta_value' => $value, 'meta_compare' => '=' ) ); + $ids = get_users( + array( + 'fields' => 'ID', + 'meta_key' => $key, + 'meta_value' => $value, + 'meta_compare' => '=', + ) + ); if ( ! isset( $ids ) || empty( $ids ) ) { return false; } foreach ( $ids as $k => $id ) { - if ( $id == um_user('ID') ) { + if ( $id == um_user( 'ID' ) ) { unset( $ids[ $k ] ); } else { $duplicates[] = $id; } - } if ( ! empty( $duplicates ) ) { @@ -2231,29 +2262,28 @@ if ( ! class_exists( 'um\core\User' ) ) { * * @return bool */ - function user_exists_by_name( $value ) { + public function user_exists_by_name( $value ) { // Permalink base $permalink_base = UM()->options()->get( 'permalink_base' ); $raw_value = $value; - $value = UM()->validation()->safe_name_in_url( $value ); - $value = um_clean_user_basename( $value ); + $value = UM()->validation()->safe_name_in_url( $value ); + $value = um_clean_user_basename( $value ); // Search by Profile Slug $args = array( - 'fields' => array( 'ID' ), + 'fields' => array( 'ID' ), 'meta_query' => array( 'relation' => 'OR', array( - 'key' => 'um_user_profile_url_slug_' . $permalink_base, - 'value' => strtolower( $raw_value ), - 'compare' => '=', + 'key' => 'um_user_profile_url_slug_' . $permalink_base, + 'value' => strtolower( $raw_value ), + 'compare' => '=', ), ), ); - $ids = new \WP_User_Query( $args ); if ( $ids->total_users > 0 ) { @@ -2263,9 +2293,9 @@ if ( ! class_exists( 'um\core\User' ) ) { // Search by Display Name or ID $args = array( - 'fields' => array( 'ID' ), - 'search' => $value, - 'search_columns' => array( 'display_name', 'ID' ), + 'fields' => array( 'ID' ), + 'search' => $value, + 'search_columns' => array( 'display_name', 'ID' ), ); $ids = new \WP_User_Query( $args ); @@ -2275,17 +2305,15 @@ if ( ! class_exists( 'um\core\User' ) ) { return $um_user_query->ID; } - // Search By User Login - $value = str_replace( ".", "_", $value ); - $value = str_replace( " ", "", $value ); + $value = str_replace( array( '.', ' ' ), array( '_', '' ), $value ); $args = array( - 'fields' => array( 'ID' ), - 'search' => $value, - 'search_columns' => array( + 'fields' => array( 'ID' ), + 'search' => $value, + 'search_columns' => array( 'user_login', - ) + ), ); $ids = new \WP_User_Query( $args ); @@ -2321,7 +2349,7 @@ if ( ! class_exists( 'um\core\User' ) ) { * */ - function user_exists_by_id( $user_id ) { + public function user_exists_by_id( $user_id ) { $aux = get_userdata( absint( $user_id ) ); if ( $aux == false ) { return false; @@ -2330,6 +2358,38 @@ if ( ! class_exists( 'um\core\User' ) ) { } } + /** + * @param string $hash + * + * @return bool|int + */ + public function user_exists_by_hash( $hash ) { + // Permalink base + $permalink_base = UM()->options()->get( 'permalink_base' ); + $raw_value = $hash; + + // 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 = new \WP_User_Query( $args ); + + if ( $ids->total_users > 0 ) { + $um_user_query = current( $ids->get_results() ); + return $um_user_query->ID; + } + + return false; + } /** * This method checks if a user exists or not in your site based on the user email as username @@ -2355,7 +2415,12 @@ if ( ! class_exists( 'um\core\User' ) ) { $user_id = false; - $ids = get_users( array( 'fields' => 'ID', 'meta_key' => 'um_email_as_username_' . $slug ) ); + $ids = get_users( + array( + 'fields' => 'ID', + 'meta_key' => 'um_email_as_username_' . $slug, + ) + ); if ( ! empty( $ids[0] ) ) { $user_id = $ids[0]; } @@ -2373,11 +2438,11 @@ if ( ! class_exists( 'um\core\User' ) ) { function set_gravatar( $user_id ) { um_fetch_user( $user_id ); - $email_address = um_user( 'user_email' ); + $email_address = um_user( 'user_email' ); $hash_email_address = ''; if ( $email_address ) { - $hash_email_address = md5( $email_address ); + $hash_email_address = md5( $email_address ); $this->profile['synced_gravatar_hashed_id'] = $hash_email_address; $this->update_usermeta_info( 'synced_gravatar_hashed_id' ); } diff --git a/includes/core/um-filters-user.php b/includes/core/um-filters-user.php index 6d8bfe8a..455651ca 100644 --- a/includes/core/um-filters-user.php +++ b/includes/core/um-filters-user.php @@ -1,47 +1,49 @@ -roles()->get_priority_user_role( get_current_user_id() ) ); - $can_edit_users = current_user_can( 'edit_users' ) && $role->has_cap( 'edit_users' ); + $can_edit_users = null !== $role && current_user_can( 'edit_users' ) && $role->has_cap( 'edit_users' ); if ( $can_edit_users ) { + $account_status = um_user( 'account_status' ); - if ( um_user( 'account_status' ) == 'awaiting_admin_review' ) { + if ( 'awaiting_admin_review' === $account_status ) { $actions['um_approve_membership'] = array( 'label' => __( 'Approve Membership', 'ultimate-member' ) ); - $actions['um_reject_membership'] = array( 'label' => __( 'Reject Membership', 'ultimate-member' ) ); + $actions['um_reject_membership'] = array( 'label' => __( 'Reject Membership', 'ultimate-member' ) ); } - if ( um_user( 'account_status' ) == 'rejected' ) { + if ( 'rejected' === $account_status ) { $actions['um_approve_membership'] = array( 'label' => __( 'Approve Membership', 'ultimate-member' ) ); } - if ( um_user( 'account_status' ) == 'approved' ) { + if ( 'approved' === $account_status ) { $actions['um_put_as_pending'] = array( 'label' => __( 'Put as Pending Review', 'ultimate-member' ) ); } - if ( um_user( 'account_status' ) == 'awaiting_email_confirmation' ) { + if ( 'awaiting_email_confirmation' === $account_status ) { $actions['um_resend_activation'] = array( 'label' => __( 'Resend Activation E-mail', 'ultimate-member' ) ); } - if ( um_user( 'account_status' ) != 'inactive' ) { + if ( 'inactive' !== $account_status ) { $actions['um_deactivate'] = array( 'label' => __( 'Deactivate this account', 'ultimate-member' ) ); } - if ( um_user( 'account_status' ) == 'inactive' ) { + if ( 'inactive' === $account_status ) { $actions['um_reenable'] = array( 'label' => __( 'Reactivate this account', 'ultimate-member' ) ); } - } if ( UM()->roles()->um_current_user_can( 'delete', $user_id ) ) { @@ -56,226 +58,150 @@ function um_admin_user_actions_hook( $actions, $user_id ) { } add_filter( 'um_admin_user_actions_hook', 'um_admin_user_actions_hook', 10, 2 ); - /** - * Filter user basename + * Filter user basename. + * * @param string $value + * * @return string - * @hook_filter: um_clean_user_basename_filter */ -function um_clean_user_basename_filter( $value, $raw ){ +function um_clean_user_basename_filter( $value, $raw ) { $permalink_base = UM()->options()->get( 'permalink_base' ); $user_query = new WP_User_Query( array( - 'meta_query' => array( - 'relation' => 'AND', + 'meta_query' => array( + 'relation' => 'AND', array( - 'key' => 'um_user_profile_url_slug_'.$permalink_base, + 'key' => 'um_user_profile_url_slug_' . $permalink_base, 'value' => $raw, - 'compare' => '=' - ) + 'compare' => '=', + ), ), - 'fields' => array('ID') + 'fields' => array( 'ID' ), ) - ); - if( $user_query->total_users > 0 ){ - + 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; + if ( isset( $result->ID ) ) { + $value = get_user_meta( $result->ID, 'um_user_profile_url_slug_' . $permalink_base, true ); } } /** - * UM hook + * Filters the base user permalink value before cleaning. * - * @type filter - * @title um_permalink_base_before_filter - * @description Base permalink before - * @input_vars - * [{"var":"$permalink","type":"string","desc":"User Permalink"}] - * @change_log - * ["Since: 2.0"] - * @usage - * - * @example - * Change base permalink before cleaning. * function my_permalink_base_before( $permalink ) { * // your code here * return $permalink; * } - * ?> + * add_filter( 'um_permalink_base_before_filter', 'my_permalink_base_before' ); */ - $value = apply_filters( "um_permalink_base_before_filter", $value ); - $raw_value = $value; + $value = apply_filters( 'um_permalink_base_before_filter', $value ); + $raw_value = $value; + $filter_slug = ''; - switch( $permalink_base ) { + switch ( $permalink_base ) { case 'name': - - - if( ! empty( $value ) && strrpos( $value ,"_") > -1 ){ + if ( ! empty( $value ) && strrpos( $value, '_' ) > -1 ) { $value = str_replace( '_', '. ', $value ); } - if( ! empty( $value ) && strrpos( $value ,"_") > -1 ){ + if ( ! empty( $value ) && strrpos( $value, '_' ) > -1 ) { $value = str_replace( '_', '-', $value ); } - if( ! empty( $value ) && strrpos( $value ,".") > -1 && strrpos( $raw_value ,"_" ) <= -1 ){ + if ( ! empty( $value ) && strrpos( $value, '.' ) > -1 && strrpos( $raw_value, '_' ) <= -1 ) { $value = str_replace( '.', ' ', $value ); } - /** - * UM hook - * - * @type filter - * @title um_permalink_base_after_filter_name - * @description Base permalink after if permalink is username - * @input_vars - * [{"var":"$permalink","type":"string","desc":"User Permalink"}, - * {"var":"$raw_permalink","type":"string","desc":"RAW User Permalink"}] - * @change_log - * ["Since: 2.0"] - * @usage - * - * @example - * - */ - $value = apply_filters("um_permalink_base_after_filter_name", $value, $raw_value ); - + $filter_slug = '_' . $permalink_base; break; - case 'name_dash': - - if( ! empty( $value ) && strrpos( $value ,"-") > -1 ){ + if ( ! empty( $value ) && strrpos( $value, '-' ) > -1 ) { $value = str_replace( '-', ' ', $value ); } - if( ! empty( $value ) && strrpos( $value ,"_") > -1 ){ + if ( ! empty( $value ) && strrpos( $value, '_' ) > -1 ) { $value = str_replace( '_', '-', $value ); } // Checks if last name has a dash - if( ! empty( $value ) && strrpos( $value ,"_") > -1 ){ + if ( ! empty( $value ) && strrpos( $value, '_' ) > -1 ) { $value = str_replace( '_', '-', $value ); } - /** - * UM hook - * - * @type filter - * @title um_permalink_base_after_filter_name_dash - * @description Base permalink after if permalink is first name - last name - * @input_vars - * [{"var":"$permalink","type":"string","desc":"User Permalink"}, - * {"var":"$raw_permalink","type":"string","desc":"RAW User Permalink"}] - * @change_log - * ["Since: 2.0"] - * @usage - * - * @example - * - */ - $value = apply_filters("um_permalink_base_after_filter_name_dash", $value, $raw_value ); - + $filter_slug = '_' . $permalink_base; break; - - case 'name_plus': - - if( ! empty( $value ) && strrpos( $value ,"+") > -1 ){ + if ( ! empty( $value ) && strrpos( $value, '+' ) > -1 ) { $value = str_replace( '+', ' ', $value ); } - if( ! empty( $value ) && strrpos( $value ,"_") > -1 ){ + if ( ! empty( $value ) && strrpos( $value, '_' ) > -1 ) { $value = str_replace( '_', '+', $value ); } - /** - * UM hook - * - * @type filter - * @title um_permalink_base_after_filter_name_plus - * @description Base permalink after if permalink is first name + last name - * @input_vars - * [{"var":"$permalink","type":"string","desc":"User Permalink"}, - * {"var":"$raw_permalink","type":"string","desc":"RAW User Permalink"}] - * @change_log - * ["Since: 2.0"] - * @usage - * - * @example - * - */ - $value = apply_filters("um_permalink_base_after_filter_name_plus", $value, $raw_value ); - + $filter_slug = '_' . $permalink_base; break; - default: - // Checks if last name has a dash - if( ! empty( $value ) && strrpos( $value ,"_") > -1 && substr( $value , "_") == 1 ){ + if ( ! empty( $value ) && strrpos( $value, '_' ) > -1 ) { $value = str_replace( '_', '-', $value ); } - - /** - * UM hook - * - * @type filter - * @title um_permalink_base_after_filter - * @description Base permalink after for default permalink - * @input_vars - * [{"var":"$permalink","type":"string","desc":"User Permalink"}, - * {"var":"$raw_permalink","type":"string","desc":"RAW User Permalink"}] - * @change_log - * ["Since: 2.0"] - * @usage - * - * @example - * - */ - $value = apply_filters("um_permalink_base_after_filter", $value, $raw_value ); - break; } - return $value; - + /** + * Filters the base user permalink value after cleaning. + * $filter_slug - can be empty '' or equals 'name', 'name_dash', 'name_plus' + * + * @param {string} $permalink User Profile permalink. + * @param {string} $raw_value The base user permalink value before cleaning. + * + * @return {string} User Profile permalink. + * + * @since 1.3.x + * @hook um_permalink_base_after_filter{$filter_slug} + * + * @example Change base permalink after cleaning if permalink settings isn't connected with user first or last name. + * function my_permalink_base_after_filter( $permalink, $raw_permalink ) { + * // your code here + * return $permalink; + * } + * add_filter( 'um_permalink_base_after_filter', 'my_permalink_base_after_filter', 10, 2 ); + * @example Change base permalink after cleaning if permalink settings is a full name. + * function my_permalink_base_after_filter_name( $permalink, $raw_permalink ) { + * // your code here + * return $permalink; + * } + * add_filter( 'um_permalink_base_after_filter_name', 'my_permalink_base_after_filter_name', 10, 2 ); + * @example Change base permalink after cleaning if permalink settings is a full name connected by dash. + * function my_permalink_base_after_filter_name_dash( $permalink, $raw_permalink ) { + * // your code here + * return $permalink; + * } + * add_filter( 'um_permalink_base_after_filter_name_dash', 'my_permalink_base_after_filter_name_dash', 10, 2 ); + * @example Change base permalink after cleaning if permalink settings is a full name connected by plus. + * function my_permalink_base_after_filter_name_plus( $permalink, $raw_permalink ) { + * // your code here + * return $permalink; + * } + * add_filter( 'um_permalink_base_after_filter_name_plus', 'my_permalink_base_after_filter_name_plus', 10, 2 ); + */ + return apply_filters( "um_permalink_base_after_filter{$filter_slug}", $value, $raw_value ); } add_filter( 'um_clean_user_basename_filter', 'um_clean_user_basename_filter', 2, 10 ); - /** * Filter before update profile to force utf8 strings * @@ -296,4 +222,4 @@ function um_before_update_profile( $changes, $user_id ) { return $changes; } -add_filter( 'um_before_update_profile','um_before_update_profile', 10, 2 ); +add_filter( 'um_before_update_profile', 'um_before_update_profile', 10, 2 ); From 0149605a36778673529d1e2ffaf0941bca52b1cf Mon Sep 17 00:00:00 2001 From: Mykyta Synelnikov Date: Mon, 11 Sep 2023 15:41:29 +0300 Subject: [PATCH 2/2] - added ability to use custom metakey as profile slug; - important: use for this case required usermeta which cannot be empty --- includes/admin/core/class-admin-settings.php | 32 +++++---- includes/class-config.php | 1 + includes/core/class-permalinks.php | 14 +++- includes/core/class-rewrite.php | 12 ++++ includes/core/class-user.php | 71 +++++++++++++++++++- 5 files changed, 115 insertions(+), 15 deletions(-) diff --git a/includes/admin/core/class-admin-settings.php b/includes/admin/core/class-admin-settings.php index cabdcb26..5046d64e 100644 --- a/includes/admin/core/class-admin-settings.php +++ b/includes/admin/core/class-admin-settings.php @@ -7,41 +7,34 @@ if ( ! defined( 'ABSPATH' ) ) { if ( ! class_exists( 'um\admin\core\Admin_Settings' ) ) { - /** * Class Admin_Settings * @package um\admin\core */ class Admin_Settings { - /** * @var array */ public $settings_map; - /** * @var array */ public $settings_structure; - /** * @var */ private $previous_licenses; - /** * @var */ private $need_change_permalinks; - private $gravatar_changed = false; - /** * Admin_Settings constructor. */ @@ -668,6 +661,9 @@ if ( ! class_exists( 'um\admin\core\Admin_Settings' ) ) { 'permalink_base' => array( 'sanitize' => 'key', ), + 'permalink_base_custom_meta' => array( + 'sanitize' => 'text', + ), 'display_name' => array( 'sanitize' => 'key', ), @@ -1014,15 +1010,24 @@ if ( ! class_exists( 'um\admin\core\Admin_Settings' ) ) { // translators: %s: Profile page URL 'tooltip' => sprintf( __( 'Here you can control the permalink structure of the user profile URL globally e.g. %susername/', 'ultimate-member' ), trailingslashit( um_get_core_page( 'user' ) ) ), 'options' => array( - 'user_login' => __( 'Username', 'ultimate-member' ), - 'name' => __( 'First and Last Name with \'.\'', 'ultimate-member' ), - 'name_dash' => __( 'First and Last Name with \'-\'', 'ultimate-member' ), - 'name_plus' => __( 'First and Last Name with \'+\'', 'ultimate-member' ), - 'user_id' => __( 'User ID', 'ultimate-member' ), - 'hash' => __( 'Unique hash string', 'ultimate-member' ), + 'user_login' => __( 'Username', 'ultimate-member' ), + 'name' => __( 'First and Last Name with \'.\'', 'ultimate-member' ), + 'name_dash' => __( 'First and Last Name with \'-\'', 'ultimate-member' ), + 'name_plus' => __( 'First and Last Name with \'+\'', 'ultimate-member' ), + 'user_id' => __( 'User ID', 'ultimate-member' ), + 'hash' => __( 'Unique hash string', 'ultimate-member' ), + 'custom_meta' => __( 'Custom usermeta', 'ultimate-member' ), ), 'placeholder' => __( 'Select...', 'ultimate-member' ), ), + array( + 'id' => 'permalink_base_custom_meta', + 'type' => 'text', + 'label' => __( 'Profile Permalink Base Custom Meta Key', 'ultimate-member' ), + 'tooltip' => __( 'Specify the custom field meta key that you want to use as profile permalink base. Meta value should be unique.', 'ultimate-member' ), + 'conditional' => array( 'permalink_base', '=', 'custom_meta' ), + 'size' => 'medium', + ), array( 'id' => 'display_name', 'type' => 'select', @@ -1048,6 +1053,7 @@ if ( ! class_exists( 'um\admin\core\Admin_Settings' ) ) { 'label' => __( 'Display Name Custom Field(s)', 'ultimate-member' ), 'tooltip' => __( 'Specify the custom field meta key or custom fields seperated by comma that you want to use to display users name on the frontend of your site', 'ultimate-member' ), 'conditional' => array( 'display_name', '=', 'field' ), + 'size' => 'medium', ), array( 'id' => 'author_redirect', diff --git a/includes/class-config.php b/includes/class-config.php index ffeb704a..6390cb93 100644 --- a/includes/class-config.php +++ b/includes/class-config.php @@ -511,6 +511,7 @@ if ( ! class_exists( 'um\Config' ) ) { 'disable_restriction_pre_queries' => 0, 'uninstall_on_delete' => 0, 'permalink_base' => 'user_login', + 'permalink_base_custom_meta' => '', 'display_name' => 'full_name', 'display_name_field' => '', 'author_redirect' => 1, diff --git a/includes/core/class-permalinks.php b/includes/core/class-permalinks.php index a04c29b6..6fef7102 100644 --- a/includes/core/class-permalinks.php +++ b/includes/core/class-permalinks.php @@ -257,6 +257,18 @@ if ( ! class_exists( 'um\core\Permalinks' ) ) { global $wpdb; $permalink_base = UM()->options()->get( 'permalink_base' ); + if ( 'custom_meta' === $permalink_base ) { + $custom_meta = UM()->options()->get( 'permalink_base_custom_meta' ); + if ( empty( $custom_meta ) ) { + // Set default permalink base if custom meta is empty. + $permalink_base = 'user_login'; + $meta_key = 'um_user_profile_url_slug_' . $permalink_base; + } else { + $meta_key = $custom_meta; + } + } else { + $meta_key = 'um_user_profile_url_slug_' . $permalink_base; + } $user_id = $wpdb->get_var( $wpdb->prepare( @@ -266,7 +278,7 @@ if ( ! class_exists( 'um\core\Permalinks' ) ) { meta_value = %s ORDER BY umeta_id ASC LIMIT 1", - 'um_user_profile_url_slug_' . $permalink_base, + $meta_key, $slug ) ); diff --git a/includes/core/class-rewrite.php b/includes/core/class-rewrite.php index 8595d2b7..2b8d11b8 100644 --- a/includes/core/class-rewrite.php +++ b/includes/core/class-rewrite.php @@ -153,6 +153,14 @@ if ( ! class_exists( 'um\core\Rewrite' ) ) { */ public function locate_user_profile() { $permalink_base = UM()->options()->get( 'permalink_base' ); + if ( 'custom_meta' === $permalink_base ) { + $custom_meta = UM()->options()->get( 'permalink_base_custom_meta' ); + if ( empty( $custom_meta ) ) { + // Set default permalink base if custom meta is empty. + $permalink_base = 'user_login'; + } + } + if ( um_queried_user() && um_is_core_page( 'user' ) ) { if ( 'user_login' === $permalink_base ) { $user_id = username_exists( um_queried_user() ); @@ -204,6 +212,10 @@ if ( ! class_exists( 'um\core\Rewrite' ) ) { $user_id = UM()->user()->user_exists_by_hash( um_queried_user() ); } + if ( 'custom_meta' === $permalink_base ) { + $user_id = UM()->user()->user_exists_by_custom_meta( um_queried_user() ); + } + if ( in_array( $permalink_base, array( 'name', 'name_dash', 'name_dot', 'name_plus' ), true ) ) { $user_id = UM()->user()->user_exists_by_name( um_queried_user() ); } diff --git a/includes/core/class-user.php b/includes/core/class-user.php index 1d7201da..20221847 100644 --- a/includes/core/class-user.php +++ b/includes/core/class-user.php @@ -706,7 +706,19 @@ if ( ! class_exists( 'um\core\User' ) ) { public function get_profile_slug( $user_id ) { // Permalink base $permalink_base = UM()->options()->get( 'permalink_base' ); - $profile_slug = get_user_meta( $user_id, "um_user_profile_url_slug_{$permalink_base}", true ); + if ( 'custom_meta' === $permalink_base ) { + $custom_meta = UM()->options()->get( 'permalink_base_custom_meta' ); + if ( empty( $custom_meta ) ) { + // Set default permalink base if custom meta is empty. + $permalink_base = 'user_login'; + $meta_key = 'um_user_profile_url_slug_' . $permalink_base; + } else { + $meta_key = $custom_meta; + } + } else { + $meta_key = 'um_user_profile_url_slug_' . $permalink_base; + } + $profile_slug = get_user_meta( $user_id, $meta_key, true ); //get default username permalink if it's empty then return false if ( empty( $profile_slug ) ) { @@ -781,6 +793,17 @@ if ( ! class_exists( 'um\core\User' ) ) { $user_in_url = $this->generate_user_hash( $user_id ); } + if ( 'custom_meta' === $permalink_base ) { + $custom_meta = UM()->options()->get( 'permalink_base_custom_meta' ); + if ( empty( $custom_meta ) ) { + // Set default permalink base if custom meta is empty. + $permalink_base = 'user_login'; + } else { + $user_in_url = rawurlencode( get_user_meta( $user_id, $custom_meta, true ) ); + $user_in_url = apply_filters( 'um_custom_meta_permalink_base_generate_user_slug', $user_in_url, $user_id, $custom_meta ); + } + } + // Username if ( 'user_login' === $permalink_base ) { @@ -2391,6 +2414,52 @@ if ( ! class_exists( 'um\core\User' ) ) { return false; } + /** + * @param string $slug + * + * @return bool|int + */ + public function user_exists_by_custom_meta( $slug ) { + $permalink_base = UM()->options()->get( 'permalink_base' ); + $custom_meta = UM()->options()->get( 'permalink_base_custom_meta' ); + if ( empty( $custom_meta ) ) { + // Set default permalink base if custom meta is empty. + $permalink_base = 'user_login'; + $meta_key = 'um_user_profile_url_slug_' . $permalink_base; + } else { + $meta_key = $custom_meta; + } + + $raw_value = $slug; + + // Search by Profile Slug + $args = array( + 'fields' => array( 'ID' ), + 'meta_query' => array( + 'relation' => 'OR', + array( + 'key' => $meta_key, + 'value' => strtolower( $raw_value ), + 'compare' => '=', + ), + array( + 'key' => 'um_user_profile_url_slug_' . $permalink_base, + 'value' => strtolower( $raw_value ), + 'compare' => '=', + ), + ), + ); + + $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; + } + /** * This method checks if a user exists or not in your site based on the user email as username *