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 *