From 004cfd12cda888649b0e83e7bc18c5cac80514a1 Mon Sep 17 00:00:00 2001 From: ashubawork Date: Fri, 25 Apr 2025 12:42:42 +0300 Subject: [PATCH 01/28] - fix general sitehealth --- includes/admin/class-site-health.php | 298 +++++++++++++++------------ 1 file changed, 168 insertions(+), 130 deletions(-) diff --git a/includes/admin/class-site-health.php b/includes/admin/class-site-health.php index 45ceec2d..46f51a53 100644 --- a/includes/admin/class-site-health.php +++ b/includes/admin/class-site-health.php @@ -470,58 +470,118 @@ class Site_Health { $display_name = UM()->config()->display_name_options; $user_settings = array( - 'um-permalink_base' => array( + 'um-user_separator' => array( + 'label' => __( 'User settings', 'ultimate-member' ), + 'value' => '---------------------------------------------------------------------', + ), + 'um-register_role' => array( + 'label' => __( 'Registration Default Role', 'ultimate-member' ), + 'value' => ! empty( UM()->options()->get( 'register_role' ) ) ? UM()->options()->get( 'register_role' ) : __( 'Default', 'ultimate-member' ), + ), + 'um-permalink_base' => array( 'label' => __( 'Profile Permalink Base', 'ultimate-member' ), 'value' => isset( $permalink_base[ UM()->options()->get( 'permalink_base' ) ] ) ? $permalink_base[ UM()->options()->get( 'permalink_base' ) ] : $labels['no'], ), - 'um-display_name' => array( + 'um-display_name' => array( 'label' => __( 'User Display Name', 'ultimate-member' ), 'value' => isset( $display_name[ UM()->options()->get( 'display_name' ) ] ) ? $display_name[ UM()->options()->get( 'display_name' ) ] : $labels['no'], ), - 'um-author_redirect' => array( - 'label' => __( 'Automatically redirect author page to their profile?', 'ultimate-member' ), + 'um-author_redirect' => array( + 'label' => __( 'Hide author pages (enable author page redirect to user profile)', 'ultimate-member' ), 'value' => UM()->options()->get( 'author_redirect' ) ? $labels['yes'] : $labels['no'], ), - 'um-members_page' => array( + 'um-members_page' => array( 'label' => __( 'Enable Members Directory', 'ultimate-member' ), 'value' => UM()->options()->get( 'members_page' ) ? $labels['yes'] : $labels['no'], ), - 'um-toggle_password' => array( - 'label' => __( 'Show/hide password button', 'ultimate-member' ), - 'value' => UM()->options()->get( 'toggle_password' ) ? $labels['yes'] : $labels['no'], - ), - 'um-require_strongpass' => array( - 'label' => __( 'Require Strong Passwords', 'ultimate-member' ), - 'value' => UM()->options()->get( 'require_strongpass' ) ? $labels['yes'] : $labels['no'], - ), - 'um-password_min_chars' => array( - 'label' => __( 'Require Strong Passwords', 'ultimate-member' ), - 'value' => UM()->options()->get( 'password_min_chars' ), - ), - 'um-password_max_chars' => array( - 'label' => __( 'Require Strong Passwords', 'ultimate-member' ), - 'value' => UM()->options()->get( 'password_max_chars' ), - ), - 'um-profile_noindex' => array( - 'label' => __( 'Avoid indexing profile by search engines', 'ultimate-member' ), - 'value' => UM()->options()->get( 'profile_noindex' ) ? $labels['yes'] : $labels['no'], - ), - 'um-activation_link_expiry_time' => array( - 'label' => __( 'Activation link lifetime', 'ultimate-member' ), - 'value' => UM()->options()->get( 'activation_link_expiry_time' ), - ), - 'um-use_gravatars' => array( + 'um-use_gravatars' => array( 'label' => __( 'Use Gravatars?', 'ultimate-member' ), 'value' => UM()->options()->get( 'use_gravatars' ) ? $labels['yes'] : $labels['no'], ), - 'um-admin_ignore_user_status' => array( - 'label' => __( 'Ignore the "User Role > Registration Options" if this user is added from the wp-admin dashboard', 'ultimate-member' ), - 'value' => UM()->options()->get( 'admin_ignore_user_status' ) ? $labels['yes'] : $labels['no'], - ), - 'um-delete_comments' => array( - 'label' => __( 'Deleting user comments after deleting a user', 'ultimate-member' ), - 'value' => UM()->options()->get( 'delete_comments' ) ? $labels['yes'] : $labels['no'], - ), + ); + + if ( UM()->options()->get( 'use_gravatars' ) ) { + $gravatar_options = array( + 'default' => __( 'Default', 'ultimate-member' ), + '404' => __( '404 ( File Not Found response )', 'ultimate-member' ), + 'mm' => __( 'Mystery Man', 'ultimate-member' ), + 'identicon' => __( 'Identicon', 'ultimate-member' ), + 'monsterid' => __( 'Monsterid', 'ultimate-member' ), + 'wavatar' => __( 'Wavatar', 'ultimate-member' ), + 'retro' => __( 'Retro', 'ultimate-member' ), + 'blank' => __( 'Blank ( a transparent PNG image )', 'ultimate-member' ), + ); + + $user_settings['um-use_um_gravatar_default_builtin_image'] = array( + 'label' => __( 'Use Gravatar builtin image', 'ultimate-member' ), + 'value' => $gravatar_options[ UM()->options()->get( 'use_um_gravatar_default_builtin_image' ) ], + ); + if ( 'default' === UM()->options()->get( 'use_um_gravatar_default_builtin_image' ) ) { + $user_settings['um-use_um_gravatar_default_image'] = array( + 'label' => __( 'Replace Gravatar\'s Default avatar (Set Default plugin avatar as Gravatar\'s Default avatar)', 'ultimate-member' ), + 'value' => UM()->options()->get( 'use_um_gravatar_default_image' ) ? $labels['yes'] : $labels['no'], + ); + } + } + + $user_settings = array_merge( + $user_settings, + array( + 'um-admin_ignore_user_status' => array( + 'label' => __( 'Ignore the "User Role > Registration Options" if this user is added from the wp-admin dashboard', 'ultimate-member' ), + 'value' => UM()->options()->get( 'admin_ignore_user_status' ) ? $labels['yes'] : $labels['no'], + ), + 'um-delete_comments' => array( + 'label' => __( 'Delete user comments (enable deleting user comments after deleting a user)', 'ultimate-member' ), + 'value' => UM()->options()->get( 'delete_comments' ) ? $labels['yes'] : $labels['no'], + ), + 'um-toggle_password' => array( + 'label' => __( 'Toggle Password Visibility (enable password show/hide icon on password field)', 'ultimate-member' ), + 'value' => UM()->options()->get( 'toggle_password' ) ? $labels['yes'] : $labels['no'], + ), + 'um-require_strongpass' => array( + 'label' => __( 'Require Strong Passwords', 'ultimate-member' ), + 'value' => UM()->options()->get( 'require_strongpass' ) ? $labels['yes'] : $labels['no'], + ), + ) + ); + + if ( UM()->options()->get( 'require_strongpass' ) ) { + $user_settings = array_merge( + $user_settings, + array( + 'um-password_min_chars' => array( + 'label' => __( 'Password minimum length', 'ultimate-member' ), + 'value' => UM()->options()->get( 'password_min_chars' ), + ), + 'um-password_max_chars' => array( + 'label' => __( 'Password maximum length', 'ultimate-member' ), + 'value' => UM()->options()->get( 'password_max_chars' ), + ), + ) + ); + } + + $user_settings = array_merge( + $user_settings, + array( + 'um-activation_link_expiry_time' => array( + 'label' => __( 'Email activation link expiration (days)', 'ultimate-member' ), + 'value' => UM()->options()->get( 'activation_link_expiry_time' ), + ), + 'um-profile_noindex' => array( + 'label' => __( 'Avoid indexing profile by search engines', 'ultimate-member' ), + 'value' => UM()->options()->get( 'profile_noindex' ) ? $labels['yes'] : $labels['no'], + ), + 'um-profile_title' => array( + 'label' => __( 'User Profile Title', 'ultimate-member' ), + 'value' => stripslashes( UM()->options()->get( 'profile_title' ) ), + ), + 'um-profile_desc' => array( + 'label' => __( 'User Profile Dynamic Meta Description', 'ultimate-member' ), + 'value' => stripslashes( UM()->options()->get( 'profile_desc' ) ), + ), + ) ); if ( 'custom_meta' === UM()->options()->get( 'permalink_base' ) ) { @@ -550,42 +610,51 @@ class Site_Health { ); } - if ( UM()->options()->get( 'use_gravatars' ) ) { - $gravatar_options = array( - 'default' => __( 'Default', 'ultimate-member' ), - '404' => __( '404 ( File Not Found response )', 'ultimate-member' ), - 'mm' => __( 'Mystery Man', 'ultimate-member' ), - 'identicon' => __( 'Identicon', 'ultimate-member' ), - 'monsterid' => __( 'Monsterid', 'ultimate-member' ), - 'wavatar' => __( 'Wavatar', 'ultimate-member' ), - 'retro' => __( 'Retro', 'ultimate-member' ), - 'blank' => __( 'Blank ( a transparent PNG image )', 'ultimate-member' ), - ); - - $user_settings['um-use_um_gravatar_default_builtin_image'] = array( - 'label' => __( 'Use Gravatar builtin image', 'ultimate-member' ), - 'value' => $gravatar_options[ UM()->options()->get( 'use_um_gravatar_default_builtin_image' ) ], - ); - if ( 'default' === UM()->options()->get( 'use_um_gravatar_default_builtin_image' ) ) { - $user_settings['um-use_um_gravatar_default_image'] = array( - 'label' => __( 'Use Default plugin avatar as Gravatar\'s Default avatar', 'ultimate-member' ), - 'value' => UM()->options()->get( 'use_um_gravatar_default_image' ) ? $labels['yes'] : $labels['no'], - ); - } - } - // Account settings $account_settings = array( - 'um-account_tab_password' => array( + 'um-account_separator' => array( + 'label' => __( 'Account settings', 'ultimate-member' ), + 'value' => '---------------------------------------------------------------------', + ), + 'um-account_name' => array( + 'label' => __( 'Display First & Last name fields (enable to display First & Last name fields)', 'ultimate-member' ), + 'value' => UM()->options()->get( 'account_name' ) ? $labels['yes'] : $labels['no'], + ), + 'um-account_email' => array( + 'label' => __( 'Allow users to change email (enable changing email via the account page)', 'ultimate-member' ), + 'value' => UM()->options()->get( 'account_email' ) ? $labels['yes'] : $labels['no'], + ), + 'um-account_general_password' => array( + 'label' => __( 'Require password to update account (enable required password)', 'ultimate-member' ), + 'value' => UM()->options()->get( 'account_general_password' ) ? $labels['yes'] : $labels['no'], + ), + 'um-account_tab_password' => array( 'label' => __( 'Password Account Tab', 'ultimate-member' ), 'value' => UM()->options()->get( 'account_tab_password' ) ? $labels['yes'] : $labels['no'], ), - 'um-account_tab_privacy' => array( + 'um-account_tab_privacy' => array( 'label' => __( 'Privacy Account Tab', 'ultimate-member' ), 'value' => UM()->options()->get( 'account_tab_privacy' ) ? $labels['yes'] : $labels['no'], ), ); + if ( UM()->options()->get( 'account_name' ) ) { + $account_settings = UM()->array_insert_before( + $account_settings, + 'um-account_email', + array( + 'um-account_name_disable' => array( + 'label' => __( 'Disable First & Last name field editing', 'ultimate-member' ), + 'value' => UM()->options()->get( 'account_name_disable' ) ? $labels['yes'] : $labels['no'], + ), + 'um-account_name_require' => array( + 'label' => __( 'Require First & Last Name', 'ultimate-member' ), + 'value' => UM()->options()->get( 'account_name_require' ) ? $labels['yes'] : $labels['no'], + ), + ) + ); + } + if ( false !== UM()->account()->is_notifications_tab_visible() ) { $account_settings['um-account_tab_notifications'] = array( 'label' => __( 'Notifications Account Tab', 'ultimate-member' ), @@ -593,6 +662,20 @@ class Site_Health { ); } + if ( UM()->options()->get( 'account_tab_privacy' ) ) { + $account_settings['um-account_hide_in_directory'] = array( + 'label' => __( 'Allow users to hide their profiles from directory', 'ultimate-member' ), + 'value' => UM()->options()->get( 'account_hide_in_directory' ) ? $labels['yes'] : $labels['no'], + ); + + if ( UM()->options()->get( 'account_hide_in_directory' ) ) { + $account_settings['um-account_hide_in_directory_default'] = array( + 'label' => __( 'Hide profiles from directory by default', 'ultimate-member' ), + 'value' => UM()->options()->get( 'account_hide_in_directory_default' ), + ); + } + } + $account_settings = array_merge( $account_settings, array( @@ -601,53 +684,16 @@ class Site_Health { 'value' => UM()->options()->get( 'account_tab_delete' ) ? $labels['yes'] : $labels['no'], ), 'um-delete_account_text' => array( - 'label' => __( 'Account Deletion Custom Text', 'ultimate-member' ), + 'label' => __( 'Account Deletion Text', 'ultimate-member' ), 'value' => UM()->options()->get( 'delete_account_text' ), ), 'um-delete_account_no_pass_required_text' => array( - 'label' => __( 'Account Deletion without password Custom Text', 'ultimate-member' ), + 'label' => __( 'Account Deletion without password Text', 'ultimate-member' ), 'value' => UM()->options()->get( 'delete_account_no_pass_required_text' ), ), - 'um-account_name' => array( - 'label' => __( 'Add a First & Last Name fields', 'ultimate-member' ), - 'value' => UM()->options()->get( 'account_name' ) ? $labels['yes'] : $labels['no'], - ), ) ); - if ( UM()->options()->get( 'account_name' ) ) { - $account_settings['um-account_name_disable'] = array( - 'label' => __( 'Disable First & Last name field editing', 'ultimate-member' ), - 'value' => UM()->options()->get( 'account_name_disable' ) ? $labels['yes'] : $labels['no'], - ); - $account_settings['um-account_name_require'] = array( - 'label' => __( 'Require First & Last Name', 'ultimate-member' ), - 'value' => UM()->options()->get( 'account_name_require' ) ? $labels['yes'] : $labels['no'], - ); - } - - $account_settings['um-account_email'] = array( - 'label' => __( 'Allow users to change email', 'ultimate-member' ), - 'value' => UM()->options()->get( 'account_email' ) ? $labels['yes'] : $labels['no'], - ); - - $account_settings['um-account_general_password'] = array( - 'label' => __( 'Password is required?', 'ultimate-member' ), - 'value' => UM()->options()->get( 'account_general_password' ) ? $labels['yes'] : $labels['no'], - ); - - $account_settings['um-account_hide_in_directory'] = array( - 'label' => __( 'Allow users to hide their profiles from directory', 'ultimate-member' ), - 'value' => UM()->options()->get( 'account_hide_in_directory' ) ? $labels['yes'] : $labels['no'], - ); - - if ( UM()->options()->get( 'account_hide_in_directory' ) ) { - $account_settings['um-account_hide_in_directory_default'] = array( - 'label' => __( 'Hide profiles from directory by default', 'ultimate-member' ), - 'value' => UM()->options()->get( 'account_hide_in_directory_default' ), - ); - } - // Uploads settings $profile_sizes_list = ''; $profile_sizes = UM()->options()->get( 'photo_thumb_sizes' ); @@ -664,21 +710,9 @@ class Site_Health { } } $uploads_settings = array( - 'um-profile_photo_max_size' => array( - 'label' => __( 'Profile Photo Maximum File Size (bytes)', 'ultimate-member' ), - 'value' => UM()->options()->get( 'profile_photo_max_size' ), - ), - 'um-cover_photo_max_size' => array( - 'label' => __( 'Cover Photo Maximum File Size (bytes)', 'ultimate-member' ), - 'value' => UM()->options()->get( 'cover_photo_max_size' ), - ), - 'um-photo_thumb_sizes' => array( - 'label' => __( 'Profile Photo Thumbnail Sizes (px)', 'ultimate-member' ), - 'value' => $profile_sizes_list, - ), - 'um-cover_thumb_sizes' => array( - 'label' => __( 'Cover Photo Thumbnail Sizes (px)', 'ultimate-member' ), - 'value' => $cover_sizes_list, + 'um-account_separator' => array( + 'label' => __( 'Upload settings', 'ultimate-member' ), + 'value' => '---------------------------------------------------------------------', ), 'um-image_orientation_by_exif' => array( 'label' => __( 'Change image orientation', 'ultimate-member' ), @@ -692,10 +726,26 @@ class Site_Health { 'label' => __( 'Image Upload Maximum Width (px)', 'ultimate-member' ), 'value' => UM()->options()->get( 'image_max_width' ), ), + 'um-profile_photo_max_size' => array( + 'label' => __( 'Profile Photo Maximum File Size (bytes)', 'ultimate-member' ), + 'value' => UM()->options()->get( 'profile_photo_max_size' ), + ), + 'um-photo_thumb_sizes' => array( + 'label' => __( 'Profile Photo Thumbnail Sizes (px)', 'ultimate-member' ), + 'value' => $profile_sizes_list, + ), + 'um-cover_photo_max_size' => array( + 'label' => __( 'Cover Photo Maximum File Size (bytes)', 'ultimate-member' ), + 'value' => UM()->options()->get( 'cover_photo_max_size' ), + ), 'um-cover_min_width' => array( 'label' => __( 'Cover Photo Minimum Width (px)', 'ultimate-member' ), 'value' => UM()->options()->get( 'cover_min_width' ), ), + 'um-cover_thumb_sizes' => array( + 'label' => __( 'Cover Photo Thumbnail Sizes (px)', 'ultimate-member' ), + 'value' => $cover_sizes_list, + ), ); // Content Restriction settings @@ -1149,10 +1199,6 @@ class Site_Health { 'value' => UM()->options()->get( 'register_secondary_btn_url' ), ); } - $appearance_settings['um-register_role'] = array( - 'label' => __( 'Registration Default Role', 'ultimate-member' ), - 'value' => ! empty( UM()->options()->get( 'register_role' ) ) ? UM()->options()->get( 'register_role' ) : __( 'Default', 'ultimate-member' ), - ); // > Login Form section. $login_templates = UM()->shortcodes()->get_templates( 'login' ); @@ -1210,14 +1256,6 @@ class Site_Health { 'label' => __( 'Show an asterisk for required fields', 'ultimate-member' ), 'value' => UM()->options()->get( 'form_asterisk' ) ? $labels['yes'] : $labels['no'], ), - 'um-profile_title' => array( - 'label' => __( 'User Profile Title', 'ultimate-member' ), - 'value' => stripslashes( UM()->options()->get( 'profile_title' ) ), - ), - 'um-profile_desc' => array( - 'label' => __( 'User Profile Dynamic Meta Description', 'ultimate-member' ), - 'value' => stripslashes( UM()->options()->get( 'profile_desc' ) ), - ), 'um-um_profile_object_cache_stop' => array( 'label' => __( 'Disable Cache User Profile', 'ultimate-member' ), 'value' => UM()->options()->get( 'um_profile_object_cache_stop' ) ? $labels['yes'] : $labels['no'], From a52954e8aedf17afc855ac9c93e82ccd54ad647e Mon Sep 17 00:00:00 2001 From: ashubawork Date: Mon, 28 Apr 2025 13:33:22 +0300 Subject: [PATCH 02/28] - access, appearance, emails sitehealth --- includes/admin/class-site-health.php | 1718 ++++++++++++++------------ 1 file changed, 907 insertions(+), 811 deletions(-) diff --git a/includes/admin/class-site-health.php b/includes/admin/class-site-health.php index 46f51a53..b7a07925 100644 --- a/includes/admin/class-site-health.php +++ b/includes/admin/class-site-health.php @@ -24,6 +24,8 @@ class Site_Health { */ const BADGE_COLOR = 'blue'; + private static $labels = array(); + /** * Site_Health constructor. */ @@ -32,6 +34,20 @@ class Site_Health { add_filter( 'site_status_tests', array( $this, 'register_site_status_tests' ) ); } + public static function get_labels() { + if ( empty( self::$labels ) ) { + self::$labels = array( + 'yes' => __( 'Yes', 'ultimate-member' ), + 'no' => __( 'No', 'ultimate-member' ), + 'all' => __( 'All', 'ultimate-member' ), + 'default' => __( 'Default', 'ultimate-member' ), + 'nopages' => __( 'No predefined page', 'ultimate-member' ), + ); + } + + return self::$labels; + } + public function register_site_status_tests( $tests ) { $custom_templates = UM()->common()->theme()->get_custom_templates_list(); @@ -436,819 +452,17 @@ class Site_Health { 'fields' => array(), ); - // Pages settings. - $pages = array(); - $predefined_pages = UM()->config()->core_pages; - foreach ( $predefined_pages as $page_s => $page ) { - $page_id = UM()->options()->get_predefined_page_option_key( $page_s ); - $page_title = ! empty( $page['title'] ) ? $page['title'] : ''; - if ( empty( $page_title ) ) { - continue; - } + // General settings sitehealth + $general_sitehealth = $this->general_siteheath(); - $predefined_page_id = UM()->options()->get( $page_id ); + // Access settings sitehealth + $access_sitehealth = $this->access_sitehealth(); - if ( empty( $predefined_page_id ) ) { - $pages[ $page_title ] = $labels['nopages']; - continue; - } - // translators: %1$s is a predefined page title; %2$d is a predefined page ID; %3$s is a predefined page permalink. - $pages[ $page_title ] = sprintf( __( '%1$s (ID#%2$d) | %3$s', 'ultimate-member' ), get_the_title( $predefined_page_id ), $predefined_page_id, get_permalink( $predefined_page_id ) ); - } + // Emails settings sitehealth + $emails_sitehealth = $this->emails_sitehealth(); - $pages = apply_filters( 'um_debug_information_pages', $pages ); - - $pages_settings = array( - 'um-pages' => array( - 'label' => __( 'Pages', 'ultimate-member' ), - 'value' => $pages, - ), - ); - - // User settings - $permalink_base = UM()->config()->permalink_base_options; - $display_name = UM()->config()->display_name_options; - - $user_settings = array( - 'um-user_separator' => array( - 'label' => __( 'User settings', 'ultimate-member' ), - 'value' => '---------------------------------------------------------------------', - ), - 'um-register_role' => array( - 'label' => __( 'Registration Default Role', 'ultimate-member' ), - 'value' => ! empty( UM()->options()->get( 'register_role' ) ) ? UM()->options()->get( 'register_role' ) : __( 'Default', 'ultimate-member' ), - ), - 'um-permalink_base' => array( - 'label' => __( 'Profile Permalink Base', 'ultimate-member' ), - 'value' => isset( $permalink_base[ UM()->options()->get( 'permalink_base' ) ] ) ? $permalink_base[ UM()->options()->get( 'permalink_base' ) ] : $labels['no'], - ), - 'um-display_name' => array( - 'label' => __( 'User Display Name', 'ultimate-member' ), - 'value' => isset( $display_name[ UM()->options()->get( 'display_name' ) ] ) ? $display_name[ UM()->options()->get( 'display_name' ) ] : $labels['no'], - ), - 'um-author_redirect' => array( - 'label' => __( 'Hide author pages (enable author page redirect to user profile)', 'ultimate-member' ), - 'value' => UM()->options()->get( 'author_redirect' ) ? $labels['yes'] : $labels['no'], - ), - 'um-members_page' => array( - 'label' => __( 'Enable Members Directory', 'ultimate-member' ), - 'value' => UM()->options()->get( 'members_page' ) ? $labels['yes'] : $labels['no'], - ), - 'um-use_gravatars' => array( - 'label' => __( 'Use Gravatars?', 'ultimate-member' ), - 'value' => UM()->options()->get( 'use_gravatars' ) ? $labels['yes'] : $labels['no'], - ), - ); - - if ( UM()->options()->get( 'use_gravatars' ) ) { - $gravatar_options = array( - 'default' => __( 'Default', 'ultimate-member' ), - '404' => __( '404 ( File Not Found response )', 'ultimate-member' ), - 'mm' => __( 'Mystery Man', 'ultimate-member' ), - 'identicon' => __( 'Identicon', 'ultimate-member' ), - 'monsterid' => __( 'Monsterid', 'ultimate-member' ), - 'wavatar' => __( 'Wavatar', 'ultimate-member' ), - 'retro' => __( 'Retro', 'ultimate-member' ), - 'blank' => __( 'Blank ( a transparent PNG image )', 'ultimate-member' ), - ); - - $user_settings['um-use_um_gravatar_default_builtin_image'] = array( - 'label' => __( 'Use Gravatar builtin image', 'ultimate-member' ), - 'value' => $gravatar_options[ UM()->options()->get( 'use_um_gravatar_default_builtin_image' ) ], - ); - if ( 'default' === UM()->options()->get( 'use_um_gravatar_default_builtin_image' ) ) { - $user_settings['um-use_um_gravatar_default_image'] = array( - 'label' => __( 'Replace Gravatar\'s Default avatar (Set Default plugin avatar as Gravatar\'s Default avatar)', 'ultimate-member' ), - 'value' => UM()->options()->get( 'use_um_gravatar_default_image' ) ? $labels['yes'] : $labels['no'], - ); - } - } - - $user_settings = array_merge( - $user_settings, - array( - 'um-admin_ignore_user_status' => array( - 'label' => __( 'Ignore the "User Role > Registration Options" if this user is added from the wp-admin dashboard', 'ultimate-member' ), - 'value' => UM()->options()->get( 'admin_ignore_user_status' ) ? $labels['yes'] : $labels['no'], - ), - 'um-delete_comments' => array( - 'label' => __( 'Delete user comments (enable deleting user comments after deleting a user)', 'ultimate-member' ), - 'value' => UM()->options()->get( 'delete_comments' ) ? $labels['yes'] : $labels['no'], - ), - 'um-toggle_password' => array( - 'label' => __( 'Toggle Password Visibility (enable password show/hide icon on password field)', 'ultimate-member' ), - 'value' => UM()->options()->get( 'toggle_password' ) ? $labels['yes'] : $labels['no'], - ), - 'um-require_strongpass' => array( - 'label' => __( 'Require Strong Passwords', 'ultimate-member' ), - 'value' => UM()->options()->get( 'require_strongpass' ) ? $labels['yes'] : $labels['no'], - ), - ) - ); - - if ( UM()->options()->get( 'require_strongpass' ) ) { - $user_settings = array_merge( - $user_settings, - array( - 'um-password_min_chars' => array( - 'label' => __( 'Password minimum length', 'ultimate-member' ), - 'value' => UM()->options()->get( 'password_min_chars' ), - ), - 'um-password_max_chars' => array( - 'label' => __( 'Password maximum length', 'ultimate-member' ), - 'value' => UM()->options()->get( 'password_max_chars' ), - ), - ) - ); - } - - $user_settings = array_merge( - $user_settings, - array( - 'um-activation_link_expiry_time' => array( - 'label' => __( 'Email activation link expiration (days)', 'ultimate-member' ), - 'value' => UM()->options()->get( 'activation_link_expiry_time' ), - ), - 'um-profile_noindex' => array( - 'label' => __( 'Avoid indexing profile by search engines', 'ultimate-member' ), - 'value' => UM()->options()->get( 'profile_noindex' ) ? $labels['yes'] : $labels['no'], - ), - 'um-profile_title' => array( - 'label' => __( 'User Profile Title', 'ultimate-member' ), - 'value' => stripslashes( UM()->options()->get( 'profile_title' ) ), - ), - 'um-profile_desc' => array( - 'label' => __( 'User Profile Dynamic Meta Description', 'ultimate-member' ), - 'value' => stripslashes( UM()->options()->get( 'profile_desc' ) ), - ), - ) - ); - - if ( 'custom_meta' === UM()->options()->get( 'permalink_base' ) ) { - $user_settings = UM()->array_insert_before( - $user_settings, - 'um-display_name', - array( - 'um-permalink_base_custom_meta' => array( - 'label' => __( 'Profile Permalink Base Custom Meta Key', 'ultimate-member' ), - 'value' => UM()->options()->get( 'permalink_base_custom_meta' ), - ), - ) - ); - } - - if ( 'field' === UM()->options()->get( 'display_name' ) ) { - $user_settings = UM()->array_insert_before( - $user_settings, - 'um-author_redirect', - array( - 'um-display_name_field' => array( - 'label' => __( 'Display Name Custom Field(s)', 'ultimate-member' ), - 'value' => UM()->options()->get( 'display_name_field' ), - ), - ) - ); - } - - // Account settings - $account_settings = array( - 'um-account_separator' => array( - 'label' => __( 'Account settings', 'ultimate-member' ), - 'value' => '---------------------------------------------------------------------', - ), - 'um-account_name' => array( - 'label' => __( 'Display First & Last name fields (enable to display First & Last name fields)', 'ultimate-member' ), - 'value' => UM()->options()->get( 'account_name' ) ? $labels['yes'] : $labels['no'], - ), - 'um-account_email' => array( - 'label' => __( 'Allow users to change email (enable changing email via the account page)', 'ultimate-member' ), - 'value' => UM()->options()->get( 'account_email' ) ? $labels['yes'] : $labels['no'], - ), - 'um-account_general_password' => array( - 'label' => __( 'Require password to update account (enable required password)', 'ultimate-member' ), - 'value' => UM()->options()->get( 'account_general_password' ) ? $labels['yes'] : $labels['no'], - ), - 'um-account_tab_password' => array( - 'label' => __( 'Password Account Tab', 'ultimate-member' ), - 'value' => UM()->options()->get( 'account_tab_password' ) ? $labels['yes'] : $labels['no'], - ), - 'um-account_tab_privacy' => array( - 'label' => __( 'Privacy Account Tab', 'ultimate-member' ), - 'value' => UM()->options()->get( 'account_tab_privacy' ) ? $labels['yes'] : $labels['no'], - ), - ); - - if ( UM()->options()->get( 'account_name' ) ) { - $account_settings = UM()->array_insert_before( - $account_settings, - 'um-account_email', - array( - 'um-account_name_disable' => array( - 'label' => __( 'Disable First & Last name field editing', 'ultimate-member' ), - 'value' => UM()->options()->get( 'account_name_disable' ) ? $labels['yes'] : $labels['no'], - ), - 'um-account_name_require' => array( - 'label' => __( 'Require First & Last Name', 'ultimate-member' ), - 'value' => UM()->options()->get( 'account_name_require' ) ? $labels['yes'] : $labels['no'], - ), - ) - ); - } - - if ( false !== UM()->account()->is_notifications_tab_visible() ) { - $account_settings['um-account_tab_notifications'] = array( - 'label' => __( 'Notifications Account Tab', 'ultimate-member' ), - 'value' => UM()->options()->get( 'account_tab_notifications' ) ? $labels['yes'] : $labels['no'], - ); - } - - if ( UM()->options()->get( 'account_tab_privacy' ) ) { - $account_settings['um-account_hide_in_directory'] = array( - 'label' => __( 'Allow users to hide their profiles from directory', 'ultimate-member' ), - 'value' => UM()->options()->get( 'account_hide_in_directory' ) ? $labels['yes'] : $labels['no'], - ); - - if ( UM()->options()->get( 'account_hide_in_directory' ) ) { - $account_settings['um-account_hide_in_directory_default'] = array( - 'label' => __( 'Hide profiles from directory by default', 'ultimate-member' ), - 'value' => UM()->options()->get( 'account_hide_in_directory_default' ), - ); - } - } - - $account_settings = array_merge( - $account_settings, - array( - 'um-account_tab_delete' => array( - 'label' => __( 'Delete Account Tab', 'ultimate-member' ), - 'value' => UM()->options()->get( 'account_tab_delete' ) ? $labels['yes'] : $labels['no'], - ), - 'um-delete_account_text' => array( - 'label' => __( 'Account Deletion Text', 'ultimate-member' ), - 'value' => UM()->options()->get( 'delete_account_text' ), - ), - 'um-delete_account_no_pass_required_text' => array( - 'label' => __( 'Account Deletion without password Text', 'ultimate-member' ), - 'value' => UM()->options()->get( 'delete_account_no_pass_required_text' ), - ), - ) - ); - - // Uploads settings - $profile_sizes_list = ''; - $profile_sizes = UM()->options()->get( 'photo_thumb_sizes' ); - if ( ! empty( $profile_sizes ) ) { - foreach ( $profile_sizes as $size ) { - $profile_sizes_list = empty( $profile_sizes_list ) ? $size : $profile_sizes_list . ', ' . $size; - } - } - $cover_sizes_list = ''; - $cover_sizes = UM()->options()->get( 'cover_thumb_sizes' ); - if ( ! empty( $cover_sizes ) ) { - foreach ( $cover_sizes as $size ) { - $cover_sizes_list = empty( $cover_sizes_list ) ? $size : $cover_sizes_list . ', ' . $size; - } - } - $uploads_settings = array( - 'um-account_separator' => array( - 'label' => __( 'Upload settings', 'ultimate-member' ), - 'value' => '---------------------------------------------------------------------', - ), - 'um-image_orientation_by_exif' => array( - 'label' => __( 'Change image orientation', 'ultimate-member' ), - 'value' => UM()->options()->get( 'image_orientation_by_exif' ) ? $labels['yes'] : $labels['no'], - ), - 'um-image_compression' => array( - 'label' => __( 'Image Quality', 'ultimate-member' ), - 'value' => UM()->options()->get( 'image_compression' ), - ), - 'um-image_max_width' => array( - 'label' => __( 'Image Upload Maximum Width (px)', 'ultimate-member' ), - 'value' => UM()->options()->get( 'image_max_width' ), - ), - 'um-profile_photo_max_size' => array( - 'label' => __( 'Profile Photo Maximum File Size (bytes)', 'ultimate-member' ), - 'value' => UM()->options()->get( 'profile_photo_max_size' ), - ), - 'um-photo_thumb_sizes' => array( - 'label' => __( 'Profile Photo Thumbnail Sizes (px)', 'ultimate-member' ), - 'value' => $profile_sizes_list, - ), - 'um-cover_photo_max_size' => array( - 'label' => __( 'Cover Photo Maximum File Size (bytes)', 'ultimate-member' ), - 'value' => UM()->options()->get( 'cover_photo_max_size' ), - ), - 'um-cover_min_width' => array( - 'label' => __( 'Cover Photo Minimum Width (px)', 'ultimate-member' ), - 'value' => UM()->options()->get( 'cover_min_width' ), - ), - 'um-cover_thumb_sizes' => array( - 'label' => __( 'Cover Photo Thumbnail Sizes (px)', 'ultimate-member' ), - 'value' => $cover_sizes_list, - ), - ); - - // Content Restriction settings - $restricted_posts = UM()->options()->get( 'restricted_access_post_metabox' ); - $restricted_posts_list = ''; - if ( ! empty( $restricted_posts ) ) { - foreach ( $restricted_posts as $key => $posts ) { - $restricted_posts_list = empty( $restricted_posts_list ) ? $key : $restricted_posts_list . ', ' . $key; - } - } - $restricted_taxonomy = UM()->options()->get( 'restricted_access_taxonomy_metabox' ); - $restricted_taxonomy_list = ''; - if ( ! empty( $restricted_taxonomy ) ) { - foreach ( $restricted_taxonomy as $key => $posts ) { - $restricted_taxonomy_list = empty( $restricted_taxonomy_list ) ? $key : $restricted_taxonomy_list . ', ' . $key; - } - } - - $accessible = absint( UM()->options()->get( 'accessible' ) ); - - $restrict_settings = array( - 'um-accessible' => array( - 'label' => __( 'Global Site Access', 'ultimate-member' ), - 'value' => 0 === $accessible ? __( 'Site accessible to Everyone', 'ultimate-member' ) : __( 'Site accessible to Logged In Users', 'ultimate-member' ), - ), - ); - - if ( 2 === $accessible ) { - $exclude_uris = UM()->options()->get( 'access_exclude_uris' ); - $exclude_uris_list = ''; - if ( ! empty( $exclude_uris ) ) { - $exclude_uris_list = implode( ', ', $exclude_uris ); - } - $restrict_settings['um-access_redirect'] = array( - 'label' => __( 'Custom Redirect URL', 'ultimate-member' ), - 'value' => UM()->options()->get( 'access_redirect' ), - ); - $restrict_settings['um-access_exclude_uris'] = array( - 'label' => __( 'Exclude the following URLs', 'ultimate-member' ), - 'value' => $exclude_uris_list, - ); - $restrict_settings['um-home_page_accessible'] = array( - 'label' => __( 'Allow Homepage to be accessible', 'ultimate-member' ), - 'value' => UM()->options()->get( 'home_page_accessible' ) ? $labels['yes'] : $labels['no'], - ); - $restrict_settings['um-category_page_accessible'] = array( - 'label' => __( 'Allow Category pages to be accessible', 'ultimate-member' ), - 'value' => UM()->options()->get( 'category_page_accessible' ) ? $labels['yes'] : $labels['no'], - ); - } - - $restrict_settings['um-restricted_post_title_replace'] = array( - 'label' => __( 'Restricted Content Titles', 'ultimate-member' ), - 'value' => UM()->options()->get( 'restricted_post_title_replace' ) ? $labels['yes'] : $labels['no'], - ); - if ( UM()->options()->get( 'restricted_post_title_replace' ) ) { - $restrict_settings['um-restricted_access_post_title'] = array( - 'label' => __( 'Restricted Content Title Text', 'ultimate-member' ), - 'value' => stripslashes( UM()->options()->get( 'restricted_access_post_title' ) ), - ); - } - - $restrict_settings['um-restricted_access_message'] = array( - 'label' => __( 'Restricted Access Message', 'ultimate-member' ), - 'value' => stripslashes( UM()->options()->get( 'restricted_access_message' ) ), - ); - $restrict_settings['um-restricted_blocks'] = array( - 'label' => __( 'Enable the "Content Restriction" settings for the Gutenberg Blocks', 'ultimate-member' ), - 'value' => UM()->options()->get( 'restricted_blocks' ) ? $labels['yes'] : $labels['no'], - ); - if ( UM()->options()->get( 'restricted_blocks' ) ) { - $restrict_settings['um-restricted_block_message'] = array( - 'label' => __( 'Restricted Access Block Message', 'ultimate-member' ), - 'value' => stripslashes( UM()->options()->get( 'restricted_block_message' ) ), - ); - } - $restrict_settings['um-restricted_access_post_metabox'] = array( - 'label' => __( 'Enable the "Content Restriction" settings for post types', 'ultimate-member' ), - 'value' => $restricted_posts_list, - ); - $restrict_settings['um-restricted_access_taxonomy_metabox'] = array( - 'label' => __( 'Enable the "Content Restriction" settings for taxonomies', 'ultimate-member' ), - 'value' => $restricted_taxonomy_list, - ); - - // Access other settings - $blocked_emails = str_replace( '
', ', ', nl2br( UM()->options()->get( 'blocked_emails' ) ) ); - $blocked_words = str_replace( '
', ', ', nl2br( UM()->options()->get( 'blocked_words' ) ) ); - $allowed_callbacks = str_replace( '
', ', ', nl2br( UM()->options()->get( 'allowed_choice_callbacks' ) ) ); - - $access_other_settings = array( - 'um-enable_reset_password_limit' => array( - 'label' => __( 'Enable the Reset Password Limit?', 'ultimate-member' ), - 'value' => UM()->options()->get( 'enable_reset_password_limit' ) ? $labels['yes'] : $labels['no'], - ), - ); - if ( UM()->options()->get( 'enable_reset_password_limit' ) ) { - $access_other_settings['um-reset_password_limit_number'] = array( - 'label' => __( 'Reset Password Limit ', 'ultimate-member' ), - 'value' => UM()->options()->get( 'reset_password_limit_number' ), - ); - } - $access_other_settings['um-change_password_request_limit'] = array( - 'label' => __( 'Change Password request limit ', 'ultimate-member' ), - 'value' => UM()->options()->get( 'change_password_request_limit' ), - ); - $access_other_settings['um-only_approved_user_reset_password'] = array( - 'label' => __( 'Only approved user Reset Password', 'ultimate-member' ), - 'value' => UM()->options()->get( 'only_approved_user_reset_password' ), - ); - $access_other_settings['um-blocked_emails'] = array( - 'label' => __( 'Blocked Email Addresses', 'ultimate-member' ), - 'value' => stripslashes( $blocked_emails ), - ); - $access_other_settings['um-blocked_words'] = array( - 'label' => __( 'Blacklist Words', 'ultimate-member' ), - 'value' => stripslashes( $blocked_words ), - ); - $access_other_settings['um-allowed_choice_callbacks'] = array( - 'label' => __( 'Allowed Choice Callbacks', 'ultimate-member' ), - 'value' => stripslashes( $allowed_callbacks ), - ); - $access_other_settings['um-allow_url_redirect_confirm'] = array( - 'label' => __( 'Allow external link redirect confirm ', 'ultimate-member' ), - 'value' => UM()->options()->get( 'allow_url_redirect_confirm' ) ? $labels['yes'] : $labels['no'], - ); - - // Email settings - $email_settings = array( - 'um-admin_email' => array( - 'label' => __( 'Admin Email Address', 'ultimate-member' ), - 'value' => UM()->options()->get( 'admin_email' ), - ), - 'um-mail_from' => array( - 'label' => __( 'Mail appears from', 'ultimate-member' ), - 'value' => UM()->options()->get( 'mail_from' ), - ), - 'um-mail_from_addr' => array( - 'label' => __( 'Mail appears from address', 'ultimate-member' ), - 'value' => UM()->options()->get( 'mail_from_addr' ), - ), - 'um-email_html' => array( - 'label' => __( 'Use HTML for Emails?', 'ultimate-member' ), - 'value' => UM()->options()->get( 'email_html' ) ? $labels['yes'] : $labels['no'], - ), - ); - - $emails = UM()->config()->email_notifications; - foreach ( $emails as $key => $email ) { - if ( UM()->options()->get( $key . '_on' ) ) { - $email_settings[ 'um-' . $key ] = array( - // translators: %s is email template title. - 'label' => sprintf( __( '"%s" Subject', 'ultimate-member' ), $email['title'] ), - 'value' => UM()->options()->get( $key . '_sub' ), - ); - - $email_settings[ 'um-theme_' . $key ] = array( - // translators: %s is email template title. - 'label' => sprintf( __( 'Template "%s" in theme?', 'ultimate-member' ), $email['title'] ), - 'value' => '' !== locate_template( array( 'ultimate-member/emails/' . $key . '.php' ) ) ? $labels['yes'] : $labels['no'], - ); - } - } - - // Appearance settings. - // > Profile section. - $icons_display_options = array( - 'field' => __( 'Show inside text field', 'ultimate-member' ), - 'label' => __( 'Show with label', 'ultimate-member' ), - 'off' => __( 'Turn off', 'ultimate-member' ), - ); - $profile_header_menu_options = array( - 'bc' => __( 'Bottom of Icon', 'ultimate-member' ), - 'lc' => __( 'Left of Icon (right for RTL)', 'ultimate-member' ), - ); - - $profile_templates = UM()->shortcodes()->get_templates( 'profile' ); - $profile_template_key = UM()->options()->get( 'profile_template' ); - $profile_template_title = array_key_exists( $profile_template_key, $profile_templates ) ? $profile_templates[ $profile_template_key ] : __( 'No template name', 'ultimate-member' ); - $profile_secondary_btn = UM()->options()->get( 'profile_secondary_btn' ); - $profile_cover_enabled = UM()->options()->get( 'profile_cover_enabled' ); - $profile_empty_text = UM()->options()->get( 'profile_empty_text' ); - - $appearance_settings = array( - 'um-profile_template' => array( - 'label' => __( 'Profile Default Template', 'ultimate-member' ), - // translators: %1$s - profile template name, %2$s - profile template filename - 'value' => sprintf( __( '%1$s (filename: %2$s.php)', 'ultimate-member' ), $profile_template_title, $profile_template_key ), - ), - 'um-profile_max_width' => array( - 'label' => __( 'Profile Maximum Width', 'ultimate-member' ), - 'value' => UM()->options()->get( 'profile_max_width' ), - ), - 'um-profile_area_max_width' => array( - 'label' => __( 'Profile Area Maximum Width', 'ultimate-member' ), - 'value' => UM()->options()->get( 'profile_area_max_width' ), - ), - 'um-profile_icons' => array( - 'label' => __( 'Profile Field Icons', 'ultimate-member' ), - 'value' => $icons_display_options[ UM()->options()->get( 'profile_icons' ) ], - ), - 'um-profile_primary_btn_word' => array( - 'label' => __( 'Profile Primary Button Text', 'ultimate-member' ), - 'value' => UM()->options()->get( 'profile_primary_btn_word' ), - ), - 'um-profile_secondary_btn' => array( - 'label' => __( 'Profile Secondary Button', 'ultimate-member' ), - 'value' => $profile_secondary_btn ? $labels['yes'] : $labels['no'], - ), - ); - if ( ! empty( $profile_secondary_btn ) ) { - $appearance_settings['um-profile_secondary_btn_word'] = array( - 'label' => __( 'Profile Secondary Button Text ', 'ultimate-member' ), - 'value' => UM()->options()->get( 'profile_secondary_btn_word' ), - ); - } - - $default_avatar = UM()->options()->get( 'default_avatar' ); - $default_cover = UM()->options()->get( 'default_cover' ); - - $appearance_settings['um-default_avatar'] = array( - 'label' => __( 'Default Profile Photo', 'ultimate-member' ), - 'value' => ! empty( $default_avatar['url'] ) ? $default_avatar['url'] : '', - ); - $appearance_settings['um-default_cover'] = array( - 'label' => __( 'Default Cover Photo', 'ultimate-member' ), - 'value' => ! empty( $default_cover['url'] ) ? $default_cover['url'] : '', - ); - $appearance_settings['um-disable_profile_photo_upload'] = array( - 'label' => __( 'Disable Profile Photo Upload', 'ultimate-member' ), - 'value' => UM()->options()->get( 'disable_profile_photo_upload' ) ? $labels['yes'] : $labels['no'], - ); - $appearance_settings['um-profile_photosize'] = array( - 'label' => __( 'Profile Photo Size', 'ultimate-member' ), - 'value' => UM()->options()->get( 'profile_photosize' ) . 'x' . UM()->options()->get( 'profile_photosize' ) . 'px', - ); - $appearance_settings['um-profile_cover_enabled'] = array( - 'label' => __( 'Profile Cover Photos', 'ultimate-member' ), - 'value' => $profile_cover_enabled ? $labels['yes'] : $labels['no'], - ); - if ( ! empty( $profile_cover_enabled ) ) { - $appearance_settings['um-profile_coversize'] = array( - 'label' => __( 'Profile Cover Size', 'ultimate-member' ), - 'value' => UM()->options()->get( 'profile_coversize' ) . 'px', - ); - $appearance_settings['um-profile_cover_ratio'] = array( - 'label' => __( 'Profile Cover Ratio', 'ultimate-member' ), - 'value' => UM()->options()->get( 'profile_cover_ratio' ), - ); - } - $appearance_settings['um-profile_show_metaicon'] = array( - 'label' => __( 'Profile Header Meta Text Icon', 'ultimate-member' ), - 'value' => UM()->options()->get( 'profile_show_metaicon' ) ? $labels['yes'] : $labels['no'], - ); - $appearance_settings['um-profile_show_name'] = array( - 'label' => __( 'Show display name in profile header', 'ultimate-member' ), - 'value' => UM()->options()->get( 'profile_show_name' ) ? $labels['yes'] : $labels['no'], - ); - $appearance_settings['um-profile_show_social_links'] = array( - 'label' => __( 'Show social links in profile header', 'ultimate-member' ), - 'value' => UM()->options()->get( 'profile_show_social_links' ) ? $labels['yes'] : $labels['no'], - ); - $appearance_settings['um-profile_show_bio'] = array( - 'label' => __( 'Show user description in header', 'ultimate-member' ), - 'value' => UM()->options()->get( 'profile_show_bio' ) ? $labels['yes'] : $labels['no'], - ); - $appearance_settings['um-profile_show_html_bio'] = array( - 'label' => __( 'Enable HTML support for user description', 'ultimate-member' ), - 'value' => UM()->options()->get( 'profile_show_html_bio' ) ? $labels['yes'] : $labels['no'], - ); - $appearance_settings['um-profile_bio_maxchars'] = array( - 'label' => __( 'User description maximum chars', 'ultimate-member' ), - 'value' => UM()->options()->get( 'profile_bio_maxchars' ), - ); - $appearance_settings['um-profile_header_menu'] = array( - 'label' => __( 'Profile Header Menu Position', 'ultimate-member' ), - 'value' => $profile_header_menu_options[ UM()->options()->get( 'profile_header_menu' ) ], - ); - $appearance_settings['um-profile_empty_text'] = array( - 'label' => __( 'Show a custom message if profile is empty', 'ultimate-member' ), - 'value' => $profile_empty_text ? $labels['yes'] : $labels['no'], - ); - if ( ! empty( $profile_empty_text ) ) { - $appearance_settings['um-profile_empty_text_emo'] = array( - 'label' => __( 'Show the emoticon', 'ultimate-member' ), - 'value' => UM()->options()->get( 'profile_empty_text_emo' ) ? $labels['yes'] : $labels['no'], - ); - } - - // > Profile Menu section. - $profile_menu = UM()->options()->get( 'profile_menu' ); - - $appearance_settings['um-profile_menu'] = array( - 'label' => __( 'Enable profile menu', 'ultimate-member' ), - 'value' => $profile_menu ? $labels['yes'] : $labels['no'], - ); - - if ( ! empty( $profile_menu ) ) { - /** - * Filters a privacy list extend. - * - * @since 2.7.0 - * @hook um_profile_tabs_privacy_list - * - * @param {array} $privacy_option Add options for profile tabs' privacy. - * - * @return {array} Options for profile tabs' privacy. - * - * @example Add options for profile tabs' privacy. - * function um_profile_menu_link_attrs( $privacy_option ) { - * // your code here - * return $privacy_option; - * } - * add_filter( 'um_profile_tabs_privacy_list', 'um_profile_tabs_privacy_list', 10, 1 ); - */ - $privacy_option = UM()->profile()->tabs_privacy(); - - $tabs = UM()->profile()->tabs(); - foreach ( $tabs as $id => $tab ) { - if ( ! empty( $tab['hidden'] ) ) { - continue; - } - - $tab_enabled = UM()->options()->get( 'profile_tab_' . $id ); - - $appearance_settings[ 'um-profile_tab_' . $id ] = array( - // translators: %s Profile Tab Title - 'label' => sprintf( __( '%s Tab', 'ultimate-member' ), $tab['name'] ), - 'value' => $tab_enabled ? $labels['yes'] : $labels['no'], - ); - - if ( ! isset( $tab['default_privacy'] ) && ! empty( $tab_enabled ) ) { - $privacy = UM()->options()->get( 'profile_tab_' . $id . '_privacy' ); - if ( is_numeric( $privacy ) ) { - $appearance_settings[ 'um-profile_tab_' . $id . '_privacy' ] = array( - // translators: %s Profile Tab Title - 'label' => sprintf( __( 'Who can see %s Tab?', 'ultimate-member' ), $tab['name'] ), - 'value' => $privacy_option[ UM()->options()->get( 'profile_tab_' . $id . '_privacy' ) ], - ); - } - } - } - /** - * Filters appearance settings for Site Health extend. - * - * @since 2.7.0 - * @hook um_profile_tabs_site_health - * - * @param {array} $appearance_settings Appearance settings for Site Health. - * - * @return {array} Appearance settings for Site Health. - * - * @example Add options for appearance settings for Site Health. - * function um_profile_tabs_site_health( $appearance_settings ) { - * // your code here - * return $appearance_settings; - * } - * add_filter( 'um_profile_tabs_site_health', 'um_profile_tabs_site_health', 10, 1 ); - */ - $appearance_settings = apply_filters( 'um_profile_tabs_site_health', $appearance_settings ); - - /** - * Filters user profile tabs - * - * @since 2.7.0 - * @hook um_profile_tabs - * - * @param {array} $tabs tabs list. - * - * @return {array} tabs list. - * - * @example Add options for profile tabs' privacy. - * function um_profile_tabs( $tabs ) { - * // your code here - * return $tabs; - * } - * add_filter( 'um_profile_tabs', 'um_profile_tabs', 10, 1 ); - */ - $tabs_options = apply_filters( - 'um_profile_tabs', - array( - 'main' => array( - 'name' => __( 'About', 'ultimate-member' ), - 'icon' => 'um-faicon-user', - ), - 'posts' => array( - 'name' => __( 'Posts', 'ultimate-member' ), - 'icon' => 'um-faicon-pencil', - ), - 'comments' => array( - 'name' => __( 'Comments', 'ultimate-member' ), - 'icon' => 'um-faicon-comment', - ), - ) - ); - - $appearance_settings['um-profile_menu_default_tab'] = array( - 'label' => __( 'Profile menu default tab', 'ultimate-member' ), - 'value' => $tabs_options[ UM()->options()->get( 'profile_menu_default_tab' ) ], - ); - $appearance_settings['um-profile_menu_icons'] = array( - 'label' => __( 'Enable menu icons in desktop view', 'ultimate-member' ), - 'value' => UM()->options()->get( 'profile_menu_icons' ) ? $labels['yes'] : $labels['no'], - ); - } - - // > Registration Form section. - $register_templates = UM()->shortcodes()->get_templates( 'register' ); - $register_template_key = UM()->options()->get( 'register_template' ); - $register_template_title = array_key_exists( $register_template_key, $register_templates ) ? $register_templates[ $register_template_key ] : __( 'No template name', 'ultimate-member' ); - $register_secondary_btn = UM()->options()->get( 'register_secondary_btn' ); - - $form_align_options = array( - 'center' => __( 'Centered', 'ultimate-member' ), - 'left' => __( 'Left aligned', 'ultimate-member' ), - 'right' => __( 'Right aligned', 'ultimate-member' ), - ); - - $appearance_settings['um-register_template'] = array( - 'label' => __( 'Registration Default Template', 'ultimate-member' ), - // translators: %1$s - register template name, %2$s - register template filename - 'value' => sprintf( __( '%1$s (filename: %2$s.php)', 'ultimate-member' ), $register_template_title, $register_template_key ), - ); - $appearance_settings['um-register_max_width'] = array( - 'label' => __( 'Registration Maximum Width', 'ultimate-member' ), - 'value' => UM()->options()->get( 'register_max_width' ), - ); - $appearance_settings['um-register_align'] = array( - 'label' => __( 'Registration Shortcode Alignment', 'ultimate-member' ), - 'value' => $form_align_options[ UM()->options()->get( 'register_align' ) ], - ); - $appearance_settings['um-register_icons'] = array( - 'label' => __( 'Registration Field Icons', 'ultimate-member' ), - 'value' => $icons_display_options[ UM()->options()->get( 'register_icons' ) ], - ); - $appearance_settings['um-register_primary_btn_word'] = array( - 'label' => __( 'Registration Primary Button Text ', 'ultimate-member' ), - 'value' => UM()->options()->get( 'register_primary_btn_word' ), - ); - $appearance_settings['um-register_secondary_btn'] = array( - 'label' => __( 'Registration Secondary Button', 'ultimate-member' ), - 'value' => $register_secondary_btn ? $labels['yes'] : $labels['no'], - ); - if ( ! empty( $register_secondary_btn ) ) { - $appearance_settings['um-register_secondary_btn_word'] = array( - 'label' => __( 'Registration Secondary Button Text', 'ultimate-member' ), - 'value' => UM()->options()->get( 'register_secondary_btn_word' ), - ); - $appearance_settings['um-register_secondary_btn_url'] = array( - 'label' => __( 'Registration Secondary Button URL', 'ultimate-member' ), - 'value' => UM()->options()->get( 'register_secondary_btn_url' ), - ); - } - - // > Login Form section. - $login_templates = UM()->shortcodes()->get_templates( 'login' ); - $login_template_key = UM()->options()->get( 'login_template' ); - $login_template_title = array_key_exists( $login_template_key, $login_templates ) ? $login_templates[ $login_template_key ] : __( 'No template name', 'ultimate-member' ); - $login_secondary_btn = UM()->options()->get( 'login_secondary_btn' ); - - $appearance_settings['um-login_template'] = array( - 'label' => __( 'Login Default Template', 'ultimate-member' ), - // translators: %1$s - login template name, %2$s - login template filename - 'value' => sprintf( __( '%1$s (filename: %2$s.php)', 'ultimate-member' ), $login_template_title, $login_template_key ), - ); - $appearance_settings['um-login_max_width'] = array( - 'label' => __( 'Login Maximum Width', 'ultimate-member' ), - 'value' => UM()->options()->get( 'login_max_width' ), - ); - $appearance_settings['um-login_align'] = array( - 'label' => __( 'Login Shortcode Alignment', 'ultimate-member' ), - 'value' => $form_align_options[ UM()->options()->get( 'login_align' ) ], - ); - $appearance_settings['um-login_icons'] = array( - 'label' => __( 'Login Field Icons', 'ultimate-member' ), - 'value' => $icons_display_options[ UM()->options()->get( 'login_icons' ) ], - ); - $appearance_settings['um-login_primary_btn_word'] = array( - 'label' => __( 'Login Primary Button Text', 'ultimate-member' ), - 'value' => UM()->options()->get( 'login_primary_btn_word' ), - ); - $appearance_settings['um-login_secondary_btn'] = array( - 'label' => __( 'Login Secondary Button', 'ultimate-member' ), - 'value' => $login_secondary_btn ? $labels['yes'] : $labels['no'], - ); - if ( ! empty( $login_secondary_btn ) ) { - $appearance_settings['um-login_secondary_btn_word'] = array( - 'label' => __( 'Login Secondary Button Text', 'ultimate-member' ), - 'value' => UM()->options()->get( 'login_secondary_btn_word' ), - ); - $appearance_settings['um-login_secondary_btn_url'] = array( - 'label' => __( 'Login Secondary Button URL', 'ultimate-member' ), - 'value' => UM()->options()->get( 'login_secondary_btn_url' ), - ); - } - $appearance_settings['um-login_forgot_pass_link'] = array( - 'label' => __( 'Login Forgot Password Link', 'ultimate-member' ), - 'value' => UM()->options()->get( 'login_forgot_pass_link' ) ? $labels['yes'] : $labels['no'], - ); - $appearance_settings['um-login_show_rememberme'] = array( - 'label' => __( 'Show "Remember Me"', 'ultimate-member' ), - 'value' => UM()->options()->get( 'login_show_rememberme' ) ? $labels['yes'] : $labels['no'], - ); + // Appearance settings sitehealth + $appearance_sitehealth = $this->appearance_sitehealth(); // Misc settings. $misc_settings = array( @@ -1373,7 +587,8 @@ class Site_Health { */ $license_settings = apply_filters( 'um_licenses_site_health', $license_settings ); - $info['ultimate-member']['fields'] = array_merge( $info['ultimate-member']['fields'], $pages_settings, $user_settings, $account_settings, $uploads_settings, $restrict_settings, $access_other_settings, $email_settings, $appearance_settings, $misc_settings, $secure_settings, $license_settings ); +// $info['ultimate-member']['fields'] = array_merge( $info['ultimate-member']['fields'], $pages_settings, $user_settings, $account_settings, $uploads_settings, $restrict_settings, $access_other_settings, $email_settings, $appearance_settings, $misc_settings, $secure_settings, $license_settings ); + $info['ultimate-member']['fields'] = array_merge( $info['ultimate-member']['fields'], $general_sitehealth, $access_sitehealth, $emails_sitehealth, $appearance_sitehealth, $misc_settings, $secure_settings, $license_settings ); // User roles settings $roles_array = array(); @@ -2608,4 +1823,885 @@ class Site_Health { */ return apply_filters( 'um_site_health_extend', $info ); } + + public function general_siteheath() { + $labels = self::get_labels(); + + // Pages settings. + $pages = array(); + $predefined_pages = UM()->config()->core_pages; + foreach ( $predefined_pages as $page_s => $page ) { + $page_id = UM()->options()->get_predefined_page_option_key( $page_s ); + $page_title = ! empty( $page['title'] ) ? $page['title'] : ''; + if ( empty( $page_title ) ) { + continue; + } + + $predefined_page_id = UM()->options()->get( $page_id ); + + if ( empty( $predefined_page_id ) ) { + $pages[ $page_title ] = $labels['nopages']; + continue; + } + // translators: %1$s is a predefined page title; %2$d is a predefined page ID; %3$s is a predefined page permalink. + $pages[ $page_title ] = sprintf( __( '%1$s (ID#%2$d) | %3$s', 'ultimate-member' ), get_the_title( $predefined_page_id ), $predefined_page_id, get_permalink( $predefined_page_id ) ); + } + + $pages = apply_filters( 'um_debug_information_pages', $pages ); + + $pages_settings = array( + 'um-pages' => array( + 'label' => __( 'Pages', 'ultimate-member' ), + 'value' => $pages, + ), + ); + + // User settings + $permalink_base = UM()->config()->permalink_base_options; + $display_name = UM()->config()->display_name_options; + + $user_settings = array( + 'um-user_separator' => array( + 'label' => __( 'User settings', 'ultimate-member' ), + 'value' => '---------------------------------------------------------------------', + ), + 'um-register_role' => array( + 'label' => __( 'Registration Default Role', 'ultimate-member' ), + 'value' => ! empty( UM()->options()->get( 'register_role' ) ) ? UM()->options()->get( 'register_role' ) : __( 'Default', 'ultimate-member' ), + ), + 'um-permalink_base' => array( + 'label' => __( 'Profile Permalink Base', 'ultimate-member' ), + 'value' => isset( $permalink_base[ UM()->options()->get( 'permalink_base' ) ] ) ? $permalink_base[ UM()->options()->get( 'permalink_base' ) ] : $labels['no'], + ), + 'um-display_name' => array( + 'label' => __( 'User Display Name', 'ultimate-member' ), + 'value' => isset( $display_name[ UM()->options()->get( 'display_name' ) ] ) ? $display_name[ UM()->options()->get( 'display_name' ) ] : $labels['no'], + ), + 'um-author_redirect' => array( + 'label' => __( 'Hide author pages (enable author page redirect to user profile)', 'ultimate-member' ), + 'value' => UM()->options()->get( 'author_redirect' ) ? $labels['yes'] : $labels['no'], + ), + 'um-members_page' => array( + 'label' => __( 'Enable Members Directory', 'ultimate-member' ), + 'value' => UM()->options()->get( 'members_page' ) ? $labels['yes'] : $labels['no'], + ), + 'um-use_gravatars' => array( + 'label' => __( 'Use Gravatars?', 'ultimate-member' ), + 'value' => UM()->options()->get( 'use_gravatars' ) ? $labels['yes'] : $labels['no'], + ), + ); + + if ( UM()->options()->get( 'use_gravatars' ) ) { + $gravatar_options = array( + 'default' => __( 'Default', 'ultimate-member' ), + '404' => __( '404 ( File Not Found response )', 'ultimate-member' ), + 'mm' => __( 'Mystery Man', 'ultimate-member' ), + 'identicon' => __( 'Identicon', 'ultimate-member' ), + 'monsterid' => __( 'Monsterid', 'ultimate-member' ), + 'wavatar' => __( 'Wavatar', 'ultimate-member' ), + 'retro' => __( 'Retro', 'ultimate-member' ), + 'blank' => __( 'Blank ( a transparent PNG image )', 'ultimate-member' ), + ); + + $user_settings['um-use_um_gravatar_default_builtin_image'] = array( + 'label' => __( 'Use Gravatar builtin image', 'ultimate-member' ), + 'value' => $gravatar_options[ UM()->options()->get( 'use_um_gravatar_default_builtin_image' ) ], + ); + if ( 'default' === UM()->options()->get( 'use_um_gravatar_default_builtin_image' ) ) { + $user_settings['um-use_um_gravatar_default_image'] = array( + 'label' => __( 'Replace Gravatar\'s Default avatar (Set Default plugin avatar as Gravatar\'s Default avatar)', 'ultimate-member' ), + 'value' => UM()->options()->get( 'use_um_gravatar_default_image' ) ? $labels['yes'] : $labels['no'], + ); + } + } + + $user_settings = array_merge( + $user_settings, + array( + 'um-admin_ignore_user_status' => array( + 'label' => __( 'Ignore the "User Role > Registration Options" if this user is added from the wp-admin dashboard', 'ultimate-member' ), + 'value' => UM()->options()->get( 'admin_ignore_user_status' ) ? $labels['yes'] : $labels['no'], + ), + 'um-delete_comments' => array( + 'label' => __( 'Delete user comments (enable deleting user comments after deleting a user)', 'ultimate-member' ), + 'value' => UM()->options()->get( 'delete_comments' ) ? $labels['yes'] : $labels['no'], + ), + 'um-toggle_password' => array( + 'label' => __( 'Toggle Password Visibility (enable password show/hide icon on password field)', 'ultimate-member' ), + 'value' => UM()->options()->get( 'toggle_password' ) ? $labels['yes'] : $labels['no'], + ), + 'um-require_strongpass' => array( + 'label' => __( 'Require Strong Passwords', 'ultimate-member' ), + 'value' => UM()->options()->get( 'require_strongpass' ) ? $labels['yes'] : $labels['no'], + ), + ) + ); + + if ( UM()->options()->get( 'require_strongpass' ) ) { + $user_settings = array_merge( + $user_settings, + array( + 'um-password_min_chars' => array( + 'label' => __( 'Password minimum length', 'ultimate-member' ), + 'value' => UM()->options()->get( 'password_min_chars' ), + ), + 'um-password_max_chars' => array( + 'label' => __( 'Password maximum length', 'ultimate-member' ), + 'value' => UM()->options()->get( 'password_max_chars' ), + ), + ) + ); + } + + $user_settings = array_merge( + $user_settings, + array( + 'um-activation_link_expiry_time' => array( + 'label' => __( 'Email activation link expiration (days)', 'ultimate-member' ), + 'value' => UM()->options()->get( 'activation_link_expiry_time' ), + ), + 'um-profile_noindex' => array( + 'label' => __( 'Avoid indexing profile by search engines', 'ultimate-member' ), + 'value' => UM()->options()->get( 'profile_noindex' ) ? $labels['yes'] : $labels['no'], + ), + 'um-profile_title' => array( + 'label' => __( 'User Profile Title', 'ultimate-member' ), + 'value' => stripslashes( UM()->options()->get( 'profile_title' ) ), + ), + 'um-profile_desc' => array( + 'label' => __( 'User Profile Dynamic Meta Description', 'ultimate-member' ), + 'value' => stripslashes( UM()->options()->get( 'profile_desc' ) ), + ), + ) + ); + + if ( 'custom_meta' === UM()->options()->get( 'permalink_base' ) ) { + $user_settings = UM()->array_insert_before( + $user_settings, + 'um-display_name', + array( + 'um-permalink_base_custom_meta' => array( + 'label' => __( 'Profile Permalink Base Custom Meta Key', 'ultimate-member' ), + 'value' => UM()->options()->get( 'permalink_base_custom_meta' ), + ), + ) + ); + } + + if ( 'field' === UM()->options()->get( 'display_name' ) ) { + $user_settings = UM()->array_insert_before( + $user_settings, + 'um-author_redirect', + array( + 'um-display_name_field' => array( + 'label' => __( 'Display Name Custom Field(s)', 'ultimate-member' ), + 'value' => UM()->options()->get( 'display_name_field' ), + ), + ) + ); + } + + // Account settings + $account_settings = array( + 'um-account_separator' => array( + 'label' => __( 'Account settings', 'ultimate-member' ), + 'value' => '---------------------------------------------------------------------', + ), + 'um-account_name' => array( + 'label' => __( 'Display First & Last name fields (enable to display First & Last name fields)', 'ultimate-member' ), + 'value' => UM()->options()->get( 'account_name' ) ? $labels['yes'] : $labels['no'], + ), + 'um-account_email' => array( + 'label' => __( 'Allow users to change email (enable changing email via the account page)', 'ultimate-member' ), + 'value' => UM()->options()->get( 'account_email' ) ? $labels['yes'] : $labels['no'], + ), + 'um-account_general_password' => array( + 'label' => __( 'Require password to update account (enable required password)', 'ultimate-member' ), + 'value' => UM()->options()->get( 'account_general_password' ) ? $labels['yes'] : $labels['no'], + ), + 'um-account_tab_password' => array( + 'label' => __( 'Password Account Tab', 'ultimate-member' ), + 'value' => UM()->options()->get( 'account_tab_password' ) ? $labels['yes'] : $labels['no'], + ), + 'um-account_tab_privacy' => array( + 'label' => __( 'Privacy Account Tab', 'ultimate-member' ), + 'value' => UM()->options()->get( 'account_tab_privacy' ) ? $labels['yes'] : $labels['no'], + ), + ); + + if ( UM()->options()->get( 'account_name' ) ) { + $account_settings = UM()->array_insert_before( + $account_settings, + 'um-account_email', + array( + 'um-account_name_disable' => array( + 'label' => __( 'Disable First & Last name field editing', 'ultimate-member' ), + 'value' => UM()->options()->get( 'account_name_disable' ) ? $labels['yes'] : $labels['no'], + ), + 'um-account_name_require' => array( + 'label' => __( 'Require First & Last Name', 'ultimate-member' ), + 'value' => UM()->options()->get( 'account_name_require' ) ? $labels['yes'] : $labels['no'], + ), + ) + ); + } + + if ( false !== UM()->account()->is_notifications_tab_visible() ) { + $account_settings['um-account_tab_notifications'] = array( + 'label' => __( 'Notifications Account Tab', 'ultimate-member' ), + 'value' => UM()->options()->get( 'account_tab_notifications' ) ? $labels['yes'] : $labels['no'], + ); + } + + if ( UM()->options()->get( 'account_tab_privacy' ) ) { + $account_settings['um-account_hide_in_directory'] = array( + 'label' => __( 'Allow users to hide their profiles from directory', 'ultimate-member' ), + 'value' => UM()->options()->get( 'account_hide_in_directory' ) ? $labels['yes'] : $labels['no'], + ); + + if ( UM()->options()->get( 'account_hide_in_directory' ) ) { + $account_settings['um-account_hide_in_directory_default'] = array( + 'label' => __( 'Hide profiles from directory by default', 'ultimate-member' ), + 'value' => UM()->options()->get( 'account_hide_in_directory_default' ), + ); + } + } + + $account_settings = array_merge( + $account_settings, + array( + 'um-account_tab_delete' => array( + 'label' => __( 'Delete Account Tab', 'ultimate-member' ), + 'value' => UM()->options()->get( 'account_tab_delete' ) ? $labels['yes'] : $labels['no'], + ), + 'um-delete_account_text' => array( + 'label' => __( 'Account Deletion Text', 'ultimate-member' ), + 'value' => UM()->options()->get( 'delete_account_text' ), + ), + 'um-delete_account_no_pass_required_text' => array( + 'label' => __( 'Account Deletion without password Text', 'ultimate-member' ), + 'value' => UM()->options()->get( 'delete_account_no_pass_required_text' ), + ), + ) + ); + + // Uploads settings + $profile_sizes_list = ''; + $profile_sizes = UM()->options()->get( 'photo_thumb_sizes' ); + if ( ! empty( $profile_sizes ) ) { + foreach ( $profile_sizes as $size ) { + $profile_sizes_list = empty( $profile_sizes_list ) ? $size : $profile_sizes_list . ', ' . $size; + } + } + $cover_sizes_list = ''; + $cover_sizes = UM()->options()->get( 'cover_thumb_sizes' ); + if ( ! empty( $cover_sizes ) ) { + foreach ( $cover_sizes as $size ) { + $cover_sizes_list = empty( $cover_sizes_list ) ? $size : $cover_sizes_list . ', ' . $size; + } + } + $uploads_settings = array( + 'um-account_separator' => array( + 'label' => __( 'Upload settings', 'ultimate-member' ), + 'value' => '---------------------------------------------------------------------', + ), + 'um-image_orientation_by_exif' => array( + 'label' => __( 'Change image orientation', 'ultimate-member' ), + 'value' => UM()->options()->get( 'image_orientation_by_exif' ) ? $labels['yes'] : $labels['no'], + ), + 'um-image_compression' => array( + 'label' => __( 'Image Quality', 'ultimate-member' ), + 'value' => UM()->options()->get( 'image_compression' ), + ), + 'um-image_max_width' => array( + 'label' => __( 'Image Upload Maximum Width (px)', 'ultimate-member' ), + 'value' => UM()->options()->get( 'image_max_width' ), + ), + 'um-profile_photo_max_size' => array( + 'label' => __( 'Profile Photo Maximum File Size (bytes)', 'ultimate-member' ), + 'value' => UM()->options()->get( 'profile_photo_max_size' ), + ), + 'um-photo_thumb_sizes' => array( + 'label' => __( 'Profile Photo Thumbnail Sizes (px)', 'ultimate-member' ), + 'value' => $profile_sizes_list, + ), + 'um-cover_photo_max_size' => array( + 'label' => __( 'Cover Photo Maximum File Size (bytes)', 'ultimate-member' ), + 'value' => UM()->options()->get( 'cover_photo_max_size' ), + ), + 'um-cover_min_width' => array( + 'label' => __( 'Cover Photo Minimum Width (px)', 'ultimate-member' ), + 'value' => UM()->options()->get( 'cover_min_width' ), + ), + 'um-cover_thumb_sizes' => array( + 'label' => __( 'Cover Photo Thumbnail Sizes (px)', 'ultimate-member' ), + 'value' => $cover_sizes_list, + ), + ); + + return array_merge( $pages_settings, $user_settings, $account_settings, $uploads_settings ); + } + + public function access_sitehealth() { + $labels = self::get_labels(); + + // Content Restriction settings + $restricted_posts = UM()->options()->get( 'restricted_access_post_metabox' ); + $restricted_posts_list = ''; + if ( ! empty( $restricted_posts ) ) { + foreach ( $restricted_posts as $key => $posts ) { + $restricted_posts_list = empty( $restricted_posts_list ) ? $key : $restricted_posts_list . ', ' . $key; + } + } + $restricted_taxonomy = UM()->options()->get( 'restricted_access_taxonomy_metabox' ); + $restricted_taxonomy_list = ''; + if ( ! empty( $restricted_taxonomy ) ) { + foreach ( $restricted_taxonomy as $key => $posts ) { + $restricted_taxonomy_list = empty( $restricted_taxonomy_list ) ? $key : $restricted_taxonomy_list . ', ' . $key; + } + } + + $accessible = absint( UM()->options()->get( 'accessible' ) ); + + $restrict_settings = array( + 'um-accessible_separator' => array( + 'label' => __( 'Access settings', 'ultimate-member' ), + 'value' => '---------------------------------------------------------------------', + ), + 'um-accessible' => array( + 'label' => __( 'Global Site Access', 'ultimate-member' ), + 'value' => 0 === $accessible ? __( 'Site accessible to Everyone', 'ultimate-member' ) : __( 'Site accessible to Logged In Users', 'ultimate-member' ), + ), + ); + + if ( 2 === $accessible ) { + $exclude_uris = UM()->options()->get( 'access_exclude_uris' ); + $exclude_uris_list = ''; + if ( ! empty( $exclude_uris ) ) { + $exclude_uris_list = implode( ', ', $exclude_uris ); + } + $restrict_settings['um-access_redirect'] = array( + 'label' => __( 'Custom Redirect URL', 'ultimate-member' ), + 'value' => UM()->options()->get( 'access_redirect' ), + ); + $restrict_settings['um-access_exclude_uris'] = array( + 'label' => __( 'Exclude the following URLs', 'ultimate-member' ), + 'value' => $exclude_uris_list, + ); + $restrict_settings['um-home_page_accessible'] = array( + 'label' => __( 'Allow Homepage to be accessible', 'ultimate-member' ), + 'value' => UM()->options()->get( 'home_page_accessible' ) ? $labels['yes'] : $labels['no'], + ); + $restrict_settings['um-category_page_accessible'] = array( + 'label' => __( 'Allow Category pages to be accessible', 'ultimate-member' ), + 'value' => UM()->options()->get( 'category_page_accessible' ) ? $labels['yes'] : $labels['no'], + ); + } + + $restrict_settings['um-restricted_post_title_replace'] = array( + 'label' => __( 'Restricted Post Title', 'ultimate-member' ), + 'value' => UM()->options()->get( 'restricted_post_title_replace' ) ? $labels['yes'] : $labels['no'], + ); + if ( UM()->options()->get( 'restricted_post_title_replace' ) ) { + $restrict_settings['um-restricted_access_post_title'] = array( + 'label' => __( 'Restricted Access Post Title', 'ultimate-member' ), + 'value' => stripslashes( UM()->options()->get( 'restricted_access_post_title' ) ), + ); + } + + $restrict_settings['um-restricted_access_message'] = array( + 'label' => __( 'Restricted Access Message', 'ultimate-member' ), + 'value' => stripslashes( UM()->options()->get( 'restricted_access_message' ) ), + ); + $restrict_settings['um-restricted_blocks'] = array( + 'label' => __( 'Restricted Gutenberg Blocks (enable the "Content Restriction" settings for the Gutenberg Blocks)', 'ultimate-member' ), + 'value' => UM()->options()->get( 'restricted_blocks' ) ? $labels['yes'] : $labels['no'], + ); + if ( UM()->options()->get( 'restricted_blocks' ) ) { + $restrict_settings['um-restricted_block_message'] = array( + 'label' => __( 'Restricted Access Block Message', 'ultimate-member' ), + 'value' => stripslashes( UM()->options()->get( 'restricted_block_message' ) ), + ); + } + $restrict_settings['um-restricted_access_post_metabox'] = array( + 'label' => __( 'Enable the "Content Restriction" settings for post types', 'ultimate-member' ), + 'value' => $restricted_posts_list, + ); + $restrict_settings['um-restricted_access_taxonomy_metabox'] = array( + 'label' => __( 'Enable the "Content Restriction" settings for taxonomies', 'ultimate-member' ), + 'value' => $restricted_taxonomy_list, + ); + + // Access other settings + $blocked_emails = str_replace( '
', ', ', nl2br( UM()->options()->get( 'blocked_emails' ) ) ); + $blocked_words = str_replace( '
', ', ', nl2br( UM()->options()->get( 'blocked_words' ) ) ); + + $access_other_settings = array( + 'um-enable_reset_password_limit' => array( + 'label' => __( 'Enable the Reset Password Limit?', 'ultimate-member' ), + 'value' => UM()->options()->get( 'enable_reset_password_limit' ) ? $labels['yes'] : $labels['no'], + ), + ); + if ( UM()->options()->get( 'enable_reset_password_limit' ) ) { + $access_other_settings['um-reset_password_limit_number'] = array( + 'label' => __( 'Password Limit (maximum reset password limit)', 'ultimate-member' ), + 'value' => UM()->options()->get( 'reset_password_limit_number' ), + ); + } + $access_other_settings['um-change_password_request_limit'] = array( + 'label' => __( 'Change Password request limit ', 'ultimate-member' ), + 'value' => UM()->options()->get( 'change_password_request_limit' ) ? $labels['yes'] : $labels['no'], + ); + $access_other_settings['um-only_approved_user_reset_password'] = array( + 'label' => __( 'Only approved user Reset Password', 'ultimate-member' ), + 'value' => UM()->options()->get( 'only_approved_user_reset_password' ) ? $labels['yes'] : $labels['no'], + ); + $access_other_settings['um-blocked_emails'] = array( + 'label' => __( 'Blocked Email Addresses', 'ultimate-member' ), + 'value' => stripslashes( $blocked_emails ), + ); + $access_other_settings['um-blocked_words'] = array( + 'label' => __( 'Blacklist Words', 'ultimate-member' ), + 'value' => stripslashes( $blocked_words ), + ); + + return array_merge( $restrict_settings, $access_other_settings ); + } + + public function emails_sitehealth() { + $labels = self::get_labels(); + + // Email settings + $email_settings = array( + 'um-email_separator' => array( + 'label' => __( 'Emails settings', 'ultimate-member' ), + 'value' => '---------------------------------------------------------------------', + ), + 'um-admin_email' => array( + 'label' => __( 'Admin Email Address', 'ultimate-member' ), + 'value' => UM()->options()->get( 'admin_email' ), + ), + 'um-mail_from' => array( + 'label' => __( 'Mail appears from', 'ultimate-member' ), + 'value' => UM()->options()->get( 'mail_from' ), + ), + 'um-mail_from_addr' => array( + 'label' => __( 'Mail appears from address', 'ultimate-member' ), + 'value' => UM()->options()->get( 'mail_from_addr' ), + ), + 'um-email_html' => array( + 'label' => __( 'Use HTML for Emails?', 'ultimate-member' ), + 'value' => UM()->options()->get( 'email_html' ) ? $labels['yes'] : $labels['no'], + ), + ); + + $emails = UM()->config()->email_notifications; + foreach ( $emails as $key => $email ) { + if ( UM()->options()->get( $key . '_on' ) ) { + $email_settings[ 'um-' . $key ] = array( + // translators: %s is email template title. + 'label' => sprintf( __( '"%s" Subject', 'ultimate-member' ), $email['title'] ), + 'value' => UM()->options()->get( $key . '_sub' ), + ); + + $email_settings[ 'um-theme_' . $key ] = array( + // translators: %s is email template title. + 'label' => sprintf( __( 'Template "%s" in theme?', 'ultimate-member' ), $email['title'] ), + 'value' => '' !== locate_template( array( 'ultimate-member/emails/' . $key . '.php' ) ) ? $labels['yes'] : $labels['no'], + ); + } + } + + return $email_settings; + } + + public function appearance_sitehealth() { + $labels = self::get_labels(); + + // > Profile section. + $icons_display_options = array( + 'field' => __( 'Show inside text field', 'ultimate-member' ), + 'label' => __( 'Show with label', 'ultimate-member' ), + 'off' => __( 'Turn off', 'ultimate-member' ), + ); + $profile_header_menu_options = array( + 'bc' => __( 'Bottom of Icon', 'ultimate-member' ), + 'lc' => __( 'Left of Icon (right for RTL)', 'ultimate-member' ), + ); + + $profile_templates = UM()->shortcodes()->get_templates( 'profile' ); + $profile_template_key = UM()->options()->get( 'profile_template' ); + $profile_template_title = array_key_exists( $profile_template_key, $profile_templates ) ? $profile_templates[ $profile_template_key ] : __( 'No template name', 'ultimate-member' ); + $profile_secondary_btn = UM()->options()->get( 'profile_secondary_btn' ); + $profile_cover_enabled = UM()->options()->get( 'profile_cover_enabled' ); + $profile_empty_text = UM()->options()->get( 'profile_empty_text' ); + $default_avatar = UM()->options()->get( 'default_avatar' ); + $default_cover = UM()->options()->get( 'default_cover' ); + + $appearance_settings = array( + 'um-appearance_separator' => array( + 'label' => __( 'Appearance settings', 'ultimate-member' ), + 'value' => '---------------------------------------------------------------------', + ), + 'um-profile_template' => array( + 'label' => __( 'Profile Default Template', 'ultimate-member' ), + // translators: %1$s - profile template name, %2$s - profile template filename + 'value' => sprintf( __( '%1$s (filename: %2$s.php)', 'ultimate-member' ), $profile_template_title, $profile_template_key ), + ), + 'um-profile_max_width' => array( + 'label' => __( 'Profile Maximum Width', 'ultimate-member' ), + 'value' => UM()->options()->get( 'profile_max_width' ), + ), + 'um-profile_area_max_width' => array( + 'label' => __( 'Profile Area Maximum Width', 'ultimate-member' ), + 'value' => UM()->options()->get( 'profile_area_max_width' ), + ), + 'um-default_avatar' => array( + 'label' => __( 'Default Profile Photo', 'ultimate-member' ), + 'value' => ! empty( $default_avatar['url'] ) ? $default_avatar['url'] : '', + ), + 'um-disable_profile_photo_upload' => array( + 'label' => __( 'Disable Profile Photo Upload', 'ultimate-member' ), + 'value' => UM()->options()->get( 'disable_profile_photo_upload' ) ? $labels['yes'] : $labels['no'], + ), + 'um-profile_photosize' => array( + 'label' => __( 'Profile Photo Size', 'ultimate-member' ), + 'value' => UM()->options()->get( 'profile_photosize' ) . 'x' . UM()->options()->get( 'profile_photosize' ) . 'px', + ), + 'um-default_cover' => array( + 'label' => __( 'Default Cover Photo', 'ultimate-member' ), + 'value' => ! empty( $default_cover['url'] ) ? $default_cover['url'] : '', + ), + 'um-profile_cover_enabled' => array( + 'label' => __( 'Profile Cover Photos', 'ultimate-member' ), + 'value' => $profile_cover_enabled ? $labels['yes'] : $labels['no'], + ), + ); + + if ( ! empty( $profile_cover_enabled ) ) { + $appearance_settings['um-profile_coversize'] = array( + 'label' => __( 'Profile Cover Size', 'ultimate-member' ), + 'value' => UM()->options()->get( 'profile_coversize' ) . 'px', + ); + $appearance_settings['um-profile_cover_ratio'] = array( + 'label' => __( 'Profile Cover Ratio', 'ultimate-member' ), + 'value' => UM()->options()->get( 'profile_cover_ratio' ), + ); + } + + $appearance_settings = array_merge( + $appearance_settings, + array( + 'um-profile_show_metaicon' => array( + 'label' => __( 'Profile Header Meta Text Icon', 'ultimate-member' ), + 'value' => UM()->options()->get( 'profile_show_metaicon' ) ? $labels['yes'] : $labels['no'], + ), + 'um-profile_show_name' => array( + 'label' => __( 'Show display name in profile header', 'ultimate-member' ), + 'value' => UM()->options()->get( 'profile_show_name' ) ? $labels['yes'] : $labels['no'], + ), + 'um-profile_show_social_links' => array( + 'label' => __( 'Show social links in profile header', 'ultimate-member' ), + 'value' => UM()->options()->get( 'profile_show_social_links' ) ? $labels['yes'] : $labels['no'], + ), + 'um-profile_show_bio' => array( + 'label' => __( 'Show user description in profile header', 'ultimate-member' ), + 'value' => UM()->options()->get( 'profile_show_bio' ) ? $labels['yes'] : $labels['no'], + ), + ) + ); + + if ( UM()->options()->get( 'profile_show_bio' ) ) { + $appearance_settings['um-profile_bio_maxchars'] = array( + 'label' => __( 'User description maximum chars', 'ultimate-member' ), + 'value' => UM()->options()->get( 'profile_bio_maxchars' ), + ); + } + + $appearance_settings = array_merge( + $appearance_settings, + array( + 'um-profile_show_html_bio' => array( + 'label' => __( 'Enable HTML support for user description', 'ultimate-member' ), + 'value' => UM()->options()->get( 'profile_show_html_bio' ) ? $labels['yes'] : $labels['no'], + ), + 'um-profile_header_menu' => array( + 'label' => __( 'Profile Header Menu Position', 'ultimate-member' ), + 'value' => $profile_header_menu_options[ UM()->options()->get( 'profile_header_menu' ) ], + ), + 'um-profile_primary_btn_word' => array( + 'label' => __( 'Profile Primary Button Text', 'ultimate-member' ), + 'value' => UM()->options()->get( 'profile_primary_btn_word' ), + ), + 'um-profile_secondary_btn' => array( + 'label' => __( 'Profile Secondary Button', 'ultimate-member' ), + 'value' => $profile_secondary_btn ? $labels['yes'] : $labels['no'], + ), + ) + ); + + if ( ! empty( $profile_secondary_btn ) ) { + $appearance_settings['um-profile_secondary_btn_word'] = array( + 'label' => __( 'Profile Secondary Button Text ', 'ultimate-member' ), + 'value' => UM()->options()->get( 'profile_secondary_btn_word' ), + ); + } + + $appearance_settings = array_merge( + $appearance_settings, + array( + 'um-profile_icons' => array( + 'label' => __( 'Profile Field Icons', 'ultimate-member' ), + 'value' => $icons_display_options[ UM()->options()->get( 'profile_icons' ) ], + ), + 'um-profile_empty_text' => array( + 'label' => __( 'Show a custom message if profile is empty', 'ultimate-member' ), + 'value' => $profile_empty_text ? $labels['yes'] : $labels['no'], + ), + ) + ); + + if ( ! empty( $profile_empty_text ) ) { + $appearance_settings['um-profile_empty_text_emo'] = array( + 'label' => __( 'Show the emoticon', 'ultimate-member' ), + 'value' => UM()->options()->get( 'profile_empty_text_emo' ) ? $labels['yes'] : $labels['no'], + ); + } + + // > Profile Menu section. + $profile_menu = UM()->options()->get( 'profile_menu' ); + + $appearance_settings['um-profile_menu'] = array( + 'label' => __( 'Enable profile menu', 'ultimate-member' ), + 'value' => $profile_menu ? $labels['yes'] : $labels['no'], + ); + + if ( ! empty( $profile_menu ) ) { + /** + * Filters a privacy list extend. + * + * @since 2.7.0 + * @hook um_profile_tabs_privacy_list + * + * @param {array} $privacy_option Add options for profile tabs' privacy. + * + * @return {array} Options for profile tabs' privacy. + * + * @example Add options for profile tabs' privacy. + * function um_profile_menu_link_attrs( $privacy_option ) { + * // your code here + * return $privacy_option; + * } + * add_filter( 'um_profile_tabs_privacy_list', 'um_profile_tabs_privacy_list', 10, 1 ); + */ + $privacy_option = UM()->profile()->tabs_privacy(); + + $tabs = UM()->profile()->tabs(); + foreach ( $tabs as $id => $tab ) { + if ( ! empty( $tab['hidden'] ) ) { + continue; + } + + $tab_enabled = UM()->options()->get( 'profile_tab_' . $id ); + + $appearance_settings[ 'um-profile_tab_' . $id ] = array( + // translators: %s Profile Tab Title + 'label' => sprintf( __( '%s Tab', 'ultimate-member' ), $tab['name'] ), + 'value' => $tab_enabled ? $labels['yes'] : $labels['no'], + ); + + if ( ! isset( $tab['default_privacy'] ) && ! empty( $tab_enabled ) ) { + $privacy = UM()->options()->get( 'profile_tab_' . $id . '_privacy' ); + if ( is_numeric( $privacy ) ) { + $appearance_settings[ 'um-profile_tab_' . $id . '_privacy' ] = array( + // translators: %s Profile Tab Title + 'label' => sprintf( __( 'Who can see %s Tab?', 'ultimate-member' ), $tab['name'] ), + 'value' => $privacy_option[ UM()->options()->get( 'profile_tab_' . $id . '_privacy' ) ], + ); + } + } + } + /** + * Filters appearance settings for Site Health extend. + * + * @since 2.7.0 + * @hook um_profile_tabs_site_health + * + * @param {array} $appearance_settings Appearance settings for Site Health. + * + * @return {array} Appearance settings for Site Health. + * + * @example Add options for appearance settings for Site Health. + * function um_profile_tabs_site_health( $appearance_settings ) { + * // your code here + * return $appearance_settings; + * } + * add_filter( 'um_profile_tabs_site_health', 'um_profile_tabs_site_health', 10, 1 ); + */ + $appearance_settings = apply_filters( 'um_profile_tabs_site_health', $appearance_settings ); + + /** + * Filters user profile tabs + * + * @since 2.7.0 + * @hook um_profile_tabs + * + * @param {array} $tabs tabs list. + * + * @return {array} tabs list. + * + * @example Add options for profile tabs' privacy. + * function um_profile_tabs( $tabs ) { + * // your code here + * return $tabs; + * } + * add_filter( 'um_profile_tabs', 'um_profile_tabs', 10, 1 ); + */ + $tabs_options = apply_filters( + 'um_profile_tabs', + array( + 'main' => array( + 'name' => __( 'About', 'ultimate-member' ), + 'icon' => 'um-faicon-user', + ), + 'posts' => array( + 'name' => __( 'Posts', 'ultimate-member' ), + 'icon' => 'um-faicon-pencil', + ), + 'comments' => array( + 'name' => __( 'Comments', 'ultimate-member' ), + 'icon' => 'um-faicon-comment', + ), + ) + ); + + $appearance_settings['um-profile_menu_default_tab'] = array( + 'label' => __( 'Profile menu default tab', 'ultimate-member' ), + 'value' => $tabs_options[ UM()->options()->get( 'profile_menu_default_tab' ) ], + ); + $appearance_settings['um-profile_menu_icons'] = array( + 'label' => __( 'Enable menu icons in desktop view', 'ultimate-member' ), + 'value' => UM()->options()->get( 'profile_menu_icons' ) ? $labels['yes'] : $labels['no'], + ); + } + + // > Registration Form section. + $register_templates = UM()->shortcodes()->get_templates( 'register' ); + $register_template_key = UM()->options()->get( 'register_template' ); + $register_template_title = array_key_exists( $register_template_key, $register_templates ) ? $register_templates[ $register_template_key ] : __( 'No template name', 'ultimate-member' ); + $register_secondary_btn = UM()->options()->get( 'register_secondary_btn' ); + + $form_align_options = array( + 'center' => __( 'Centered', 'ultimate-member' ), + 'left' => __( 'Left aligned', 'ultimate-member' ), + 'right' => __( 'Right aligned', 'ultimate-member' ), + ); + + $appearance_settings = array_merge( + $appearance_settings, + array( + 'um-register_template' => array( + 'label' => __( 'Registration Default Template', 'ultimate-member' ), + // translators: %1$s - register template name, %2$s - register template filename + 'value' => sprintf( __( '%1$s (filename: %2$s.php)', 'ultimate-member' ), $register_template_title, $register_template_key ), + ), + 'um-register_max_width' => array( + 'label' => __( 'Registration Maximum Width', 'ultimate-member' ), + 'value' => UM()->options()->get( 'register_max_width' ), + ), + 'um-register_align' => array( + 'label' => __( 'Registration Shortcode Alignment', 'ultimate-member' ), + 'value' => $form_align_options[ UM()->options()->get( 'register_align' ) ], + ), + 'um-register_primary_btn_word' => array( + 'label' => __( 'Registration Primary Button Text ', 'ultimate-member' ), + 'value' => UM()->options()->get( 'register_primary_btn_word' ), + ), + 'um-register_secondary_btn' => array( + 'label' => __( 'Registration Secondary Button', 'ultimate-member' ), + 'value' => $register_secondary_btn ? $labels['yes'] : $labels['no'], + ), + ) + ); + + if ( ! empty( $register_secondary_btn ) ) { + $appearance_settings['um-register_secondary_btn_word'] = array( + 'label' => __( 'Registration Secondary Button Text', 'ultimate-member' ), + 'value' => UM()->options()->get( 'register_secondary_btn_word' ), + ); + $appearance_settings['um-register_secondary_btn_url'] = array( + 'label' => __( 'Registration Secondary Button URL', 'ultimate-member' ), + 'value' => UM()->options()->get( 'register_secondary_btn_url' ), + ); + } + + $appearance_settings['um-register_icons'] = array( + 'label' => __( 'Registration Field Icons', 'ultimate-member' ), + 'value' => $icons_display_options[ UM()->options()->get( 'register_icons' ) ], + ); + + // > Login Form section. + $login_templates = UM()->shortcodes()->get_templates( 'login' ); + $login_template_key = UM()->options()->get( 'login_template' ); + $login_template_title = array_key_exists( $login_template_key, $login_templates ) ? $login_templates[ $login_template_key ] : __( 'No template name', 'ultimate-member' ); + $login_secondary_btn = UM()->options()->get( 'login_secondary_btn' ); + + $appearance_settings = array_merge( + $appearance_settings, + array( + 'um-login_template' => array( + 'label' => __( 'Login Default Template', 'ultimate-member' ), + // translators: %1$s - login template name, %2$s - login template filename + 'value' => sprintf( __( '%1$s (filename: %2$s.php)', 'ultimate-member' ), $login_template_title, $login_template_key ), + ), + 'um-login_max_width' => array( + 'label' => __( 'Login Maximum Width', 'ultimate-member' ), + 'value' => UM()->options()->get( 'login_max_width' ), + ), + 'um-login_align' => array( + 'label' => __( 'Login Shortcode Alignment', 'ultimate-member' ), + 'value' => $form_align_options[ UM()->options()->get( 'login_align' ) ], + ), + 'um-login_primary_btn_word' => array( + 'label' => __( 'Login Primary Button Text', 'ultimate-member' ), + 'value' => UM()->options()->get( 'login_primary_btn_word' ), + ), + 'um-login_secondary_btn' => array( + 'label' => __( 'Login Secondary Button', 'ultimate-member' ), + 'value' => $login_secondary_btn ? $labels['yes'] : $labels['no'], + ), + ) + ); + + if ( ! empty( $login_secondary_btn ) ) { + $appearance_settings['um-login_secondary_btn_word'] = array( + 'label' => __( 'Login Secondary Button Text', 'ultimate-member' ), + 'value' => UM()->options()->get( 'login_secondary_btn_word' ), + ); + $appearance_settings['um-login_secondary_btn_url'] = array( + 'label' => __( 'Login Secondary Button URL', 'ultimate-member' ), + 'value' => UM()->options()->get( 'login_secondary_btn_url' ), + ); + } + + $appearance_settings = array_merge( + $appearance_settings, + array( + 'um-login_forgot_pass_link' => array( + 'label' => __( 'Login Forgot Password Link', 'ultimate-member' ), + 'value' => UM()->options()->get( 'login_forgot_pass_link' ) ? $labels['yes'] : $labels['no'], + ), + 'um-login_show_rememberme' => array( + 'label' => __( 'Login Maximum Width', 'ultimate-member' ), + 'value' => UM()->options()->get( 'login_max_width' ), + ), + 'um-login_icons' => array( + 'label' => __( 'Login Field Icons', 'ultimate-member' ), + 'value' => $icons_display_options[ UM()->options()->get( 'login_icons' ) ], + ), + ) + ); + + return $appearance_settings; + } } From 9b8365acb0523a25d5fbfd5eabd75c82831ba862 Mon Sep 17 00:00:00 2001 From: ashubawork Date: Tue, 29 Apr 2025 15:14:28 +0300 Subject: [PATCH 03/28] - roles, directories sitehealth --- includes/admin/class-site-health.php | 2801 ++++++++++++++------------ 1 file changed, 1461 insertions(+), 1340 deletions(-) diff --git a/includes/admin/class-site-health.php b/includes/admin/class-site-health.php index b7a07925..a8100d74 100644 --- a/includes/admin/class-site-health.php +++ b/includes/admin/class-site-health.php @@ -464,1351 +464,22 @@ class Site_Health { // Appearance settings sitehealth $appearance_sitehealth = $this->appearance_sitehealth(); - // Misc settings. - $misc_settings = array( - 'um-form_asterisk' => array( - 'label' => __( 'Show an asterisk for required fields', 'ultimate-member' ), - 'value' => UM()->options()->get( 'form_asterisk' ) ? $labels['yes'] : $labels['no'], - ), - 'um-um_profile_object_cache_stop' => array( - 'label' => __( 'Disable Cache User Profile', 'ultimate-member' ), - 'value' => UM()->options()->get( 'um_profile_object_cache_stop' ) ? $labels['yes'] : $labels['no'], - ), - 'um-enable_blocks' => array( - 'label' => __( 'Enable Gutenberg Blocks', 'ultimate-member' ), - 'value' => UM()->options()->get( 'enable_blocks' ) ? $labels['yes'] : $labels['no'], - ), - 'um-enable_as_email_sending' => array( - 'label' => __( 'Email sending by Action Scheduler', 'ultimate-member' ), - 'value' => UM()->options()->get( 'enable_as_email_sending' ) ? $labels['yes'] : $labels['no'], - ), - 'um-rest_api_version' => array( - 'label' => __( 'REST API version', 'ultimate-member' ), - 'value' => UM()->options()->get( 'rest_api_version' ), - ), - 'um-disable_restriction_pre_queries' => array( - 'label' => __( 'Disable pre-queries for restriction content logic (advanced)', 'ultimate-member' ), - 'value' => UM()->options()->get( 'disable_restriction_pre_queries' ) ? $labels['yes'] : $labels['no'], - ), - 'um-member_directory_own_table' => array( - 'label' => __( 'Enable custom table for usermeta', 'ultimate-member' ), - 'value' => UM()->options()->get( 'member_directory_own_table' ) ? $labels['yes'] : $labels['no'], - ), - 'um-uninstall_on_delete' => array( - 'label' => __( 'Remove Data on Uninstall?', 'ultimate-member' ), - 'value' => UM()->options()->get( 'uninstall_on_delete' ) ? $labels['yes'] : $labels['no'], - ), - ); + // Advanced settings sitehealth + $advanced_sitehealth = $this->advanced_sitehealth(); - // Secure settings - $secure_ban_admins_accounts = UM()->options()->get( 'secure_ban_admins_accounts' ); + // License settings sitehealth + $license_sitehealth = $this->license_sitehealth(); - $banned_capabilities_opt = UM()->options()->get( 'banned_capabilities' ); - $banned_capabilities = array(); - if ( ! empty( $banned_capabilities_opt ) ) { - if ( is_string( $banned_capabilities_opt ) ) { - $banned_capabilities = array( $banned_capabilities_opt ); - } else { - $banned_capabilities = $banned_capabilities_opt; - } - } + $info['ultimate-member']['fields'] = array_merge( $info['ultimate-member']['fields'], $general_sitehealth, $access_sitehealth, $emails_sitehealth, $appearance_sitehealth, $advanced_sitehealth, $license_sitehealth ); - $secure_settings = array( - 'um-banned_capabilities' => array( - 'label' => __( 'Banned Administrative Capabilities', 'ultimate-member' ), - 'value' => ! empty( $banned_capabilities ) ? implode( ', ', $banned_capabilities ) : '', - ), - 'um-lock_register_forms' => array( - 'label' => __( 'Lock All Register Forms', 'ultimate-member' ), - 'value' => UM()->options()->get( 'lock_register_forms' ) ? $labels['yes'] : $labels['no'], - ), - 'um-display_login_form_notice' => array( - 'label' => __( 'Display Login form notice to reset passwords', 'ultimate-member' ), - 'value' => UM()->options()->get( 'display_login_form_notice' ) ? $labels['yes'] : $labels['no'], - ), - 'um-secure_ban_admins_accounts' => array( - 'label' => __( 'Enable ban for administrative capabilities', 'ultimate-member' ), - 'value' => $secure_ban_admins_accounts ? $labels['yes'] : $labels['no'], - ), - ); - if ( ! empty( $secure_ban_admins_accounts ) ) { - $secure_notify_admins_banned_accounts = UM()->options()->get( 'secure_notify_admins_banned_accounts' ); + // User roles settings sitehealth + $info = $this->roles_sitehealth( $info ); - $secure_settings['um-secure_notify_admins_banned_accounts'] = array( - 'label' => __( 'Notify Administrators', 'ultimate-member' ), - 'value' => $secure_notify_admins_banned_accounts ? $labels['yes'] : $labels['no'], - ); - if ( ! empty( $secure_notify_admins_banned_accounts ) ) { - $secure_notify_admins_banned_accounts_options = array( - 'instant' => __( 'Send Immediately', 'ultimate-member' ), - 'hourly' => __( 'Hourly', 'ultimate-member' ), - 'daily' => __( 'Daily', 'ultimate-member' ), - ); + // Forms settings sitehealth + $info = $this->forms_sitehealth( $info ); - $secure_settings['um-secure_notify_admins_banned_accounts__interval'] = array( - 'label' => __( 'Notification Schedule', 'ultimate-member' ), - 'value' => $secure_notify_admins_banned_accounts_options[ UM()->options()->get( 'secure_notify_admins_banned_accounts__interval' ) ], - ); - } - } - - $secure_allowed_redirect_hosts = UM()->options()->get( 'secure_allowed_redirect_hosts' ); - $secure_allowed_redirect_hosts = explode( PHP_EOL, $secure_allowed_redirect_hosts ); - - $secure_settings['um-secure_allowed_redirect_hosts'] = array( - 'label' => __( 'Allowed hosts for safe redirect', 'ultimate-member' ), - 'value' => $secure_allowed_redirect_hosts, - ); - - // Licenses settings. - $license_settings = array( - 'um-licenses' => array( - 'label' => __( 'Licenses', 'ultimate-member' ), - 'value' => array(), - ), - ); - - /** - * Filters licenses settings for Site Health. - * - * @since 2.7.0 - * @hook um_licenses_site_health - * - * @param {array} $license_settings licenses settings for Site Health. - * - * @return {array} licenses settings for Site Health. - * - * @example Extend licenses settings for Site Health. - * function um_licenses_site_health( $license_settings ) { - * // your code here - * return $license_settings; - * } - * add_filter( 'um_licenses_site_health', 'um_licenses_site_health', 10, 1 ); - */ - $license_settings = apply_filters( 'um_licenses_site_health', $license_settings ); - -// $info['ultimate-member']['fields'] = array_merge( $info['ultimate-member']['fields'], $pages_settings, $user_settings, $account_settings, $uploads_settings, $restrict_settings, $access_other_settings, $email_settings, $appearance_settings, $misc_settings, $secure_settings, $license_settings ); - $info['ultimate-member']['fields'] = array_merge( $info['ultimate-member']['fields'], $general_sitehealth, $access_sitehealth, $emails_sitehealth, $appearance_sitehealth, $misc_settings, $secure_settings, $license_settings ); - - // User roles settings - $roles_array = array(); - foreach ( $this->get_roles() as $key => $role ) { - if ( strpos( $key, 'um_' ) === 0 ) { - $key = substr( $key, 3 ); - } - $rolemeta = $this->get_role_meta( $key ); - if ( false === $rolemeta ) { - continue; - } - $priority = ! empty( $rolemeta['_um_priority'] ) ? $rolemeta['_um_priority'] : 0; - - $k = $priority . '-' . $role; - $roles_array[ $k ] = $role . '(' . $priority . ')'; - - krsort( $roles_array, SORT_NUMERIC ); - } - - $info['ultimate-member-user-roles'] = array( - 'label' => __( 'User roles', 'ultimate-member' ), - 'description' => __( 'This debug information about user roles.', 'ultimate-member' ), - 'fields' => array( - 'um-roles' => array( - 'label' => __( 'User Roles (priority)', 'ultimate-member' ), - 'value' => implode( ', ', $roles_array ), - ), - 'um-register_role' => array( - 'label' => __( 'WordPress Default New User Role', 'ultimate-member' ), - 'value' => get_option( 'default_role' ), - ), - ), - ); - - foreach ( $this->get_roles() as $key => $role ) { - if ( strpos( $key, 'um_' ) === 0 ) { - $key = substr( $key, 3 ); - } - - $rolemeta = $this->get_role_meta( $key ); - if ( false === $rolemeta ) { - continue; - } - - $info[ 'ultimate-member-' . $key ] = array( - 'label' => ' - ' . $role . __( ' role settings', 'ultimate-member' ), - 'description' => __( 'This debug information about user role.', 'ultimate-member' ), - 'fields' => array(), - ); - - if ( array_key_exists( '_um_can_access_wpadmin', $rolemeta ) ) { - $info[ 'ultimate-member-' . $key ]['fields'] = array_merge( - $info[ 'ultimate-member-' . $key ]['fields'], - array( - 'um-can_access_wpadmin' => array( - 'label' => __( 'Can access wp-admin?', 'ultimate-member' ), - 'value' => $rolemeta['_um_can_access_wpadmin'] ? $labels['yes'] : $labels['no'], - ), - ) - ); - } - - if ( array_key_exists( '_um_can_not_see_adminbar', $rolemeta ) ) { - $info[ 'ultimate-member-' . $key ]['fields'] = array_merge( - $info[ 'ultimate-member-' . $key ]['fields'], - array( - 'um-can_not_see_adminbar' => array( - 'label' => __( 'Force hiding adminbar in frontend?', 'ultimate-member' ), - 'value' => $rolemeta['_um_can_not_see_adminbar'] ? $labels['yes'] : $labels['no'], - ), - ) - ); - } - - if ( array_key_exists( '_um_can_edit_everyone', $rolemeta ) ) { - $info[ 'ultimate-member-' . $key ]['fields'] = array_merge( - $info[ 'ultimate-member-' . $key ]['fields'], - array( - 'um-can_edit_everyone' => array( - 'label' => __( 'Can edit other member accounts?', 'ultimate-member' ), - 'value' => $rolemeta['_um_can_edit_everyone'] ? $labels['yes'] : $labels['no'], - ), - ) - ); - } - - if ( array_key_exists( '_um_can_edit_everyone', $rolemeta ) && 1 === absint( $rolemeta['_um_can_edit_everyone'] ) ) { - $can_edit_roles_meta = ! empty( $rolemeta['_um_can_edit_roles'] ) ? $rolemeta['_um_can_edit_roles'] : array(); - $can_edit_roles = array(); - if ( ! empty( $can_edit_roles_meta ) ) { - if ( is_string( $can_edit_roles_meta ) ) { - $can_edit_roles = array( $can_edit_roles_meta ); - } else { - $can_edit_roles = $can_edit_roles_meta; - } - } - - $info[ 'ultimate-member-' . $key ]['fields'] = array_merge( - $info[ 'ultimate-member-' . $key ]['fields'], - array( - 'um-can_edit_roles' => array( - 'label' => __( 'Can edit these user roles only', 'ultimate-member' ), - 'value' => ! empty( $can_edit_roles ) ? implode( ', ', $can_edit_roles ) : $labels['all'], - ), - ) - ); - } - - if ( array_key_exists( '_um_can_delete_everyone', $rolemeta ) ) { - $info[ 'ultimate-member-' . $key ]['fields'] = array_merge( - $info[ 'ultimate-member-' . $key ]['fields'], - array( - 'um-can_delete_everyone' => array( - 'label' => __( 'Can delete other member accounts?', 'ultimate-member' ), - 'value' => $rolemeta['_um_can_delete_everyone'] ? $labels['yes'] : $labels['no'], - ), - ) - ); - } - - if ( array_key_exists( '_um_can_delete_everyone', $rolemeta ) && 1 === absint( $rolemeta['_um_can_delete_everyone'] ) ) { - $can_delete_roles_meta = ! empty( $rolemeta['_um_can_delete_roles'] ) ? $rolemeta['_um_can_delete_roles'] : array(); - $can_delete_roles = array(); - if ( ! empty( $can_delete_roles_meta ) ) { - if ( is_string( $can_delete_roles_meta ) ) { - $can_delete_roles = array( $can_delete_roles_meta ); - } else { - $can_delete_roles = $can_delete_roles_meta; - } - } - - $info[ 'ultimate-member-' . $key ]['fields'] = array_merge( - $info[ 'ultimate-member-' . $key ]['fields'], - array( - 'um-can_delete_roles' => array( - 'label' => __( 'Can delete these user roles only', 'ultimate-member' ), - 'value' => ! empty( $can_delete_roles ) ? implode( ', ', $can_delete_roles ) : $labels['all'], - ), - ) - ); - } - - if ( array_key_exists( '_um_can_edit_profile', $rolemeta ) ) { - $info[ 'ultimate-member-' . $key ]['fields'] = array_merge( - $info[ 'ultimate-member-' . $key ]['fields'], - array( - 'um-can_edit_profile' => array( - 'label' => __( 'Can edit their profile?', 'ultimate-member' ), - 'value' => $rolemeta['_um_can_edit_profile'] ? $labels['yes'] : $labels['no'], - ), - ) - ); - } - - if ( array_key_exists( '_um_can_delete_profile', $rolemeta ) ) { - $info[ 'ultimate-member-' . $key ]['fields'] = array_merge( - $info[ 'ultimate-member-' . $key ]['fields'], - array( - 'um-can_delete_profile' => array( - 'label' => __( 'Can delete their account?', 'ultimate-member' ), - 'value' => $rolemeta['_um_can_delete_profile'] ? $labels['yes'] : $labels['no'], - ), - ) - ); - } - - if ( array_key_exists( '_um_can_view_all', $rolemeta ) ) { - $info[ 'ultimate-member-' . $key ]['fields'] = array_merge( - $info[ 'ultimate-member-' . $key ]['fields'], - array( - 'um-can_view_all' => array( - 'label' => __( 'Can view other member profiles?', 'ultimate-member' ), - 'value' => $rolemeta['_um_can_view_all'] ? $labels['yes'] : $labels['no'], - ), - ) - ); - } - - if ( array_key_exists( '_um_can_view_all', $rolemeta ) && 1 === absint( $rolemeta['_um_can_view_all'] ) ) { - $can_view_roles_meta = ! empty( $rolemeta['_um_can_view_roles'] ) ? $rolemeta['_um_can_view_roles'] : array(); - $can_view_roles = array(); - if ( ! empty( $can_view_roles_meta ) ) { - if ( is_string( $can_view_roles_meta ) ) { - $can_view_roles = array( $can_view_roles_meta ); - } else { - $can_view_roles = $can_view_roles_meta; - } - } - - $info[ 'ultimate-member-' . $key ]['fields'] = array_merge( - $info[ 'ultimate-member-' . $key ]['fields'], - array( - 'um-can_view_roles' => array( - 'label' => __( 'Can view these user roles only', 'ultimate-member' ), - 'value' => ! empty( $can_view_roles ) ? implode( ', ', $can_view_roles ) : $labels['all'], - ), - ) - ); - } - - if ( isset( $rolemeta['_um_profile_noindex'] ) && '' !== $rolemeta['_um_profile_noindex'] ) { - $profile_noindex = $rolemeta['_um_profile_noindex'] ? $labels['yes'] : $labels['no']; - } else { - $profile_noindex = __( 'Default', 'ultimate-member' ); - } - if ( isset( $rolemeta['_um_default_homepage'] ) && '' !== $rolemeta['_um_default_homepage'] ) { - $default_homepage = $rolemeta['_um_default_homepage'] ? $labels['yes'] : $labels['no']; - } else { - $default_homepage = __( 'No such option', 'ultimate-member' ); - } - - if ( array_key_exists( '_um_can_make_private_profile', $rolemeta ) ) { - $info[ 'ultimate-member-' . $key ]['fields'] = array_merge( - $info[ 'ultimate-member-' . $key ]['fields'], - array( - 'um-can_make_private_profile' => array( - 'label' => __( 'Can make their profile private?', 'ultimate-member' ), - 'value' => $rolemeta['_um_can_make_private_profile'] ? $labels['yes'] : $labels['no'], - ), - ) - ); - } - - if ( array_key_exists( '_um_can_access_private_profile', $rolemeta ) ) { - $info[ 'ultimate-member-' . $key ]['fields'] = array_merge( - $info[ 'ultimate-member-' . $key ]['fields'], - array( - 'um-can_access_private_profile' => array( - 'label' => __( 'Can view/access private profiles?', 'ultimate-member' ), - 'value' => $rolemeta['_um_can_access_private_profile'] ? $labels['yes'] : $labels['no'], - ), - ) - ); - } - - $info[ 'ultimate-member-' . $key ]['fields'] = array_merge( - $info[ 'ultimate-member-' . $key ]['fields'], - array( - 'um-profile_noindex' => array( - 'label' => __( 'Avoid indexing profile by search engines', 'ultimate-member' ), - 'value' => $profile_noindex, - ), - 'um-default_homepage' => array( - 'label' => __( 'Can view default homepage?', 'ultimate-member' ), - 'value' => $default_homepage, - ), - ) - ); - - if ( isset( $rolemeta['_um_default_homepage'] ) && 0 === absint( $rolemeta['_um_default_homepage'] ) ) { - $info[ 'ultimate-member-' . $key ]['fields'] = array_merge( - $info[ 'ultimate-member-' . $key ]['fields'], - array( - 'um-redirect_homepage' => array( - 'label' => __( 'Custom Homepage Redirect', 'ultimate-member' ), - 'value' => $rolemeta['_um_redirect_homepage'], - ), - ) - ); - } - - $status_options = array( - 'approved' => __( 'Auto Approve', 'ultimate-member' ), - 'checkmail' => __( 'Require Email Activation', 'ultimate-member' ), - 'pending' => __( 'Require Admin Review', 'ultimate-member' ), - ); - - if ( array_key_exists( '_um_status', $rolemeta ) && isset( $status_options[ $rolemeta['_um_status'] ] ) ) { - $info[ 'ultimate-member-' . $key ]['fields'] = array_merge( - $info[ 'ultimate-member-' . $key ]['fields'], - array( - 'um-status' => array( - 'label' => __( 'Registration Status', 'ultimate-member' ), - 'value' => $status_options[ $rolemeta['_um_status'] ], - ), - ) - ); - } - - if ( array_key_exists( '_um_status', $rolemeta ) && 'approved' === $rolemeta['_um_status'] ) { - $auto_approve_act = array( - 'redirect_profile' => __( 'Redirect to profile', 'ultimate-member' ), - 'redirect_url' => __( 'Redirect to URL', 'ultimate-member' ), - ); - - if ( isset( $auto_approve_act[ $rolemeta['_um_auto_approve_act'] ] ) ) { - $info[ 'ultimate-member-' . $key ]['fields'] = array_merge( - $info[ 'ultimate-member-' . $key ]['fields'], - array( - 'um-auto_approve_act' => array( - 'label' => __( 'Custom Homepage Redirect', 'ultimate-member' ), - 'value' => $auto_approve_act[ $rolemeta['_um_auto_approve_act'] ], - ), - ) - ); - } - - if ( 'redirect_url' === $rolemeta['_um_auto_approve_act'] && array_key_exists( '_um_auto_approve_url', $rolemeta ) ) { - $info[ 'ultimate-member-' . $key ]['fields'] = array_merge( - $info[ 'ultimate-member-' . $key ]['fields'], - array( - 'um-auto_approve_url' => array( - 'label' => __( 'Set Custom Redirect URL', 'ultimate-member' ), - 'value' => $rolemeta['_um_auto_approve_url'], - ), - ) - ); - } - } - - if ( array_key_exists( '_um_status', $rolemeta ) && 'checkmail' === $rolemeta['_um_status'] ) { - $checkmail_action = array( - 'show_message' => __( 'Show custom message', 'ultimate-member' ), - 'redirect_url' => __( 'Redirect to URL', 'ultimate-member' ), - ); - - if ( array_key_exists( '_um_login_email_activate', $rolemeta ) ) { - $info[ 'ultimate-member-' . $key ]['fields'] = array_merge( - $info[ 'ultimate-member-' . $key ]['fields'], - array( - 'um-login_email_activate' => array( - 'label' => __( 'Login user after validating the activation link?', 'ultimate-member' ), - 'value' => $rolemeta['_um_login_email_activate'] ? $labels['yes'] : $labels['no'], - ), - ) - ); - } - - if ( isset( $checkmail_action[ $rolemeta['_um_checkmail_action'] ] ) ) { - $info[ 'ultimate-member-' . $key ]['fields'] = array_merge( - $info[ 'ultimate-member-' . $key ]['fields'], - array( - 'um-checkmail_action' => array( - 'label' => __( 'Action to be taken after registration', 'ultimate-member' ), - 'value' => $checkmail_action[ $rolemeta['_um_checkmail_action'] ], - ), - ) - ); - } - - if ( 'show_message' === $rolemeta['_um_checkmail_action'] ) { - if ( array_key_exists( '_um_checkmail_message', $rolemeta ) ) { - $info[ 'ultimate-member-' . $key ]['fields'] = array_merge( - $info[ 'ultimate-member-' . $key ]['fields'], - array( - 'um-checkmail_message' => array( - 'label' => __( 'Personalize the custom message', 'ultimate-member' ), - 'value' => stripslashes( $rolemeta['_um_checkmail_message'] ), - ), - ) - ); - } - } else { - if ( array_key_exists( '_um_checkmail_url', $rolemeta ) ) { - $info[ 'ultimate-member-' . $key ]['fields'] = array_merge( - $info[ 'ultimate-member-' . $key ]['fields'], - array( - 'um-checkmail_url' => array( - 'label' => __( 'Set Custom Redirect URL', 'ultimate-member' ), - 'value' => $rolemeta['_um_checkmail_url'], - ), - ) - ); - } - } - - if ( array_key_exists( '_um_url_email_activate', $rolemeta ) ) { - $info[ 'ultimate-member-' . $key ]['fields'] = array_merge( - $info[ 'ultimate-member-' . $key ]['fields'], - array( - 'um-url_email_activate' => array( - 'label' => __( 'URL redirect after email activation', 'ultimate-member' ), - 'value' => $rolemeta['_um_url_email_activate'], - ), - ) - ); - } - } - - if ( array_key_exists( '_um_status', $rolemeta ) && 'pending' === $rolemeta['_um_status'] ) { - $pending_action = array( - 'show_message' => __( 'Show custom message', 'ultimate-member' ), - 'redirect_url' => __( 'Redirect to URL', 'ultimate-member' ), - ); - - if ( array_key_exists( '_um_pending_action', $rolemeta ) ) { - $info[ 'ultimate-member-' . $key ]['fields'] = array_merge( - $info[ 'ultimate-member-' . $key ]['fields'], - array( - 'um-pending_action' => array( - 'label' => __( 'Action to be taken after registration', 'ultimate-member' ), - 'value' => $pending_action[ $rolemeta['_um_pending_action'] ], - ), - ) - ); - } - - if ( 'show_message' === $rolemeta['_um_pending_action'] ) { - if ( array_key_exists( '_um_pending_message', $rolemeta ) ) { - $info[ 'ultimate-member-' . $key ]['fields'] = array_merge( - $info[ 'ultimate-member-' . $key ]['fields'], - array( - 'um-pending_message' => array( - 'label' => __( 'Personalize the custom message', 'ultimate-member' ), - 'value' => stripslashes( $rolemeta['_um_pending_message'] ), - ), - ) - ); - } - } else { - if ( array_key_exists( '_um_pending_url', $rolemeta ) ) { - $info[ 'ultimate-member-' . $key ]['fields'] = array_merge( - $info[ 'ultimate-member-' . $key ]['fields'], - array( - 'um-pending_url' => array( - 'label' => __( 'Set Custom Redirect URL', 'ultimate-member' ), - 'value' => $rolemeta['_um_pending_url'], - ), - ) - ); - } - } - } - - $after_login_options = array( - 'redirect_profile' => __( 'Redirect to profile', 'ultimate-member' ), - 'redirect_url' => __( 'Redirect to URL', 'ultimate-member' ), - 'refresh' => __( 'Refresh active page', 'ultimate-member' ), - 'redirect_admin' => __( 'Redirect to WordPress Admin', 'ultimate-member' ), - ); - - if ( array_key_exists( '_um_after_login', $rolemeta ) && isset( $after_login_options[ $rolemeta['_um_after_login'] ] ) ) { - $info[ 'ultimate-member-' . $key ]['fields'] = array_merge( - $info[ 'ultimate-member-' . $key ]['fields'], - array( - 'um-after_login' => array( - 'label' => __( 'Action to be taken after login', 'ultimate-member' ), - 'value' => $after_login_options[ $rolemeta['_um_after_login'] ], - ), - ) - ); - - if ( 'redirect_url' === $rolemeta['_um_after_login'] && array_key_exists( '_um_login_redirect_url', $rolemeta ) ) { - $info[ 'ultimate-member-' . $key ]['fields'] = array_merge( - $info[ 'ultimate-member-' . $key ]['fields'], - array( - 'um-login_redirect_url' => array( - 'label' => __( 'Set Custom Redirect URL', 'ultimate-member' ), - 'value' => $rolemeta['_um_login_redirect_url'], - ), - ) - ); - } - } - - $redirect_options = array( - 'redirect_home' => __( 'Go to Homepage', 'ultimate-member' ), - 'redirect_url' => __( 'Go to Custom URL', 'ultimate-member' ), - ); - if ( ! isset( $rolemeta['_um_after_logout'] ) ) { - $rolemeta['_um_after_logout'] = 'redirect_home'; - } - if ( array_key_exists( '_um_after_logout', $rolemeta ) && isset( $redirect_options[ $rolemeta['_um_after_logout'] ] ) ) { - $info[ 'ultimate-member-' . $key ]['fields'] = array_merge( - $info[ 'ultimate-member-' . $key ]['fields'], - array( - 'um-after_logout' => array( - 'label' => __( 'Action to be taken after logout', 'ultimate-member' ), - 'value' => $redirect_options[ $rolemeta['_um_after_logout'] ], - ), - ) - ); - - if ( 'redirect_url' === $rolemeta['_um_after_logout'] && array_key_exists( '_um_logout_redirect_url', $rolemeta ) ) { - $info[ 'ultimate-member-' . $key ]['fields'] = array_merge( - $info[ 'ultimate-member-' . $key ]['fields'], - array( - 'um-logout_redirect_url' => array( - 'label' => __( 'Set Custom Redirect URL', 'ultimate-member' ), - 'value' => $rolemeta['_um_logout_redirect_url'], - ), - ) - ); - } - } - - if ( ! isset( $rolemeta['_um_after_delete'] ) ) { - $rolemeta['_um_after_delete'] = 'redirect_home'; - } - if ( array_key_exists( '_um_after_delete', $rolemeta ) && isset( $redirect_options[ $rolemeta['_um_after_delete'] ] ) ) { - $info[ 'ultimate-member-' . $key ]['fields'] = array_merge( - $info[ 'ultimate-member-' . $key ]['fields'], - array( - 'um-after_delete' => array( - 'label' => __( 'Action to be taken after account is deleted', 'ultimate-member' ), - 'value' => $redirect_options[ $rolemeta['_um_after_delete'] ], - ), - ) - ); - - if ( 'redirect_url' === $rolemeta['_um_after_delete'] && array_key_exists( '_um_delete_redirect_url', $rolemeta ) ) { - $info[ 'ultimate-member-' . $key ]['fields'] = array_merge( - $info[ 'ultimate-member-' . $key ]['fields'], - array( - 'um-delete_redirect_url' => array( - 'label' => __( 'Set Custom Redirect URL', 'ultimate-member' ), - 'value' => $rolemeta['_um_delete_redirect_url'], - ), - ) - ); - } - } - - if ( ! empty( $rolemeta['wp_capabilities'] ) ) { - $info[ 'ultimate-member-' . $key ]['fields'] = array_merge( - $info[ 'ultimate-member-' . $key ]['fields'], - array( - 'um-wp_capabilities' => array( - 'label' => __( 'WP Capabilities', 'ultimate-member' ), - 'value' => $rolemeta['wp_capabilities'], - ), - ) - ); - } - - $info = apply_filters( 'um_debug_information_user_role', $info, $key ); - } - - // Forms settings - if ( ! empty( $this->get_forms() ) ) { - $info['ultimate-member-forms'] = array( - 'label' => __( 'Ultimate Member Forms', 'ultimate-member' ), - 'description' => __( 'This debug information for your Ultimate Member forms.', 'ultimate-member' ), - 'fields' => array( - 'um-forms' => array( - 'label' => __( 'UM Forms', 'ultimate-member' ), - 'value' => $this->get_forms(), - ), - ), - ); - - foreach ( $this->get_forms() as $key => $form ) { - if ( strpos( $key, 'ID#' ) === 0 ) { - $key = substr( $key, 3 ); - } - - $info[ 'ultimate-member-' . $key ] = array( - 'label' => ' - ' . $form . __( ' form settings', 'ultimate-member' ), - 'description' => __( 'This debug information for your Ultimate Member form.', 'ultimate-member' ), - 'fields' => array( - 'um-form-shortcode' => array( - 'label' => __( 'Shortcode', 'ultimate-member' ), - 'value' => '[ultimatemember form_id="' . $key . '"]', - ), - 'um-mode' => array( - 'label' => __( 'Type', 'ultimate-member' ), - 'value' => get_post_meta( $key, '_um_mode', true ), - ), - ), - ); - - if ( 'register' === get_post_meta( $key, '_um_mode', true ) ) { - $info[ 'ultimate-member-' . $key ]['fields'] = array_merge( - $info[ 'ultimate-member-' . $key ]['fields'], - array( - 'um-register_role' => array( - 'label' => __( 'User registration role', 'ultimate-member' ), - 'value' => 0 === absint( get_post_meta( $key, '_um_register_role', true ) ) ? $labels['default'] : get_post_meta( $key, '_um_register_role', true ), - ), - 'um-register_template' => array( - 'label' => __( 'Template', 'ultimate-member' ), - 'value' => 0 === absint( get_post_meta( $key, '_um_register_template', true ) ) ? $labels['default'] : get_post_meta( $key, '_um_register_template', true ), - ), - 'um-register_primary_btn_word' => array( - 'label' => __( 'Primary Button Text', 'ultimate-member' ), - 'value' => ! get_post_meta( $key, '_um_register_primary_btn_word', true ) ? $labels['default'] : get_post_meta( $key, '_um_register_primary_btn_word', true ), - ), - 'um-register_use_gdpr' => array( - 'label' => __( 'Enable privacy policy agreement', 'ultimate-member' ), - 'value' => get_post_meta( $key, '_um_register_use_gdpr', true ) ? $labels['yes'] : $labels['no'], - ), - ) - ); - - if ( 1 === absint( get_post_meta( $key, '_um_register_use_gdpr', true ) ) ) { - $gdpr_content_id = get_post_meta( $key, '_um_register_use_gdpr_content_id', true ); - - $info[ 'ultimate-member-' . $key ]['fields'] = array_merge( - $info[ 'ultimate-member-' . $key ]['fields'], - array( - 'um-register_use_gdpr_content_id' => array( - 'label' => __( 'Privacy policy content', 'ultimate-member' ), - 'value' => $gdpr_content_id ? get_the_title( $gdpr_content_id ) . '(' . $gdpr_content_id . ')' . get_the_permalink( $gdpr_content_id ) : '', - ), - 'um-register_use_gdpr_toggle_show' => array( - 'label' => __( 'Toggle Show text', 'ultimate-member' ), - 'value' => get_post_meta( $key, '_um_register_use_gdpr_toggle_show', true ), - ), - 'um-register_use_gdpr_toggle_hide' => array( - 'label' => __( 'Toggle Hide text', 'ultimate-member' ), - 'value' => get_post_meta( $key, '_um_register_use_gdpr_toggle_hide', true ), - ), - 'um-register_use_gdpr_agreement' => array( - 'label' => __( 'Checkbox agreement description', 'ultimate-member' ), - 'value' => get_post_meta( $key, '_um_register_use_gdpr_agreement', true ), - ), - 'um-register_use_gdpr_error_text' => array( - 'label' => __( 'Error Text', 'ultimate-member' ), - 'value' => get_post_meta( $key, '_um_register_use_gdpr_error_text', true ), - ), - ) - ); - } - - $info = apply_filters( 'um_debug_information_register_form', $info, $key ); - - $fields = get_post_meta( $key, '_um_custom_fields', true ); - if ( ! empty( $fields ) && is_array( $fields ) ) { - foreach ( $fields as $field_key => $field ) { - $field_info = $this->get_field_data( $info, $key, $field_key, $field ); - - $info[ 'ultimate-member-' . $key ]['fields'] = array_merge( - $info[ 'ultimate-member-' . $key ]['fields'], - $field_info - ); - } - } - } elseif ( 'login' === get_post_meta( $key, '_um_mode', true ) ) { - $login_redirect_options = array( - '0' => __( 'Default', 'ultimate-member' ), - 'redirect_profile' => __( 'Redirect to profile', 'ultimate-member' ), - 'redirect_url' => __( 'Redirect to URL', 'ultimate-member' ), - 'refresh' => __( 'Refresh active page', 'ultimate-member' ), - 'redirect_admin' => __( 'Redirect to WordPress Admin', 'ultimate-member' ), - ); - - $login_after_login = get_post_meta( $key, '_um_login_after_login', true ); - $login_after_login = '' === $login_after_login ? '0' : $login_after_login; - - $info[ 'ultimate-member-' . $key ]['fields'] = array_merge( - $info[ 'ultimate-member-' . $key ]['fields'], - array( - 'um-login_template' => array( - 'label' => __( 'Template', 'ultimate-member' ), - 'value' => 0 === absint( get_post_meta( $key, '_um_login_template', true ) ) ? $labels['default'] : get_post_meta( $key, '_um_login_template', true ), - ), - 'um-login_primary_btn_word' => array( - 'label' => __( 'Primary Button Text', 'ultimate-member' ), - 'value' => ! get_post_meta( $key, '_um_login_primary_btn_word', true ) ? $labels['default'] : get_post_meta( $key, '_um_login_primary_btn_word', true ), - ), - 'um-login_forgot_pass_link' => array( - 'label' => __( 'Show Forgot Password Link?', 'ultimate-member' ), - 'value' => get_post_meta( $key, '_um_login_forgot_pass_link', true ) ? $labels['yes'] : $labels['no'], - ), - 'um-login_show_rememberme' => array( - 'label' => __( 'Show "Remember Me"?', 'ultimate-member' ), - 'value' => get_post_meta( $key, '_um_login_show_rememberme', true ) ? $labels['yes'] : $labels['no'], - ), - 'um-login_after_login' => array( - 'label' => __( 'Redirection after Login', 'ultimate-member' ), - 'value' => $login_redirect_options[ $login_after_login ], - ), - ) - ); - - if ( 'redirect_url' === get_post_meta( $key, '_um_login_after_login', true ) ) { - $info[ 'ultimate-member-' . $key ]['fields'] = array_merge( - $info[ 'ultimate-member-' . $key ]['fields'], - array( - 'um-login_redirect_url' => array( - 'label' => __( 'Set Custom Redirect URL', 'ultimate-member' ), - 'value' => get_post_meta( $key, '_um_login_redirect_url', true ), - ), - ) - ); - } - - $info = apply_filters( 'um_debug_information_login_form', $info, $key ); - - $fields = get_post_meta( $key, '_um_custom_fields', true ); - if ( ! empty( $fields ) && is_array( $fields ) ) { - foreach ( $fields as $field_key => $field ) { - $field_info = $this->get_field_data( $info, $key, $field_key, $field ); - - $info[ 'ultimate-member-' . $key ]['fields'] = array_merge( - $info[ 'ultimate-member-' . $key ]['fields'], - $field_info - ); - } - } - } elseif ( 'profile' === get_post_meta( $key, '_um_mode', true ) ) { - $info[ 'ultimate-member-' . $key ]['fields'] = array_merge( - $info[ 'ultimate-member-' . $key ]['fields'], - array( - 'um-profile_role' => array( - 'label' => __( 'Make this profile form role-specific', 'ultimate-member' ), - 'value' => ! empty( get_post_meta( $key, '_um_profile_role', true ) ) ? get_post_meta( $key, '_um_profile_role', true ) : $labels['all'], - ), - 'um-profile_template' => array( - 'label' => __( 'Template', 'ultimate-member' ), - 'value' => 0 === absint( get_post_meta( $key, '_um_profile_template', true ) ) ? $labels['default'] : get_post_meta( $key, '_um_profile_template', true ), - ), - 'um-profile_primary_btn_word' => array( - 'label' => __( 'Primary Button Text', 'ultimate-member' ), - 'value' => ! get_post_meta( $key, '_um_profile_primary_btn_word', true ) ? $labels['default'] : get_post_meta( $key, '_um_profile_primary_btn_word', true ), - ), - 'um-profile_cover_enabled' => array( - 'label' => __( 'Enable Cover Photos', 'ultimate-member' ), - 'value' => get_post_meta( $key, '_um_profile_cover_enabled', true ) ? $labels['yes'] : $labels['no'], - ), - 'um-profile_disable_photo_upload' => array( - 'label' => __( 'Disable Profile Photo Upload', 'ultimate-member' ), - 'value' => get_post_meta( $key, '_um_profile_disable_photo_upload', true ) ? $labels['yes'] : $labels['no'], - ), - ) - ); - - if ( 0 === absint( get_post_meta( $key, '_um_profile_disable_photo_upload', true ) ) ) { - $info[ 'ultimate-member-' . $key ]['fields'] = array_merge( - $info[ 'ultimate-member-' . $key ]['fields'], - array( - 'um-profile_photo_required' => array( - 'label' => __( 'Make Profile Photo Required', 'ultimate-member' ), - 'value' => get_post_meta( $key, '_um_profile_photo_required', true ) ? $labels['yes'] : $labels['no'], - ), - ) - ); - } - - $info[ 'ultimate-member-' . $key ]['fields'] = array_merge( - $info[ 'ultimate-member-' . $key ]['fields'], - array( - 'um-profile_show_name' => array( - 'label' => __( 'Show display name in profile header?', 'ultimate-member' ), - 'value' => get_post_meta( $key, '_um_profile_show_name', true ) ? $labels['yes'] : $labels['no'], - ), - 'um-profile_show_social_links' => array( - 'label' => __( 'Show social links in profile header?', 'ultimate-member' ), - 'value' => get_post_meta( $key, '_um_profile_show_social_links', true ) ? $labels['yes'] : $labels['no'], - ), - 'um-profile_show_bio' => array( - 'label' => __( 'Show user description in profile header?', 'ultimate-member' ), - 'value' => get_post_meta( $key, '_um_profile_show_bio', true ) ? $labels['yes'] : $labels['no'], - ), - ) - ); - - $fields = get_post_meta( $key, '_um_custom_fields', true ); - if ( ! empty( $fields ) && is_array( $fields ) ) { - foreach ( $fields as $field_key => $field ) { - $field_info = $this->get_field_data( $info, $key, $field_key, $field ); - - $info[ 'ultimate-member-' . $key ]['fields'] = array_merge( - $info[ 'ultimate-member-' . $key ]['fields'], - $field_info - ); - } - } - - $profile_metafields = get_post_meta( $key, '_um_profile_metafields', true ); - if ( ! empty( $profile_metafields ) && is_array( $profile_metafields ) ) { - foreach ( $profile_metafields as $k => $field ) { - $info[ 'ultimate-member-' . $key ]['fields'] = array_merge( - $info[ 'ultimate-member-' . $key ]['fields'], - array( - 'um-profile_metafields-' . $k => array( - 'label' => __( 'Field to show in user meta', 'ultimate-member' ), - 'value' => $field, - ), - ) - ); - } - } - } - } - } - - // Members directory - $options = array( - 'country' => __( 'Country', 'ultimate-member' ), - 'gender' => __( 'Gender', 'ultimate-member' ), - 'languages' => __( 'Languages', 'ultimate-member' ), - 'role' => __( 'Roles', 'ultimate-member' ), - 'birth_date' => __( 'Age', 'ultimate-member' ), - 'last_login' => __( 'Last Login', 'ultimate-member' ), - 'user_registered' => __( 'User Registered', 'ultimate-member' ), - 'first_name' => __( 'First Name', 'ultimate-member' ), - 'last_name' => __( 'Last Name', 'ultimate-member' ), - 'nickname' => __( 'Nickname', 'ultimate-member' ), - 'secondary_user_email' => __( 'Secondary Email Address', 'ultimate-member' ), - 'description' => __( 'Biography', 'ultimate-member' ), - 'phone_number' => __( 'Phone Number', 'ultimate-member' ), - 'mobile_number' => __( 'Mobile Number', 'ultimate-member' ), - 'role_select' => __( 'Roles (Dropdown)', 'ultimate-member' ), - 'role_radio' => __( 'Roles (Radio)', 'ultimate-member' ), - 'whatsapp' => __( 'WhatsApp number', 'ultimate-member' ), - 'facebook' => __( 'Facebook', 'ultimate-member' ), - 'twitter' => __( 'X (formerly Twitter)', 'ultimate-member' ), - 'viber' => __( 'Viber number', 'ultimate-member' ), - 'skype' => __( 'Skype ID', 'ultimate-member' ), - 'telegram' => __( 'Telegram', 'ultimate-member' ), - 'discord' => __( 'Discord', 'ultimate-member' ), - 'youtube' => __( 'Youtube', 'ultimate-member' ), - 'soundcloud' => __( 'SoundCloud', 'ultimate-member' ), - 'user_registered_desc' => __( 'New users first', 'ultimate-member' ), - 'user_registered_asc' => __( 'Old users first', 'ultimate-member' ), - 'username' => __( 'Username', 'ultimate-member' ), - 'display_name' => __( 'Display name', 'ultimate-member' ), - 'last_first_name' => __( 'Last & First name', 'ultimate-member' ), - 'random' => __( 'Random', 'ultimate-member' ), - 'other' => __( 'Other (Custom Field)', 'ultimate-member' ), - ); - - $info['ultimate-member-directories'] = array( - 'label' => __( 'Ultimate Member Directories', 'ultimate-member' ), - 'description' => __( 'This debug information about Ultimate Member directories.', 'ultimate-member' ), - 'fields' => array( - 'um-directory' => array( - 'label' => __( 'Member directories', 'ultimate-member' ), - 'value' => ! empty( $this->get_member_directories() ) ? $this->get_member_directories() : $labels['no-dir'], - ), - ), - ); - - if ( ! empty( $this->get_member_directories() ) ) { - foreach ( $this->get_member_directories() as $key => $directory ) { - if ( 0 === strpos( $key, 'ID#' ) ) { - $key = substr( $key, 3 ); - } - - $_um_view_types_value = get_post_meta( $key, '_um_view_types', true ); - $_um_view_types_value = empty( $_um_view_types_value ) ? array( 'grid', 'list' ) : $_um_view_types_value; - $_um_view_types_value = is_string( $_um_view_types_value ) ? array( $_um_view_types_value ) : $_um_view_types_value; - - $info[ 'ultimate-member-directory-' . $key ] = array( - 'label' => ' - ' . $directory . __( ' directory settings', 'ultimate-member' ), - 'description' => __( 'This debug information for your Ultimate Member directory.', 'ultimate-member' ), - 'fields' => array( - 'um-directory-shortcode' => array( - 'label' => __( 'Shortcode', 'ultimate-member' ), - 'value' => '[ultimatemember_directory id="' . $key . '"]', - ), - 'um-directory_template' => array( - 'label' => __( 'Template', 'ultimate-member' ), - 'value' => get_post_meta( $key, '_um_directory_template', true ) ? get_post_meta( $key, '_um_directory_template', true ) : $labels['default'], - ), - 'um-directory-view_types' => array( - 'label' => __( 'View types', 'ultimate-member' ), - 'value' => implode( ', ', $_um_view_types_value ), - ), - 'um-directory-default_view' => array( - 'label' => __( 'Default view type', 'ultimate-member' ), - 'value' => get_post_meta( $key, '_um_default_view', true ), - ), - ), - ); - - if ( isset( $options[ get_post_meta( $key, '_um_sortby', true ) ] ) ) { - $sortby_label = $options[ get_post_meta( $key, '_um_sortby', true ) ]; - } else { - $sortby_label = get_post_meta( $key, '_um_sortby', true ); - } - - $directory_roles_meta = get_post_meta( $key, '_um_roles', true ); - $directory_roles = array(); - if ( ! empty( $directory_roles_meta ) ) { - if ( is_string( $directory_roles_meta ) ) { - $directory_roles = array( $directory_roles_meta ); - } else { - $directory_roles = $directory_roles_meta; - } - } - - $directory_show_these_users_meta = get_post_meta( $key, '_um_show_these_users', true ); - $show_these_users = array(); - if ( ! empty( $directory_show_these_users_meta ) ) { - if ( is_string( $directory_show_these_users_meta ) ) { - $show_these_users = array( $directory_show_these_users_meta ); - } else { - $show_these_users = $directory_show_these_users_meta; - } - } - - $directory_exclude_these_users_meta = get_post_meta( $key, '_um_exclude_these_users', true ); - $exclude_these_users = array(); - if ( ! empty( $directory_exclude_these_users_meta ) ) { - if ( is_string( $directory_exclude_these_users_meta ) ) { - $exclude_these_users = array( $directory_exclude_these_users_meta ); - } else { - $exclude_these_users = $directory_exclude_these_users_meta; - } - } - - $info[ 'ultimate-member-directory-' . $key ]['fields'] = array_merge( - $info[ 'ultimate-member-directory-' . $key ]['fields'], - array( - 'um-directory-roles' => array( - 'label' => __( 'User Roles to display', 'ultimate-member' ), - 'value' => ! empty( $directory_roles ) ? implode( ', ', $directory_roles ) : $labels['all'], - ), - 'um-directory-has_profile_photo' => array( - 'label' => __( 'Only show members who have uploaded a profile photo', 'ultimate-member' ), - 'value' => get_post_meta( $key, '_um_has_profile_photo', true ) ? $labels['yes'] : $labels['no'], - ), - 'um-directory-has_cover_photo' => array( - 'label' => __( 'Only show members who have uploaded a profile photo', 'ultimate-member' ), - 'value' => get_post_meta( $key, '_um_has_cover_photo', true ) ? $labels['yes'] : $labels['no'], - ), - 'um-directory-show_these_users' => array( - 'label' => __( 'Only show specific users (Enter one username per line)', 'ultimate-member' ), - 'value' => ! empty( $show_these_users ) ? implode( ', ', $show_these_users ) : '', - ), - 'um-directory-exclude_these_users' => array( - 'label' => __( 'Exclude specific users (Enter one username per line)', 'ultimate-member' ), - 'value' => ! empty( $exclude_these_users ) ? implode( ', ', $exclude_these_users ) : '', - ), - ) - ); - - $info = apply_filters( 'um_debug_member_directory_general_extend', $info, $key ); - - $info[ 'ultimate-member-directory-' . $key ]['fields'] = array_merge( - $info[ 'ultimate-member-directory-' . $key ]['fields'], - array( - 'um-directory-sortby' => array( - 'label' => __( 'Default sort users by', 'ultimate-member' ), - 'value' => $sortby_label, - ), - ) - ); - - if ( 'other' === get_post_meta( $key, '_um_sortby', true ) ) { - $info[ 'ultimate-member-directory-' . $key ]['fields'] = array_merge( - $info[ 'ultimate-member-directory-' . $key ]['fields'], - array( - 'um-directory-enable_sorting' => array( - 'label' => __( 'Enable custom sorting', 'ultimate-member' ), - 'value' => get_post_meta( $key, '_um_enable_sorting', true ) ? $labels['yes'] : $labels['no'], - ), - 'um-directory-sortby_custom' => array( - 'label' => __( 'Custom sorting meta key', 'ultimate-member' ), - 'value' => get_post_meta( $key, '_um_sortby_custom', true ), - ), - 'um-directory-sortby_custom_label' => array( - 'label' => __( 'Label of custom sort', 'ultimate-member' ), - 'value' => get_post_meta( $key, '_um_sortby_custom_label', true ), - ), - ) - ); - } - - if ( 1 === absint( get_post_meta( $key, '_um_enable_sorting', true ) ) ) { - $sorting_fields = get_post_meta( $key, '_um_sorting_fields', true ); - if ( ! empty( $sorting_fields ) ) { - foreach ( $sorting_fields as $k => $field ) { - if ( is_array( $field ) ) { - $info[ 'ultimate-member-directory-' . $key ]['fields'] = array_merge( - $info[ 'ultimate-member-directory-' . $key ]['fields'], - array( - 'um-directory-sorting_fields-' . $k => array( - 'label' => __( 'Field(s) to enable in sorting', 'ultimate-member' ), - 'value' => __( 'Label: ', 'ultimate-member' ) . array_values( $field )[0] . ' | ' . __( 'Meta key: ', 'ultimate-member' ) . stripslashes( array_keys( $field )[0] ), - ), - ) - ); - } else { - $sortby_label = isset( $options[ $field ] ) ? $options[ $field ] : $field; - $info[ 'ultimate-member-directory-' . $key ]['fields'] = array_merge( - $info[ 'ultimate-member-directory-' . $key ]['fields'], - array( - 'um-directory-sorting_fields-' . $k => array( - 'label' => __( 'Field to enable in sorting', 'ultimate-member' ), - 'value' => $sortby_label, - ), - ) - ); - } - } - } - } - - $info[ 'ultimate-member-directory-' . $key ]['fields'] = array_merge( - $info[ 'ultimate-member-directory-' . $key ]['fields'], - array( - 'um-directory-profile_photo' => array( - 'label' => __( 'Enable Profile Photo', 'ultimate-member' ), - 'value' => get_post_meta( $key, '_um_profile_photo', true ) ? $labels['yes'] : $labels['no'], - ), - 'um-directory-cover_photos' => array( - 'label' => __( 'Enable Cover Photo', 'ultimate-member' ), - 'value' => get_post_meta( $key, '_um_cover_photos', true ) ? $labels['yes'] : $labels['no'], - ), - 'um-directory-show_name' => array( - 'label' => __( 'Show display name', 'ultimate-member' ), - 'value' => get_post_meta( $key, '_um_show_name', true ) ? $labels['yes'] : $labels['no'], - ), - ) - ); - - $info = apply_filters( 'um_debug_member_directory_profile_extend', $info, $key ); - - $info[ 'ultimate-member-directory-' . $key ]['fields'] = array_merge( - $info[ 'ultimate-member-directory-' . $key ]['fields'], - array( - 'um-directory-show_tagline' => array( - 'label' => __( 'Show tagline below profile name', 'ultimate-member' ), - 'value' => get_post_meta( $key, '_um_show_tagline', true ) ? $labels['yes'] : $labels['no'], - ), - ) - ); - - if ( 1 === absint( get_post_meta( $key, '_um_show_tagline', true ) ) ) { - $tagline_fields = get_post_meta( $key, '_um_tagline_fields', true ); - if ( ! empty( $tagline_fields ) && is_array( $tagline_fields ) ) { - foreach ( $tagline_fields as $k => $field ) { - $label = isset( $options[ $field ] ) ? $options[ $field ] : $field; - $info[ 'ultimate-member-directory-' . $key ]['fields'] = array_merge( - $info[ 'ultimate-member-directory-' . $key ]['fields'], - array( - 'um-directory-tagline_fields-' . $k => array( - 'label' => __( 'Field to display in tagline', 'ultimate-member' ), - 'value' => $label, - ), - ) - ); - } - } - } - - $info[ 'ultimate-member-directory-' . $key ]['fields'] = array_merge( - $info[ 'ultimate-member-directory-' . $key ]['fields'], - array( - 'um-directory-show_userinfo' => array( - 'label' => __( 'Show extra user information below tagline?', 'ultimate-member' ), - 'value' => get_post_meta( $key, '_um_show_userinfo', true ) ? $labels['yes'] : $labels['no'], - ), - ) - ); - - if ( 1 === absint( get_post_meta( $key, '_um_show_userinfo', true ) ) ) { - $reveal_fields = get_post_meta( $key, '_um_reveal_fields', true ); - if ( ! empty( $reveal_fields ) && is_array( $reveal_fields ) ) { - foreach ( $reveal_fields as $k => $field ) { - $label = isset( $options[ $field ] ) ? $options[ $field ] : $field; - $info[ 'ultimate-member-directory-' . $key ]['fields'] = array_merge( - $info[ 'ultimate-member-directory-' . $key ]['fields'], - array( - 'um-directory-reveal_fields-' . $k => array( - 'label' => __( 'Field to display in extra user information section', 'ultimate-member' ), - 'value' => $label, - ), - ) - ); - } - } - } - - $info[ 'ultimate-member-directory-' . $key ]['fields'] = array_merge( - $info[ 'ultimate-member-directory-' . $key ]['fields'], - array( - 'um-directory-show_social' => array( - 'label' => __( 'Show social connect icons in extra user information section', 'ultimate-member' ), - 'value' => get_post_meta( $key, '_um_show_social', true ) ? $labels['yes'] : $labels['no'], - ), - 'um-directory-search' => array( - 'label' => __( 'Enable Search feature', 'ultimate-member' ), - 'value' => get_post_meta( $key, '_um_search', true ) ? $labels['yes'] : $labels['no'], - ), - ) - ); - - if ( 1 === absint( get_post_meta( $key, '_um_search', true ) ) ) { - $directory_roles_can_search_meta = get_post_meta( $key, '_um_roles_can_search', true ); - $roles_can_search = array(); - if ( ! empty( $directory_roles_can_search_meta ) ) { - if ( is_string( $directory_roles_can_search_meta ) ) { - $roles_can_search = array( $directory_roles_can_search_meta ); - } else { - $roles_can_search = $directory_roles_can_search_meta; - } - } - - $info[ 'ultimate-member-directory-' . $key ]['fields'] = array_merge( - $info[ 'ultimate-member-directory-' . $key ]['fields'], - array( - 'um-directory-roles_can_search' => array( - 'label' => __( 'User Roles that can use search', 'ultimate-member' ), - 'value' => ! empty( $roles_can_search ) ? implode( ', ', $roles_can_search ) : $labels['all'], - ), - ) - ); - } - - $info[ 'ultimate-member-directory-' . $key ]['fields'] = array_merge( - $info[ 'ultimate-member-directory-' . $key ]['fields'], - array( - 'um-directory-filters' => array( - 'label' => __( 'Enable Filters feature', 'ultimate-member' ), - 'value' => get_post_meta( $key, '_um_filters', true ) ? $labels['yes'] : $labels['no'], - ), - ) - ); - - if ( 1 === absint( get_post_meta( $key, '_um_filters', true ) ) ) { - $directory_roles_can_filter_meta = get_post_meta( $key, '_um_roles_can_filter', true ); - $roles_can_filter = array(); - if ( ! empty( $directory_roles_can_filter_meta ) ) { - if ( is_string( $directory_roles_can_filter_meta ) ) { - $roles_can_filter = array( $directory_roles_can_filter_meta ); - } else { - $roles_can_filter = $directory_roles_can_filter_meta; - } - } - - $info[ 'ultimate-member-directory-' . $key ]['fields'] = array_merge( - $info[ 'ultimate-member-directory-' . $key ]['fields'], - array( - 'um-directory-roles_can_filter' => array( - 'label' => __( 'User Roles that can use filters', 'ultimate-member' ), - 'value' => ! empty( $roles_can_filter ) ? implode( ', ', $roles_can_filter ) : $labels['all'], - ), - ) - ); - - $search_fields = get_post_meta( $key, '_um_search_fields', true ); - if ( ! empty( $search_fields ) && is_array( $search_fields ) ) { - foreach ( $search_fields as $k => $field ) { - $label = isset( $options[ $field ] ) ? $options[ $field ] : $field; - $info[ 'ultimate-member-directory-' . $key ]['fields'] = array_merge( - $info[ 'ultimate-member-directory-' . $key ]['fields'], - array( - 'um-directory-search_fields-' . $k => array( - 'label' => __( 'Filter meta to enable', 'ultimate-member' ), - 'value' => $label, - ), - ) - ); - } - } - } - - $info[ 'ultimate-member-directory-' . $key ]['fields'] = array_merge( - $info[ 'ultimate-member-directory-' . $key ]['fields'], - array( - 'um-directory-filters_expanded' => array( - 'label' => __( 'Expand the filter bar by default', 'ultimate-member' ), - 'value' => get_post_meta( $key, '_um_filters_expanded', true ) ? $labels['yes'] : $labels['no'], - ), - ) - ); - - if ( 1 === absint( get_post_meta( $key, '_um_filters_expanded', true ) ) ) { - $info[ 'ultimate-member-directory-' . $key ]['fields'] = array_merge( - $info[ 'ultimate-member-directory-' . $key ]['fields'], - array( - 'um-directory-filters_is_collapsible' => array( - 'label' => __( 'Can filter bar be collapsed', 'ultimate-member' ), - 'value' => get_post_meta( $key, '_um_filters_is_collapsible', true ) ? $labels['yes'] : $labels['no'], - ), - ) - ); - } - - $search_filters = get_post_meta( $key, '_um_search_filters', true ); - if ( ! empty( $search_filters ) && is_array( $search_filters ) ) { - foreach ( $search_filters as $k => $field ) { - $label = isset( $options[ $k ] ) ? $options[ $k ] : $k; - $value = $field; - if ( is_array( $field ) ) { - $value = __( 'From ', 'ultimate-member' ) . $field[0] . __( ' to ', 'ultimate-member' ) . $field[1]; - } - $info[ 'ultimate-member-directory-' . $key ]['fields'] = array_merge( - $info[ 'ultimate-member-directory-' . $key ]['fields'], - array( - 'um-directory-search_filters-' . $k => array( - 'label' => __( 'Admin filtering', 'ultimate-member' ), - 'value' => $label . ' - ' . $value, - ), - ) - ); - } - } - - $info[ 'ultimate-member-directory-' . $key ]['fields'] = array_merge( - $info[ 'ultimate-member-directory-' . $key ]['fields'], - array( - 'um-directory-must_search' => array( - 'label' => __( 'Show results only after search/filtration', 'ultimate-member' ), - 'value' => get_post_meta( $key, '_um_must_search', true ) ? $labels['yes'] : $labels['no'], - ), - 'um-directory-max_users' => array( - 'label' => __( 'Maximum number of profiles', 'ultimate-member' ), - 'value' => get_post_meta( $key, '_um_max_users', true ), - ), - 'um-directory-profiles_per_page' => array( - 'label' => __( 'Number of profiles per page', 'ultimate-member' ), - 'value' => get_post_meta( $key, '_um_profiles_per_page', true ), - ), - 'um-directory-profiles_per_page_mobile' => array( - 'label' => __( 'Maximum number of profiles', 'ultimate-member' ), - 'value' => get_post_meta( $key, '_um_profiles_per_page_mobile', true ), - ), - 'um-directory-directory_header' => array( - 'label' => __( 'Results Text', 'ultimate-member' ), - 'value' => get_post_meta( $key, '_um_directory_header', true ), - ), - 'um-directory-directory_header_single' => array( - 'label' => __( 'Single Result Text', 'ultimate-member' ), - 'value' => get_post_meta( $key, '_um_directory_header_single', true ), - ), - 'um-directory-directory_no_users' => array( - 'label' => __( 'Custom text if no users were found', 'ultimate-member' ), - 'value' => get_post_meta( $key, '_um_directory_no_users', true ), - ), - ) - ); - - $info = apply_filters( 'um_debug_member_directory_extend', $info, $key ); - } - } + // Members directory sitehealth + $info = $this->get_member_directories_sitehealth( $info ); /** * Filters the site health information. @@ -2704,4 +1375,1454 @@ class Site_Health { return $appearance_settings; } + + public function advanced_sitehealth() { + $labels = self::get_labels(); + + $general = array( + 'um-advanced_separator' => array( + 'label' => __( 'Advanced settings', 'ultimate-member' ), + 'value' => '---------------------------------------------------------------------', + ), + 'um-form_asterisk' => array( + 'label' => __( 'Required fields\' asterisk (Show an asterisk for required fields)', 'ultimate-member' ), + 'value' => UM()->options()->get( 'form_asterisk' ) ? $labels['yes'] : $labels['no'], + ), + 'um-um_profile_object_cache_stop' => array( + 'label' => __( 'Disable Cache User Profile', 'ultimate-member' ), + 'value' => UM()->options()->get( 'um_profile_object_cache_stop' ) ? $labels['yes'] : $labels['no'], + ), + 'um-uninstall_on_delete' => array( + 'label' => __( 'Remove Data on Uninstall?', 'ultimate-member' ), + 'value' => UM()->options()->get( 'uninstall_on_delete' ) ? $labels['yes'] : $labels['no'], + ), + ); + + $feature = array( + 'um-enable_blocks' => array( + 'label' => __( 'Enable Gutenberg Blocks', 'ultimate-member' ), + 'value' => UM()->options()->get( 'enable_blocks' ) ? $labels['yes'] : $labels['no'], + ), + 'um-member_directory_own_table' => array( + 'label' => __( 'Enable custom table for usermeta', 'ultimate-member' ), + 'value' => UM()->options()->get( 'member_directory_own_table' ) ? $labels['yes'] : $labels['no'], + ), + 'um-enable_as_email_sending' => array( + 'label' => __( 'Email sending by Action Scheduler', 'ultimate-member' ), + 'value' => UM()->options()->get( 'enable_as_email_sending' ) ? $labels['yes'] : $labels['no'], + ), + 'um-disable_restriction_pre_queries' => array( + 'label' => __( 'Disable pre-queries for restriction content logic (advanced)', 'ultimate-member' ), + 'value' => UM()->options()->get( 'disable_restriction_pre_queries' ) ? $labels['yes'] : $labels['no'], + ), + ); + + // Secure settings + $secure_ban_admins_accounts = UM()->options()->get( 'secure_ban_admins_accounts' ); + + $banned_capabilities_opt = UM()->options()->get( 'banned_capabilities' ); + $banned_capabilities = array(); + if ( ! empty( $banned_capabilities_opt ) ) { + if ( is_string( $banned_capabilities_opt ) ) { + $banned_capabilities = array( $banned_capabilities_opt ); + } else { + $banned_capabilities = $banned_capabilities_opt; + } + } + + $secure_settings = array( + 'um-banned_capabilities' => array( + 'label' => __( 'Banned Administrative Capabilities', 'ultimate-member' ), + 'value' => ! empty( $banned_capabilities ) ? implode( ', ', $banned_capabilities ) : '', + ), + 'um-lock_register_forms' => array( + 'label' => __( 'Lock All Register Forms', 'ultimate-member' ), + 'value' => UM()->options()->get( 'lock_register_forms' ) ? $labels['yes'] : $labels['no'], + ), + 'um-display_login_form_notice' => array( + 'label' => __( 'Display Login form notice to reset passwords', 'ultimate-member' ), + 'value' => UM()->options()->get( 'display_login_form_notice' ) ? $labels['yes'] : $labels['no'], + ), + 'um-secure_ban_admins_accounts' => array( + 'label' => __( 'Administrative capabilities ban (enable ban for administrative capabilities)', 'ultimate-member' ), + 'value' => $secure_ban_admins_accounts ? $labels['yes'] : $labels['no'], + ), + ); + if ( ! empty( $secure_ban_admins_accounts ) ) { + $secure_notify_admins_banned_accounts = UM()->options()->get( 'secure_notify_admins_banned_accounts' ); + + $secure_settings['um-secure_notify_admins_banned_accounts'] = array( + 'label' => __( 'Notify Administrators', 'ultimate-member' ), + 'value' => $secure_notify_admins_banned_accounts ? $labels['yes'] : $labels['no'], + ); + if ( ! empty( $secure_notify_admins_banned_accounts ) ) { + $secure_notify_admins_banned_accounts_options = array( + 'instant' => __( 'Send Immediately', 'ultimate-member' ), + 'hourly' => __( 'Hourly', 'ultimate-member' ), + 'daily' => __( 'Daily', 'ultimate-member' ), + ); + + $secure_settings['um-secure_notify_admins_banned_accounts__interval'] = array( + 'label' => __( 'Notification Schedule', 'ultimate-member' ), + 'value' => $secure_notify_admins_banned_accounts_options[ UM()->options()->get( 'secure_notify_admins_banned_accounts__interval' ) ], + ); + } + } + + $secure_allowed_redirect_hosts = UM()->options()->get( 'secure_allowed_redirect_hosts' ); + $secure_allowed_redirect_hosts = explode( PHP_EOL, $secure_allowed_redirect_hosts ); + + $secure_settings['um-secure_allowed_redirect_hosts'] = array( + 'label' => __( 'Allowed hosts for safe redirect', 'ultimate-member' ), + 'value' => $secure_allowed_redirect_hosts, + ); + + $developers = array( + 'um-allowed_choice_callbacks' => array( + 'label' => __( 'Allowed Choice Callbacks', 'ultimate-member' ), + 'value' => UM()->options()->get( 'allowed_choice_callbacks' ), + ), + 'um-rest_api_version' => array( + 'label' => __( 'REST API version', 'ultimate-member' ), + 'value' => UM()->options()->get( 'rest_api_version' ), + ), + 'um-allow_url_redirect_confirm' => array( + 'label' => __( 'Allow external link redirect confirm (enable JS.confirm for external links)', 'ultimate-member' ), + 'value' => UM()->options()->get( 'allow_url_redirect_confirm' ) ? $labels['yes'] : $labels['no'], + ), + ); + + return array_merge( $general, $feature, $secure_settings, $developers ); + } + + public function license_sitehealth() { + // Licenses settings. + $license_settings = array( + 'um-licenses' => array( + 'label' => __( 'Licenses', 'ultimate-member' ), + 'value' => array(), + ), + ); + + /** + * Filters licenses settings for Site Health. + * + * @since 2.7.0 + * @hook um_licenses_site_health + * + * @param {array} $license_settings licenses settings for Site Health. + * + * @return {array} licenses settings for Site Health. + * + * @example Extend licenses settings for Site Health. + * function um_licenses_site_health( $license_settings ) { + * // your code here + * return $license_settings; + * } + * add_filter( 'um_licenses_site_health', 'um_licenses_site_health', 10, 1 ); + */ + $license_settings = apply_filters( 'um_licenses_site_health', $license_settings ); + + return $license_settings; + } + + public function get_member_directories_sitehealth( $info ) { + $labels = self::get_labels(); + $options = array( + 'country' => __( 'Country', 'ultimate-member' ), + 'gender' => __( 'Gender', 'ultimate-member' ), + 'languages' => __( 'Languages', 'ultimate-member' ), + 'role' => __( 'Roles', 'ultimate-member' ), + 'birth_date' => __( 'Age', 'ultimate-member' ), + 'last_login' => __( 'Last Login', 'ultimate-member' ), + 'user_registered' => __( 'User Registered', 'ultimate-member' ), + 'first_name' => __( 'First Name', 'ultimate-member' ), + 'last_name' => __( 'Last Name', 'ultimate-member' ), + 'nickname' => __( 'Nickname', 'ultimate-member' ), + 'secondary_user_email' => __( 'Secondary Email Address', 'ultimate-member' ), + 'description' => __( 'Biography', 'ultimate-member' ), + 'phone_number' => __( 'Phone Number', 'ultimate-member' ), + 'mobile_number' => __( 'Mobile Number', 'ultimate-member' ), + 'role_select' => __( 'Roles (Dropdown)', 'ultimate-member' ), + 'role_radio' => __( 'Roles (Radio)', 'ultimate-member' ), + 'whatsapp' => __( 'WhatsApp number', 'ultimate-member' ), + 'facebook' => __( 'Facebook', 'ultimate-member' ), + 'twitter' => __( 'X (formerly Twitter)', 'ultimate-member' ), + 'viber' => __( 'Viber number', 'ultimate-member' ), + 'skype' => __( 'Skype ID', 'ultimate-member' ), + 'telegram' => __( 'Telegram', 'ultimate-member' ), + 'discord' => __( 'Discord', 'ultimate-member' ), + 'youtube' => __( 'Youtube', 'ultimate-member' ), + 'soundcloud' => __( 'SoundCloud', 'ultimate-member' ), + 'user_registered_desc' => __( 'New users first', 'ultimate-member' ), + 'user_registered_asc' => __( 'Old users first', 'ultimate-member' ), + 'username' => __( 'Username', 'ultimate-member' ), + 'display_name' => __( 'Display name', 'ultimate-member' ), + 'last_first_name' => __( 'Last & First name', 'ultimate-member' ), + 'random' => __( 'Random', 'ultimate-member' ), + 'other' => __( 'Other (Custom Field)', 'ultimate-member' ), + ); + + $info['ultimate-member-directories'] = array( + 'label' => __( 'Ultimate Member Directories', 'ultimate-member' ), + 'description' => __( 'This debug information about Ultimate Member directories.', 'ultimate-member' ), + 'fields' => array( + 'um-directory' => array( + 'label' => __( 'Member directories', 'ultimate-member' ), + 'value' => ! empty( $this->get_member_directories() ) ? $this->get_member_directories() : $labels['no-dir'], + ), + ), + ); + + if ( ! empty( $this->get_member_directories() ) ) { + foreach ( $this->get_member_directories() as $key => $directory ) { + if ( 0 === strpos( $key, 'ID#' ) ) { + $key = substr( $key, 3 ); + } + + $_um_view_types_value = get_post_meta( $key, '_um_view_types', true ); + $_um_view_types_value = empty( $_um_view_types_value ) ? array( 'grid', 'list' ) : $_um_view_types_value; + $_um_view_types_value = is_string( $_um_view_types_value ) ? array( $_um_view_types_value ) : $_um_view_types_value; + + $info[ 'ultimate-member-directory-' . $key ] = array( + 'label' => ' - ' . $directory . __( ' directory settings', 'ultimate-member' ), + 'description' => __( 'This debug information for your Ultimate Member directory.', 'ultimate-member' ), + 'fields' => array( + 'um-directory-shortcode' => array( + 'label' => __( 'Shortcode', 'ultimate-member' ), + 'value' => '[ultimatemember_directory id="' . $key . '"]', + ), + 'um-directory_template' => array( + 'label' => __( 'Template', 'ultimate-member' ), + 'value' => get_post_meta( $key, '_um_directory_template', true ) ? get_post_meta( $key, '_um_directory_template', true ) : $labels['default'], + ), + 'um-directory-view_types' => array( + 'label' => __( 'View types', 'ultimate-member' ), + 'value' => implode( ', ', $_um_view_types_value ), + ), + 'um-directory-default_view' => array( + 'label' => __( 'Default view type', 'ultimate-member' ), + 'value' => get_post_meta( $key, '_um_default_view', true ), + ), + ), + ); + + if ( isset( $options[ get_post_meta( $key, '_um_sortby', true ) ] ) ) { + $sortby_label = $options[ get_post_meta( $key, '_um_sortby', true ) ]; + } else { + $sortby_label = get_post_meta( $key, '_um_sortby', true ); + } + + $directory_roles_meta = get_post_meta( $key, '_um_roles', true ); + $directory_roles = array(); + if ( ! empty( $directory_roles_meta ) ) { + if ( is_string( $directory_roles_meta ) ) { + $directory_roles = array( $directory_roles_meta ); + } else { + $directory_roles = $directory_roles_meta; + } + } + + $directory_show_these_users_meta = get_post_meta( $key, '_um_show_these_users', true ); + $show_these_users = array(); + if ( ! empty( $directory_show_these_users_meta ) ) { + if ( is_string( $directory_show_these_users_meta ) ) { + $show_these_users = array( $directory_show_these_users_meta ); + } else { + $show_these_users = $directory_show_these_users_meta; + } + } + + $directory_exclude_these_users_meta = get_post_meta( $key, '_um_exclude_these_users', true ); + $exclude_these_users = array(); + if ( ! empty( $directory_exclude_these_users_meta ) ) { + if ( is_string( $directory_exclude_these_users_meta ) ) { + $exclude_these_users = array( $directory_exclude_these_users_meta ); + } else { + $exclude_these_users = $directory_exclude_these_users_meta; + } + } + + $info[ 'ultimate-member-directory-' . $key ]['fields'] = array_merge( + $info[ 'ultimate-member-directory-' . $key ]['fields'], + array( + 'um-directory-roles' => array( + 'label' => __( 'User Roles to display', 'ultimate-member' ), + 'value' => ! empty( $directory_roles ) ? implode( ', ', $directory_roles ) : $labels['all'], + ), + 'um-directory-has_profile_photo' => array( + 'label' => __( 'Only show members who have uploaded a profile photo', 'ultimate-member' ), + 'value' => get_post_meta( $key, '_um_has_profile_photo', true ) ? $labels['yes'] : $labels['no'], + ), + 'um-directory-has_cover_photo' => array( + 'label' => __( 'Only show members who have uploaded a cover photo', 'ultimate-member' ), + 'value' => get_post_meta( $key, '_um_has_cover_photo', true ) ? $labels['yes'] : $labels['no'], + ), + 'um-directory-show_these_users' => array( + 'label' => __( 'Only show specific users', 'ultimate-member' ), + 'value' => ! empty( $show_these_users ) ? implode( ', ', $show_these_users ) : '', + ), + 'um-directory-exclude_these_users' => array( + 'label' => __( 'Exclude specific users', 'ultimate-member' ), + 'value' => ! empty( $exclude_these_users ) ? implode( ', ', $exclude_these_users ) : '', + ), + ) + ); + + $info = apply_filters( 'um_debug_member_directory_general_extend', $info, $key ); + + $info[ 'ultimate-member-directory-' . $key ]['fields'] = array_merge( + $info[ 'ultimate-member-directory-' . $key ]['fields'], + array( + 'um-directory-sortby' => array( + 'label' => __( 'Default sort users by', 'ultimate-member' ), + 'value' => $sortby_label, + ), + ) + ); + + if ( 'other' === get_post_meta( $key, '_um_sortby', true ) ) { + $sort_type_opts = array( + 'CHAR' => __( 'CHAR', 'ultimate-member' ), + 'NUMERIC' => __( 'NUMERIC', 'ultimate-member' ), + 'BINARY' => __( 'BINARY', 'ultimate-member' ), + 'DATE' => __( 'DATE', 'ultimate-member' ), + 'DATETIME' => __( 'DATETIME', 'ultimate-member' ), + 'DECIMAL' => __( 'DECIMAL', 'ultimate-member' ), + 'SIGNED' => __( 'SIGNED', 'ultimate-member' ), + 'TIME' => __( 'TIME', 'ultimate-member' ), + 'UNSIGNED' => __( 'UNSIGNED', 'ultimate-member' ), + ); + + $info[ 'ultimate-member-directory-' . $key ]['fields'] = array_merge( + $info[ 'ultimate-member-directory-' . $key ]['fields'], + array( + 'um-directory-sortby_custom' => array( + 'label' => __( 'Meta key', 'ultimate-member' ), + 'value' => get_post_meta( $key, '_um_sortby_custom', true ), + ), + 'um-directory-um_sortby_custom_type' => array( + 'label' => __( 'Data type', 'ultimate-member' ), + 'value' => $sort_type_opts[ get_post_meta( $key, '_um_sortby_custom_type', true ) ], + ), + 'um-directory-um_sortby_custom_order' => array( + 'label' => __( 'Order', 'ultimate-member' ), + 'value' => 'ASC' === get_post_meta( $key, '_um_sortby_custom_order', true ) ? __( 'Ascending', 'ultimate-member' ) : __( 'Descending', 'ultimate-member' ), + ), + 'um-directory-sortby_custom_label' => array( + 'label' => __( 'Label of custom sort', 'ultimate-member' ), + 'value' => get_post_meta( $key, '_um_sortby_custom_label', true ), + ), + ) + ); + } + + $info[ 'ultimate-member-directory-' . $key ]['fields'] = array_merge( + $info[ 'ultimate-member-directory-' . $key ]['fields'], + array( + 'um-directory-enable_sorting' => array( + 'label' => __( 'Enable custom sorting', 'ultimate-member' ), + 'value' => get_post_meta( $key, '_um_enable_sorting', true ) ? $labels['yes'] : $labels['no'], + ), + ) + ); + + if ( 1 === absint( get_post_meta( $key, '_um_enable_sorting', true ) ) ) { + $sorting_fields = get_post_meta( $key, '_um_sorting_fields', true ); + if ( ! empty( $sorting_fields ) ) { + foreach ( $sorting_fields as $k => $field ) { + if ( is_array( $field ) ) { + $info[ 'ultimate-member-directory-' . $key ]['fields'] = array_merge( + $info[ 'ultimate-member-directory-' . $key ]['fields'], + array( + 'um-directory-sorting_fields-' . $k => array( + 'label' => __( 'Field(s) to enable in sorting', 'ultimate-member' ), + 'value' => __( 'Label: ', 'ultimate-member' ) . array_values( $field )[0] . ' | ' . __( 'Meta key: ', 'ultimate-member' ) . stripslashes( array_keys( $field )[0] ), + ), + ) + ); + } else { + $sortby_label = isset( $options[ $field ] ) ? $options[ $field ] : $field; + $info[ 'ultimate-member-directory-' . $key ]['fields'] = array_merge( + $info[ 'ultimate-member-directory-' . $key ]['fields'], + array( + 'um-directory-sorting_fields-' . $k => array( + 'label' => __( 'Field to enable in sorting', 'ultimate-member' ), + 'value' => $sortby_label, + ), + ) + ); + } + } + } + } + + $info[ 'ultimate-member-directory-' . $key ]['fields'] = array_merge( + $info[ 'ultimate-member-directory-' . $key ]['fields'], + array( + 'um-directory-search' => array( + 'label' => __( 'Enable Search feature', 'ultimate-member' ), + 'value' => get_post_meta( $key, '_um_search', true ) ? $labels['yes'] : $labels['no'], + ), + ) + ); + + if ( 1 === absint( get_post_meta( $key, '_um_search', true ) ) ) { + $directory_roles_can_search_meta = get_post_meta( $key, '_um_roles_can_search', true ); + $roles_can_search = array(); + if ( ! empty( $directory_roles_can_search_meta ) ) { + if ( is_string( $directory_roles_can_search_meta ) ) { + $roles_can_search = array( $directory_roles_can_search_meta ); + } else { + $roles_can_search = $directory_roles_can_search_meta; + } + } + + $info[ 'ultimate-member-directory-' . $key ]['fields'] = array_merge( + $info[ 'ultimate-member-directory-' . $key ]['fields'], + array( + 'um-directory-roles_can_search' => array( + 'label' => __( 'User Roles that can use search', 'ultimate-member' ), + 'value' => ! empty( $roles_can_search ) ? implode( ', ', $roles_can_search ) : $labels['all'], + ), + ) + ); + } + + if ( ! empty( get_post_meta( $key, '_um_search_exclude_fields', true ) ) ) { + $info[ 'ultimate-member-directory-' . $key ]['fields'] = array_merge( + $info[ 'ultimate-member-directory-' . $key ]['fields'], + array( + 'um-directory-um_search_exclude_fields' => array( + 'label' => __( 'Exclude fields from search', 'ultimate-member' ), + 'value' => get_post_meta( $key, '_um_search_exclude_fields', true ), + ), + ) + ); + } + + if ( ! empty( get_post_meta( $key, '_um_search_include_fields', true ) ) ) { + $info[ 'ultimate-member-directory-' . $key ]['fields'] = array_merge( + $info[ 'ultimate-member-directory-' . $key ]['fields'], + array( + 'um-directory-um_search_include_fields' => array( + 'label' => __( 'Fields to search by', 'ultimate-member' ), + 'value' => get_post_meta( $key, '_um_search_include_fields', true ), + ), + ) + ); + } + + $info[ 'ultimate-member-directory-' . $key ]['fields'] = array_merge( + $info[ 'ultimate-member-directory-' . $key ]['fields'], + array( + 'um-directory-filters' => array( + 'label' => __( 'Enable Filters feature', 'ultimate-member' ), + 'value' => get_post_meta( $key, '_um_filters', true ) ? $labels['yes'] : $labels['no'], + ), + ) + ); + + if ( 1 === absint( get_post_meta( $key, '_um_filters', true ) ) ) { + $directory_roles_can_filter_meta = get_post_meta( $key, '_um_roles_can_filter', true ); + $roles_can_filter = array(); + if ( ! empty( $directory_roles_can_filter_meta ) ) { + if ( is_string( $directory_roles_can_filter_meta ) ) { + $roles_can_filter = array( $directory_roles_can_filter_meta ); + } else { + $roles_can_filter = $directory_roles_can_filter_meta; + } + } + + $info[ 'ultimate-member-directory-' . $key ]['fields'] = array_merge( + $info[ 'ultimate-member-directory-' . $key ]['fields'], + array( + 'um-directory-roles_can_filter' => array( + 'label' => __( 'User Roles that can use filters', 'ultimate-member' ), + 'value' => ! empty( $roles_can_filter ) ? implode( ', ', $roles_can_filter ) : $labels['all'], + ), + ) + ); + + $search_fields = get_post_meta( $key, '_um_search_fields', true ); + if ( ! empty( $search_fields ) && is_array( $search_fields ) ) { + $field_labels = array(); + foreach ( $search_fields as $k => $field ) { + $field_label = isset( $options[ $field ] ) ? $options[ $field ] : $field; + $field_labels[] = $field_label; + } + $info[ 'ultimate-member-directory-' . $key ]['fields'] = array_merge( + $info[ 'ultimate-member-directory-' . $key ]['fields'], + array( + 'um-directory-search_fields-' . $k => array( + 'label' => __( 'Filter meta to enable', 'ultimate-member' ), + 'value' => $field_labels, + ), + ) + ); + } + + $info[ 'ultimate-member-directory-' . $key ]['fields'] = array_merge( + $info[ 'ultimate-member-directory-' . $key ]['fields'], + array( + 'um-directory-filters_expanded' => array( + 'label' => __( 'Expand the filter bar by default', 'ultimate-member' ), + 'value' => get_post_meta( $key, '_um_filters_expanded', true ) ? $labels['yes'] : $labels['no'], + ), + ) + ); + + if ( 1 === absint( get_post_meta( $key, '_um_filters_expanded', true ) ) ) { + $info[ 'ultimate-member-directory-' . $key ]['fields'] = array_merge( + $info[ 'ultimate-member-directory-' . $key ]['fields'], + array( + 'um-directory-filters_is_collapsible' => array( + 'label' => __( 'Can filter bar be collapsed', 'ultimate-member' ), + 'value' => get_post_meta( $key, '_um_filters_is_collapsible', true ) ? $labels['yes'] : $labels['no'], + ), + ) + ); + } + } + + $search_filters = get_post_meta( $key, '_um_search_filters', true ); + if ( ! empty( $search_filters ) && is_array( $search_filters ) ) { + $field_labels = array(); + foreach ( $search_filters as $k => $field ) { + $field_label = isset( $options[ $k ] ) ? $options[ $k ] : $k; + $value = $field; + if ( is_array( $field ) ) { + // @todo: check if field 'From' and 'To' is set. $value = __( 'From ', 'ultimate-member' ) . $field[0] . __( ' to ', 'ultimate-member' ) . $field[1]; + $value = implode( ', ', $field ); + } + $field_labels[] = $field_label . ' - ' . $value; + } + $info[ 'ultimate-member-directory-' . $key ]['fields'] = array_merge( + $info[ 'ultimate-member-directory-' . $key ]['fields'], + array( + 'um-directory-search_filters-' . $k => array( + 'label' => __( 'Admin filtering', 'ultimate-member' ), + 'value' => $field_labels, + ), + ) + ); + } + + $info[ 'ultimate-member-directory-' . $key ]['fields'] = array_merge( + $info[ 'ultimate-member-directory-' . $key ]['fields'], + array( + 'um-directory-profile_photo' => array( + 'label' => __( 'Enable Profile Photo', 'ultimate-member' ), + 'value' => get_post_meta( $key, '_um_profile_photo', true ) ? $labels['yes'] : $labels['no'], + ), + 'um-directory-cover_photos' => array( + 'label' => __( 'Enable Cover Photo', 'ultimate-member' ), + 'value' => get_post_meta( $key, '_um_cover_photos', true ) ? $labels['yes'] : $labels['no'], + ), + 'um-directory-show_name' => array( + 'label' => __( 'Show display name', 'ultimate-member' ), + 'value' => get_post_meta( $key, '_um_show_name', true ) ? $labels['yes'] : $labels['no'], + ), + ) + ); + + $info = apply_filters( 'um_debug_member_directory_profile_extend', $info, $key ); + + $info[ 'ultimate-member-directory-' . $key ]['fields'] = array_merge( + $info[ 'ultimate-member-directory-' . $key ]['fields'], + array( + 'um-directory-show_tagline' => array( + 'label' => __( 'Show tagline below profile name', 'ultimate-member' ), + 'value' => get_post_meta( $key, '_um_show_tagline', true ) ? $labels['yes'] : $labels['no'], + ), + ) + ); + + if ( 1 === absint( get_post_meta( $key, '_um_show_tagline', true ) ) ) { + $tagline_fields = get_post_meta( $key, '_um_tagline_fields', true ); + if ( ! empty( $tagline_fields ) && is_array( $tagline_fields ) ) { + $field_labels = array(); + foreach ( $tagline_fields as $k => $field ) { + $label = isset( $options[ $field ] ) ? $options[ $field ] : $field; + $field_labels[] = $label; + } + + $info[ 'ultimate-member-directory-' . $key ]['fields'] = array_merge( + $info[ 'ultimate-member-directory-' . $key ]['fields'], + array( + 'um-directory-tagline_fields-' . $k => array( + 'label' => __( 'Field to display in tagline', 'ultimate-member' ), + 'value' => $field_labels, + ), + ) + ); + } + } + + $info[ 'ultimate-member-directory-' . $key ]['fields'] = array_merge( + $info[ 'ultimate-member-directory-' . $key ]['fields'], + array( + 'um-directory-show_userinfo' => array( + 'label' => __( 'Show extra user information below tagline?', 'ultimate-member' ), + 'value' => get_post_meta( $key, '_um_show_userinfo', true ) ? $labels['yes'] : $labels['no'], + ), + ) + ); + + if ( 1 === absint( get_post_meta( $key, '_um_show_userinfo', true ) ) ) { + $reveal_fields = get_post_meta( $key, '_um_reveal_fields', true ); + if ( ! empty( $reveal_fields ) && is_array( $reveal_fields ) ) { + $field_labels = array(); + foreach ( $reveal_fields as $k => $field ) { + $label = isset( $options[ $field ] ) ? $options[ $field ] : $field; + $field_labels[] = $label; + } + + $info[ 'ultimate-member-directory-' . $key ]['fields'] = array_merge( + $info[ 'ultimate-member-directory-' . $key ]['fields'], + array( + 'um-directory-reveal_fields-' . $k => array( + 'label' => __( 'Field to display in extra user information section', 'ultimate-member' ), + 'value' => $field_labels, + ), + ) + ); + } + } + + $info[ 'ultimate-member-directory-' . $key ]['fields'] = array_merge( + $info[ 'ultimate-member-directory-' . $key ]['fields'], + array( + 'um-directory-show_social' => array( + 'label' => __( 'Show social connect icons in extra user information section', 'ultimate-member' ), + 'value' => get_post_meta( $key, '_um_show_social', true ) ? $labels['yes'] : $labels['no'], + ), + 'um-directory-um_userinfo_animate' => array( + 'label' => __( 'Hide extra user information to the reveal section', 'ultimate-member' ), + 'value' => get_post_meta( $key, '_um_userinfo_animate', true ) ? $labels['yes'] : $labels['no'], + ), + 'um-directory-must_search' => array( + 'label' => __( 'Show results only after search/filtration', 'ultimate-member' ), + 'value' => get_post_meta( $key, '_um_must_search', true ) ? $labels['yes'] : $labels['no'], + ), + 'um-directory-max_users' => array( + 'label' => __( 'Maximum number of profiles', 'ultimate-member' ), + 'value' => get_post_meta( $key, '_um_max_users', true ), + ), + 'um-directory-profiles_per_page' => array( + 'label' => __( 'Number of profiles per page', 'ultimate-member' ), + 'value' => get_post_meta( $key, '_um_profiles_per_page', true ), + ), + 'um-directory-profiles_per_page_mobile' => array( + 'label' => __( 'Maximum number of profiles', 'ultimate-member' ), + 'value' => get_post_meta( $key, '_um_profiles_per_page_mobile', true ), + ), + 'um-directory-directory_header' => array( + 'label' => __( 'Results Text', 'ultimate-member' ), + 'value' => get_post_meta( $key, '_um_directory_header', true ), + ), + 'um-directory-directory_header_single' => array( + 'label' => __( 'Single Result Text', 'ultimate-member' ), + 'value' => get_post_meta( $key, '_um_directory_header_single', true ), + ), + 'um-directory-directory_no_users' => array( + 'label' => __( 'Custom text if no users were found', 'ultimate-member' ), + 'value' => get_post_meta( $key, '_um_directory_no_users', true ), + ), + ) + ); + + $info = apply_filters( 'um_debug_member_directory_extend', $info, $key ); + } + } + + return $info; + } + + public function roles_sitehealth( $info ) { + $labels = self::get_labels(); + + // User roles settings + $roles_array = array(); + foreach ( $this->get_roles() as $key => $role ) { + if ( strpos( $key, 'um_' ) === 0 ) { + $key = substr( $key, 3 ); + } + $rolemeta = $this->get_role_meta( $key ); + if ( false === $rolemeta ) { + continue; + } + $priority = ! empty( $rolemeta['_um_priority'] ) ? $rolemeta['_um_priority'] : 0; + + $k = $priority . '-' . $role; + $roles_array[ $k ] = $role . '(' . $priority . ')'; + + krsort( $roles_array, SORT_NUMERIC ); + } + + $info['ultimate-member-user-roles'] = array( + 'label' => __( 'User roles', 'ultimate-member' ), + 'description' => __( 'This debug information about user roles.', 'ultimate-member' ), + 'fields' => array( + 'um-roles' => array( + 'label' => __( 'User Roles (priority)', 'ultimate-member' ), + 'value' => implode( ', ', $roles_array ), + ), + 'um-register_role' => array( + 'label' => __( 'WordPress Default New User Role', 'ultimate-member' ), + 'value' => get_option( 'default_role' ), + ), + ), + ); + + foreach ( $this->get_roles() as $key => $role ) { + if ( strpos( $key, 'um_' ) === 0 ) { + $key = substr( $key, 3 ); + } + + $rolemeta = $this->get_role_meta( $key ); + if ( false === $rolemeta ) { + continue; + } + + $info[ 'ultimate-member-' . $key ] = array( + 'label' => ' - ' . $role . __( ' role settings', 'ultimate-member' ), + 'description' => __( 'This debug information about user role.', 'ultimate-member' ), + 'fields' => array(), + ); + + if ( array_key_exists( '_um_can_access_wpadmin', $rolemeta ) ) { + $info[ 'ultimate-member-' . $key ]['fields'] = array_merge( + $info[ 'ultimate-member-' . $key ]['fields'], + array( + 'um-can_access_wpadmin' => array( + 'label' => __( 'Can access wp-admin?', 'ultimate-member' ), + 'value' => $rolemeta['_um_can_access_wpadmin'] ? $labels['yes'] : $labels['no'], + ), + ) + ); + } + + if ( array_key_exists( '_um_can_not_see_adminbar', $rolemeta ) ) { + $info[ 'ultimate-member-' . $key ]['fields'] = array_merge( + $info[ 'ultimate-member-' . $key ]['fields'], + array( + 'um-can_not_see_adminbar' => array( + 'label' => __( 'Force hiding adminbar in frontend?', 'ultimate-member' ), + 'value' => $rolemeta['_um_can_not_see_adminbar'] ? $labels['yes'] : $labels['no'], + ), + ) + ); + } + + if ( array_key_exists( '_um_can_edit_everyone', $rolemeta ) ) { + $info[ 'ultimate-member-' . $key ]['fields'] = array_merge( + $info[ 'ultimate-member-' . $key ]['fields'], + array( + 'um-can_edit_everyone' => array( + 'label' => __( 'Can edit other member accounts?', 'ultimate-member' ), + 'value' => $rolemeta['_um_can_edit_everyone'] ? $labels['yes'] : $labels['no'], + ), + ) + ); + } + + if ( array_key_exists( '_um_can_edit_everyone', $rolemeta ) && 1 === absint( $rolemeta['_um_can_edit_everyone'] ) ) { + $can_edit_roles_meta = ! empty( $rolemeta['_um_can_edit_roles'] ) ? $rolemeta['_um_can_edit_roles'] : array(); + $can_edit_roles = array(); + if ( ! empty( $can_edit_roles_meta ) ) { + if ( is_string( $can_edit_roles_meta ) ) { + $can_edit_roles = array( $can_edit_roles_meta ); + } else { + $can_edit_roles = $can_edit_roles_meta; + } + } + + $info[ 'ultimate-member-' . $key ]['fields'] = array_merge( + $info[ 'ultimate-member-' . $key ]['fields'], + array( + 'um-can_edit_roles' => array( + 'label' => __( 'Can edit these user roles only', 'ultimate-member' ), + 'value' => ! empty( $can_edit_roles ) ? implode( ', ', $can_edit_roles ) : $labels['all'], + ), + ) + ); + } + + if ( array_key_exists( '_um_can_delete_everyone', $rolemeta ) ) { + $info[ 'ultimate-member-' . $key ]['fields'] = array_merge( + $info[ 'ultimate-member-' . $key ]['fields'], + array( + 'um-can_delete_everyone' => array( + 'label' => __( 'Can delete other member accounts?', 'ultimate-member' ), + 'value' => $rolemeta['_um_can_delete_everyone'] ? $labels['yes'] : $labels['no'], + ), + ) + ); + } + + if ( array_key_exists( '_um_can_delete_everyone', $rolemeta ) && 1 === absint( $rolemeta['_um_can_delete_everyone'] ) ) { + $can_delete_roles_meta = ! empty( $rolemeta['_um_can_delete_roles'] ) ? $rolemeta['_um_can_delete_roles'] : array(); + $can_delete_roles = array(); + if ( ! empty( $can_delete_roles_meta ) ) { + if ( is_string( $can_delete_roles_meta ) ) { + $can_delete_roles = array( $can_delete_roles_meta ); + } else { + $can_delete_roles = $can_delete_roles_meta; + } + } + + $info[ 'ultimate-member-' . $key ]['fields'] = array_merge( + $info[ 'ultimate-member-' . $key ]['fields'], + array( + 'um-can_delete_roles' => array( + 'label' => __( 'Can delete these user roles only', 'ultimate-member' ), + 'value' => ! empty( $can_delete_roles ) ? implode( ', ', $can_delete_roles ) : $labels['all'], + ), + ) + ); + } + + if ( array_key_exists( '_um_can_edit_profile', $rolemeta ) ) { + $info[ 'ultimate-member-' . $key ]['fields'] = array_merge( + $info[ 'ultimate-member-' . $key ]['fields'], + array( + 'um-can_edit_profile' => array( + 'label' => __( 'Can edit their profile?', 'ultimate-member' ), + 'value' => $rolemeta['_um_can_edit_profile'] ? $labels['yes'] : $labels['no'], + ), + ) + ); + } + + if ( array_key_exists( '_um_can_delete_profile', $rolemeta ) ) { + $info[ 'ultimate-member-' . $key ]['fields'] = array_merge( + $info[ 'ultimate-member-' . $key ]['fields'], + array( + 'um-can_delete_profile' => array( + 'label' => __( 'Can delete their account?', 'ultimate-member' ), + 'value' => $rolemeta['_um_can_delete_profile'] ? $labels['yes'] : $labels['no'], + ), + ) + ); + } + + if ( array_key_exists( '_um_can_view_all', $rolemeta ) ) { + $info[ 'ultimate-member-' . $key ]['fields'] = array_merge( + $info[ 'ultimate-member-' . $key ]['fields'], + array( + 'um-can_view_all' => array( + 'label' => __( 'Can view other member profiles?', 'ultimate-member' ), + 'value' => $rolemeta['_um_can_view_all'] ? $labels['yes'] : $labels['no'], + ), + ) + ); + } + + if ( array_key_exists( '_um_can_view_all', $rolemeta ) && 1 === absint( $rolemeta['_um_can_view_all'] ) ) { + $can_view_roles_meta = ! empty( $rolemeta['_um_can_view_roles'] ) ? $rolemeta['_um_can_view_roles'] : array(); + $can_view_roles = array(); + if ( ! empty( $can_view_roles_meta ) ) { + if ( is_string( $can_view_roles_meta ) ) { + $can_view_roles = array( $can_view_roles_meta ); + } else { + $can_view_roles = $can_view_roles_meta; + } + } + + $info[ 'ultimate-member-' . $key ]['fields'] = array_merge( + $info[ 'ultimate-member-' . $key ]['fields'], + array( + 'um-can_view_roles' => array( + 'label' => __( 'Can view these user roles only', 'ultimate-member' ), + 'value' => ! empty( $can_view_roles ) ? implode( ', ', $can_view_roles ) : $labels['all'], + ), + ) + ); + } + + if ( isset( $rolemeta['_um_profile_noindex'] ) && '' !== $rolemeta['_um_profile_noindex'] ) { + $profile_noindex = $rolemeta['_um_profile_noindex'] ? $labels['yes'] : $labels['no']; + } else { + $profile_noindex = __( 'Default', 'ultimate-member' ); + } + if ( isset( $rolemeta['_um_default_homepage'] ) && '' !== $rolemeta['_um_default_homepage'] ) { + $default_homepage = $rolemeta['_um_default_homepage'] ? $labels['yes'] : $labels['no']; + } else { + $default_homepage = __( 'No such option', 'ultimate-member' ); + } + + if ( array_key_exists( '_um_can_make_private_profile', $rolemeta ) ) { + $info[ 'ultimate-member-' . $key ]['fields'] = array_merge( + $info[ 'ultimate-member-' . $key ]['fields'], + array( + 'um-can_make_private_profile' => array( + 'label' => __( 'Can make their profile private?', 'ultimate-member' ), + 'value' => $rolemeta['_um_can_make_private_profile'] ? $labels['yes'] : $labels['no'], + ), + ) + ); + } + + if ( array_key_exists( '_um_can_access_private_profile', $rolemeta ) ) { + $info[ 'ultimate-member-' . $key ]['fields'] = array_merge( + $info[ 'ultimate-member-' . $key ]['fields'], + array( + 'um-can_access_private_profile' => array( + 'label' => __( 'Can view/access private profiles?', 'ultimate-member' ), + 'value' => $rolemeta['_um_can_access_private_profile'] ? $labels['yes'] : $labels['no'], + ), + ) + ); + } + + $info[ 'ultimate-member-' . $key ]['fields'] = array_merge( + $info[ 'ultimate-member-' . $key ]['fields'], + array( + 'um-profile_noindex' => array( + 'label' => __( 'Avoid indexing profile by search engines', 'ultimate-member' ), + 'value' => $profile_noindex, + ), + 'um-default_homepage' => array( + 'label' => __( 'Can view default homepage?', 'ultimate-member' ), + 'value' => $default_homepage, + ), + ) + ); + + if ( isset( $rolemeta['_um_default_homepage'] ) && 0 === absint( $rolemeta['_um_default_homepage'] ) ) { + $info[ 'ultimate-member-' . $key ]['fields'] = array_merge( + $info[ 'ultimate-member-' . $key ]['fields'], + array( + 'um-redirect_homepage' => array( + 'label' => __( 'Custom Homepage Redirect', 'ultimate-member' ), + 'value' => $rolemeta['_um_redirect_homepage'], + ), + ) + ); + } + + $status_options = array( + 'approved' => __( 'Auto Approve', 'ultimate-member' ), + 'checkmail' => __( 'Require Email Activation', 'ultimate-member' ), + 'pending' => __( 'Require Admin Review', 'ultimate-member' ), + ); + + if ( array_key_exists( '_um_status', $rolemeta ) && isset( $status_options[ $rolemeta['_um_status'] ] ) ) { + $info[ 'ultimate-member-' . $key ]['fields'] = array_merge( + $info[ 'ultimate-member-' . $key ]['fields'], + array( + 'um-status' => array( + 'label' => __( 'Registration Status', 'ultimate-member' ), + 'value' => $status_options[ $rolemeta['_um_status'] ], + ), + ) + ); + } + + if ( array_key_exists( '_um_status', $rolemeta ) && 'approved' === $rolemeta['_um_status'] ) { + $auto_approve_act = array( + 'redirect_profile' => __( 'Redirect to profile', 'ultimate-member' ), + 'redirect_url' => __( 'Redirect to URL', 'ultimate-member' ), + ); + + if ( isset( $auto_approve_act[ $rolemeta['_um_auto_approve_act'] ] ) ) { + $info[ 'ultimate-member-' . $key ]['fields'] = array_merge( + $info[ 'ultimate-member-' . $key ]['fields'], + array( + 'um-auto_approve_act' => array( + 'label' => __( 'Custom Homepage Redirect', 'ultimate-member' ), + 'value' => $auto_approve_act[ $rolemeta['_um_auto_approve_act'] ], + ), + ) + ); + } + + if ( 'redirect_url' === $rolemeta['_um_auto_approve_act'] && array_key_exists( '_um_auto_approve_url', $rolemeta ) ) { + $info[ 'ultimate-member-' . $key ]['fields'] = array_merge( + $info[ 'ultimate-member-' . $key ]['fields'], + array( + 'um-auto_approve_url' => array( + 'label' => __( 'Set Custom Redirect URL', 'ultimate-member' ), + 'value' => $rolemeta['_um_auto_approve_url'], + ), + ) + ); + } + } + + if ( array_key_exists( '_um_status', $rolemeta ) && 'checkmail' === $rolemeta['_um_status'] ) { + $checkmail_action = array( + 'show_message' => __( 'Show custom message', 'ultimate-member' ), + 'redirect_url' => __( 'Redirect to URL', 'ultimate-member' ), + ); + + if ( array_key_exists( '_um_login_email_activate', $rolemeta ) ) { + $info[ 'ultimate-member-' . $key ]['fields'] = array_merge( + $info[ 'ultimate-member-' . $key ]['fields'], + array( + 'um-login_email_activate' => array( + 'label' => __( 'Login user after validating the activation link?', 'ultimate-member' ), + 'value' => $rolemeta['_um_login_email_activate'] ? $labels['yes'] : $labels['no'], + ), + ) + ); + } + + if ( isset( $checkmail_action[ $rolemeta['_um_checkmail_action'] ] ) ) { + $info[ 'ultimate-member-' . $key ]['fields'] = array_merge( + $info[ 'ultimate-member-' . $key ]['fields'], + array( + 'um-checkmail_action' => array( + 'label' => __( 'Action to be taken after registration', 'ultimate-member' ), + 'value' => $checkmail_action[ $rolemeta['_um_checkmail_action'] ], + ), + ) + ); + } + + if ( 'show_message' === $rolemeta['_um_checkmail_action'] ) { + if ( array_key_exists( '_um_checkmail_message', $rolemeta ) ) { + $info[ 'ultimate-member-' . $key ]['fields'] = array_merge( + $info[ 'ultimate-member-' . $key ]['fields'], + array( + 'um-checkmail_message' => array( + 'label' => __( 'Personalize the custom message', 'ultimate-member' ), + 'value' => stripslashes( $rolemeta['_um_checkmail_message'] ), + ), + ) + ); + } + } else { + if ( array_key_exists( '_um_checkmail_url', $rolemeta ) ) { + $info[ 'ultimate-member-' . $key ]['fields'] = array_merge( + $info[ 'ultimate-member-' . $key ]['fields'], + array( + 'um-checkmail_url' => array( + 'label' => __( 'Set Custom Redirect URL', 'ultimate-member' ), + 'value' => $rolemeta['_um_checkmail_url'], + ), + ) + ); + } + } + + if ( array_key_exists( '_um_url_email_activate', $rolemeta ) ) { + $info[ 'ultimate-member-' . $key ]['fields'] = array_merge( + $info[ 'ultimate-member-' . $key ]['fields'], + array( + 'um-url_email_activate' => array( + 'label' => __( 'URL redirect after email activation', 'ultimate-member' ), + 'value' => $rolemeta['_um_url_email_activate'], + ), + ) + ); + } + } + + if ( array_key_exists( '_um_status', $rolemeta ) && 'pending' === $rolemeta['_um_status'] ) { + $pending_action = array( + 'show_message' => __( 'Show custom message', 'ultimate-member' ), + 'redirect_url' => __( 'Redirect to URL', 'ultimate-member' ), + ); + + if ( array_key_exists( '_um_pending_action', $rolemeta ) ) { + $info[ 'ultimate-member-' . $key ]['fields'] = array_merge( + $info[ 'ultimate-member-' . $key ]['fields'], + array( + 'um-pending_action' => array( + 'label' => __( 'Action to be taken after registration', 'ultimate-member' ), + 'value' => $pending_action[ $rolemeta['_um_pending_action'] ], + ), + ) + ); + } + + if ( 'show_message' === $rolemeta['_um_pending_action'] ) { + if ( array_key_exists( '_um_pending_message', $rolemeta ) ) { + $info[ 'ultimate-member-' . $key ]['fields'] = array_merge( + $info[ 'ultimate-member-' . $key ]['fields'], + array( + 'um-pending_message' => array( + 'label' => __( 'Personalize the custom message', 'ultimate-member' ), + 'value' => stripslashes( $rolemeta['_um_pending_message'] ), + ), + ) + ); + } + } else { + if ( array_key_exists( '_um_pending_url', $rolemeta ) ) { + $info[ 'ultimate-member-' . $key ]['fields'] = array_merge( + $info[ 'ultimate-member-' . $key ]['fields'], + array( + 'um-pending_url' => array( + 'label' => __( 'Set Custom Redirect URL', 'ultimate-member' ), + 'value' => $rolemeta['_um_pending_url'], + ), + ) + ); + } + } + } + + $after_login_options = array( + 'redirect_profile' => __( 'Redirect to profile', 'ultimate-member' ), + 'redirect_url' => __( 'Redirect to URL', 'ultimate-member' ), + 'refresh' => __( 'Refresh active page', 'ultimate-member' ), + 'redirect_admin' => __( 'Redirect to WordPress Admin', 'ultimate-member' ), + ); + + if ( array_key_exists( '_um_after_login', $rolemeta ) && isset( $after_login_options[ $rolemeta['_um_after_login'] ] ) ) { + $info[ 'ultimate-member-' . $key ]['fields'] = array_merge( + $info[ 'ultimate-member-' . $key ]['fields'], + array( + 'um-after_login' => array( + 'label' => __( 'Action to be taken after login', 'ultimate-member' ), + 'value' => $after_login_options[ $rolemeta['_um_after_login'] ], + ), + ) + ); + + if ( 'redirect_url' === $rolemeta['_um_after_login'] && array_key_exists( '_um_login_redirect_url', $rolemeta ) ) { + $info[ 'ultimate-member-' . $key ]['fields'] = array_merge( + $info[ 'ultimate-member-' . $key ]['fields'], + array( + 'um-login_redirect_url' => array( + 'label' => __( 'Set Custom Redirect URL', 'ultimate-member' ), + 'value' => $rolemeta['_um_login_redirect_url'], + ), + ) + ); + } + } + + $redirect_options = array( + 'redirect_home' => __( 'Go to Homepage', 'ultimate-member' ), + 'redirect_url' => __( 'Go to Custom URL', 'ultimate-member' ), + ); + if ( ! isset( $rolemeta['_um_after_logout'] ) ) { + $rolemeta['_um_after_logout'] = 'redirect_home'; + } + if ( array_key_exists( '_um_after_logout', $rolemeta ) && isset( $redirect_options[ $rolemeta['_um_after_logout'] ] ) ) { + $info[ 'ultimate-member-' . $key ]['fields'] = array_merge( + $info[ 'ultimate-member-' . $key ]['fields'], + array( + 'um-after_logout' => array( + 'label' => __( 'Action to be taken after logout', 'ultimate-member' ), + 'value' => $redirect_options[ $rolemeta['_um_after_logout'] ], + ), + ) + ); + + if ( 'redirect_url' === $rolemeta['_um_after_logout'] && array_key_exists( '_um_logout_redirect_url', $rolemeta ) ) { + $info[ 'ultimate-member-' . $key ]['fields'] = array_merge( + $info[ 'ultimate-member-' . $key ]['fields'], + array( + 'um-logout_redirect_url' => array( + 'label' => __( 'Set Custom Redirect URL', 'ultimate-member' ), + 'value' => $rolemeta['_um_logout_redirect_url'], + ), + ) + ); + } + } + + if ( ! isset( $rolemeta['_um_after_delete'] ) ) { + $rolemeta['_um_after_delete'] = 'redirect_home'; + } + if ( array_key_exists( '_um_after_delete', $rolemeta ) && isset( $redirect_options[ $rolemeta['_um_after_delete'] ] ) ) { + $info[ 'ultimate-member-' . $key ]['fields'] = array_merge( + $info[ 'ultimate-member-' . $key ]['fields'], + array( + 'um-after_delete' => array( + 'label' => __( 'Action to be taken after account is deleted', 'ultimate-member' ), + 'value' => $redirect_options[ $rolemeta['_um_after_delete'] ], + ), + ) + ); + + if ( 'redirect_url' === $rolemeta['_um_after_delete'] && array_key_exists( '_um_delete_redirect_url', $rolemeta ) ) { + $info[ 'ultimate-member-' . $key ]['fields'] = array_merge( + $info[ 'ultimate-member-' . $key ]['fields'], + array( + 'um-delete_redirect_url' => array( + 'label' => __( 'Set Custom Redirect URL', 'ultimate-member' ), + 'value' => $rolemeta['_um_delete_redirect_url'], + ), + ) + ); + } + } + + if ( ! empty( $rolemeta['wp_capabilities'] ) ) { + $info[ 'ultimate-member-' . $key ]['fields'] = array_merge( + $info[ 'ultimate-member-' . $key ]['fields'], + array( + 'um-wp_capabilities' => array( + 'label' => __( 'WP Capabilities', 'ultimate-member' ), + 'value' => $rolemeta['wp_capabilities'], + ), + ) + ); + } + + $info = apply_filters( 'um_debug_information_user_role', $info, $key ); + } + + return $info; + } + + public function forms_sitehealth( $info ) { + $labels = self::get_labels(); + + if ( ! empty( $this->get_forms() ) ) { + $info['ultimate-member-forms'] = array( + 'label' => __( 'Ultimate Member Forms', 'ultimate-member' ), + 'description' => __( 'This debug information for your Ultimate Member forms.', 'ultimate-member' ), + 'fields' => array( + 'um-forms' => array( + 'label' => __( 'UM Forms', 'ultimate-member' ), + 'value' => $this->get_forms(), + ), + ), + ); + + foreach ( $this->get_forms() as $key => $form ) { + if ( strpos( $key, 'ID#' ) === 0 ) { + $key = substr( $key, 3 ); + } + + $info[ 'ultimate-member-' . $key ] = array( + 'label' => ' - ' . $form . __( ' form settings', 'ultimate-member' ), + 'description' => __( 'This debug information for your Ultimate Member form.', 'ultimate-member' ), + 'fields' => array( + 'um-form-shortcode' => array( + 'label' => __( 'Shortcode', 'ultimate-member' ), + 'value' => '[ultimatemember form_id="' . $key . '"]', + ), + 'um-mode' => array( + 'label' => __( 'Type', 'ultimate-member' ), + 'value' => get_post_meta( $key, '_um_mode', true ), + ), + ), + ); + + if ( 'register' === get_post_meta( $key, '_um_mode', true ) ) { + $info[ 'ultimate-member-' . $key ]['fields'] = array_merge( + $info[ 'ultimate-member-' . $key ]['fields'], + array( + 'um-register_role' => array( + 'label' => __( 'User registration role', 'ultimate-member' ), + 'value' => 0 === absint( get_post_meta( $key, '_um_register_role', true ) ) ? $labels['default'] : get_post_meta( $key, '_um_register_role', true ), + ), + 'um-register_template' => array( + 'label' => __( 'Template', 'ultimate-member' ), + 'value' => 0 === absint( get_post_meta( $key, '_um_register_template', true ) ) ? $labels['default'] : get_post_meta( $key, '_um_register_template', true ), + ), + 'um-register_primary_btn_word' => array( + 'label' => __( 'Primary Button Text', 'ultimate-member' ), + 'value' => ! get_post_meta( $key, '_um_register_primary_btn_word', true ) ? $labels['default'] : get_post_meta( $key, '_um_register_primary_btn_word', true ), + ), + 'um-register_use_gdpr' => array( + 'label' => __( 'Enable privacy policy agreement', 'ultimate-member' ), + 'value' => get_post_meta( $key, '_um_register_use_gdpr', true ) ? $labels['yes'] : $labels['no'], + ), + ) + ); + + if ( 1 === absint( get_post_meta( $key, '_um_register_use_gdpr', true ) ) ) { + $gdpr_content_id = get_post_meta( $key, '_um_register_use_gdpr_content_id', true ); + + $info[ 'ultimate-member-' . $key ]['fields'] = array_merge( + $info[ 'ultimate-member-' . $key ]['fields'], + array( + 'um-register_use_gdpr_content_id' => array( + 'label' => __( 'Privacy policy content', 'ultimate-member' ), + 'value' => $gdpr_content_id ? get_the_title( $gdpr_content_id ) . '(' . $gdpr_content_id . ')' . get_the_permalink( $gdpr_content_id ) : '', + ), + 'um-register_use_gdpr_toggle_show' => array( + 'label' => __( 'Toggle Show text', 'ultimate-member' ), + 'value' => get_post_meta( $key, '_um_register_use_gdpr_toggle_show', true ), + ), + 'um-register_use_gdpr_toggle_hide' => array( + 'label' => __( 'Toggle Hide text', 'ultimate-member' ), + 'value' => get_post_meta( $key, '_um_register_use_gdpr_toggle_hide', true ), + ), + 'um-register_use_gdpr_agreement' => array( + 'label' => __( 'Checkbox agreement description', 'ultimate-member' ), + 'value' => get_post_meta( $key, '_um_register_use_gdpr_agreement', true ), + ), + 'um-register_use_gdpr_error_text' => array( + 'label' => __( 'Error Text', 'ultimate-member' ), + 'value' => get_post_meta( $key, '_um_register_use_gdpr_error_text', true ), + ), + ) + ); + } + + $info = apply_filters( 'um_debug_information_register_form', $info, $key ); + + $fields = get_post_meta( $key, '_um_custom_fields', true ); + if ( ! empty( $fields ) && is_array( $fields ) ) { + foreach ( $fields as $field_key => $field ) { + $field_info = $this->get_field_data( $info, $key, $field_key, $field ); + + $info[ 'ultimate-member-' . $key ]['fields'] = array_merge( + $info[ 'ultimate-member-' . $key ]['fields'], + $field_info + ); + } + } + } elseif ( 'login' === get_post_meta( $key, '_um_mode', true ) ) { + $login_redirect_options = array( + '0' => __( 'Default', 'ultimate-member' ), + 'redirect_profile' => __( 'Redirect to profile', 'ultimate-member' ), + 'redirect_url' => __( 'Redirect to URL', 'ultimate-member' ), + 'refresh' => __( 'Refresh active page', 'ultimate-member' ), + 'redirect_admin' => __( 'Redirect to WordPress Admin', 'ultimate-member' ), + ); + + $login_after_login = get_post_meta( $key, '_um_login_after_login', true ); + $login_after_login = '' === $login_after_login ? '0' : $login_after_login; + + $info[ 'ultimate-member-' . $key ]['fields'] = array_merge( + $info[ 'ultimate-member-' . $key ]['fields'], + array( + 'um-login_template' => array( + 'label' => __( 'Template', 'ultimate-member' ), + 'value' => 0 === absint( get_post_meta( $key, '_um_login_template', true ) ) ? $labels['default'] : get_post_meta( $key, '_um_login_template', true ), + ), + 'um-login_primary_btn_word' => array( + 'label' => __( 'Primary Button Text', 'ultimate-member' ), + 'value' => ! get_post_meta( $key, '_um_login_primary_btn_word', true ) ? $labels['default'] : get_post_meta( $key, '_um_login_primary_btn_word', true ), + ), + 'um-login_forgot_pass_link' => array( + 'label' => __( 'Show Forgot Password Link?', 'ultimate-member' ), + 'value' => get_post_meta( $key, '_um_login_forgot_pass_link', true ) ? $labels['yes'] : $labels['no'], + ), + 'um-login_show_rememberme' => array( + 'label' => __( 'Show "Remember Me"?', 'ultimate-member' ), + 'value' => get_post_meta( $key, '_um_login_show_rememberme', true ) ? $labels['yes'] : $labels['no'], + ), + 'um-login_after_login' => array( + 'label' => __( 'Redirection after Login', 'ultimate-member' ), + 'value' => $login_redirect_options[ $login_after_login ], + ), + ) + ); + + if ( 'redirect_url' === get_post_meta( $key, '_um_login_after_login', true ) ) { + $info[ 'ultimate-member-' . $key ]['fields'] = array_merge( + $info[ 'ultimate-member-' . $key ]['fields'], + array( + 'um-login_redirect_url' => array( + 'label' => __( 'Set Custom Redirect URL', 'ultimate-member' ), + 'value' => get_post_meta( $key, '_um_login_redirect_url', true ), + ), + ) + ); + } + + $info = apply_filters( 'um_debug_information_login_form', $info, $key ); + + $fields = get_post_meta( $key, '_um_custom_fields', true ); + if ( ! empty( $fields ) && is_array( $fields ) ) { + foreach ( $fields as $field_key => $field ) { + $field_info = $this->get_field_data( $info, $key, $field_key, $field ); + + $info[ 'ultimate-member-' . $key ]['fields'] = array_merge( + $info[ 'ultimate-member-' . $key ]['fields'], + $field_info + ); + } + } + } elseif ( 'profile' === get_post_meta( $key, '_um_mode', true ) ) { + $info[ 'ultimate-member-' . $key ]['fields'] = array_merge( + $info[ 'ultimate-member-' . $key ]['fields'], + array( + 'um-profile_role' => array( + 'label' => __( 'Make this profile form role-specific', 'ultimate-member' ), + 'value' => ! empty( get_post_meta( $key, '_um_profile_role', true ) ) ? get_post_meta( $key, '_um_profile_role', true ) : $labels['all'], + ), + 'um-profile_template' => array( + 'label' => __( 'Template', 'ultimate-member' ), + 'value' => 0 === absint( get_post_meta( $key, '_um_profile_template', true ) ) ? $labels['default'] : get_post_meta( $key, '_um_profile_template', true ), + ), + 'um-profile_primary_btn_word' => array( + 'label' => __( 'Primary Button Text', 'ultimate-member' ), + 'value' => ! get_post_meta( $key, '_um_profile_primary_btn_word', true ) ? $labels['default'] : get_post_meta( $key, '_um_profile_primary_btn_word', true ), + ), + 'um-profile_cover_enabled' => array( + 'label' => __( 'Enable Cover Photos', 'ultimate-member' ), + 'value' => get_post_meta( $key, '_um_profile_cover_enabled', true ) ? $labels['yes'] : $labels['no'], + ), + 'um-profile_disable_photo_upload' => array( + 'label' => __( 'Disable Profile Photo Upload', 'ultimate-member' ), + 'value' => get_post_meta( $key, '_um_profile_disable_photo_upload', true ) ? $labels['yes'] : $labels['no'], + ), + ) + ); + + if ( 0 === absint( get_post_meta( $key, '_um_profile_disable_photo_upload', true ) ) ) { + $info[ 'ultimate-member-' . $key ]['fields'] = array_merge( + $info[ 'ultimate-member-' . $key ]['fields'], + array( + 'um-profile_photo_required' => array( + 'label' => __( 'Make Profile Photo Required', 'ultimate-member' ), + 'value' => get_post_meta( $key, '_um_profile_photo_required', true ) ? $labels['yes'] : $labels['no'], + ), + ) + ); + } + + $info[ 'ultimate-member-' . $key ]['fields'] = array_merge( + $info[ 'ultimate-member-' . $key ]['fields'], + array( + 'um-profile_show_name' => array( + 'label' => __( 'Show display name in profile header?', 'ultimate-member' ), + 'value' => get_post_meta( $key, '_um_profile_show_name', true ) ? $labels['yes'] : $labels['no'], + ), + 'um-profile_show_social_links' => array( + 'label' => __( 'Show social links in profile header?', 'ultimate-member' ), + 'value' => get_post_meta( $key, '_um_profile_show_social_links', true ) ? $labels['yes'] : $labels['no'], + ), + 'um-profile_show_bio' => array( + 'label' => __( 'Show user description in profile header?', 'ultimate-member' ), + 'value' => get_post_meta( $key, '_um_profile_show_bio', true ) ? $labels['yes'] : $labels['no'], + ), + ) + ); + + $fields = get_post_meta( $key, '_um_custom_fields', true ); + if ( ! empty( $fields ) && is_array( $fields ) ) { + foreach ( $fields as $field_key => $field ) { + $field_info = $this->get_field_data( $info, $key, $field_key, $field ); + + $info[ 'ultimate-member-' . $key ]['fields'] = array_merge( + $info[ 'ultimate-member-' . $key ]['fields'], + $field_info + ); + } + } + + $profile_metafields = get_post_meta( $key, '_um_profile_metafields', true ); + if ( ! empty( $profile_metafields ) && is_array( $profile_metafields ) ) { + foreach ( $profile_metafields as $k => $field ) { + $info[ 'ultimate-member-' . $key ]['fields'] = array_merge( + $info[ 'ultimate-member-' . $key ]['fields'], + array( + 'um-profile_metafields-' . $k => array( + 'label' => __( 'Field to show in user meta', 'ultimate-member' ), + 'value' => $field, + ), + ) + ); + } + } + } + } + } + + return $info; + } } From 7bca143d502bc47c4e4747d4c7d5a845c0a38f1a Mon Sep 17 00:00:00 2001 From: ashubawork Date: Wed, 30 Apr 2025 10:36:24 +0300 Subject: [PATCH 04/28] - forms sitehealth --- includes/admin/class-site-health.php | 310 +++++++++++++++++++++------ 1 file changed, 239 insertions(+), 71 deletions(-) diff --git a/includes/admin/class-site-health.php b/includes/admin/class-site-health.php index a8100d74..17ebf370 100644 --- a/includes/admin/class-site-health.php +++ b/includes/admin/class-site-health.php @@ -2575,6 +2575,12 @@ class Site_Health { public function forms_sitehealth( $info ) { $labels = self::get_labels(); + $icons_display_options = array( + 'field' => __( 'Show inside text field', 'ultimate-member' ), + 'label' => __( 'Show with label', 'ultimate-member' ), + 'off' => __( 'Turn off', 'ultimate-member' ), + ); + if ( ! empty( $this->get_forms() ) ) { $info['ultimate-member-forms'] = array( 'label' => __( 'Ultimate Member Forms', 'ultimate-member' ), @@ -2611,26 +2617,68 @@ class Site_Health { $info[ 'ultimate-member-' . $key ]['fields'] = array_merge( $info[ 'ultimate-member-' . $key ]['fields'], array( - 'um-register_role' => array( - 'label' => __( 'User registration role', 'ultimate-member' ), - 'value' => 0 === absint( get_post_meta( $key, '_um_register_role', true ) ) ? $labels['default'] : get_post_meta( $key, '_um_register_role', true ), + 'um-um_register_use_custom_settings' => array( + 'label' => __( 'Apply custom settings to this form', 'ultimate-member' ), + 'value' => get_post_meta( $key, '_um_register_use_custom_settings', true ) ? $labels['yes'] : $labels['no'], ), - 'um-register_template' => array( - 'label' => __( 'Template', 'ultimate-member' ), - 'value' => 0 === absint( get_post_meta( $key, '_um_register_template', true ) ) ? $labels['default'] : get_post_meta( $key, '_um_register_template', true ), - ), - 'um-register_primary_btn_word' => array( - 'label' => __( 'Primary Button Text', 'ultimate-member' ), - 'value' => ! get_post_meta( $key, '_um_register_primary_btn_word', true ) ? $labels['default'] : get_post_meta( $key, '_um_register_primary_btn_word', true ), - ), - 'um-register_use_gdpr' => array( + ) + ); + + if ( get_post_meta( $key, '_um_register_use_custom_settings', true ) ) { + $info[ 'ultimate-member-' . $key ]['fields'] = array_merge( + $info[ 'ultimate-member-' . $key ]['fields'], + array( + 'um-register_role' => array( + 'label' => __( 'User registration role', 'ultimate-member' ), + 'value' => 0 === absint( get_post_meta( $key, '_um_register_role', true ) ) ? $labels['default'] : get_post_meta( $key, '_um_register_role', true ), + ), + 'um-register_template' => array( + 'label' => __( 'Template', 'ultimate-member' ), + 'value' => 0 === absint( get_post_meta( $key, '_um_register_template', true ) ) ? $labels['default'] : get_post_meta( $key, '_um_register_template', true ), + ), + 'um-um_register_max_width' => array( + 'label' => __( 'Max. Width (px)', 'ultimate-member' ), + 'value' => get_post_meta( $key, '_um_register_max_width', true ), + ), + 'um-um_register_icons' => array( + 'label' => __( 'Field Icons', 'ultimate-member' ), + 'value' => $icons_display_options[ get_post_meta( $key, '_um_register_icons', true ) ], + ), + 'um-register_primary_btn_word' => array( + 'label' => __( 'Primary Button Text', 'ultimate-member' ), + 'value' => ! get_post_meta( $key, '_um_register_primary_btn_word', true ) ? $labels['default'] : get_post_meta( $key, '_um_register_primary_btn_word', true ), + ), + 'um-um_register_secondary_btn' => array( + 'label' => __( 'Show Secondary Button', 'ultimate-member' ), + 'value' => get_post_meta( $key, '_um_register_secondary_btn', true ) ? $labels['yes'] : $labels['no'], + ), + ) + ); + + if ( get_post_meta( $key, '_um_register_secondary_btn', true ) ) { + $info[ 'ultimate-member-' . $key ]['fields'] = array_merge( + $info[ 'ultimate-member-' . $key ]['fields'], + array( + 'um-um_register_secondary_btn_word' => array( + 'label' => __( 'Secondary Button Text', 'ultimate-member' ), + 'value' => get_post_meta( $key, '_um_register_secondary_btn_word', true ), + ), + ) + ); + } + } + + $info[ 'ultimate-member-' . $key ]['fields'] = array_merge( + $info[ 'ultimate-member-' . $key ]['fields'], + array( + 'um-register_use_gdpr' => array( 'label' => __( 'Enable privacy policy agreement', 'ultimate-member' ), 'value' => get_post_meta( $key, '_um_register_use_gdpr', true ) ? $labels['yes'] : $labels['no'], ), ) ); - if ( 1 === absint( get_post_meta( $key, '_um_register_use_gdpr', true ) ) ) { + if ( get_post_meta( $key, '_um_register_use_gdpr', true ) ) { $gdpr_content_id = get_post_meta( $key, '_um_register_use_gdpr_content_id', true ); $info[ 'ultimate-member-' . $key ]['fields'] = array_merge( @@ -2638,7 +2686,7 @@ class Site_Health { array( 'um-register_use_gdpr_content_id' => array( 'label' => __( 'Privacy policy content', 'ultimate-member' ), - 'value' => $gdpr_content_id ? get_the_title( $gdpr_content_id ) . '(' . $gdpr_content_id . ')' . get_the_permalink( $gdpr_content_id ) : '', + 'value' => $gdpr_content_id ? get_the_title( $gdpr_content_id ) . ' (ID#' . $gdpr_content_id . ') ' . get_the_permalink( $gdpr_content_id ) : '', ), 'um-register_use_gdpr_toggle_show' => array( 'label' => __( 'Toggle Show text', 'ultimate-member' ), @@ -2688,23 +2736,71 @@ class Site_Health { $info[ 'ultimate-member-' . $key ]['fields'] = array_merge( $info[ 'ultimate-member-' . $key ]['fields'], array( - 'um-login_template' => array( - 'label' => __( 'Template', 'ultimate-member' ), - 'value' => 0 === absint( get_post_meta( $key, '_um_login_template', true ) ) ? $labels['default'] : get_post_meta( $key, '_um_login_template', true ), + 'um-um_login_use_custom_settings' => array( + 'label' => __( 'Apply custom settings to this form', 'ultimate-member' ), + 'value' => get_post_meta( $key, '_um_login_use_custom_settings', true ) ? $labels['yes'] : $labels['no'], ), - 'um-login_primary_btn_word' => array( - 'label' => __( 'Primary Button Text', 'ultimate-member' ), - 'value' => ! get_post_meta( $key, '_um_login_primary_btn_word', true ) ? $labels['default'] : get_post_meta( $key, '_um_login_primary_btn_word', true ), - ), - 'um-login_forgot_pass_link' => array( - 'label' => __( 'Show Forgot Password Link?', 'ultimate-member' ), - 'value' => get_post_meta( $key, '_um_login_forgot_pass_link', true ) ? $labels['yes'] : $labels['no'], - ), - 'um-login_show_rememberme' => array( - 'label' => __( 'Show "Remember Me"?', 'ultimate-member' ), - 'value' => get_post_meta( $key, '_um_login_show_rememberme', true ) ? $labels['yes'] : $labels['no'], - ), - 'um-login_after_login' => array( + ) + ); + + if ( get_post_meta( $key, '_um_login_use_custom_settings', true ) ) { + $info[ 'ultimate-member-' . $key ]['fields'] = array_merge( + $info[ 'ultimate-member-' . $key ]['fields'], + array( + 'um-login_template' => array( + 'label' => __( 'Template', 'ultimate-member' ), + 'value' => 0 === absint( get_post_meta( $key, '_um_login_template', true ) ) ? $labels['default'] : get_post_meta( $key, '_um_login_template', true ), + ), + 'um-um_login_max_width' => array( + 'label' => __( 'Max. Width (px)', 'ultimate-member' ), + 'value' => get_post_meta( $key, '_um_login_max_width', true ), + ), + 'um-um_login_icons' => array( + 'label' => __( 'Field Icons', 'ultimate-member' ), + 'value' => $icons_display_options[ get_post_meta( $key, '_um_login_icons', true ) ], + ), + 'um-login_primary_btn_word' => array( + 'label' => __( 'Primary Button Text', 'ultimate-member' ), + 'value' => ! get_post_meta( $key, '_um_login_primary_btn_word', true ) ? $labels['default'] : get_post_meta( $key, '_um_login_primary_btn_word', true ), + ), + 'um-um_login_secondary_btn' => array( + 'label' => __( 'Show Secondary Button', 'ultimate-member' ), + 'value' => get_post_meta( $key, '_um_login_secondary_btn', true ) ? $labels['yes'] : $labels['no'], + ), + ) + ); + + if ( get_post_meta( $key, '_um_login_secondary_btn', true ) ) { + $info[ 'ultimate-member-' . $key ]['fields'] = array_merge( + $info[ 'ultimate-member-' . $key ]['fields'], + array( + 'um-um_login_secondary_btn_word' => array( + 'label' => __( 'Secondary Button Text', 'ultimate-member' ), + 'value' => get_post_meta( $key, '_um_login_secondary_btn_word', true ), + ), + ) + ); + } + + $info[ 'ultimate-member-' . $key ]['fields'] = array_merge( + $info[ 'ultimate-member-' . $key ]['fields'], + array( + 'um-login_forgot_pass_link' => array( + 'label' => __( 'Show Forgot Password Link?', 'ultimate-member' ), + 'value' => get_post_meta( $key, '_um_login_forgot_pass_link', true ) ? $labels['yes'] : $labels['no'], + ), + 'um-login_show_rememberme' => array( + 'label' => __( 'Show "Remember Me"?', 'ultimate-member' ), + 'value' => get_post_meta( $key, '_um_login_show_rememberme', true ) ? $labels['yes'] : $labels['no'], + ), + ) + ); + } + + $info[ 'ultimate-member-' . $key ]['fields'] = array_merge( + $info[ 'ultimate-member-' . $key ]['fields'], + array( + 'um-login_after_login' => array( 'label' => __( 'Redirection after Login', 'ultimate-member' ), 'value' => $login_redirect_options[ $login_after_login ], ), @@ -2740,59 +2836,131 @@ class Site_Health { $info[ 'ultimate-member-' . $key ]['fields'] = array_merge( $info[ 'ultimate-member-' . $key ]['fields'], array( - 'um-profile_role' => array( - 'label' => __( 'Make this profile form role-specific', 'ultimate-member' ), - 'value' => ! empty( get_post_meta( $key, '_um_profile_role', true ) ) ? get_post_meta( $key, '_um_profile_role', true ) : $labels['all'], - ), - 'um-profile_template' => array( - 'label' => __( 'Template', 'ultimate-member' ), - 'value' => 0 === absint( get_post_meta( $key, '_um_profile_template', true ) ) ? $labels['default'] : get_post_meta( $key, '_um_profile_template', true ), - ), - 'um-profile_primary_btn_word' => array( - 'label' => __( 'Primary Button Text', 'ultimate-member' ), - 'value' => ! get_post_meta( $key, '_um_profile_primary_btn_word', true ) ? $labels['default'] : get_post_meta( $key, '_um_profile_primary_btn_word', true ), - ), - 'um-profile_cover_enabled' => array( - 'label' => __( 'Enable Cover Photos', 'ultimate-member' ), - 'value' => get_post_meta( $key, '_um_profile_cover_enabled', true ) ? $labels['yes'] : $labels['no'], - ), - 'um-profile_disable_photo_upload' => array( - 'label' => __( 'Disable Profile Photo Upload', 'ultimate-member' ), - 'value' => get_post_meta( $key, '_um_profile_disable_photo_upload', true ) ? $labels['yes'] : $labels['no'], + 'um-um_profile_use_custom_settings' => array( + 'label' => __( 'Apply custom settings to this form', 'ultimate-member' ), + 'value' => get_post_meta( $key, '_um_profile_use_custom_settings', true ) ? $labels['yes'] : $labels['no'], ), ) ); - if ( 0 === absint( get_post_meta( $key, '_um_profile_disable_photo_upload', true ) ) ) { + if ( get_post_meta( $key, '_um_profile_use_custom_settings', true ) ) { $info[ 'ultimate-member-' . $key ]['fields'] = array_merge( $info[ 'ultimate-member-' . $key ]['fields'], array( - 'um-profile_photo_required' => array( - 'label' => __( 'Make Profile Photo Required', 'ultimate-member' ), - 'value' => get_post_meta( $key, '_um_profile_photo_required', true ) ? $labels['yes'] : $labels['no'], + 'um-profile_role' => array( + 'label' => __( 'Make this profile form role-specific', 'ultimate-member' ), + 'value' => ! empty( get_post_meta( $key, '_um_profile_role', true ) ) ? get_post_meta( $key, '_um_profile_role', true ) : $labels['all'], + ), + 'um-profile_template' => array( + 'label' => __( 'Template', 'ultimate-member' ), + 'value' => 0 === absint( get_post_meta( $key, '_um_profile_template', true ) ) ? $labels['default'] : get_post_meta( $key, '_um_profile_template', true ), + ), + 'um-um_profile_max_width' => array( + 'label' => __( 'Max. Width (px)', 'ultimate-member' ), + 'value' => get_post_meta( $key, '_um_profile_max_width', true ), + ), + 'um-um_profile_area_max_width' => array( + 'label' => __( 'Profile Area Max. Width (px)', 'ultimate-member' ), + 'value' => get_post_meta( $key, '_um_profile_area_max_width', true ), + ), + 'um-um_profile_icons' => array( + 'label' => __( 'Field Icons', 'ultimate-member' ), + 'value' => $icons_display_options[ get_post_meta( $key, '_um_profile_icons', true ) ], + ), + 'um-profile_primary_btn_word' => array( + 'label' => __( 'Primary Button Text', 'ultimate-member' ), + 'value' => ! get_post_meta( $key, '_um_profile_primary_btn_word', true ) ? $labels['default'] : get_post_meta( $key, '_um_profile_primary_btn_word', true ), + ), + 'um-um_profile_secondary_btn' => array( + 'label' => __( 'Show Secondary Button', 'ultimate-member' ), + 'value' => get_post_meta( $key, '_um_profile_secondary_btn', true ) ? $labels['yes'] : $labels['no'], + ), + ) + ); + + if ( get_post_meta( $key, '_um_profile_secondary_btn', true ) ) { + $info[ 'ultimate-member-' . $key ]['fields'] = array_merge( + $info[ 'ultimate-member-' . $key ]['fields'], + array( + 'um-um_profile_secondary_btn_word' => array( + 'label' => __( 'Secondary Button Text', 'ultimate-member' ), + 'value' => get_post_meta( $key, '_um_profile_secondary_btn_word', true ), + ), + ) + ); + } + + $info[ 'ultimate-member-' . $key ]['fields'] = array_merge( + $info[ 'ultimate-member-' . $key ]['fields'], + array( + 'um-profile_cover_enabled' => array( + 'label' => __( 'Enable Cover Photos', 'ultimate-member' ), + 'value' => get_post_meta( $key, '_um_profile_cover_enabled', true ) ? $labels['yes'] : $labels['no'], + ), + ) + ); + + if ( get_post_meta( $key, '_um_profile_cover_enabled', true ) ) { + $info[ 'ultimate-member-' . $key ]['fields'] = array_merge( + $info[ 'ultimate-member-' . $key ]['fields'], + array( + 'um-um_profile_coversize' => array( + 'label' => __( 'Cover Photo Size', 'ultimate-member' ), + 'value' => get_post_meta( $key, '_um_profile_coversize', true ), + ), + 'um-um_profile_cover_ratio' => array( + 'label' => __( 'Cover photo ratio', 'ultimate-member' ), + 'value' => get_post_meta( $key, '_um_profile_cover_ratio', true ), + ), + ) + ); + } + + $info[ 'ultimate-member-' . $key ]['fields'] = array_merge( + $info[ 'ultimate-member-' . $key ]['fields'], + array( + 'um-profile_disable_photo_upload' => array( + 'label' => __( 'Disable Profile Photo Upload', 'ultimate-member' ), + 'value' => get_post_meta( $key, '_um_profile_disable_photo_upload', true ) ? $labels['yes'] : $labels['no'], + ), + ) + ); + + if ( 0 === absint( get_post_meta( $key, '_um_profile_disable_photo_upload', true ) ) ) { + $info[ 'ultimate-member-' . $key ]['fields'] = array_merge( + $info[ 'ultimate-member-' . $key ]['fields'], + array( + 'um-profile_photosize' => array( + 'label' => __( 'Profile Photo Size', 'ultimate-member' ), + 'value' => get_post_meta( $key, '_um_profile_photosize', true ), + ), + 'um-profile_photo_required' => array( + 'label' => __( 'Make Profile Photo Required', 'ultimate-member' ), + 'value' => get_post_meta( $key, '_um_profile_photo_required', true ) ? $labels['yes'] : $labels['no'], + ), + ) + ); + } + + $info[ 'ultimate-member-' . $key ]['fields'] = array_merge( + $info[ 'ultimate-member-' . $key ]['fields'], + array( + 'um-profile_show_name' => array( + 'label' => __( 'Show display name in profile header?', 'ultimate-member' ), + 'value' => get_post_meta( $key, '_um_profile_show_name', true ) ? $labels['yes'] : $labels['no'], + ), + 'um-profile_show_social_links' => array( + 'label' => __( 'Show social links in profile header?', 'ultimate-member' ), + 'value' => get_post_meta( $key, '_um_profile_show_social_links', true ) ? $labels['yes'] : $labels['no'], + ), + 'um-profile_show_bio' => array( + 'label' => __( 'Show user description in profile header?', 'ultimate-member' ), + 'value' => get_post_meta( $key, '_um_profile_show_bio', true ) ? $labels['yes'] : $labels['no'], ), ) ); } - $info[ 'ultimate-member-' . $key ]['fields'] = array_merge( - $info[ 'ultimate-member-' . $key ]['fields'], - array( - 'um-profile_show_name' => array( - 'label' => __( 'Show display name in profile header?', 'ultimate-member' ), - 'value' => get_post_meta( $key, '_um_profile_show_name', true ) ? $labels['yes'] : $labels['no'], - ), - 'um-profile_show_social_links' => array( - 'label' => __( 'Show social links in profile header?', 'ultimate-member' ), - 'value' => get_post_meta( $key, '_um_profile_show_social_links', true ) ? $labels['yes'] : $labels['no'], - ), - 'um-profile_show_bio' => array( - 'label' => __( 'Show user description in profile header?', 'ultimate-member' ), - 'value' => get_post_meta( $key, '_um_profile_show_bio', true ) ? $labels['yes'] : $labels['no'], - ), - ) - ); - $fields = get_post_meta( $key, '_um_custom_fields', true ); if ( ! empty( $fields ) && is_array( $fields ) ) { foreach ( $fields as $field_key => $field ) { From ccbce2f6636c936e2ba2865a3d80d1ee33c4507a Mon Sep 17 00:00:00 2001 From: ashubawork Date: Wed, 30 Apr 2025 10:36:52 +0300 Subject: [PATCH 05/28] - small fix --- includes/admin/class-site-health.php | 8 -------- 1 file changed, 8 deletions(-) diff --git a/includes/admin/class-site-health.php b/includes/admin/class-site-health.php index 17ebf370..23d97950 100644 --- a/includes/admin/class-site-health.php +++ b/includes/admin/class-site-health.php @@ -438,14 +438,6 @@ class Site_Health { * @return array The updated Site Health information. */ public function debug_information( $info ) { - $labels = array( - 'yes' => __( 'Yes', 'ultimate-member' ), - 'no' => __( 'No', 'ultimate-member' ), - 'all' => __( 'All', 'ultimate-member' ), - 'default' => __( 'Default', 'ultimate-member' ), - 'nopages' => __( 'No predefined page', 'ultimate-member' ), - ); - $info['ultimate-member'] = array( 'label' => __( 'Ultimate Member', 'ultimate-member' ), 'description' => __( 'This debug information for your Ultimate Member installation can assist you in getting support.', 'ultimate-member' ), From c347d8bcf7c4c2ffda2d29939a8022cff7cbeced Mon Sep 17 00:00:00 2001 From: ashubawork Date: Wed, 30 Apr 2025 11:07:22 +0300 Subject: [PATCH 06/28] - wpcs fixes --- includes/admin/class-site-health.php | 30 ++++++++++++++-------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/includes/admin/class-site-health.php b/includes/admin/class-site-health.php index 23d97950..96e21340 100644 --- a/includes/admin/class-site-health.php +++ b/includes/admin/class-site-health.php @@ -1317,7 +1317,7 @@ class Site_Health { // translators: %1$s - login template name, %2$s - login template filename 'value' => sprintf( __( '%1$s (filename: %2$s.php)', 'ultimate-member' ), $login_template_title, $login_template_key ), ), - 'um-login_max_width' => array( + 'um-login_max_width' => array( 'label' => __( 'Login Maximum Width', 'ultimate-member' ), 'value' => UM()->options()->get( 'login_max_width' ), ), @@ -1689,7 +1689,7 @@ class Site_Health { $info[ 'ultimate-member-directory-' . $key ]['fields'] = array_merge( $info[ 'ultimate-member-directory-' . $key ]['fields'], array( - 'um-directory-sortby_custom' => array( + 'um-directory-um_sortby_custom' => array( 'label' => __( 'Meta key', 'ultimate-member' ), 'value' => get_post_meta( $key, '_um_sortby_custom', true ), ), @@ -1701,7 +1701,7 @@ class Site_Health { 'label' => __( 'Order', 'ultimate-member' ), 'value' => 'ASC' === get_post_meta( $key, '_um_sortby_custom_order', true ) ? __( 'Ascending', 'ultimate-member' ) : __( 'Descending', 'ultimate-member' ), ), - 'um-directory-sortby_custom_label' => array( + 'um-directory-um_sortby_custom_label' => array( 'label' => __( 'Label of custom sort', 'ultimate-member' ), 'value' => get_post_meta( $key, '_um_sortby_custom_label', true ), ), @@ -1985,39 +1985,39 @@ class Site_Health { $info[ 'ultimate-member-directory-' . $key ]['fields'] = array_merge( $info[ 'ultimate-member-directory-' . $key ]['fields'], array( - 'um-directory-show_social' => array( + 'um-directory-um_show_social' => array( 'label' => __( 'Show social connect icons in extra user information section', 'ultimate-member' ), 'value' => get_post_meta( $key, '_um_show_social', true ) ? $labels['yes'] : $labels['no'], ), - 'um-directory-um_userinfo_animate' => array( + 'um-directory-um_userinfo_animate' => array( 'label' => __( 'Hide extra user information to the reveal section', 'ultimate-member' ), 'value' => get_post_meta( $key, '_um_userinfo_animate', true ) ? $labels['yes'] : $labels['no'], ), - 'um-directory-must_search' => array( + 'um-directory-um_must_search' => array( 'label' => __( 'Show results only after search/filtration', 'ultimate-member' ), 'value' => get_post_meta( $key, '_um_must_search', true ) ? $labels['yes'] : $labels['no'], ), - 'um-directory-max_users' => array( + 'um-directory-um_max_users' => array( 'label' => __( 'Maximum number of profiles', 'ultimate-member' ), 'value' => get_post_meta( $key, '_um_max_users', true ), ), - 'um-directory-profiles_per_page' => array( + 'um-directory-profiles_per_page' => array( 'label' => __( 'Number of profiles per page', 'ultimate-member' ), 'value' => get_post_meta( $key, '_um_profiles_per_page', true ), ), - 'um-directory-profiles_per_page_mobile' => array( + 'um-directory-um_profiles_per_page_mobile' => array( 'label' => __( 'Maximum number of profiles', 'ultimate-member' ), 'value' => get_post_meta( $key, '_um_profiles_per_page_mobile', true ), ), - 'um-directory-directory_header' => array( + 'um-directory-um_directory_header' => array( 'label' => __( 'Results Text', 'ultimate-member' ), 'value' => get_post_meta( $key, '_um_directory_header', true ), ), - 'um-directory-directory_header_single' => array( + 'um-directory-um_directory_header_single' => array( 'label' => __( 'Single Result Text', 'ultimate-member' ), 'value' => get_post_meta( $key, '_um_directory_header_single', true ), ), - 'um-directory-directory_no_users' => array( + 'um-directory-um_directory_no_users' => array( 'label' => __( 'Custom text if no users were found', 'ultimate-member' ), 'value' => get_post_meta( $key, '_um_directory_no_users', true ), ), @@ -2839,11 +2839,11 @@ class Site_Health { $info[ 'ultimate-member-' . $key ]['fields'] = array_merge( $info[ 'ultimate-member-' . $key ]['fields'], array( - 'um-profile_role' => array( + 'um-profile_role' => array( 'label' => __( 'Make this profile form role-specific', 'ultimate-member' ), 'value' => ! empty( get_post_meta( $key, '_um_profile_role', true ) ) ? get_post_meta( $key, '_um_profile_role', true ) : $labels['all'], ), - 'um-profile_template' => array( + 'um-profile_template' => array( 'label' => __( 'Template', 'ultimate-member' ), 'value' => 0 === absint( get_post_meta( $key, '_um_profile_template', true ) ) ? $labels['default'] : get_post_meta( $key, '_um_profile_template', true ), ), @@ -2863,7 +2863,7 @@ class Site_Health { 'label' => __( 'Primary Button Text', 'ultimate-member' ), 'value' => ! get_post_meta( $key, '_um_profile_primary_btn_word', true ) ? $labels['default'] : get_post_meta( $key, '_um_profile_primary_btn_word', true ), ), - 'um-um_profile_secondary_btn' => array( + 'um-um_profile_secondary_btn' => array( 'label' => __( 'Show Secondary Button', 'ultimate-member' ), 'value' => get_post_meta( $key, '_um_profile_secondary_btn', true ) ? $labels['yes'] : $labels['no'], ), From bcfdbb954ded2e6256318f3932ddf1fb7369d90b Mon Sep 17 00:00:00 2001 From: Mykyta Synelnikov Date: Mon, 19 May 2025 14:26:39 +0300 Subject: [PATCH 07/28] Refactor email placeholders and deprecate obsolete methods Streamline placeholder handling for emails by introducing universal patterns and replacements, and update email dispatch functions for efficiency. Deprecated various redundant user and password-related methods, consolidating logic into common utility classes for better maintainability. --- includes/common/actions/class-emails.php | 25 ----- includes/common/class-users.php | 111 +++++++++++++++++--- includes/core/class-mail.php | 19 ---- includes/core/class-password.php | 23 ++--- includes/core/class-permalinks.php | 55 +++++----- includes/core/class-profile.php | 19 ++-- includes/core/class-user.php | 126 +++++++++++++---------- includes/core/um-actions-login.php | 8 +- includes/core/um-actions-register.php | 22 +++- includes/um-short-functions.php | 32 +----- 10 files changed, 233 insertions(+), 207 deletions(-) diff --git a/includes/common/actions/class-emails.php b/includes/common/actions/class-emails.php index f4c485be..fb1613dc 100644 --- a/includes/common/actions/class-emails.php +++ b/includes/common/actions/class-emails.php @@ -19,7 +19,6 @@ if ( ! class_exists( 'um\common\actions\Emails' ) ) { public function __construct() { add_filter( 'um_action_scheduler_is_hook_enabled', array( $this, 'is_enabled' ), 10, 2 ); add_action( 'um_dispatch_email', array( $this, 'send' ), 10, 3 ); - add_action( 'um_before_email_notification_sending', array( $this, 'before_email_send' ), 10, 2 ); } public function is_enabled( $is_enabled, $hook ) { @@ -52,29 +51,5 @@ if ( ! class_exists( 'um\common\actions\Emails' ) ) { UM()->mail()->send( $user_email, $template, $args ); } - - /** - * Add some custom placeholders when sending via Action Scheduler. - * - * @todo Workaround for now. Maybe we need to handle email placeholders in email class where $user_id is fetched everytime - * - * @param string $email - * @param string $template - * - * @return void - */ - public function before_email_send( $email, $template ) { - if ( ! UM()->maybe_action_scheduler()->is_hook_enabled( 'um_dispatch_email' ) ) { - return; - } - - if ( 'checkmail_email' === $template ) { - add_filter( 'um_template_tags_patterns_hook', array( UM()->user(), 'add_activation_placeholder' ) ); - add_filter( 'um_template_tags_replaces_hook', array( UM()->user(), 'add_activation_replace_placeholder' ) ); - } elseif ( 'welcome_email' === $template || 'approved_email' === $template || 'resetpw_email' === $template ) { - add_filter( 'um_template_tags_patterns_hook', array( UM()->password(), 'add_placeholder' ) ); - add_filter( 'um_template_tags_replaces_hook', array( UM()->password(), 'add_replace_placeholder' ) ); - } - } } } diff --git a/includes/common/class-users.php b/includes/common/class-users.php index 1701b913..79c6a4fc 100644 --- a/includes/common/class-users.php +++ b/includes/common/class-users.php @@ -387,10 +387,22 @@ class Users { $current_user_id = get_current_user_id(); um_fetch_user( $user_id ); - add_filter( 'um_template_tags_patterns_hook', array( UM()->user(), 'add_activation_placeholder' ) ); - add_filter( 'um_template_tags_replaces_hook', array( UM()->user(), 'add_activation_replace_placeholder' ) ); - - UM()->maybe_action_scheduler()->enqueue_async_action( 'um_dispatch_email', array( $userdata->user_email, 'checkmail_email', array( 'fetch_user_id' => $user_id ) ) ); + UM()->maybe_action_scheduler()->enqueue_async_action( + 'um_dispatch_email', + array( + $userdata->user_email, + 'checkmail_email', + array( + 'fetch_user_id' => $user_id, + 'tags' => array( + '{account_activation_link}', + ), + 'tags_replace' => array( + UM()->permalinks()->activate_url( $user_id ), + ), + ), + ) + ); um_fetch_user( $current_user_id ); /** @@ -689,19 +701,48 @@ class Users { $this->reset_activation_link( $user_id ); - $email_slug = 'welcome_email'; - if ( 'awaiting_admin_review' === $old_status ) { - $email_slug = 'approved_email'; - $this->maybe_generate_password_reset_key( $userdata ); + $email_slug = 'awaiting_admin_review' === $old_status ? 'approved_email' : 'welcome_email'; + + $reset_pw_link = UM()->password()->reset_url( $user_id ); + + $tags = array( + '{password_reset_link}', + '{password}', + ); + $tags_replace = array( + $reset_pw_link, + __( 'Your set password', 'ultimate-member' ), + ); + + if ( 'welcome_email' === $email_slug ) { + $tags[] = '{action_url}'; + $tags[] = '{action_title}'; + + $set_password_required = get_user_meta( $user_id, 'um_set_password_required', true ); + if ( empty( $set_password_required ) || $this->has_status( $user_id, 'pending' ) ) { + $tags_replace[] = um_get_core_page( 'login' ); + $tags_replace[] = esc_html__( 'Login to our site', 'ultimate-member' ); + } else { + $tags_replace[] = $reset_pw_link; + $tags_replace[] = esc_html__( 'Set your password', 'ultimate-member' ); + } } $current_user_id = get_current_user_id(); um_fetch_user( $user_id ); - add_filter( 'um_template_tags_patterns_hook', array( UM()->password(), 'add_placeholder' ) ); - add_filter( 'um_template_tags_replaces_hook', array( UM()->password(), 'add_replace_placeholder' ) ); - - UM()->maybe_action_scheduler()->enqueue_async_action( 'um_dispatch_email', array( $userdata->user_email, $email_slug, array( 'fetch_user_id' => $user_id ) ) ); + UM()->maybe_action_scheduler()->enqueue_async_action( + 'um_dispatch_email', + array( + $userdata->user_email, + $email_slug, + array( + 'fetch_user_id' => $user_id, + 'tags' => $tags, + 'tags_replace' => $tags_replace, + ), + ) + ); um_fetch_user( $current_user_id ); } @@ -776,10 +817,39 @@ class Users { $current_user_id = get_current_user_id(); um_fetch_user( $user_id ); - add_filter( 'um_template_tags_patterns_hook', array( UM()->password(), 'add_placeholder' ) ); - add_filter( 'um_template_tags_replaces_hook', array( UM()->password(), 'add_replace_placeholder' ) ); + $reset_pw_link = UM()->password()->reset_url( $user_id ); - UM()->maybe_action_scheduler()->enqueue_async_action( 'um_dispatch_email', array( $userdata->user_email, 'welcome_email', array( 'fetch_user_id' => $user_id ) ) ); + $tags_replace = array( + $reset_pw_link, + __( 'Your set password', 'ultimate-member' ), + ); + + $set_password_required = get_user_meta( $user_id, 'um_set_password_required', true ); + if ( empty( $set_password_required ) || $this->has_status( $user_id, 'pending' ) ) { + $tags_replace[] = um_get_core_page( 'login' ); + $tags_replace[] = esc_html__( 'Login to our site', 'ultimate-member' ); + } else { + $tags_replace[] = $reset_pw_link; + $tags_replace[] = esc_html__( 'Set your password', 'ultimate-member' ); + } + + UM()->maybe_action_scheduler()->enqueue_async_action( + 'um_dispatch_email', + array( + $userdata->user_email, + 'welcome_email', + array( + 'fetch_user_id' => $user_id, + 'tags' => array( + '{password_reset_link}', + '{password}', + '{action_url}', + '{action_title}', + ), + 'tags_replace' => $tags_replace, + ), + ) + ); um_fetch_user( $current_user_id ); @@ -860,4 +930,15 @@ class Users { return $total_users; } + + /** + * Set last login timestamp. + * + * @param int $user_id User ID. + */ + public function set_last_login( $user_id ) { + update_user_meta( $user_id, '_um_last_login', current_time( 'mysql', true ) ); + // Flush user cache after updating last_login timestamp. + UM()->user()->remove_cache( $user_id ); + } } diff --git a/includes/core/class-mail.php b/includes/core/class-mail.php index 60d7c298..4df1543d 100644 --- a/includes/core/class-mail.php +++ b/includes/core/class-mail.php @@ -348,9 +348,6 @@ if ( ! class_exists( 'um\core\Mail' ) ) { */ $message = apply_filters( 'um_email_send_message_content', $message, $slug, $args ); -// add_filter( 'um_template_tags_patterns_hook', array( &$this, 'add_placeholder' ) ); -// add_filter( 'um_template_tags_replaces_hook', array( &$this, 'add_replace_placeholder' ) ); - // Convert tags in email template. return um_convert_tags( $message, $args ); } @@ -616,12 +613,8 @@ if ( ! class_exists( 'um\core\Mail' ) ) { $placeholders[] = '{user_profile_link}'; $placeholders[] = '{site_url}'; $placeholders[] = '{admin_email}'; - $placeholders[] = '{submitted_registration}'; $placeholders[] = '{login_url}'; $placeholders[] = '{password}'; - $placeholders[] = '{account_activation_link}'; - $placeholders[] = '{action_url}'; - $placeholders[] = '{action_title}'; return $placeholders; } @@ -636,20 +629,8 @@ if ( ! class_exists( 'um\core\Mail' ) ) { $replace_placeholders[] = um_user_profile_url(); $replace_placeholders[] = get_bloginfo( 'url' ); $replace_placeholders[] = um_admin_email(); - $replace_placeholders[] = um_user_submitted_registration_formatted(); $replace_placeholders[] = um_get_core_page( 'login' ); $replace_placeholders[] = esc_html__( 'Your set password', 'ultimate-member' ); - $replace_placeholders[] = um_user( 'account_activation_link' ); - - $set_password_required = get_user_meta( um_user( 'ID' ), 'um_set_password_required', true ); - if ( empty( $set_password_required ) || 'pending' === um_user( 'status' ) ) { - $replace_placeholders[] = um_get_core_page( 'login' ); - $replace_placeholders[] = esc_html__( 'Login to our site', 'ultimate-member' ); - } else { - $replace_placeholders[] = um_user( 'password_reset_link' ); - $replace_placeholders[] = esc_html__( 'Set your password', 'ultimate-member' ); - } - return $replace_placeholders; } } diff --git a/includes/core/class-password.php b/includes/core/class-password.php index c08fbe0b..434ab902 100644 --- a/includes/core/class-password.php +++ b/includes/core/class-password.php @@ -57,11 +57,11 @@ if ( ! class_exists( 'um\core\Password' ) ) { } if ( empty( $reset_key ) ) { - $reset_key = UM()->user()->maybe_generate_password_reset_key( $user_data ); + $reset_key = UM()->common()->users()->maybe_generate_password_reset_key( $user_data ); } - // this link looks like WordPress native link e.g. wp-login.php?action=rp&key={hash}&login={user_login} - $url = add_query_arg( + // This link looks like WordPress native link e.g. wp-login.php?action=rp&key={hash}&login={user_login} + return add_query_arg( array( 'act' => 'reset_password', 'hash' => $reset_key, @@ -69,7 +69,6 @@ if ( ! class_exists( 'um\core\Password' ) ) { ), um_get_core_page( 'password-reset' ) ); - return $url; } @@ -695,31 +694,27 @@ if ( ! class_exists( 'um\core\Password' ) ) { setcookie( $name, $value, $expire, $path, COOKIE_DOMAIN, is_ssl(), true ); } - /** * UM Placeholders for reset password - * + * @depreated 2.10.5 * @param $placeholders * * @return array */ - function add_placeholder( $placeholders ) { - $placeholders[] = '{password_reset_link}'; - $placeholders[] = '{password}'; + public function add_placeholder( $placeholders ) { + _deprecated_function( __METHOD__, '2.10.5' ); return $placeholders; } - /** * UM Replace Placeholders for reset password - * + * @depreated 2.10.5 * @param $replace_placeholders * * @return array */ - function add_replace_placeholder( $replace_placeholders ) { - $replace_placeholders[] = um_user( 'password_reset_link' ); - $replace_placeholders[] = esc_html__( 'Your set password', 'ultimate-member' ); + public function add_replace_placeholder( $replace_placeholders ) { + _deprecated_function( __METHOD__, '2.10.5' ); return $replace_placeholders; } } diff --git a/includes/core/class-permalinks.php b/includes/core/class-permalinks.php index 5abe91cc..d930ab25 100644 --- a/includes/core/class-permalinks.php +++ b/includes/core/class-permalinks.php @@ -172,8 +172,7 @@ if ( ! class_exists( 'um\core\Permalinks' ) ) { $redirect = empty( $user_role_data['url_email_activate'] ) ? um_get_core_page( 'login', 'account_active' ) : trim( $user_role_data['url_email_activate'] ); } else { // Redirect to the change password page if there is no password for this user. - um_fetch_user( $user_id ); - $redirect = um_user( 'password_reset_link' ); + $redirect = UM()->password()->reset_url( $user_id ); } /** * Filter to change the redirect URL after email confirmation. @@ -204,40 +203,44 @@ if ( ! class_exists( 'um\core\Permalinks' ) ) { /** * Makes an activate link for any user * - * @return bool|string + * @return string */ - public function activate_url() { - if ( ! um_user( 'account_secret_hash' ) ) { - return false; + public function activate_url( $user_id = null ) { + if ( is_null( $user_id ) ) { + $user_id = um_user( 'ID' ); + } + + $account_secret_hash = get_user_meta( $user_id, 'account_secret_hash', true ); + if ( empty( $account_secret_hash ) ) { + return ''; } /** - * UM hook + * Filter to change the base URL for the user activation link. * - * @type filter - * @title um_activate_url - * @description Change activate user URL - * @input_vars - * [{"var":"$url","type":"string","desc":"Activate URL"}] - * @change_log - * ["Since: 2.0"] - * @usage - * - * @example - * Change activate user base URL. + * function my_after_email_confirmation_redirect( $url ) { * // your code here * return $url; * } - * ?> + * add_filter( 'um_activate_url', 'my_um_activate_url' ); */ - $url = apply_filters( 'um_activate_url', home_url() ); - $url = add_query_arg( 'act', 'activate_via_email', $url ); - $url = add_query_arg( 'hash', um_user( 'account_secret_hash' ), $url ); - $url = add_query_arg( 'user_id', um_user( 'ID' ), $url ); + $base_url = apply_filters( 'um_activate_url', home_url() ); - return $url; + return add_query_arg( + array( + 'act' => 'activate_via_email', + 'hash' => $account_secret_hash, + 'user_id' => $user_id, + ), + $base_url + ); } /** diff --git a/includes/core/class-profile.php b/includes/core/class-profile.php index b469209e..ad5d9d64 100644 --- a/includes/core/class-profile.php +++ b/includes/core/class-profile.php @@ -513,35 +513,28 @@ if ( ! class_exists( 'um\core\Profile' ) ) { @@ -1468,22 +1471,6 @@ if ( ! class_exists( 'um\core\User' ) ) { do_action( 'um_after_save_registration_details', $this->id, $submitted, $form_data ); } - /** - * Set last login for new registered users - */ - public function set_last_login() { - update_user_meta( $this->id, '_um_last_login', current_time( 'mysql', true ) ); - } - - /** - * @param \WP_User $userdata - * - * @return string|\WP_Error - */ - function maybe_generate_password_reset_key( $userdata ) { - return get_password_reset_key( $userdata ); - } - /** * Password reset email * @@ -1497,19 +1484,22 @@ if ( ! class_exists( 'um\core\User' ) ) { } $userdata = get_userdata( $user_id ); - $this->maybe_generate_password_reset_key( $userdata ); - - $mail_args = array( - 'fetch_user_id' => $user_id, - 'tags' => array( - '{password_reset_link}', - ), - 'tags_replace' => array( - UM()->password()->reset_url( $user_id ), - ), + UM()->maybe_action_scheduler()->enqueue_async_action( + 'um_dispatch_email', + array( + $userdata->user_email, + 'resetpw_email', + array( + 'fetch_user_id' => $user_id, + 'tags' => array( + '{password_reset_link}', + ), + 'tags_replace' => array( + UM()->password()->reset_url( $user_id ), + ), + ), + ) ); - - UM()->maybe_action_scheduler()->enqueue_async_action( 'um_dispatch_email', array( $userdata->user_email, 'resetpw_email', $mail_args ) ); } /** @@ -2121,30 +2111,6 @@ if ( ! class_exists( 'um\core\User' ) ) { return $hash_email_address; } - /** - * UM Placeholders for activation link in email - * - * @param $placeholders - * - * @return array - */ - public function add_activation_placeholder( $placeholders ) { - $placeholders[] = '{account_activation_link}'; - return $placeholders; - } - - /** - * UM Replace Placeholders for activation link in email - * - * @param $replace_placeholders - * - * @return array - */ - public function add_activation_replace_placeholder( $replace_placeholders ) { - $replace_placeholders[] = um_user( 'account_activation_link' ); - return $replace_placeholders; - } - /** * Set user's account status * @@ -2240,5 +2206,53 @@ if ( ! class_exists( 'um\core\User' ) ) { _deprecated_function( __METHOD__, '2.8.7', 'UM()->common()->users()->deactivate()' ); UM()->common()->users()->deactivate( um_user( 'ID' ) ); } + + /** + * @deprecated 2.10.5 + * + * @param WP_User $userdata + * + * @return string|WP_Error + */ + public function maybe_generate_password_reset_key( $userdata ) { + _deprecated_function( __METHOD__, '2.10.5', 'UM()->common()->users()->maybe_generate_password_reset_key()' ); + return UM()->common()->users()->maybe_generate_password_reset_key( $userdata ); + } + + /** + * Set last login for new registered users + * + * @deprecated 2.10.5 + * + * @return void + */ + public function set_last_login() { + _deprecated_function( __METHOD__, '2.10.5', 'UM()->common()->users()->set_last_login()' ); + UM()->common()->users()->set_last_login( $this->id ); + } + + /** + * UM Placeholders for activation link in email + * @deprecated 2.10.5 + * @param $placeholders + * + * @return array + */ + public function add_activation_placeholder( $placeholders ) { + _deprecated_function( __METHOD__, '2.10.5' ); + return $placeholders; + } + + /** + * UM Replace Placeholders for activation link in email + * @deprecated 2.10.5 + * @param $replace_placeholders + * + * @return array + */ + public function add_activation_replace_placeholder( $replace_placeholders ) { + _deprecated_function( __METHOD__, '2.10.5' ); + return $replace_placeholders; + } } } diff --git a/includes/core/um-actions-login.php b/includes/core/um-actions-login.php index 42cac3e0..ab3cd3b1 100644 --- a/includes/core/um-actions-login.php +++ b/includes/core/um-actions-login.php @@ -157,11 +157,9 @@ add_action( 'um_submit_form_errors_hook_logincheck', 'um_submit_form_errors_hook * @param $user_id */ function um_store_lastlogin_timestamp( $user_id ) { - update_user_meta( $user_id, '_um_last_login', current_time( 'mysql', true ) ); - // Flush user cache after updating last_login timestamp. - UM()->user()->remove_cache( $user_id ); + UM()->common()->users()->set_last_login( $user_id ); } -add_action( 'um_on_login_before_redirect', 'um_store_lastlogin_timestamp', 10, 1 ); +add_action( 'um_on_login_before_redirect', 'um_store_lastlogin_timestamp' ); /** @@ -171,7 +169,7 @@ function um_store_lastlogin_timestamp_( $login ) { $user = get_user_by( 'login', $login ); if ( false !== $user ) { - um_store_lastlogin_timestamp( $user->ID ); + UM()->common()->users()->set_last_login( $user->ID ); $attempts = (int) get_user_meta( $user->ID, 'password_rst_attempts', true ); if ( $attempts ) { diff --git a/includes/core/um-actions-register.php b/includes/core/um-actions-register.php index 007101e8..89f6bfe6 100644 --- a/includes/core/um-actions-register.php +++ b/includes/core/um-actions-register.php @@ -120,15 +120,27 @@ function um_send_registration_notification( $user_id ) { um_fetch_user( $user_id ); $registration_status = um_user( 'status' ); + $email_template = 'pending' !== $registration_status ? 'notification_new_user' : 'notification_review'; + $sending_args = array( + 'admin' => true, + 'fetch_user_id' => $user_id, + 'tags' => array( + '{submitted_registration}', + ), + 'tags_replace' => um_user_submitted_registration_formatted(), + ); $emails = um_multi_admin_email(); if ( ! empty( $emails ) ) { foreach ( $emails as $email ) { - if ( 'pending' !== $registration_status ) { - UM()->maybe_action_scheduler()->enqueue_async_action( 'um_dispatch_email', array( $email, 'notification_new_user', array( 'admin' => true, 'fetch_user_id' => $user_id ) ) ); - } else { - UM()->maybe_action_scheduler()->enqueue_async_action( 'um_dispatch_email', array( $email, 'notification_review', array( 'admin' => true, 'fetch_user_id' => $user_id ) ) ); - } + UM()->maybe_action_scheduler()->enqueue_async_action( + 'um_dispatch_email', + array( + $email, + $email_template, + $sending_args, + ) + ); } } } diff --git a/includes/um-short-functions.php b/includes/um-short-functions.php index df0c93da..45ac1b56 100644 --- a/includes/um-short-functions.php +++ b/includes/um-short-functions.php @@ -208,7 +208,7 @@ function um_convert_tags( $content, $args = array(), $with_kses = true ) { // Support for all usermeta keys if ( ! empty( $matches[1] ) && is_array( $matches[1] ) ) { foreach ( $matches[1] as $match ) { - $key = str_replace( 'usermeta:', '', $match ); + $key = str_replace( 'usermeta:', '', $match ); $value = um_user( $key ); if ( is_array( $value ) ) { $value = implode( ', ', $value ); @@ -219,32 +219,6 @@ function um_convert_tags( $content, $args = array(), $with_kses = true ) { return $content; } - -/** - * UM Placeholders for activation link in email - * - * @param $placeholders - * - * @return array - */ -function account_activation_link_tags_patterns( $placeholders ) { - $placeholders[] = '{account_activation_link}'; - return $placeholders; -} - -/** - * UM Replace Placeholders for activation link in email - * - * @param $replace_placeholders - * - * @return array - */ -function account_activation_link_tags_replaces( $replace_placeholders ) { - $replace_placeholders[] = um_user( 'account_activation_link' ); - return $replace_placeholders; -} - - /** * @function um_user_ip() * @@ -2583,12 +2557,12 @@ function um_user( $data, $attrs = null ) { break; case 'password_reset_link': + // Avoid using and make it directly with `UM()->password()->reset_url( $user_id )` return UM()->password()->reset_url(); - break; case 'account_activation_link': + // Avoid using and make it directly with `UM()->permalinks()->activate_url( $user_id )` return UM()->permalinks()->activate_url(); - break; case 'profile_photo': $data = um_get_user_avatar_data( um_user( 'ID' ), $attrs ); From d40cb941c0e88320c1c0bf30c4108ab938b190c1 Mon Sep 17 00:00:00 2001 From: Mykyta Synelnikov Date: Mon, 19 May 2025 16:19:23 +0300 Subject: [PATCH 08/28] Refactor deactivation logic to unschedule additional actions Made the `deactivation` method public and added calls to unschedule specific actions related to email dispatch and account status checks. This ensures proper cleanup of scheduled tasks during plugin deactivation. --- includes/class-init.php | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/includes/class-init.php b/includes/class-init.php index 36862a92..07138629 100644 --- a/includes/class-init.php +++ b/includes/class-init.php @@ -370,16 +370,18 @@ if ( ! class_exists( 'UM' ) ) { } } - /** * Plugin Deactivation * * @since 2.3 */ - function deactivation() { + public function deactivation() { $this->cron()->unschedule_events(); - } + $this->maybe_action_scheduler()->unschedule_all_actions( 'um_dispatch_email' ); + $this->maybe_action_scheduler()->unschedule_all_actions( 'um_schedule_empty_account_status_check' ); + $this->maybe_action_scheduler()->unschedule_all_actions( 'um_set_default_account_status' ); + } /** * Maybe need multisite activation process From da0ebf2f1fd4180bd2e291ebb5b33ded5395ae97 Mon Sep 17 00:00:00 2001 From: Mykyta Synelnikov Date: Mon, 19 May 2025 16:24:13 +0300 Subject: [PATCH 09/28] Bump plugin to version 2.10.5 --- .wordpress-org/blueprints/blueprint.json | 2 +- README.md | 2 +- readme.txt | 4 ++++ ultimate-member.php | 2 +- 4 files changed, 7 insertions(+), 3 deletions(-) diff --git a/.wordpress-org/blueprints/blueprint.json b/.wordpress-org/blueprints/blueprint.json index 617fcdfc..9b356790 100644 --- a/.wordpress-org/blueprints/blueprint.json +++ b/.wordpress-org/blueprints/blueprint.json @@ -15,7 +15,7 @@ "step": "installPlugin", "pluginZipFile": { "resource": "url", - "url": "https:\/\/downloads.wordpress.org\/plugin\/ultimate-member.2.10.4.zip" + "url": "https:\/\/downloads.wordpress.org\/plugin\/ultimate-member.2.10.5.zip" }, "options": { "activate": true diff --git a/README.md b/README.md index a7a83c83..c475cff6 100644 --- a/README.md +++ b/README.md @@ -44,7 +44,7 @@ GNU Version 2 or Any Later Version ### IMPORTANT: PLEASE UPDATE THE PLUGIN TO AT LEAST VERSION 2.6.7 IMMEDIATELY. VERSION 2.6.7 PATCHES SECURITY PRIVILEGE ESCALATION VULNERABILITY. PLEASE SEE [THIS ARTICLE](https://docs.ultimatemember.com/article/1866-security-incident-update-and-recommended-actions) FOR MORE INFORMATION -[Official Release Version: 2.10.4](https://github.com/ultimatemember/ultimatemember/releases/tag/2.10.4). +[Official Release Version: 2.10.5](https://github.com/ultimatemember/ultimatemember/releases/tag/2.10.5). ## Changelog diff --git a/readme.txt b/readme.txt index e22d12d7..fe450e87 100644 --- a/readme.txt +++ b/readme.txt @@ -167,6 +167,10 @@ No specific extensions are needed. But we highly recommended keep active these P IMPORTANT: PLEASE UPDATE THE PLUGIN TO AT LEAST VERSION 2.6.7 IMMEDIATELY. VERSION 2.6.7 PATCHES SECURITY PRIVILEGE ESCALATION VULNERABILITY. PLEASE SEE [THIS ARTICLE](https://docs.ultimatemember.com/article/1866-security-incident-update-and-recommended-actions) FOR MORE INFORMATION += 2.10.5 2025-05-xx = + + + = 2.10.4 2025-05-15 = **Bugfixes** diff --git a/ultimate-member.php b/ultimate-member.php index 15a0cd4d..0eafee65 100644 --- a/ultimate-member.php +++ b/ultimate-member.php @@ -3,7 +3,7 @@ * Plugin Name: Ultimate Member * Plugin URI: http://ultimatemember.com/ * Description: The easiest way to create powerful online communities and beautiful user profiles with WordPress - * Version: 2.10.4 + * Version: 2.10.5-alpha * Author: Ultimate Member * Author URI: http://ultimatemember.com/ * Text Domain: ultimate-member From 9f9617092004495fab6d28cba598147666b84669 Mon Sep 17 00:00:00 2001 From: Mykyta Synelnikov Date: Mon, 19 May 2025 16:28:13 +0300 Subject: [PATCH 10/28] Refactor deactivation logic in Ultimate Member plugin Updated the deactivation process to properly un-schedule Action Scheduler actions, ensuring cleaner plugin behavior and preventing potential issues with lingering tasks. This change improves overall maintainability and stability. --- readme.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/readme.txt b/readme.txt index fe450e87..23b06473 100644 --- a/readme.txt +++ b/readme.txt @@ -169,7 +169,7 @@ IMPORTANT: PLEASE UPDATE THE PLUGIN TO AT LEAST VERSION 2.6.7 IMMEDIATELY. VERSI = 2.10.5 2025-05-xx = - +* Fixed: Refactor deactivation logic to un-schedule Action Scheduler actions = 2.10.4 2025-05-15 = From 67c2ed3d049f941e8cb0dc67756e518e93c94734 Mon Sep 17 00:00:00 2001 From: Mykyta Synelnikov Date: Mon, 19 May 2025 17:27:17 +0300 Subject: [PATCH 11/28] Add Stripe API method and GPLv3 license metadata Introduced a new `UM_Stripe_API` method in the `UM` class to extend functionality. Also added license metadata (GPLv3) and its URI in the plugin headers for better clarity and compliance. --- includes/class-init.php | 1 + ultimate-member.php | 2 ++ 2 files changed, 3 insertions(+) diff --git a/includes/class-init.php b/includes/class-init.php index 07138629..0d0f976e 100644 --- a/includes/class-init.php +++ b/includes/class-init.php @@ -42,6 +42,7 @@ if ( ! class_exists( 'UM' ) ) { * @method UM_Profile_Tabs Profile_Tabs() * @method UM_JobBoardWP JobBoardWP() * @method UM_Zapier Zapier() + * @method UM_Stripe_API Stripe_API() * @method UM_Google_Authenticator Google_Authenticator() */ final class UM extends UM_Functions { diff --git a/ultimate-member.php b/ultimate-member.php index 0eafee65..f4600c08 100644 --- a/ultimate-member.php +++ b/ultimate-member.php @@ -6,6 +6,8 @@ * Version: 2.10.5-alpha * Author: Ultimate Member * Author URI: http://ultimatemember.com/ + * License: GPLv3 + * License URI: http://www.gnu.org/licenses/gpl-3.0.txt * Text Domain: ultimate-member * Domain Path: /languages * Requires at least: 6.2 From 01c7bdf72ec8b9f9959b3d13527c3c35af5b49fe Mon Sep 17 00:00:00 2001 From: Mykyta Synelnikov Date: Wed, 4 Jun 2025 17:39:27 +0300 Subject: [PATCH 12/28] Add login shortcode and enhance button class filters Introduce the `[um_login]` shortcode for rendering the login form, with backend logic for customization and error handling. Enhance flexibility by adding filters to dynamically modify primary button classes for login, register, and password-reset forms. --- includes/core/class-shortcodes.php | 187 ++++++++++++++++++++++++++ includes/core/um-actions-login.php | 6 +- includes/core/um-actions-register.php | 6 +- templates/password-reset.php | 31 +++-- 4 files changed, 213 insertions(+), 17 deletions(-) diff --git a/includes/core/class-shortcodes.php b/includes/core/class-shortcodes.php index d34a789f..d9c36e84 100644 --- a/includes/core/class-shortcodes.php +++ b/includes/core/class-shortcodes.php @@ -162,6 +162,193 @@ if ( ! class_exists( 'um\core\Shortcodes' ) ) { $this->emoji[':innocent:'] = $base_uri . '72x72/1f607.png'; $this->emoji[':smirk:'] = $base_uri . '72x72/1f60f.png'; $this->emoji[':expressionless:'] = $base_uri . '72x72/1f611.png'; + + // test shortcode + add_shortcode( 'um_login', array( &$this, 'login_form' ) ); + } + + public function login_form( $args = array() ) { + if ( ! UM()->is_new_ui() ) { + return ''; + } + + global $error; + + if ( is_user_logged_in() ) { + return ''; + } + + /** There is possible to use 'shortcode_atts_ultimatemember_login' filter for getting customized $atts. This filter is documented in wp-includes/shortcodes.php "shortcode_atts_{$shortcode}" */ + $args = shortcode_atts( + array( + 'login_button' => __( 'Log In', 'ultimate-member' ), + 'show_remember' => true, + 'show_forgot' => true, + 'login_redirect' => '', + 'login_redirect_url' => '', + 'form_id' => '', // backward compatibility argument + ), + $args, + 'ultimatemember_login' + ); + + $styling = UM()->options()->get( 'styling' ); + switch ( $styling ) { + case 'none': + break; + case 'layout_only': + wp_enqueue_script('um-login' ); + wp_enqueue_style( 'um-login-base' ); + break; + default: + wp_enqueue_script('um-login' ); + wp_enqueue_style( 'um-login-full' ); + break; + } + + $login_args = array( + 'form_id' => 'um-loginform', + 'um_login_form' => true, + 'um_login_form_id' => absint( $args['form_id'] ), + 'um_login_redirect' => '', // if empty then get default from role + 'um_show_forgot' => (bool) $args['show_forgot'], + 'echo' => true, + 'remember' => (bool) $args['show_remember'], + 'label_username' => __( 'Username or Email Address', 'ultimate-member' ), + 'label_password' => __( 'Password', 'ultimate-member' ), + 'label_remember' => __( 'Remember Me', 'ultimate-member' ), + 'label_log_in' => ! empty( $args['login_button'] ) ? $args['login_button'] : __( 'Log In', 'ultimate-member' ), + ); + + if ( ! isset( $_GET['redirect_to'] ) || empty( $_GET['redirect_to'] ) ) { + $redirect = um_get_predefined_page_url( 'user' ); + $login_args['redirect'] = $redirect; + } + + /** + * Filters Ultimate Member Login Form arguments for init it through `wp_login_form()`. + * + * @since 3.0 + * @hook um_login_form_args + * + * @param {array} $login_args Attributes for `wp_login_form()` function init. + * @param {array} $args Login form shortcode attributes. + * + * @return {array} Attributes for `wp_login_form()` function. + */ + $login_args = apply_filters( 'um_login_form_args', $login_args, $args ); + + $wp_error = new \WP_Error(); + + $error_codes = array( + 'empty' => sprintf( __( '%s and %s are required.', 'ultimate-member' ), $login_args['label_username'], $login_args['label_password'] ), + 'failed' => __( 'Invalid username, email address or incorrect password.', 'ultimate-member' ), + 'um_blocked_email' => __( 'This email address has been blocked.', 'ultimate-member' ), + 'um_blocked_domain' => __( 'This email address domain has been blocked.', 'ultimate-member' ), + 'um_account_inactive' => __( 'Your account has been disabled.', 'ultimate-member' ), + 'um_account_awaiting_admin_review' => __( 'Your account has not been approved yet.', 'ultimate-member' ), + 'um_account_awaiting_email_confirmation' => __( 'Your account is awaiting e-mail verification.', 'ultimate-member' ), + 'um_account_rejected' => __( 'Your membership request has been rejected.', 'ultimate-member' ), + ); + /** + * Filters Ultimate Member Login Form errors and their codes. + * + * @since 3.0 + * @hook um_login_form_error_codes + * + * @param {array} $error_codes Error codes in format $error_code => $error_message. + * @param {array} $args Login form attributes. + * + * @return {array} Error codes. + */ + $error_codes = apply_filters( 'um_login_form_error_codes', $error_codes, $args, $login_args ); + + if ( ! empty( $args['show_forgot'] ) ) { + // Change lostpassword URL only when using Ultimate Member Login Form + add_filter( 'lostpassword_url', array( &$this, 'change_lostpassword_url' ), 10, 1 ); + } + + ob_start(); + ?> + + + + options()->get( 'login_primary_btn_word' ); } + $primary_btn_classes = apply_filters( 'um_login_form_primary_btn_classes', array( 'um-button' ), $args ); + /** * UM hook * @@ -426,7 +428,7 @@ function um_add_submit_button_to_login( $args ) { if ( ! empty( $args['secondary_btn'] ) ) { ?>
- +
@@ -437,7 +439,7 @@ function um_add_submit_button_to_login( $args ) {
- +
diff --git a/includes/core/um-actions-register.php b/includes/core/um-actions-register.php index 007101e8..f9d44f0f 100644 --- a/includes/core/um-actions-register.php +++ b/includes/core/um-actions-register.php @@ -597,6 +597,8 @@ function um_add_submit_button_to_register( $args ) { $primary_btn_word = UM()->options()->get( 'register_primary_btn_word' ); } + $primary_btn_classes = apply_filters( 'um_register_form_primary_btn_classes', array( 'um-button' ), $args ); + $secondary_btn_word = $args['secondary_btn_word']; /** * UM hook @@ -656,7 +658,7 @@ function um_add_submit_button_to_register( $args ) {
- +
@@ -667,7 +669,7 @@ function um_add_submit_button_to_register( $args ) {
- +
diff --git a/templates/password-reset.php b/templates/password-reset.php index 6dcf9cb8..51adbeee 100644 --- a/templates/password-reset.php +++ b/templates/password-reset.php @@ -6,17 +6,18 @@ * * Call: function ultimatemember_password() * - * @version 2.7.0 + * @version 2.10.5 * * @var string $mode * @var int $form_id * @var array $args + * + * phpcs:disable WordPress.Security.NonceVerification */ if ( ! defined( 'ABSPATH' ) ) { exit; } ?> -
@@ -62,19 +63,24 @@ if ( ! defined( 'ABSPATH' ) ) { */ do_action( 'um_reset_password_page_hidden_fields', $args ); - if ( ! empty( $_GET['updated'] ) ) { ?> + if ( ! empty( $_GET['updated'] ) ) { + ?>
- + } + ?>
- +
@@ -82,7 +88,8 @@ if ( ! defined( 'ABSPATH' ) ) {
- builtin()->get_specific_fields( 'username_b' ); @@ -111,18 +118,16 @@ if ( ! defined( 'ABSPATH' ) ) { * } * ?> */ - do_action( 'um_after_password_reset_fields', $args ); ?> + do_action( 'um_after_password_reset_fields', $args ); + $primary_btn_classes = apply_filters( 'um_password_reset_form_primary_btn_classes', array( 'um-button' ), $args ); + ?>
-
- +
-
-
- Date: Thu, 5 Jun 2025 01:41:50 +0300 Subject: [PATCH 13/28] Remove unused UM login form shortcode logic. The login form shortcode functionality was outdated and no longer in use. By removing it, the codebase is simplified and unnecessary complexity is eliminated. This improves maintainability and aligns with the current state of the plugin. --- includes/core/class-shortcodes.php | 187 ----------------------------- 1 file changed, 187 deletions(-) diff --git a/includes/core/class-shortcodes.php b/includes/core/class-shortcodes.php index d9c36e84..d34a789f 100644 --- a/includes/core/class-shortcodes.php +++ b/includes/core/class-shortcodes.php @@ -162,193 +162,6 @@ if ( ! class_exists( 'um\core\Shortcodes' ) ) { $this->emoji[':innocent:'] = $base_uri . '72x72/1f607.png'; $this->emoji[':smirk:'] = $base_uri . '72x72/1f60f.png'; $this->emoji[':expressionless:'] = $base_uri . '72x72/1f611.png'; - - // test shortcode - add_shortcode( 'um_login', array( &$this, 'login_form' ) ); - } - - public function login_form( $args = array() ) { - if ( ! UM()->is_new_ui() ) { - return ''; - } - - global $error; - - if ( is_user_logged_in() ) { - return ''; - } - - /** There is possible to use 'shortcode_atts_ultimatemember_login' filter for getting customized $atts. This filter is documented in wp-includes/shortcodes.php "shortcode_atts_{$shortcode}" */ - $args = shortcode_atts( - array( - 'login_button' => __( 'Log In', 'ultimate-member' ), - 'show_remember' => true, - 'show_forgot' => true, - 'login_redirect' => '', - 'login_redirect_url' => '', - 'form_id' => '', // backward compatibility argument - ), - $args, - 'ultimatemember_login' - ); - - $styling = UM()->options()->get( 'styling' ); - switch ( $styling ) { - case 'none': - break; - case 'layout_only': - wp_enqueue_script('um-login' ); - wp_enqueue_style( 'um-login-base' ); - break; - default: - wp_enqueue_script('um-login' ); - wp_enqueue_style( 'um-login-full' ); - break; - } - - $login_args = array( - 'form_id' => 'um-loginform', - 'um_login_form' => true, - 'um_login_form_id' => absint( $args['form_id'] ), - 'um_login_redirect' => '', // if empty then get default from role - 'um_show_forgot' => (bool) $args['show_forgot'], - 'echo' => true, - 'remember' => (bool) $args['show_remember'], - 'label_username' => __( 'Username or Email Address', 'ultimate-member' ), - 'label_password' => __( 'Password', 'ultimate-member' ), - 'label_remember' => __( 'Remember Me', 'ultimate-member' ), - 'label_log_in' => ! empty( $args['login_button'] ) ? $args['login_button'] : __( 'Log In', 'ultimate-member' ), - ); - - if ( ! isset( $_GET['redirect_to'] ) || empty( $_GET['redirect_to'] ) ) { - $redirect = um_get_predefined_page_url( 'user' ); - $login_args['redirect'] = $redirect; - } - - /** - * Filters Ultimate Member Login Form arguments for init it through `wp_login_form()`. - * - * @since 3.0 - * @hook um_login_form_args - * - * @param {array} $login_args Attributes for `wp_login_form()` function init. - * @param {array} $args Login form shortcode attributes. - * - * @return {array} Attributes for `wp_login_form()` function. - */ - $login_args = apply_filters( 'um_login_form_args', $login_args, $args ); - - $wp_error = new \WP_Error(); - - $error_codes = array( - 'empty' => sprintf( __( '%s and %s are required.', 'ultimate-member' ), $login_args['label_username'], $login_args['label_password'] ), - 'failed' => __( 'Invalid username, email address or incorrect password.', 'ultimate-member' ), - 'um_blocked_email' => __( 'This email address has been blocked.', 'ultimate-member' ), - 'um_blocked_domain' => __( 'This email address domain has been blocked.', 'ultimate-member' ), - 'um_account_inactive' => __( 'Your account has been disabled.', 'ultimate-member' ), - 'um_account_awaiting_admin_review' => __( 'Your account has not been approved yet.', 'ultimate-member' ), - 'um_account_awaiting_email_confirmation' => __( 'Your account is awaiting e-mail verification.', 'ultimate-member' ), - 'um_account_rejected' => __( 'Your membership request has been rejected.', 'ultimate-member' ), - ); - /** - * Filters Ultimate Member Login Form errors and their codes. - * - * @since 3.0 - * @hook um_login_form_error_codes - * - * @param {array} $error_codes Error codes in format $error_code => $error_message. - * @param {array} $args Login form attributes. - * - * @return {array} Error codes. - */ - $error_codes = apply_filters( 'um_login_form_error_codes', $error_codes, $args, $login_args ); - - if ( ! empty( $args['show_forgot'] ) ) { - // Change lostpassword URL only when using Ultimate Member Login Form - add_filter( 'lostpassword_url', array( &$this, 'change_lostpassword_url' ), 10, 1 ); - } - - ob_start(); - ?> - -
- - Date: Thu, 5 Jun 2025 16:06:21 +0300 Subject: [PATCH 14/28] Add filters for primary button classes in UM forms Introduced new filters to customize CSS classes for primary buttons in login, registration, and password reset forms. This allows developers to extend button styling by applying custom classes via WordPress hooks. Changes enhance flexibility and improve theme compatibility. --- includes/core/um-actions-login.php | 21 ++++++++++++++++++++- includes/core/um-actions-register.php | 20 ++++++++++++++++++++ templates/password-reset.php | 20 ++++++++++++++++++++ 3 files changed, 60 insertions(+), 1 deletion(-) diff --git a/includes/core/um-actions-login.php b/includes/core/um-actions-login.php index 20e85f50..dd1ea922 100644 --- a/includes/core/um-actions-login.php +++ b/includes/core/um-actions-login.php @@ -362,7 +362,26 @@ function um_add_submit_button_to_login( $args ) { if ( ! isset( $primary_btn_word ) || $primary_btn_word == '' ){ $primary_btn_word = UM()->options()->get( 'login_primary_btn_word' ); } - + /** + * Filters the classes applied to the primary button on the login form. + * + * @hook um_login_form_primary_btn_classes + * @since 2.10.5 + * + * @param {array} $classes An array of CSS classes applied to the primary button. + * @param {array} $args An array of arguments or configurations used in the login form. + * + * @return {array} Button CSS classes. + * + * @example Extend the classes applied to the primary button on the login form. + * function my_custom_classes( $classes, $args ) { + * // Add a new class to the button + * $classes[] = 'new-button-class'; + * + * return $classes; + * } + * add_filter( 'um_login_form_primary_btn_classes', 'my_custom_classes', 10, 2 ); + */ $primary_btn_classes = apply_filters( 'um_login_form_primary_btn_classes', array( 'um-button' ), $args ); /** diff --git a/includes/core/um-actions-register.php b/includes/core/um-actions-register.php index f9d44f0f..ca5e7540 100644 --- a/includes/core/um-actions-register.php +++ b/includes/core/um-actions-register.php @@ -597,6 +597,26 @@ function um_add_submit_button_to_register( $args ) { $primary_btn_word = UM()->options()->get( 'register_primary_btn_word' ); } + /** + * Filters the classes applied to the primary button on the registration form. + * + * @hook um_register_form_primary_btn_classes + * @since 2.10.5 + * + * @param {array} $classes An array of CSS classes applied to the primary button. + * @param {array} $args An array of arguments or configurations used in the registration form. + * + * @return {array} Button CSS classes. + * + * @example Extend the classes applied to the primary button on the registration form. + * function my_custom_classes( $classes, $args ) { + * // Add a new class to the button + * $classes[] = 'new-button-class'; + * + * return $classes; + * } + * add_filter( 'um_register_form_primary_btn_classes', 'my_custom_classes', 10, 2 ); + */ $primary_btn_classes = apply_filters( 'um_register_form_primary_btn_classes', array( 'um-button' ), $args ); $secondary_btn_word = $args['secondary_btn_word']; diff --git a/templates/password-reset.php b/templates/password-reset.php index 51adbeee..0984a2f7 100644 --- a/templates/password-reset.php +++ b/templates/password-reset.php @@ -120,6 +120,26 @@ if ( ! defined( 'ABSPATH' ) ) { */ do_action( 'um_after_password_reset_fields', $args ); + /** + * Filters the classes applied to the primary button on the password reset form. + * + * @hook um_password_reset_form_primary_btn_classes + * @since 2.10.5 + * + * @param {array} $classes An array of CSS classes applied to the primary button. + * @param {array} $args An array of arguments or configurations used in the password reset form. + * + * @return {array} Button CSS classes. + * + * @example Extend the classes applied to the primary button on the password reset form. + * function my_custom_classes( $classes, $args ) { + * // Add a new class to the button + * $classes[] = 'new-button-class'; + * + * return $classes; + * } + * add_filter( 'um_password_reset_form_primary_btn_classes', 'my_custom_classes', 10, 2 ); + */ $primary_btn_classes = apply_filters( 'um_password_reset_form_primary_btn_classes', array( 'um-button' ), $args ); ?>
From 8d83489996036b83fec76415bf0ce988a67cb29d Mon Sep 17 00:00:00 2001 From: Mykyta Synelnikov Date: Thu, 5 Jun 2025 16:13:47 +0300 Subject: [PATCH 15/28] Update to version 2.10.5 and upgrade Action Scheduler Bump plugin version to 2.10.5 and update stable tag in readme. Upgraded Action Scheduler dependency to version 3.9.2 to address library errors. Added filter hooks for primary button classes and improved deactivation logic for better scheduling handling. --- composer.json | 2 +- readme.txt | 6 ++++-- ultimate-member.php | 2 +- 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/composer.json b/composer.json index 8f581ee0..16f2034c 100644 --- a/composer.json +++ b/composer.json @@ -24,7 +24,7 @@ "ext-iconv": "*", "ext-tidy": "*", "composer/installers": "^2.3", - "woocommerce/action-scheduler": "3.9.0" + "woocommerce/action-scheduler": "3.9.2" }, "require-dev": { "wp-cli/wp-cli": "*", diff --git a/readme.txt b/readme.txt index 23b06473..8f4f5c2f 100644 --- a/readme.txt +++ b/readme.txt @@ -6,7 +6,7 @@ Tags: community, member, membership, user-profile, user-registration Requires PHP: 7.0 Requires at least: 6.2 Tested up to: 6.8 -Stable tag: 2.10.4 +Stable tag: 2.10.5 License: GPLv3 License URI: http://www.gnu.org/licenses/gpl-3.0.txt @@ -169,7 +169,9 @@ IMPORTANT: PLEASE UPDATE THE PLUGIN TO AT LEAST VERSION 2.6.7 IMMEDIATELY. VERSI = 2.10.5 2025-05-xx = -* Fixed: Refactor deactivation logic to un-schedule Action Scheduler actions +* Added: Filter hooks for primary button classes in UM forms. +* Fixed: Refactor deactivation logic to un-schedule Action Scheduler actions. +* Fixed: Action Scheduler library errors. Updated to the recent 3.9.2 version. = 2.10.4 2025-05-15 = diff --git a/ultimate-member.php b/ultimate-member.php index f4600c08..cd65c785 100644 --- a/ultimate-member.php +++ b/ultimate-member.php @@ -3,7 +3,7 @@ * Plugin Name: Ultimate Member * Plugin URI: http://ultimatemember.com/ * Description: The easiest way to create powerful online communities and beautiful user profiles with WordPress - * Version: 2.10.5-alpha + * Version: 2.10.5 * Author: Ultimate Member * Author URI: http://ultimatemember.com/ * License: GPLv3 From 1d3dde0141687855c8c0b63aa3790870673901a3 Mon Sep 17 00:00:00 2001 From: ashubawork Date: Mon, 16 Jun 2025 10:05:04 +0300 Subject: [PATCH 16/28] - small typo fix --- includes/core/class-shortcodes.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/includes/core/class-shortcodes.php b/includes/core/class-shortcodes.php index d34a789f..ff86b3be 100644 --- a/includes/core/class-shortcodes.php +++ b/includes/core/class-shortcodes.php @@ -403,7 +403,7 @@ if ( ! class_exists( 'um\core\Shortcodes' ) ) { public function um_loggedin( $args = array(), $content = '' ) { $args = shortcode_atts( array( - 'lock_text' => __( 'This content has been restricted to logged-in users only. Please login to view this content.', 'ultimate-member' ), + 'lock_text' => __( 'This content has been restricted to logged-in users only. Please log in to view this content.', 'ultimate-member' ), 'show_lock' => 'yes', ), $args, From 1442c0605fb30c6fd9cdbffd198d05807a0bb088 Mon Sep 17 00:00:00 2001 From: Mykyta Synelnikov Date: Mon, 16 Jun 2025 17:13:56 +0300 Subject: [PATCH 17/28] Handle temporary user context switching in email actions Introduces a mechanism to temporarily switch user context with `um_fetch_user` only when necessary, avoiding unintended user data overwrites. Ensures previous user context is restored after async email actions are triggered. This prevents potential conflicts in scenarios involving concurrent user operations. --- includes/common/class-users.php | 94 ++++++++++++++++++++++++++++----- 1 file changed, 82 insertions(+), 12 deletions(-) diff --git a/includes/common/class-users.php b/includes/common/class-users.php index 79c6a4fc..6505ec0e 100644 --- a/includes/common/class-users.php +++ b/includes/common/class-users.php @@ -384,8 +384,11 @@ class Users { $userdata = get_userdata( $user_id ); - $current_user_id = get_current_user_id(); - um_fetch_user( $user_id ); + $temp_id = null; + if ( um_user( 'ID' ) !== $user_id ) { + $temp_id = um_user( 'ID' ); + um_fetch_user( $user_id ); + } UM()->maybe_action_scheduler()->enqueue_async_action( 'um_dispatch_email', @@ -404,7 +407,10 @@ class Users { ) ); - um_fetch_user( $current_user_id ); + if ( $temp_id ) { + um_fetch_user( $temp_id ); + } + /** * Fires after User has been set as pending email confirmation. * @@ -470,7 +476,25 @@ class Users { $this->reset_activation_link( $user_id ); $userdata = get_userdata( $user_id ); - UM()->maybe_action_scheduler()->enqueue_async_action( 'um_dispatch_email', array( $userdata->user_email, 'inactive_email', array( 'fetch_user_id' => $user_id ) ) ); + + $temp_id = null; + if ( um_user( 'ID' ) !== $user_id ) { + $temp_id = um_user( 'ID' ); + um_fetch_user( $user_id ); + } + + UM()->maybe_action_scheduler()->enqueue_async_action( + 'um_dispatch_email', + array( + $userdata->user_email, + 'inactive_email', + array( 'fetch_user_id' => $user_id ), + ) + ); + + if ( $temp_id ) { + um_fetch_user( $temp_id ); + } /** * Fires after User has been deactivated. @@ -542,7 +566,25 @@ class Users { $this->reset_activation_link( $user_id ); $userdata = get_userdata( $user_id ); - UM()->maybe_action_scheduler()->enqueue_async_action( 'um_dispatch_email', array( $userdata->user_email, 'rejected_email', array( 'fetch_user_id' => $user_id ) ) ); + + $temp_id = null; + if ( um_user( 'ID' ) !== $user_id ) { + $temp_id = um_user( 'ID' ); + um_fetch_user( $user_id ); + } + + UM()->maybe_action_scheduler()->enqueue_async_action( + 'um_dispatch_email', + array( + $userdata->user_email, + 'rejected_email', + array( 'fetch_user_id' => $user_id ), + ) + ); + + if ( $temp_id ) { + um_fetch_user( $temp_id ); + } /** * Fires after User has been rejected. @@ -620,7 +662,25 @@ class Users { $this->reset_activation_link( $user_id ); $userdata = get_userdata( $user_id ); - UM()->maybe_action_scheduler()->enqueue_async_action( 'um_dispatch_email', array( $userdata->user_email, 'pending_email', array( 'fetch_user_id' => $user_id ) ) ); + + $temp_id = null; + if ( um_user( 'ID' ) !== $user_id ) { + $temp_id = um_user( 'ID' ); + um_fetch_user( $user_id ); + } + + UM()->maybe_action_scheduler()->enqueue_async_action( + 'um_dispatch_email', + array( + $userdata->user_email, + 'pending_email', + array( 'fetch_user_id' => $user_id ), + ) + ); + + if ( $temp_id ) { + um_fetch_user( $temp_id ); + } /** * Fires after User has been set as pending admin review. @@ -728,8 +788,11 @@ class Users { } } - $current_user_id = get_current_user_id(); - um_fetch_user( $user_id ); + $temp_id = null; + if ( um_user( 'ID' ) !== $user_id ) { + $temp_id = um_user( 'ID' ); + um_fetch_user( $user_id ); + } UM()->maybe_action_scheduler()->enqueue_async_action( 'um_dispatch_email', @@ -744,7 +807,9 @@ class Users { ) ); - um_fetch_user( $current_user_id ); + if ( $temp_id ) { + um_fetch_user( $temp_id ); + } } /** * Fires after User has been approved. @@ -814,8 +879,11 @@ class Users { $userdata = get_userdata( $user_id ); - $current_user_id = get_current_user_id(); - um_fetch_user( $user_id ); + $temp_id = null; + if ( um_user( 'ID' ) !== $user_id ) { + $temp_id = um_user( 'ID' ); + um_fetch_user( $user_id ); + } $reset_pw_link = UM()->password()->reset_url( $user_id ); @@ -851,7 +919,9 @@ class Users { ) ); - um_fetch_user( $current_user_id ); + if ( $temp_id ) { + um_fetch_user( $temp_id ); + } /** * Fires after User has been reactivated. From 056e9c2f73f05ac9f8cd317b1c2d1f10ecdc8ed0 Mon Sep 17 00:00:00 2001 From: ashubawork Date: Wed, 18 Jun 2025 11:11:09 +0300 Subject: [PATCH 18/28] - fix country name --- includes/core/class-builtin.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/includes/core/class-builtin.php b/includes/core/class-builtin.php index eeb735cf..98e69a38 100644 --- a/includes/core/class-builtin.php +++ b/includes/core/class-builtin.php @@ -1987,7 +1987,7 @@ if ( ! class_exists( 'um\core\Builtin' ) ) { 'LT' => __('Lithuania','ultimate-member'), 'LU' => __('Luxembourg','ultimate-member'), 'MO' => __('Macao','ultimate-member'), - 'MK' => __('Macedonia, the former Yugoslav Republic of','ultimate-member'), + 'MK' => __('North Macedonia','ultimate-member'), 'MG' => __('Madagascar','ultimate-member'), 'MW' => __('Malawi','ultimate-member'), 'MY' => __('Malaysia','ultimate-member'), From 53b0d479c804cead90194fce5957fb88d68ca68d Mon Sep 17 00:00:00 2001 From: Mykyta Synelnikov Date: Wed, 18 Jun 2025 14:28:38 +0300 Subject: [PATCH 19/28] Ensure email validation handles primary and secondary emails. Added checks to enforce primary email requirement and prevent secondary email duplication with the primary email. Improved user lookup for unique email verification using meta queries. --- includes/core/um-actions-form.php | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/includes/core/um-actions-form.php b/includes/core/um-actions-form.php index 097ab0c4..f89e9480 100644 --- a/includes/core/um-actions-form.php +++ b/includes/core/um-actions-form.php @@ -923,6 +923,7 @@ function um_submit_form_errors_hook_( $submitted_data, $form_data ) { $email_exists = email_exists( $submitted_data[ $key ] ); if ( '' === $submitted_data[ $key ] ) { + // Primary email should be required everytime. UM()->form()->add_error( $key, __( 'You must provide your email', 'ultimate-member' ) ); } elseif ( 'register' === $mode && $email_exists ) { UM()->form()->add_error( $key, __( 'The email you entered is incorrect', 'ultimate-member' ) ); @@ -936,16 +937,28 @@ function um_submit_form_errors_hook_( $submitted_data, $form_data ) { break; } - if ( '' === $submitted_data[ $key ] ) { + if ( ! empty( $array['required'] ) && '' === $submitted_data[ $key ] ) { UM()->form()->add_error( $key, __( 'You must provide your email', 'ultimate-member' ) ); } elseif ( ! is_email( $submitted_data[ $key ] ) || email_exists( $submitted_data[ $key ] ) ) { UM()->form()->add_error( $key, __( 'The email you entered is incorrect', 'ultimate-member' ) ); + } elseif ( 'secondary_user_email' === $key && ! empty( $submitted_data[ $key ] ) && ! empty( $submitted_data['user_email'] ) && $submitted_data[ $key ] === $submitted_data['user_email'] ) { + UM()->form()->add_error( $key, __( 'The secondary email cannot be the same as primary', 'ultimate-member' ) ); } else { // There we have valid and unique user_email. But need to check in usermeta table for other users. - $users = get_users( 'meta_value=' . $submitted_data[ $key ] ); - foreach ( $users as $user ) { - if ( $user->ID !== $submitted_data['user_id'] ) { + $args = array( + 'meta_query' => array( + array( + 'key' => $key, + 'value' => sanitize_email( $submitted_data[ $key ] ), + ), + ), + ); + + $the_similar_users = get_users( $args ); + foreach ( $the_similar_users as $user ) { + if ( empty( $submitted_data['user_id'] ) || $user->ID !== $submitted_data['user_id'] ) { UM()->form()->add_error( $key, __( 'The email you entered is incorrect', 'ultimate-member' ) ); + break; } } } From 032119a8ce98f77e91134c90a03d4cdd431a7e7f Mon Sep 17 00:00:00 2001 From: Mykyta Synelnikov Date: Wed, 18 Jun 2025 15:17:19 +0300 Subject: [PATCH 20/28] Refactor batch action scheduling for account status updates (#1692) Updated batch action logic to utilize correct constants and ensure proper scheduling. Added fallback scheduling logic in admin notices to address unscheduled batch actions and improve reliability. --- includes/admin/core/class-admin-notices.php | 9 +++++++++ includes/core/class-setup.php | 4 ++-- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/includes/admin/core/class-admin-notices.php b/includes/admin/core/class-admin-notices.php index be73e0f4..3c8f0a30 100644 --- a/includes/admin/core/class-admin-notices.php +++ b/includes/admin/core/class-admin-notices.php @@ -1,6 +1,8 @@ maybe_action_scheduler()->has_scheduled_action( Users::BATCH_ACTION ) ) { + do_action( Users::SCHEDULE_ACTION ); + } + $allowed_html = array( 'a' => array( 'href' => array(), diff --git a/includes/core/class-setup.php b/includes/core/class-setup.php index eb6d37f4..21cd1fbd 100644 --- a/includes/core/class-setup.php +++ b/includes/core/class-setup.php @@ -316,9 +316,9 @@ KEY meta_value_indx (um_value(191)) } // If there are some users without `account_status` then run the first async batch for update. - $batch_size = 50; // See the class constant value `\um\common\actions\Users::BATCH_ACTION`. + $batch_size = 50; // See the class constant value `\um\common\actions\Users::BATCH_SIZE`. UM()->maybe_action_scheduler()->enqueue_async_action( - $batch_size, + 'um_set_default_account_status', // See the class constant value `\um\common\actions\Users::BATCH_ACTION`. array( 'page' => 1, 'total' => $total_users, From 8f34bbb4fa844f05913f53d5162a100c5ea645cc Mon Sep 17 00:00:00 2001 From: Mykyta Synelnikov Date: Thu, 19 Jun 2025 12:41:32 +0300 Subject: [PATCH 21/28] Update changelog and readme for version 2.10.5 release Document enhancements, bug fixes, and template update for v2.10.5, including new filter hooks, email placeholder fixes, and Action Scheduler updates. Highlight required cache flush and asset regeneration post-update. --- changelog.txt | 20 ++++++++++++++++++++ readme.txt | 16 +++++++++++++++- 2 files changed, 35 insertions(+), 1 deletion(-) diff --git a/changelog.txt b/changelog.txt index 888d7c1b..f1eb47df 100644 --- a/changelog.txt +++ b/changelog.txt @@ -1,5 +1,25 @@ == Changelog == += 2.10.5 June 25, 2025 = + +* Enhancements: + + - Added: Filter hooks for primary button classes in UM forms. + +* Bugfixes: + + - Fixed: Email placeholders values. + - Fixed: Refactor deactivation logic to un-schedule Action Scheduler actions. + - Fixed: Action Scheduler library errors. Updated to the recent 3.9.2 version. + - Fixed: Secondary email field validation. + - Fixed: Action Scheduler batch actions with users who have Undefined status. + +* Templates required update: + + - password-reset.php + +* Cached and optimized/minified assets(JS/CSS) must be flushed/re-generated after upgrade * + = 2.10.4 May 15, 2025 = * Bugfixes: diff --git a/readme.txt b/readme.txt index 8f4f5c2f..6f532427 100644 --- a/readme.txt +++ b/readme.txt @@ -167,11 +167,25 @@ No specific extensions are needed. But we highly recommended keep active these P IMPORTANT: PLEASE UPDATE THE PLUGIN TO AT LEAST VERSION 2.6.7 IMMEDIATELY. VERSION 2.6.7 PATCHES SECURITY PRIVILEGE ESCALATION VULNERABILITY. PLEASE SEE [THIS ARTICLE](https://docs.ultimatemember.com/article/1866-security-incident-update-and-recommended-actions) FOR MORE INFORMATION -= 2.10.5 2025-05-xx = += 2.10.5 2025-06-25 = + +**Enhancements** * Added: Filter hooks for primary button classes in UM forms. + +**Bugfixes** + +* Fixed: Email placeholders values. * Fixed: Refactor deactivation logic to un-schedule Action Scheduler actions. * Fixed: Action Scheduler library errors. Updated to the recent 3.9.2 version. +* Fixed: Secondary email field validation. +* Fixed: Action Scheduler batch actions with users who have Undefined status. + +**Templates required update** + +* password-reset.php + +**Cached and optimized/minified assets(JS/CSS) must be flushed/re-generated after upgrade** = 2.10.4 2025-05-15 = From 45c85931571f7f0923c752934059269223c4853e Mon Sep 17 00:00:00 2001 From: ashubawork Date: Thu, 19 Jun 2025 15:30:30 +0300 Subject: [PATCH 22/28] - fix restrictions for all blocks --- assets/js/admin/block-restrictions.js | 34 +++++++++++++++++++++++++++ includes/core/class-blocks.php | 16 +++++++++---- 2 files changed, 45 insertions(+), 5 deletions(-) diff --git a/assets/js/admin/block-restrictions.js b/assets/js/admin/block-restrictions.js index 2f3ec381..04067f60 100644 --- a/assets/js/admin/block-restrictions.js +++ b/assets/js/admin/block-restrictions.js @@ -8,6 +8,40 @@ var um_components = wp.components, function um_admin_blocks_custom_fields( um_condition_fields, props ) { return wp.hooks.applyFilters( 'um_admin_blocks_custom_fields', [], um_condition_fields, props ); } +function um_add_restriction_attributes( settings, name ) { + // add attributes for all blocks + const restrictionAttributes = { + um_is_restrict: { + type: 'boolean', + default: false, + }, + um_who_access: { + type: 'string', + default: '0', + }, + um_roles_access: { + type: 'array', + default: [], + }, + um_message_type: { + type: 'string', + default: '0', + }, + um_message_content: { + type: 'string', + default: '', + }, + }; + + settings.attributes = Object.assign( settings.attributes, restrictionAttributes ); + return settings; +} + +wp.hooks.addFilter( + 'blocks.registerBlockType', + 'um-block/add-restriction-attributes', + um_add_restriction_attributes +); var um_block_restriction = wp.compose.createHigherOrderComponent( function( BlockEdit ) { diff --git a/includes/core/class-blocks.php b/includes/core/class-blocks.php index 25b2cf9d..0b2fa4df 100644 --- a/includes/core/class-blocks.php +++ b/includes/core/class-blocks.php @@ -37,27 +37,33 @@ if ( ! class_exists( 'um\core\Blocks' ) ) { if ( empty( $settings['attributes']['um_is_restrict'] ) ) { $settings['attributes']['um_is_restrict'] = array( - 'type' => 'boolean', + 'type' => 'boolean', + 'default' => false, ); } if ( empty( $settings['attributes']['um_who_access'] ) ) { $settings['attributes']['um_who_access'] = array( - 'type' => 'string', + 'type' => 'string', + 'default' => 0, ); } if ( empty( $settings['attributes']['um_roles_access'] ) ) { $settings['attributes']['um_roles_access'] = array( - 'type' => 'array', + 'type' => 'array', + 'default' => array(), + 'items' => array( 'type' => 'string' ), ); } if ( empty( $settings['attributes']['um_message_type'] ) ) { $settings['attributes']['um_message_type'] = array( - 'type' => 'string', + 'type' => 'string', + 'default' => 0, ); } if ( empty( $settings['attributes']['um_message_content'] ) ) { $settings['attributes']['um_message_content'] = array( - 'type' => 'string', + 'type' => 'string', + 'default' => '', ); } From b71cf0c359a8c376d44edaa152ed8c6cc220b13e Mon Sep 17 00:00:00 2001 From: Mykyta Synelnikov Date: Mon, 23 Jun 2025 12:45:55 +0300 Subject: [PATCH 23/28] Filter out empty meta values in usermeta queries. Alternative of #1707 This update adds a condition to exclude empty `meta_value` entries in multiple queries within the member directory class. It ensures more accurate results and prevents potential issues caused by blank metadata in the `usermeta` table. --- includes/core/class-member-directory.php | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/includes/core/class-member-directory.php b/includes/core/class-member-directory.php index d1ca1d31..81c825fc 100644 --- a/includes/core/class-member-directory.php +++ b/includes/core/class-member-directory.php @@ -1101,7 +1101,8 @@ if ( ! class_exists( 'um\core\Member_Directory' ) ) { $wpdb->prepare( "SELECT DISTINCT meta_value FROM {$wpdb->usermeta} - WHERE meta_key = %s + WHERE meta_key = %s AND + meta_value != '' ORDER BY meta_value DESC", $filter ) @@ -1122,7 +1123,8 @@ if ( ! class_exists( 'um\core\Member_Directory' ) ) { MIN(meta_value) AS min, MAX(meta_value) AS max FROM {$wpdb->usermeta} - WHERE meta_key = '_um_last_login'", + WHERE meta_key = '_um_last_login' AND + meta_value != ''", ARRAY_A ); if ( empty( $meta['total'] ) || 1 === absint( $meta['total'] ) ) { @@ -1161,7 +1163,8 @@ if ( ! class_exists( 'um\core\Member_Directory' ) ) { $wpdb->prepare( "SELECT DISTINCT meta_value FROM {$wpdb->usermeta} - WHERE meta_key = %s + WHERE meta_key = %s AND + meta_value != '' ORDER BY meta_value DESC", $filter ) From 57141c994f2a76a9672d7b298a81b35cf1bc8928 Mon Sep 17 00:00:00 2001 From: Mykyta Synelnikov Date: Mon, 23 Jun 2025 13:34:57 +0300 Subject: [PATCH 24/28] Updated changelog.txt Minified scripts --- assets/css/um-members.css | 2 +- assets/css/um-members.min.css | 2 +- assets/js/admin/block-restrictions.min.js | 2 +- changelog.txt | 2 ++ readme.txt | 2 ++ 5 files changed, 7 insertions(+), 3 deletions(-) diff --git a/assets/css/um-members.css b/assets/css/um-members.css index 076cf73b..1a03453e 100644 --- a/assets/css/um-members.css +++ b/assets/css/um-members.css @@ -1249,4 +1249,4 @@ body #content .um-directory a:hover, body #content .um-directory a:focus { .select2-container .select2-results li.select2-results__option[aria-disabled=true] { display: none; -} +} \ No newline at end of file diff --git a/assets/css/um-members.min.css b/assets/css/um-members.min.css index 5659a061..9eaf0679 100644 --- a/assets/css/um-members.min.css +++ b/assets/css/um-members.min.css @@ -1 +1 @@ -@-webkit-keyframes um-ajax-spinning{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@-moz-keyframes um-ajax-spinning{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@-ms-keyframes um-ajax-spinning{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes um-ajax-spinning{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}.um-new-dropdown{font-size:16px;margin:0;position:absolute;height:auto;background:#fff;z-index:10;display:none;border:1px solid #ddd;box-shadow:0 7px 14px 0 rgba(50,50,93,.1),0 3px 6px 0 rgba(0,0,0,.07);-webkit-box-shadow:0 7px 14px 0 rgba(50,50,93,.1),0 3px 6px 0 rgba(0,0,0,.07);box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;border-radius:5px 5px 5px 5px;-moz-border-radius:5px 5px 5px 5px;-webkit-border-radius:5px 5px 5px 5px}.um-new-dropdown ul{margin:0;padding:0}.um-new-dropdown ul li{list-style-type:none;padding:0;margin:0}.um-new-dropdown ul li a{display:block;padding:8px 12px;line-height:1}.um-new-dropdown-arr{position:absolute;font-size:24px;width:24px;height:24px;overflow:hidden;z-index:15;color:#eee}.um-new-dropdown-arr *{display:block;width:24px;height:24px;vertical-align:bottom;overflow:hidden;line-height:24px}body #content .um-directory a{text-decoration:none;border-bottom:none;box-shadow:none}body #content .um-directory a:focus,body #content .um-directory a:hover{text-decoration:none;border-bottom:none;box-shadow:none}.um-directory{display:flex;flex-direction:column;justify-content:flex-start;align-items:stretch;flex-wrap:nowrap;position:relative}.um-directory a{text-decoration:none;border-bottom:none;box-shadow:none}.um-directory a:focus,.um-directory a:hover{text-decoration:none;border-bottom:none;box-shadow:none}.um-directory .select2-container--disabled{opacity:.6}.um-directory .um-members-overlay{display:none;position:absolute;width:100%;top:0;bottom:0;background:0 0;z-index:2}.um-directory .um-members-overlay .um-ajax-loading{-webkit-transition:.1s opacity;-moz-transition:.1s opacity;-ms-transition:.1s opacity;-o-transition:.1s opacity;transition:.1s opacity;color:#c6c6c6!important;-webkit-animation:um-ajax-spinning 1.1s infinite linear;animation:um-ajax-spinning 1.1s infinite linear;border-top:.2em solid rgba(198,198,198,.2);border-right:.2em solid rgba(198,198,198,.2);border-bottom:.2em solid rgba(198,198,198,.2);border-left:.2em solid #c6c6c6;font-size:1.75em;position:absolute;left:calc(50% - 1.75em);top:calc(50% - 1.75em);-ms-transform:translateZ(0);transform:translateZ(0);border-radius:50%;display:block;width:2.5em;height:2.5em;margin:0;outline:0;padding:0;vertical-align:baseline}.um-directory .um-member-directory-header{display:flex;flex-direction:column;justify-content:flex-start;align-items:stretch;flex-wrap:nowrap;width:100%}.um-directory .um-member-directory-header .um-member-directory-header-row.um-member-directory-filters-bar{padding:0 0 10px 0}.um-directory .um-member-directory-header .um-member-directory-header-row:not(.um-member-directory-filters-bar){display:flex;flex-direction:row;justify-content:flex-start;align-items:baseline;flex-wrap:nowrap;margin:0 0 10px 0}.um-directory .um-member-directory-header .um-member-directory-header-row.um-header-row-invisible{margin:0}.um-directory .um-member-directory-header .um-member-directory-header-row.um-member-directory-search-row{justify-content:flex-end}.um-directory .um-member-directory-header .um-member-directory-header-row .um-member-directory-search-line{display:flex;flex-direction:row;justify-content:flex-start;align-items:center;flex-wrap:nowrap;width:60%}.um-directory .um-member-directory-header .um-member-directory-header-row .um-member-directory-search-line label{flex:1;margin:0 10px 0 0;min-width:90px;max-width:85%}.um-directory .um-member-directory-header .um-member-directory-header-row .um-member-directory-search-line label span{display:none;margin:0 5px 0 0}.um-directory .um-member-directory-header .um-member-directory-header-row .um-member-directory-search-line label .um-search-line{-webkit-appearance:textfield;width:100%;box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box}.um-directory .um-member-directory-header .um-member-directory-header-row .um-member-directory-search-line .um-do-search{min-width:15%;width:auto}.um-directory .um-member-directory-header .um-member-directory-header-row .um-member-directory-nav-line{display:flex;flex-direction:row;justify-content:space-between;align-items:center;flex-wrap:nowrap;width:100%}.um-directory .um-member-directory-header .um-member-directory-header-row .um-member-directory-nav-line .um-member-directory-view-type{font-size:30px;line-height:30px;margin:0 10px 0 0;width:30px}.um-directory .um-member-directory-header .um-member-directory-header-row .um-member-directory-nav-line .um-member-directory-view-type .um-member-directory-view-type-a{color:#ddd;display:none}.um-directory .um-member-directory-header .um-member-directory-header-row .um-member-directory-nav-line .um-member-directory-view-type.um-disabled{cursor:default}.um-directory .um-member-directory-header .um-member-directory-header-row .um-member-directory-nav-line .um-member-directory-view-type.um-disabled a{cursor:default}.um-directory .um-member-directory-header .um-member-directory-header-row .um-member-directory-nav-line .um-member-directory-view-type:not(.um-disabled) .um-member-directory-view-type-a:hover{color:#ccc}.um-directory .um-member-directory-header .um-member-directory-header-row .um-member-directory-nav-line .um-member-directory-view-type:not(.um-disabled) .um-member-directory-view-type-a:focus{color:#ddd}.um-directory .um-member-directory-header .um-member-directory-header-row .um-member-directory-nav-line .um-member-directory-sorting{display:flex;flex-direction:row;justify-content:flex-start;align-items:baseline;flex-wrap:nowrap;flex:5}.um-directory .um-member-directory-header .um-member-directory-header-row .um-member-directory-nav-line .um-member-directory-sorting .um-member-directory-sorting-a{display:flex;flex-direction:row;justify-content:flex-start;align-items:baseline;flex-wrap:nowrap;position:relative;cursor:pointer}.um-directory .um-member-directory-header .um-member-directory-header-row .um-member-directory-nav-line .um-member-directory-sorting .um-member-directory-sorting-a a{margin:0 5px 0 0}.um-directory .um-member-directory-header .um-member-directory-header-row .um-member-directory-nav-line .um-member-directory-sorting .um-member-directory-sorting-a i.um-faicon-caret-down{display:inline}.um-directory .um-member-directory-header .um-member-directory-header-row .um-member-directory-nav-line .um-member-directory-sorting .um-member-directory-sorting-a i.um-faicon-caret-up{display:none}.um-directory .um-member-directory-header .um-member-directory-header-row .um-member-directory-nav-line .um-member-directory-sorting .um-member-directory-sorting-a.um-member-directory-sorting-visible i.um-faicon-caret-down{display:none}.um-directory .um-member-directory-header .um-member-directory-header-row .um-member-directory-nav-line .um-member-directory-sorting .um-member-directory-sorting-a.um-member-directory-sorting-visible i.um-faicon-caret-up{display:inline}.um-directory .um-member-directory-header .um-member-directory-header-row .um-member-directory-nav-line .um-member-directory-sorting .um-member-directory-sorting-a .um-new-dropdown{top:24px;width:200px;left:-12px}.um-directory .um-member-directory-header .um-member-directory-header-row .um-member-directory-nav-line .um-member-directory-sorting .um-member-directory-sorting-a .um-new-dropdown li a[data-selected="1"]{display:none}.um-directory .um-member-directory-header .um-member-directory-header-row .um-member-directory-nav-line .um-member-directory-filters{display:flex;flex-direction:row;justify-content:flex-end;align-items:baseline;flex-wrap:nowrap;flex:2;text-align:right}.um-directory .um-member-directory-header .um-member-directory-header-row .um-member-directory-nav-line .um-member-directory-filters .um-member-directory-filters-a{display:flex;flex-direction:row;justify-content:flex-start;align-items:baseline;flex-wrap:nowrap;cursor:pointer}.um-directory .um-member-directory-header .um-member-directory-header-row .um-member-directory-nav-line .um-member-directory-filters .um-member-directory-filters-a a{margin:0 5px 0 0}.um-directory .um-member-directory-header .um-member-directory-header-row .um-member-directory-nav-line .um-member-directory-filters .um-member-directory-filters-a i.um-faicon-caret-down{display:inline}.um-directory .um-member-directory-header .um-member-directory-header-row .um-member-directory-nav-line .um-member-directory-filters .um-member-directory-filters-a i.um-faicon-caret-up{display:none}.um-directory .um-member-directory-header .um-member-directory-header-row .um-member-directory-nav-line .um-member-directory-filters .um-member-directory-filters-a.um-member-directory-filters-visible i.um-faicon-caret-down{display:none}.um-directory .um-member-directory-header .um-member-directory-header-row .um-member-directory-nav-line .um-member-directory-filters .um-member-directory-filters-a.um-member-directory-filters-visible i.um-faicon-caret-up{display:inline}.um-directory .um-member-directory-header .um-member-directory-header-row .um-search{margin:0;width:100%;display:grid;grid-template-rows:auto 1fr;grid-template-columns:repeat(3,1fr);grid-gap:10px;grid-auto-rows:minmax(max-content,auto);-ms-grid-template-rows:auto 1fr;-ms-grid-template-columns:repeat(3,1fr);-ms-grid-gap:10px;-ms-grid-auto-rows:minmax(max-content,auto);align-items:center}.um-directory .um-member-directory-header .um-member-directory-header-row .um-search .um-search-filter{display:flex;flex-direction:row;justify-content:flex-start;align-items:baseline;flex-wrap:nowrap;width:100%;position:relative}.um-directory .um-member-directory-header .um-member-directory-header-row .um-search .um-search-filter .select2-container{float:left;width:100%!important}.um-directory .um-member-directory-header .um-member-directory-header-row .um-search .um-search-filter .um-s1{width:100%}.um-directory .um-member-directory-header .um-member-directory-header-row .um-search .um-search-filter.um-text-filter-type input{width:100%}.um-directory .um-member-directory-header .um-member-directory-header-row .um-search .um-search-filter.um-slider-filter-type{flex-direction:column;align-items:stretch}.um-directory .um-member-directory-header .um-member-directory-header-row .um-search .um-search-filter.um-slider-filter-type .um-slider{width:calc(100% - 16px)}.um-directory .um-member-directory-header .um-member-directory-header-row .um-search .um-search-filter.um-slider-filter-type .um-slider .ui-slider-range.ui-widget-header{background:#44b0ec;border:1px solid #44b0ec!important;margin-top:-1px}.um-directory .um-member-directory-header .um-member-directory-header-row .um-search .um-search-filter.um-slider-filter-type .um-slider.ui-slider.ui-slider-horizontal{border:1px solid #ddd!important;box-sizing:border-box;margin:4px 8px 0 8px}.um-directory .um-member-directory-header .um-member-directory-header-row .um-search .um-search-filter.um-slider-filter-type .um-slider-range{display:flex;flex-direction:row;justify-content:flex-start;align-items:baseline;flex-wrap:nowrap;margin:6px 0 0 8px;font-size:.8em}.um-directory .um-member-directory-header .um-member-directory-header-row .um-search .um-search-filter.um-datepicker-filter-type,.um-directory .um-member-directory-header .um-member-directory-header-row .um-search .um-search-filter.um-timepicker-filter-type{display:flex;flex-direction:row;justify-content:flex-start;align-items:baseline;flex-wrap:nowrap}.um-directory .um-member-directory-header .um-member-directory-header-row .um-search .um-search-filter.um-datepicker-filter-type input,.um-directory .um-member-directory-header .um-member-directory-header-row .um-search .um-search-filter.um-timepicker-filter-type input{width:calc(50% - 5px);margin:0 5px 0 0!important;box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box}.um-directory .um-member-directory-header .um-member-directory-header-row .um-search .um-search-filter.um-datepicker-filter-type input:nth-child(even),.um-directory .um-member-directory-header .um-member-directory-header-row .um-search .um-search-filter.um-timepicker-filter-type input:nth-child(even){margin:0 0 0 5px!important}.um-directory .um-member-directory-header .um-member-directory-header-row .um-search[style*="overflow: hidden;"] .um-search-filter{pointer-events:none}.um-directory .um-member-directory-header .um-member-directory-header-row .um-search.um-search-invisible{display:none}.um-directory .um-member-directory-header .um-member-directory-header-row .um-filtered-line{display:flex;flex-direction:row;justify-content:flex-start;align-items:baseline;flex-wrap:wrap;margin:0;padding:0;box-sizing:border-box;border:none}.um-directory .um-member-directory-header .um-member-directory-header-row .um-filtered-line .um-members-filter-tag{display:flex;flex-direction:row;justify-content:flex-start;align-items:center;flex-wrap:nowrap;margin:0 10px 5px 0;padding:0 10px;border-radius:3px;cursor:default;background:#f1f1f1;font-size:13px}.um-directory .um-member-directory-header .um-member-directory-header-row .um-filtered-line .um-members-filter-tag:first-child{margin-left:0}.um-directory .um-member-directory-header .um-member-directory-header-row .um-filtered-line .um-members-filter-tag .um-members-filter-remove{float:right;display:inline-block;margin-left:10px;cursor:pointer;font-weight:700;font-size:20px}.um-directory .um-member-directory-header .um-member-directory-header-row .um-filtered-line .um-members-filter-tag .um-members-filter-remove:hover{color:#a00}.um-directory .um-member-directory-header .um-member-directory-header-row .um-filtered-line .um-clear-filters{display:none}.um-directory .um-member-directory-header .um-member-directory-header-row .um-filtered-line .um-clear-filters a{padding:3px 10px;margin:0 10px}.um-directory .um-members-wrapper{display:flex;flex-direction:column;justify-content:flex-start;align-items:stretch;flex-wrap:nowrap;width:100%;margin:0 0 10px 0;padding:0;position:relative;height:300px}.um-directory .um-members-wrapper .um-members-intro{text-align:center;margin:0 0 10px 0}.um-directory .um-members-wrapper .um-members-total{font-size:20px;font-weight:300}.um-directory .um-members-wrapper .um-members{width:100%;margin:0;padding:0;-ms-word-break:break-all;word-break:break-word;word-wrap:break-word}.um-directory .um-members-wrapper .um-members .um-member{border:1px solid #ddd;box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box}.um-directory .um-members-wrapper .um-members .um-member .um-member-photo.radius-1 a img{-moz-border-radius:999px!important;-webkit-border-radius:999px!important;border-radius:999px!important}.um-directory .um-members-wrapper .um-members .um-member .um-member-photo.radius-1.radius-2 a img{-moz-border-radius:4px!important;-webkit-border-radius:4px!important;border-radius:4px!important}.um-directory .um-members-wrapper .um-members .um-member .um-member-photo.radius-1.radius-3 a img{-moz-border-radius:0!important;-webkit-border-radius:0!important;border-radius:0!important}.um-directory .um-members-wrapper .um-members .um-member .um-member-card .um-member-name{display:flex;flex-direction:row;justify-content:flex-start;align-items:baseline;flex-wrap:nowrap}.um-directory .um-members-wrapper .um-members .um-member .um-member-card .um-member-name a{display:flex;flex-direction:row;justify-content:flex-start;align-items:center;flex-wrap:nowrap}.um-directory .um-members-wrapper .um-members img{display:block;overflow:hidden;-moz-border-radius:0;-webkit-border-radius:0;border-radius:0;margin:0;padding:0}.um-directory .um-members-wrapper .um-members.um-members-grid .um-gutter-sizer{width:5%}.um-directory .um-members-wrapper .um-members.um-members-grid .um-member{float:left;width:30%;background:#fff;text-align:center;margin-bottom:40px;position:relative}.um-directory .um-members-wrapper .um-members.um-members-grid .um-member .um-member-status{display:none;background:#999}.um-directory .um-members-wrapper .um-members.um-members-grid .um-member .um-member-status.awaiting_admin_review,.um-directory .um-members-wrapper .um-members.um-members-grid .um-member .um-member-status.inactive,.um-directory .um-members-wrapper .um-members.um-members-grid .um-member .um-member-status.rejected{display:block;position:absolute;top:0;left:0;width:100%;padding:7px 15px;color:#fff;z-index:10;font-size:13px;box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box}.um-directory .um-members-wrapper .um-members.um-members-grid .um-member .um-member-status.awaiting_admin_review{background:#c74a4a}.um-directory .um-members-wrapper .um-members.um-members-grid .um-member .um-member-photo{padding:40px 0 20px 0;text-align:center}.um-directory .um-members-wrapper .um-members.um-members-grid .um-member .um-member-photo a{text-decoration:none;box-shadow:none!important;display:inline!important}.um-directory .um-members-wrapper .um-members.um-members-grid .um-member .um-member-photo a img{display:inline!important;border:5px solid #fff;background:#fff;width:140px;height:140px;float:none!important}.um-directory .um-members-wrapper .um-members.um-members-grid .um-member.awaiting_admin_review,.um-directory .um-members-wrapper .um-members.um-members-grid .um-member.inactive,.um-directory .um-members-wrapper .um-members.um-members-grid .um-member.rejected{opacity:.7}.um-directory .um-members-wrapper .um-members.um-members-grid .um-member.with-cover .um-member-photo{padding-top:0}.um-directory .um-members-wrapper .um-members.um-members-grid .um-member.with-cover .um-member-photo a img{width:90px;height:90px;position:relative;top:-35px;margin-bottom:-45px;float:none;opacity:1}.um-directory .um-members-wrapper .um-members.um-members-grid .um-member .um-member-cover{background-color:#eee;box-sizing:border-box;position:relative}.um-directory .um-members-wrapper .um-members.um-members-grid .um-member .um-member-cover[data-ratio]{overflow-y:hidden}.um-directory .um-members-wrapper .um-members.um-members-grid .um-member .um-member-cover .um-member-cover-e{text-align:center;box-sizing:border-box}.um-directory .um-members-wrapper .um-members.um-members-grid .um-member .um-member-cover .um-member-cover-e img{width:100%!important}.um-directory .um-members-wrapper .um-members.um-members-grid .um-member .um-member-card{padding-bottom:15px}.um-directory .um-members-wrapper .um-members.um-members-grid .um-member .um-member-card.no-photo{padding-top:30px}.um-directory .um-members-wrapper .um-members.um-members-grid .um-member .um-member-card .um-member-name{margin:0 0 4px 0;justify-content:center}.um-directory .um-members-wrapper .um-members.um-members-grid .um-member .um-member-card .um-member-name a{font-size:16px;line-height:26px;color:#444;font-weight:700}.um-directory .um-members-wrapper .um-members.um-members-grid .um-member .um-member-card .um-members-edit-btn{margin:2px 0;height:40px}.um-directory .um-members-wrapper .um-members.um-members-grid .um-member .um-member-card .um-members-edit-btn a.um-edit-profile-btn{padding:10px 15px!important;transition:none!important;display:inline-block!important;margin:0 auto!important;min-width:110px;width:auto;text-align:center;font-size:13px}.um-directory .um-members-wrapper .um-members.um-members-grid .um-member .um-member-card .um-members-edit-btn a.um-edit-profile-btn:before{font-family:FontAwesome;margin-right:8px;width:14px;text-align:left;display:inline-block;font-size:16px;position:relative;left:0;top:1px;content:"\f013"}.um-directory .um-members-wrapper .um-members.um-members-grid .um-member .um-member-card .um-member-tagline{font-size:13px;line-height:22px;color:#999;padding:0 15px}.um-directory .um-members-wrapper .um-members.um-members-grid .um-member .um-member-card .um-member-meta-main .um-member-meta{display:none;margin:20px 15px 0 15px;padding:15px 0;border-top:1px solid #e5e5e5}.um-directory .um-members-wrapper .um-members.um-members-grid .um-member .um-member-card .um-member-meta-main .um-member-meta.no-animate{display:block}.um-directory .um-members-wrapper .um-members.um-members-grid .um-member .um-member-card .um-member-meta-main .um-member-meta .um-member-metaline{font-size:13px;padding:12px 0 0 0;line-height:16px;vertical-align:middle}.um-directory .um-members-wrapper .um-members.um-members-grid .um-member .um-member-card .um-member-meta-main .um-member-meta .um-member-metaline strong{display:block;clear:both}.um-directory .um-members-wrapper .um-members.um-members-grid .um-member .um-member-card .um-member-meta-main .um-member-meta .um-member-metaline span{display:block;text-align:center}.um-directory .um-members-wrapper .um-members.um-members-grid .um-member .um-member-card .um-member-meta-main .um-member-meta .um-member-connect{padding-top:20px}.um-directory .um-members-wrapper .um-members.um-members-grid .um-member .um-member-card .um-member-meta-main .um-member-meta .um-member-connect a{display:inline-block;width:40px;line-height:40px;height:40px;-moz-border-radius:999px;-webkit-border-radius:999px;border-radius:999px;color:#fff!important;opacity:.85;margin:0 1px;font-size:22px;transition:.25s}.um-directory .um-members-wrapper .um-members.um-members-grid .um-member .um-member-card .um-member-meta-main .um-member-meta .um-member-connect a:hover{opacity:1;color:#fff}.um-directory .um-members-wrapper .um-members.um-members-grid .um-member .um-member-card .um-member-meta-main .um-member-less{display:none}.um-directory .um-members-wrapper .um-members.um-members-grid .um-member .um-member-card .um-member-meta-main .um-member-less a{color:#666;display:inline-block}.um-directory .um-members-wrapper .um-members.um-members-grid .um-member .um-member-card .um-member-meta-main .um-member-less a i{display:block;font-size:32px;height:32px;line-height:32px}.um-directory .um-members-wrapper .um-members.um-members-grid .um-member .um-member-card .um-member-meta-main .um-member-more a{color:#666;display:inline-block}.um-directory .um-members-wrapper .um-members.um-members-grid .um-member .um-member-card .um-member-meta-main .um-member-more a i{display:block;font-size:32px;height:32px;line-height:32px}.um-directory .um-members-wrapper .um-members.um-members-list{display:grid;grid-template-rows:auto 1fr;grid-template-columns:repeat(1,1fr);grid-gap:10px;grid-auto-rows:minmax(max-content,auto);-ms-grid-template-rows:auto 1fr;-ms-grid-template-columns:repeat(1,1fr);-ms-grid-gap:10px;-ms-grid-auto-rows:minmax(max-content,auto);align-items:center}.um-directory .um-members-wrapper .um-members.um-members-list .um-member{display:flex;flex-direction:column;justify-content:flex-start;align-items:stretch;flex-wrap:nowrap;width:100%;padding:15px;margin:0;background:#fff;box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box}.um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-status{display:none;background:#999}.um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-status.awaiting_admin_review,.um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-status.inactive,.um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-status.rejected{display:block;width:100%;padding:7px 15px;margin-bottom:10px;color:#fff;font-size:13px;box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box}.um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-status.awaiting_admin_review{background:#c74a4a}.um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-container{display:flex;flex-direction:row;justify-content:flex-start;align-items:flex-start;flex-wrap:nowrap;width:100%;margin:0 0 10px 0;padding:0}.um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-container .um-member-photo{width:100px;margin:0 15px 0 0;padding:0}.um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-container .um-member-photo a{width:100px;height:100px;display:block}.um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-container .um-member-photo a img{width:100px;height:100px;position:relative;top:0;margin:0;margin-bottom:0;border:none}.um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-container .um-member-card{display:flex;flex-direction:row;justify-content:flex-start;align-items:flex-start;flex-wrap:nowrap;width:calc(100% - 115px);padding:0;margin:0;box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box}.um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-container .um-member-card.no-photo{width:100%}.um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-container .um-member-card .um-member-card-content{display:flex;flex-direction:column;justify-content:flex-start;align-items:stretch;flex-wrap:nowrap;width:calc(100% - 30px);margin:0 10px 0 0}.um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-container .um-member-card .um-member-card-content .um-member-card-header{width:100%}.um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-container .um-member-card .um-member-card-content .um-member-card-header .um-member-name{margin:0 0 4px 0}.um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-container .um-member-card .um-member-card-content .um-member-card-header .um-member-name a{font-size:16px;line-height:26px;color:#444;font-weight:700}.um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-container .um-member-card .um-member-card-content .um-member-tagline{display:flex;flex-direction:row;justify-content:flex-start;align-items:baseline;flex-wrap:wrap;width:100%;font-size:13px;color:#999;padding:0;box-sizing:border-box}.um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-container .um-member-card .um-member-card-content .um-member-meta-main{width:100%;padding:0;box-sizing:border-box;display:none}.um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-container .um-member-card .um-member-card-content .um-member-meta-main.no-animate{display:block}.um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-container .um-member-card .um-member-card-content .um-member-meta-main .um-member-meta{float:left;width:100%;display:block;margin:10px 0 0 0;box-sizing:border-box;border:none}.um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-container .um-member-card .um-member-card-content .um-member-meta-main .um-member-meta .um-member-metaline{display:flex;flex-direction:row;justify-content:flex-start;align-items:center;flex-wrap:wrap;font-size:13px;padding:12px 0 0 0;line-height:16px;width:100%}.um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-container .um-member-card .um-member-card-content .um-member-meta-main .um-member-meta .um-member-connect{padding-top:10px}.um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-container .um-member-card .um-member-card-content .um-member-meta-main .um-member-meta .um-member-connect a{display:inline-block;width:40px;line-height:40px;height:40px;-moz-border-radius:999px;-webkit-border-radius:999px;border-radius:999px;color:#fff!important;opacity:.85;margin:0 1px;font-size:22px;transition:.25s;text-align:center}.um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-container .um-member-card .um-member-card-content .um-member-meta-main .um-member-meta .um-member-connect a:hover{opacity:1;color:#fff}.um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-container .um-member-card .um-member-card-actions{display:flex;flex-direction:column;justify-content:flex-start;align-items:flex-end;flex-wrap:nowrap;width:20px;text-align:right;padding:0}.um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-container .um-member-card .um-member-card-actions .um-member-cog{position:relative}.um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-container .um-member-card .um-member-card-actions .um-member-cog .um-member-actions-a{line-height:1;display:block;color:#666}.um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-container .um-member-card .um-member-card-actions .um-member-cog .um-member-actions-a i{display:block;font-size:20px;line-height:1}.um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-container .um-member-card .um-member-card-actions .um-member-cog .um-new-dropdown{width:180px;right:0;text-align:left}.um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-container .um-member-card .um-member-card-actions a{box-sizing:border-box}.um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-footer{display:flex;flex-direction:row;justify-content:flex-end;align-items:center;flex-wrap:nowrap;width:100%}.um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-footer .um-member-card-footer-buttons{display:flex;flex-direction:row;justify-content:flex-start;align-items:baseline;flex-wrap:nowrap;width:calc(100% - 145px);margin:0 10px 0 0}.um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-footer .um-member-card-footer-buttons .um-members-list-footer-button-wrapper{display:flex;flex-direction:row;justify-content:flex-start;align-items:baseline;flex-wrap:nowrap;margin:0}.um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-footer .um-member-card-footer-buttons>:not(:last-child){margin:0 10px 0 0}.um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-footer .um-member-card-reveal-buttons{width:20px;text-align:right}.um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-footer .um-member-card-reveal-buttons .um-member-more{display:flex;flex-direction:column;justify-content:flex-start;align-items:baseline;flex-wrap:nowrap}.um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-footer .um-member-card-reveal-buttons .um-member-more a{color:#666;display:inline-block}.um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-footer .um-member-card-reveal-buttons .um-member-more a i{display:block;font-size:28px;height:28px;line-height:28px}.um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-footer .um-member-card-reveal-buttons .um-member-less{display:flex;flex-direction:column;justify-content:flex-start;align-items:baseline;flex-wrap:nowrap;display:none}.um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-footer .um-member-card-reveal-buttons .um-member-less a{color:#666;display:inline-block}.um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-footer .um-member-card-reveal-buttons .um-member-less a i{display:block;font-size:28px;height:28px;line-height:28px}.um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-footer.no-photo.no-reveal .um-member-card-footer-buttons{width:100%}.um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-footer.no-photo:not(.no-reveal) .um-member-card-footer-buttons{width:calc(100% - 30px)}.um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-footer.no-reveal:not(.no-photo) .um-member-card-footer-buttons{width:calc(100% - 125px)}.um-directory .um-members-wrapper .um-members .um-members-none{text-align:center;font-size:18px}.um-directory .um-members-pagination-box{width:100%;float:left;margin:0 0 10px 0;padding:0}.um-directory .um-members-pagination-box .um-members-pagi{display:flex;flex-direction:row;justify-content:center;align-items:baseline;flex-wrap:nowrap;width:100%;margin:0;padding:0;font-size:15px}.um-directory .um-members-pagination-box .um-members-pagi .pagi{cursor:pointer;display:inline-block;width:auto;height:34px;line-height:34px;transition:all .2s linear;padding:0 14px;color:#666!important;font-weight:400}.um-directory .um-members-pagination-box .um-members-pagi .pagi.pagi-arrow{line-height:38px}.um-directory .um-members-pagination-box .um-members-pagi .pagi.pagi-arrow i:before{font-size:20px;vertical-align:middle!important;height:34px;line-height:34px;top:-2px;position:relative}.um-directory .um-members-pagination-box .um-members-pagi .pagi.current{cursor:default;color:#fff!important}.um-directory .um-members-pagination-box .um-members-pagi .pagi.current:hover{color:#fff!important}.um-directory .um-members-pagination-box .um-members-pagi .pagi.disabled{cursor:default;opacity:.4}.um-directory .um-members-pagination-box .um-members-pagi .pagi.none{color:#aaa!important}.um-directory .um-members-pagination-box .um-members-pagidrop{width:100%;float:left;margin:0;text-align:center;padding:5px 0;font-size:15px}.um-directory.um-loaded .um-members-wrapper{height:auto}.um-directory[data-view_type=list] .um-member-directory-header .um-member-directory-header-row .um-member-directory-view-type .um-member-directory-view-type-a[data-type=list]{display:block}.um-directory[data-view_type=grid] .um-member-directory-header .um-member-directory-header-row .um-member-directory-view-type .um-member-directory-view-type-a[data-type=grid]{display:block}.um-directory[data-view_type=map] .um-member-directory-header .um-member-directory-header-row .um-member-directory-view-type .um-member-directory-view-type-a[data-type=map]{display:block}.um-directory.uimob340 .um-member-directory-header .um-member-directory-header-row .um-member-directory-search-line{width:100%}.um-directory.uimob340 .um-member-directory-header .um-member-directory-header-row.um-member-directory-search-row{justify-content:flex-start}.um-directory.uimob340 .um-member-directory-header .um-member-directory-header-row .um-member-directory-nav-line{flex-wrap:wrap}.um-directory.uimob340 .um-member-directory-header .um-member-directory-header-row .um-member-directory-nav-line .um-member-directory-view-type{width:20px;font-size:20px;line-height:20px;margin:0 2px 0 0}.um-directory.uimob340 .um-member-directory-header .um-member-directory-header-row .um-member-directory-nav-line .um-member-directory-sorting{width:calc(100% - 25px);justify-content:flex-end}.um-directory.uimob340 .um-member-directory-header .um-member-directory-header-row .um-member-directory-nav-line .um-member-directory-sorting .um-new-dropdown{right:0;left:auto}.um-directory.uimob340 .um-member-directory-header .um-member-directory-header-row .um-member-directory-nav-line .um-member-directory-filters{flex:none;width:100%}.um-directory.uimob340 .um-member-directory-header .um-search{grid-template-columns:repeat(1,1fr)}.um-directory.uimob340 .um-members-wrapper .um-members .um-member{width:100%}.um-directory.uimob340 .um-members-wrapper .um-members.um-members-grid .um-gutter-sizer{width:0}.um-directory.uimob340 .um-members-wrapper .um-members.um-members-list .um-member{padding:10px}.um-directory.uimob340 .um-members-wrapper .um-members.um-members-list .um-member .um-member-photo{width:50px;margin:0 10px 0 0}.um-directory.uimob340 .um-members-wrapper .um-members.um-members-list .um-member .um-member-photo a{width:50px;height:50px}.um-directory.uimob340 .um-members-wrapper .um-members.um-members-list .um-member .um-member-photo a img{width:50px;height:50px}.um-directory.uimob340 .um-members-wrapper .um-members.um-members-list .um-member .um-member-card{width:calc(100% - 60px)}.um-directory.uimob340 .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-footer{align-items:flex-start}.um-directory.uimob340 .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-footer .um-member-card-footer-buttons{display:flex;flex-direction:column;justify-content:flex-start;align-items:stretch;flex-wrap:nowrap;width:calc(100% - 90px);margin:0 10px 0 0}.um-directory.uimob340 .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-footer .um-member-card-footer-buttons .um-members-list-footer-button-wrapper{margin:0 0 5px 0}.um-directory.uimob340 .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-footer .um-member-card-footer-buttons .um-members-list-footer-button-wrapper a.um-button{width:100%!important}.um-directory.uimob340 .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-footer.no-reveal:not(.no-photo) .um-member-card-footer-buttons{width:calc(100% - 70px)}.um-directory.uimob340 .um-members-pagination-box .um-members-pagi{display:none}.um-directory.uimob500 .um-member-directory-header .um-member-directory-header-row .um-member-directory-search-line{width:100%}.um-directory.uimob500 .um-member-directory-header .um-member-directory-header-row.um-member-directory-search-row{justify-content:flex-start}.um-directory.uimob500 .um-member-directory-header .um-member-directory-header-row .um-member-directory-nav-line .um-member-directory-view-type{width:20px;font-size:20px;line-height:20px;margin:0 5px 0 0}.um-directory.uimob500 .um-member-directory-header .um-search{grid-template-columns:repeat(1,1fr)}.um-directory.uimob500 .um-members-wrapper .um-members .um-member{width:100%}.um-directory.uimob500 .um-members-wrapper .um-members.um-members-grid .um-gutter-sizer{width:0}.um-directory.uimob500 .um-members-wrapper .um-members.um-members-list .um-member .um-member-photo{width:70px;margin:0 10px 0 0}.um-directory.uimob500 .um-members-wrapper .um-members.um-members-list .um-member .um-member-photo a{width:70px;height:70px}.um-directory.uimob500 .um-members-wrapper .um-members.um-members-list .um-member .um-member-photo a img{width:70px;height:70px}.um-directory.uimob500 .um-members-wrapper .um-members.um-members-list .um-member .um-member-card{width:calc(100% - 80px)}.um-directory.uimob500 .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-footer{align-items:flex-start}.um-directory.uimob500 .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-footer .um-member-card-footer-buttons{flex-wrap:wrap;width:calc(100% - 110px);margin:0 10px 0 0}.um-directory.uimob500 .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-footer .um-member-card-footer-buttons .um-members-list-footer-button-wrapper{margin:0 10px 5px 0}.um-directory.uimob500 .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-footer.no-reveal:not(.no-photo) .um-member-card-footer-buttons{width:calc(100% - 90px)}.um-directory.uimob500 .um-members-pagination-box .um-members-pagi{display:none}.um-directory.uimob800 .um-member-directory-header .um-member-directory-header-row .um-member-directory-search-line{width:100%}.um-directory.uimob800 .um-member-directory-header .um-search{grid-template-columns:repeat(2,1fr)}.um-directory.uimob800 .um-members-wrapper .um-members.um-members-grid .um-gutter-sizer{width:4%}.um-directory.uimob800 .um-members-wrapper .um-members.um-members-grid .um-member{width:48%}.um-directory.uimob800 .um-members-wrapper .um-members.um-members-list .um-member .um-member-photo{width:80px;margin:0 10px 0 0}.um-directory.uimob800 .um-members-wrapper .um-members.um-members-list .um-member .um-member-photo a{width:80px;height:80px}.um-directory.uimob800 .um-members-wrapper .um-members.um-members-list .um-member .um-member-photo a img{width:80px;height:80px}.um-directory.uimob800 .um-members-wrapper .um-members.um-members-list .um-member .um-member-card{width:calc(100% - 90px)}.um-directory.uimob800 .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-footer{align-items:flex-start}.um-directory.uimob800 .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-footer .um-member-card-footer-buttons{flex-wrap:wrap;width:calc(100% - 120px);margin:0 10px 0 0}.um-directory.uimob800 .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-footer .um-member-card-footer-buttons .um-members-list-footer-button-wrapper{margin:0 10px 5px 0}.um-directory.uimob800 .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-footer.no-reveal:not(.no-photo) .um-member-card-footer-buttons{width:calc(100% - 100px)}.um-directory.uimob960 .um-member-directory-header .um-search{grid-template-columns:repeat(2,1fr)}.um-directory.uimob960 .um-members-wrapper .um-members.um-members-grid .um-gutter-sizer{width:4%}.um-directory.uimob960 .um-members-wrapper .um-members.um-members-grid .um-member{width:48%}.select2-container .select2-results li.select2-results__option[aria-disabled=true]{display:none} \ No newline at end of file +@-webkit-keyframes um-ajax-spinning{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@-moz-keyframes um-ajax-spinning{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@-ms-keyframes um-ajax-spinning{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes um-ajax-spinning{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}.um-new-dropdown{font-size:16px;margin:0;position:absolute;height:auto;background:#fff;z-index:10;display:none;border:1px solid #ddd;box-shadow:0 7px 14px 0 rgba(50,50,93,.1),0 3px 6px 0 rgba(0,0,0,.07);-webkit-box-shadow:0 7px 14px 0 rgba(50,50,93,.1),0 3px 6px 0 rgba(0,0,0,.07);box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;border-radius:5px 5px 5px 5px;-moz-border-radius:5px 5px 5px 5px;-webkit-border-radius:5px 5px 5px 5px}.um-new-dropdown ul{margin:0;padding:0}.um-new-dropdown ul li{list-style-type:none;padding:0;margin:0}.um-new-dropdown ul li a{display:block;padding:8px 12px;line-height:1}.um-new-dropdown-arr{position:absolute;font-size:24px;width:24px;height:24px;overflow:hidden;z-index:15;color:#eee}.um-new-dropdown-arr *{display:block;width:24px;height:24px;vertical-align:bottom;overflow:hidden;line-height:24px}body #content .um-directory a{text-decoration:none;border-bottom:none;box-shadow:none}body #content .um-directory a:focus,body #content .um-directory a:hover{text-decoration:none;border-bottom:none;box-shadow:none}.um-directory{display:flex;flex-direction:column;justify-content:flex-start;align-items:stretch;flex-wrap:nowrap;position:relative}.um-directory a{text-decoration:none;border-bottom:none;box-shadow:none}.um-directory a:focus,.um-directory a:hover{text-decoration:none;border-bottom:none;box-shadow:none}.um-directory .select2-container--disabled{opacity:.6}.um-directory .um-members-overlay{display:none;position:absolute;width:100%;top:0;bottom:0;background:0 0;z-index:2}.um-directory .um-members-overlay .um-ajax-loading{-webkit-transition:.1s opacity;-moz-transition:.1s opacity;-ms-transition:.1s opacity;-o-transition:.1s opacity;transition:.1s opacity;color:#c6c6c6!important;-webkit-animation:um-ajax-spinning 1.1s infinite linear;animation:um-ajax-spinning 1.1s infinite linear;border-top:.2em solid rgba(198,198,198,.2);border-right:.2em solid rgba(198,198,198,.2);border-bottom:.2em solid rgba(198,198,198,.2);border-left:.2em solid #c6c6c6;font-size:1.75em;position:absolute;left:calc(50% - 1.75em);top:calc(50% - 1.75em);-ms-transform:translateZ(0);transform:translateZ(0);border-radius:50%;display:block;width:2.5em;height:2.5em;margin:0;outline:0;padding:0;vertical-align:baseline}.um-directory .um-member-directory-header{display:flex;flex-direction:column;justify-content:flex-start;align-items:stretch;flex-wrap:nowrap;width:100%}.um-directory .um-member-directory-header .um-member-directory-header-row.um-member-directory-filters-bar{padding:0 0 10px 0}.um-directory .um-member-directory-header .um-member-directory-header-row:not(.um-member-directory-filters-bar){display:flex;flex-direction:row;justify-content:flex-start;align-items:baseline;flex-wrap:nowrap;margin:0 0 10px 0}.um-directory .um-member-directory-header .um-member-directory-header-row.um-header-row-invisible{margin:0}.um-directory .um-member-directory-header .um-member-directory-header-row.um-member-directory-search-row{justify-content:flex-end}.um-directory .um-member-directory-header .um-member-directory-header-row .um-member-directory-search-line{display:flex;flex-direction:row;justify-content:flex-start;align-items:center;flex-wrap:nowrap;width:60%}.um-directory .um-member-directory-header .um-member-directory-header-row .um-member-directory-search-line label{flex:1;margin:0 10px 0 0;min-width:90px;max-width:85%}.um-directory .um-member-directory-header .um-member-directory-header-row .um-member-directory-search-line label span{display:none;margin:0 5px 0 0}.um-directory .um-member-directory-header .um-member-directory-header-row .um-member-directory-search-line label .um-search-line{-webkit-appearance:textfield;width:100%;box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box}.um-directory .um-member-directory-header .um-member-directory-header-row .um-member-directory-search-line .um-do-search{min-width:15%;width:auto}.um-directory .um-member-directory-header .um-member-directory-header-row .um-member-directory-nav-line{display:flex;flex-direction:row;justify-content:space-between;align-items:center;flex-wrap:nowrap;width:100%}.um-directory .um-member-directory-header .um-member-directory-header-row .um-member-directory-nav-line .um-member-directory-view-type{font-size:30px;line-height:30px;margin:0 10px 0 0;width:30px}.um-directory .um-member-directory-header .um-member-directory-header-row .um-member-directory-nav-line .um-member-directory-view-type .um-member-directory-view-type-a{color:#ddd;display:none}.um-directory .um-member-directory-header .um-member-directory-header-row .um-member-directory-nav-line .um-member-directory-view-type.um-disabled{cursor:default}.um-directory .um-member-directory-header .um-member-directory-header-row .um-member-directory-nav-line .um-member-directory-view-type.um-disabled a{cursor:default}.um-directory .um-member-directory-header .um-member-directory-header-row .um-member-directory-nav-line .um-member-directory-view-type:not(.um-disabled) .um-member-directory-view-type-a:hover{color:#ccc}.um-directory .um-member-directory-header .um-member-directory-header-row .um-member-directory-nav-line .um-member-directory-view-type:not(.um-disabled) .um-member-directory-view-type-a:focus{color:#ddd}.um-directory .um-member-directory-header .um-member-directory-header-row .um-member-directory-nav-line .um-member-directory-sorting{display:flex;flex-direction:row;justify-content:flex-start;align-items:baseline;flex-wrap:nowrap;flex:5}.um-directory .um-member-directory-header .um-member-directory-header-row .um-member-directory-nav-line .um-member-directory-sorting .um-member-directory-sorting-a{display:flex;flex-direction:row;justify-content:flex-start;align-items:baseline;flex-wrap:nowrap;position:relative;cursor:pointer}.um-directory .um-member-directory-header .um-member-directory-header-row .um-member-directory-nav-line .um-member-directory-sorting .um-member-directory-sorting-a a{margin:0 5px 0 0}.um-directory .um-member-directory-header .um-member-directory-header-row .um-member-directory-nav-line .um-member-directory-sorting .um-member-directory-sorting-a i.um-faicon-caret-down{display:inline}.um-directory .um-member-directory-header .um-member-directory-header-row .um-member-directory-nav-line .um-member-directory-sorting .um-member-directory-sorting-a i.um-faicon-caret-up{display:none}.um-directory .um-member-directory-header .um-member-directory-header-row .um-member-directory-nav-line .um-member-directory-sorting .um-member-directory-sorting-a.um-member-directory-sorting-visible i.um-faicon-caret-down{display:none}.um-directory .um-member-directory-header .um-member-directory-header-row .um-member-directory-nav-line .um-member-directory-sorting .um-member-directory-sorting-a.um-member-directory-sorting-visible i.um-faicon-caret-up{display:inline}.um-directory .um-member-directory-header .um-member-directory-header-row .um-member-directory-nav-line .um-member-directory-sorting .um-member-directory-sorting-a .um-new-dropdown{top:24px;width:200px;left:-12px}.um-directory .um-member-directory-header .um-member-directory-header-row .um-member-directory-nav-line .um-member-directory-sorting .um-member-directory-sorting-a .um-new-dropdown li a[data-selected="1"]{display:none}.um-directory .um-member-directory-header .um-member-directory-header-row .um-member-directory-nav-line .um-member-directory-filters{display:flex;flex-direction:row;justify-content:flex-end;align-items:baseline;flex-wrap:nowrap;flex:2;text-align:right}.um-directory .um-member-directory-header .um-member-directory-header-row .um-member-directory-nav-line .um-member-directory-filters .um-member-directory-filters-a{display:flex;flex-direction:row;justify-content:flex-start;align-items:baseline;flex-wrap:nowrap;cursor:pointer}.um-directory .um-member-directory-header .um-member-directory-header-row .um-member-directory-nav-line .um-member-directory-filters .um-member-directory-filters-a a{margin:0 5px 0 0}.um-directory .um-member-directory-header .um-member-directory-header-row .um-member-directory-nav-line .um-member-directory-filters .um-member-directory-filters-a i.um-faicon-caret-down{display:inline}.um-directory .um-member-directory-header .um-member-directory-header-row .um-member-directory-nav-line .um-member-directory-filters .um-member-directory-filters-a i.um-faicon-caret-up{display:none}.um-directory .um-member-directory-header .um-member-directory-header-row .um-member-directory-nav-line .um-member-directory-filters .um-member-directory-filters-a.um-member-directory-filters-visible i.um-faicon-caret-down{display:none}.um-directory .um-member-directory-header .um-member-directory-header-row .um-member-directory-nav-line .um-member-directory-filters .um-member-directory-filters-a.um-member-directory-filters-visible i.um-faicon-caret-up{display:inline}.um-directory .um-member-directory-header .um-member-directory-header-row .um-search{margin:0;width:100%;display:grid;grid-template-rows:auto 1fr;grid-template-columns:repeat(3,1fr);grid-gap:10px;grid-auto-rows:minmax(max-content,auto);-ms-grid-template-rows:auto 1fr;-ms-grid-template-columns:repeat(3,1fr);-ms-grid-gap:10px;-ms-grid-auto-rows:minmax(max-content,auto);align-items:center}.um-directory .um-member-directory-header .um-member-directory-header-row .um-search .um-search-filter{display:flex;flex-direction:row;justify-content:flex-start;align-items:baseline;flex-wrap:nowrap;width:100%;position:relative}.um-directory .um-member-directory-header .um-member-directory-header-row .um-search .um-search-filter .select2-container{float:left;width:100%!important}.um-directory .um-member-directory-header .um-member-directory-header-row .um-search .um-search-filter .um-s1{width:100%}.um-directory .um-member-directory-header .um-member-directory-header-row .um-search .um-search-filter.um-text-filter-type input{width:100%}.um-directory .um-member-directory-header .um-member-directory-header-row .um-search .um-search-filter.um-slider-filter-type{flex-direction:column;align-items:stretch}.um-directory .um-member-directory-header .um-member-directory-header-row .um-search .um-search-filter.um-slider-filter-type .um-slider{width:calc(100% - 16px)}.um-directory .um-member-directory-header .um-member-directory-header-row .um-search .um-search-filter.um-slider-filter-type .um-slider .ui-slider-range.ui-widget-header{background:#44b0ec;border:1px solid #44b0ec!important;margin-top:-1px}.um-directory .um-member-directory-header .um-member-directory-header-row .um-search .um-search-filter.um-slider-filter-type .um-slider.ui-slider.ui-slider-horizontal{border:1px solid #ddd!important;box-sizing:border-box;margin:4px 8px 0 8px}.um-directory .um-member-directory-header .um-member-directory-header-row .um-search .um-search-filter.um-slider-filter-type .um-slider-range{display:flex;flex-direction:row;justify-content:flex-start;align-items:baseline;flex-wrap:nowrap;margin:6px 0 0 8px;font-size:.8em}.um-directory .um-member-directory-header .um-member-directory-header-row .um-search .um-search-filter.um-datepicker-filter-type,.um-directory .um-member-directory-header .um-member-directory-header-row .um-search .um-search-filter.um-timepicker-filter-type{display:flex;flex-direction:row;justify-content:flex-start;align-items:baseline;flex-wrap:nowrap}.um-directory .um-member-directory-header .um-member-directory-header-row .um-search .um-search-filter.um-datepicker-filter-type input,.um-directory .um-member-directory-header .um-member-directory-header-row .um-search .um-search-filter.um-timepicker-filter-type input{width:calc(50% - 5px);margin:0 5px 0 0!important;box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box}.um-directory .um-member-directory-header .um-member-directory-header-row .um-search .um-search-filter.um-datepicker-filter-type input:nth-child(even),.um-directory .um-member-directory-header .um-member-directory-header-row .um-search .um-search-filter.um-timepicker-filter-type input:nth-child(even){margin:0 0 0 5px!important}.um-directory .um-member-directory-header .um-member-directory-header-row .um-search[style*="overflow: hidden;"] .um-search-filter{pointer-events:none}.um-directory .um-member-directory-header .um-member-directory-header-row .um-search.um-search-invisible{display:none}.um-directory .um-member-directory-header .um-member-directory-header-row .um-filtered-line{display:flex;flex-direction:row;justify-content:flex-start;align-items:baseline;flex-wrap:wrap;margin:0;padding:0;box-sizing:border-box;border:none}.um-directory .um-member-directory-header .um-member-directory-header-row .um-filtered-line .um-members-filter-tag{display:flex;flex-direction:row;justify-content:flex-start;align-items:center;flex-wrap:nowrap;margin:0 10px 5px 0;padding:0 10px;border-radius:3px;cursor:default;background:#f1f1f1;font-size:13px}.um-directory .um-member-directory-header .um-member-directory-header-row .um-filtered-line .um-members-filter-tag:first-child{margin-left:0}.um-directory .um-member-directory-header .um-member-directory-header-row .um-filtered-line .um-members-filter-tag .um-members-filter-remove{float:right;display:inline-block;margin-left:10px;cursor:pointer;font-weight:700;font-size:20px}.um-directory .um-member-directory-header .um-member-directory-header-row .um-filtered-line .um-members-filter-tag .um-members-filter-remove:hover{color:#a00}.um-directory .um-member-directory-header .um-member-directory-header-row .um-filtered-line .um-clear-filters{display:none}.um-directory .um-member-directory-header .um-member-directory-header-row .um-filtered-line .um-clear-filters a{padding:3px 10px;margin:0 10px}.um-directory .um-members-wrapper{display:flex;flex-direction:column;justify-content:flex-start;align-items:stretch;flex-wrap:nowrap;width:100%;margin:0 0 10px 0;padding:0;position:relative;height:300px}.um-directory .um-members-wrapper .um-members-intro{text-align:center;margin:0 0 10px 0}.um-directory .um-members-wrapper .um-members-total{font-size:20px;font-weight:300}.um-directory .um-members-wrapper .um-members{width:100%;margin:0;padding:0;-ms-word-break:break-all;word-break:break-word;word-wrap:break-word}.um-directory .um-members-wrapper .um-members .um-member{border:1px solid #ddd;box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box}.um-directory .um-members-wrapper .um-members .um-member .um-member-photo.radius-1 a img{-moz-border-radius:999px!important;-webkit-border-radius:999px!important;border-radius:999px!important}.um-directory .um-members-wrapper .um-members .um-member .um-member-photo.radius-1.radius-2 a img{-moz-border-radius:4px!important;-webkit-border-radius:4px!important;border-radius:4px!important}.um-directory .um-members-wrapper .um-members .um-member .um-member-photo.radius-1.radius-3 a img{-moz-border-radius:0!important;-webkit-border-radius:0!important;border-radius:0!important}.um-directory .um-members-wrapper .um-members .um-member .um-member-card .um-member-name{display:flex;flex-direction:row;justify-content:flex-start;align-items:baseline;flex-wrap:nowrap}.um-directory .um-members-wrapper .um-members .um-member .um-member-card .um-member-name a{display:flex;flex-direction:row;justify-content:flex-start;align-items:center;flex-wrap:nowrap}.um-directory .um-members-wrapper .um-members img{display:block;overflow:hidden;-moz-border-radius:0;-webkit-border-radius:0;border-radius:0;margin:0;padding:0}.um-directory .um-members-wrapper .um-members.um-members-grid .um-gutter-sizer{width:5%}.um-directory .um-members-wrapper .um-members.um-members-grid .um-member{float:left;width:30%;background:#fff;text-align:center;margin-bottom:40px;position:relative}.um-directory .um-members-wrapper .um-members.um-members-grid .um-member .um-member-status{display:none;background:#999}.um-directory .um-members-wrapper .um-members.um-members-grid .um-member .um-member-status.awaiting_admin_review,.um-directory .um-members-wrapper .um-members.um-members-grid .um-member .um-member-status.inactive,.um-directory .um-members-wrapper .um-members.um-members-grid .um-member .um-member-status.rejected{display:block;position:absolute;top:0;left:0;width:100%;padding:7px 15px;color:#fff;z-index:10;font-size:13px;box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box}.um-directory .um-members-wrapper .um-members.um-members-grid .um-member .um-member-status.awaiting_admin_review{background:#c74a4a}.um-directory .um-members-wrapper .um-members.um-members-grid .um-member .um-member-photo{padding:40px 0 20px 0;text-align:center}.um-directory .um-members-wrapper .um-members.um-members-grid .um-member .um-member-photo a{text-decoration:none;box-shadow:none!important;display:inline!important}.um-directory .um-members-wrapper .um-members.um-members-grid .um-member .um-member-photo a img{display:inline!important;border:5px solid #fff;background:#fff;width:140px;height:140px;float:none!important}.um-directory .um-members-wrapper .um-members.um-members-grid .um-member.awaiting_admin_review,.um-directory .um-members-wrapper .um-members.um-members-grid .um-member.inactive,.um-directory .um-members-wrapper .um-members.um-members-grid .um-member.rejected{opacity:.7}.um-directory .um-members-wrapper .um-members.um-members-grid .um-member.with-cover .um-member-photo{padding-top:0}.um-directory .um-members-wrapper .um-members.um-members-grid .um-member.with-cover .um-member-photo a img{width:90px;height:90px;position:relative;top:-35px;margin-bottom:-45px;float:none;opacity:1}.um-directory .um-members-wrapper .um-members.um-members-grid .um-member .um-member-cover{background-color:#eee;box-sizing:border-box;position:relative;min-height:50px}.um-directory .um-members-wrapper .um-members.um-members-grid .um-member .um-member-cover[data-ratio]{overflow-y:hidden}.um-directory .um-members-wrapper .um-members.um-members-grid .um-member .um-member-cover .um-member-cover-e{text-align:center;box-sizing:border-box}.um-directory .um-members-wrapper .um-members.um-members-grid .um-member .um-member-cover .um-member-cover-e img{width:100%!important}.um-directory .um-members-wrapper .um-members.um-members-grid .um-member .um-member-card{padding-bottom:15px}.um-directory .um-members-wrapper .um-members.um-members-grid .um-member .um-member-card.no-photo{padding-top:30px}.um-directory .um-members-wrapper .um-members.um-members-grid .um-member .um-member-card .um-member-name{margin:0 0 4px 0;justify-content:center}.um-directory .um-members-wrapper .um-members.um-members-grid .um-member .um-member-card .um-member-name a{font-size:16px;line-height:26px;color:#444;font-weight:700}.um-directory .um-members-wrapper .um-members.um-members-grid .um-member .um-member-card .um-members-edit-btn{margin:2px 0;height:40px}.um-directory .um-members-wrapper .um-members.um-members-grid .um-member .um-member-card .um-members-edit-btn a.um-edit-profile-btn{padding:10px 15px!important;transition:none!important;display:inline-block!important;margin:0 auto!important;min-width:110px;width:auto;text-align:center;font-size:13px}.um-directory .um-members-wrapper .um-members.um-members-grid .um-member .um-member-card .um-members-edit-btn a.um-edit-profile-btn:before{font-family:FontAwesome;margin-right:8px;width:14px;text-align:left;display:inline-block;font-size:16px;position:relative;left:0;top:1px;content:"\f013"}.um-directory .um-members-wrapper .um-members.um-members-grid .um-member .um-member-card .um-member-tagline{font-size:13px;line-height:22px;color:#999;padding:0 15px}.um-directory .um-members-wrapper .um-members.um-members-grid .um-member .um-member-card .um-member-meta-main .um-member-meta{display:none;margin:20px 15px 0 15px;padding:15px 0;border-top:1px solid #e5e5e5}.um-directory .um-members-wrapper .um-members.um-members-grid .um-member .um-member-card .um-member-meta-main .um-member-meta.no-animate{display:block}.um-directory .um-members-wrapper .um-members.um-members-grid .um-member .um-member-card .um-member-meta-main .um-member-meta .um-member-metaline{font-size:13px;padding:12px 0 0 0;line-height:16px;vertical-align:middle}.um-directory .um-members-wrapper .um-members.um-members-grid .um-member .um-member-card .um-member-meta-main .um-member-meta .um-member-metaline strong{display:block;clear:both}.um-directory .um-members-wrapper .um-members.um-members-grid .um-member .um-member-card .um-member-meta-main .um-member-meta .um-member-metaline span{display:block;text-align:center}.um-directory .um-members-wrapper .um-members.um-members-grid .um-member .um-member-card .um-member-meta-main .um-member-meta .um-member-connect{padding-top:20px}.um-directory .um-members-wrapper .um-members.um-members-grid .um-member .um-member-card .um-member-meta-main .um-member-meta .um-member-connect a{display:inline-block;width:40px;line-height:40px;height:40px;-moz-border-radius:999px;-webkit-border-radius:999px;border-radius:999px;color:#fff!important;opacity:.85;margin:0 1px;font-size:22px;transition:.25s}.um-directory .um-members-wrapper .um-members.um-members-grid .um-member .um-member-card .um-member-meta-main .um-member-meta .um-member-connect a:hover{opacity:1;color:#fff}.um-directory .um-members-wrapper .um-members.um-members-grid .um-member .um-member-card .um-member-meta-main .um-member-less{display:none}.um-directory .um-members-wrapper .um-members.um-members-grid .um-member .um-member-card .um-member-meta-main .um-member-less a{color:#666;display:inline-block}.um-directory .um-members-wrapper .um-members.um-members-grid .um-member .um-member-card .um-member-meta-main .um-member-less a i{display:block;font-size:32px;height:32px;line-height:32px}.um-directory .um-members-wrapper .um-members.um-members-grid .um-member .um-member-card .um-member-meta-main .um-member-more a{color:#666;display:inline-block}.um-directory .um-members-wrapper .um-members.um-members-grid .um-member .um-member-card .um-member-meta-main .um-member-more a i{display:block;font-size:32px;height:32px;line-height:32px}.um-directory .um-members-wrapper .um-members.um-members-list{display:grid;grid-template-rows:auto 1fr;grid-template-columns:repeat(1,1fr);grid-gap:10px;grid-auto-rows:minmax(max-content,auto);-ms-grid-template-rows:auto 1fr;-ms-grid-template-columns:repeat(1,1fr);-ms-grid-gap:10px;-ms-grid-auto-rows:minmax(max-content,auto);align-items:center}.um-directory .um-members-wrapper .um-members.um-members-list .um-member{display:flex;flex-direction:column;justify-content:flex-start;align-items:stretch;flex-wrap:nowrap;width:100%;padding:15px;margin:0;background:#fff;box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box}.um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-status{display:none;background:#999}.um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-status.awaiting_admin_review,.um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-status.inactive,.um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-status.rejected{display:block;width:100%;padding:7px 15px;margin-bottom:10px;color:#fff;font-size:13px;box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box}.um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-status.awaiting_admin_review{background:#c74a4a}.um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-container{display:flex;flex-direction:row;justify-content:flex-start;align-items:flex-start;flex-wrap:nowrap;width:100%;margin:0 0 10px 0;padding:0}.um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-container .um-member-photo{width:100px;margin:0 15px 0 0;padding:0}.um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-container .um-member-photo a{width:100px;height:100px;display:block}.um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-container .um-member-photo a img{width:100px;height:100px;position:relative;top:0;margin:0;margin-bottom:0;border:none}.um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-container .um-member-card{display:flex;flex-direction:row;justify-content:flex-start;align-items:flex-start;flex-wrap:nowrap;width:calc(100% - 115px);padding:0;margin:0;box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box}.um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-container .um-member-card.no-photo{width:100%}.um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-container .um-member-card .um-member-card-content{display:flex;flex-direction:column;justify-content:flex-start;align-items:stretch;flex-wrap:nowrap;width:calc(100% - 30px);margin:0 10px 0 0}.um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-container .um-member-card .um-member-card-content .um-member-card-header{width:100%}.um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-container .um-member-card .um-member-card-content .um-member-card-header .um-member-name{margin:0 0 4px 0}.um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-container .um-member-card .um-member-card-content .um-member-card-header .um-member-name a{font-size:16px;line-height:26px;color:#444;font-weight:700}.um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-container .um-member-card .um-member-card-content .um-member-tagline{display:flex;flex-direction:row;justify-content:flex-start;align-items:baseline;flex-wrap:wrap;width:100%;font-size:13px;color:#999;padding:0;box-sizing:border-box}.um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-container .um-member-card .um-member-card-content .um-member-meta-main{width:100%;padding:0;box-sizing:border-box;display:none}.um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-container .um-member-card .um-member-card-content .um-member-meta-main.no-animate{display:block}.um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-container .um-member-card .um-member-card-content .um-member-meta-main .um-member-meta{float:left;width:100%;display:block;margin:10px 0 0 0;box-sizing:border-box;border:none}.um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-container .um-member-card .um-member-card-content .um-member-meta-main .um-member-meta .um-member-metaline{display:flex;flex-direction:row;justify-content:flex-start;align-items:center;flex-wrap:wrap;font-size:13px;padding:12px 0 0 0;line-height:16px;width:100%}.um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-container .um-member-card .um-member-card-content .um-member-meta-main .um-member-meta .um-member-connect{padding-top:10px}.um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-container .um-member-card .um-member-card-content .um-member-meta-main .um-member-meta .um-member-connect a{display:inline-block;width:40px;line-height:40px;height:40px;-moz-border-radius:999px;-webkit-border-radius:999px;border-radius:999px;color:#fff!important;opacity:.85;margin:0 1px;font-size:22px;transition:.25s;text-align:center}.um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-container .um-member-card .um-member-card-content .um-member-meta-main .um-member-meta .um-member-connect a:hover{opacity:1;color:#fff}.um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-container .um-member-card .um-member-card-actions{display:flex;flex-direction:column;justify-content:flex-start;align-items:flex-end;flex-wrap:nowrap;width:20px;text-align:right;padding:0}.um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-container .um-member-card .um-member-card-actions .um-member-cog{position:relative}.um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-container .um-member-card .um-member-card-actions .um-member-cog .um-member-actions-a{line-height:1;display:block;color:#666}.um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-container .um-member-card .um-member-card-actions .um-member-cog .um-member-actions-a i{display:block;font-size:20px;line-height:1}.um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-container .um-member-card .um-member-card-actions .um-member-cog .um-new-dropdown{width:180px;right:0;text-align:left}.um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-container .um-member-card .um-member-card-actions a{box-sizing:border-box}.um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-footer{display:flex;flex-direction:row;justify-content:flex-end;align-items:center;flex-wrap:nowrap;width:100%}.um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-footer .um-member-card-footer-buttons{display:flex;flex-direction:row;justify-content:flex-start;align-items:baseline;flex-wrap:nowrap;width:calc(100% - 145px);margin:0 10px 0 0}.um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-footer .um-member-card-footer-buttons .um-members-list-footer-button-wrapper{display:flex;flex-direction:row;justify-content:flex-start;align-items:baseline;flex-wrap:nowrap;margin:0}.um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-footer .um-member-card-footer-buttons>:not(:last-child){margin:0 10px 0 0}.um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-footer .um-member-card-reveal-buttons{width:20px;text-align:right}.um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-footer .um-member-card-reveal-buttons .um-member-more{display:flex;flex-direction:column;justify-content:flex-start;align-items:baseline;flex-wrap:nowrap}.um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-footer .um-member-card-reveal-buttons .um-member-more a{color:#666;display:inline-block}.um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-footer .um-member-card-reveal-buttons .um-member-more a i{display:block;font-size:28px;height:28px;line-height:28px}.um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-footer .um-member-card-reveal-buttons .um-member-less{display:flex;flex-direction:column;justify-content:flex-start;align-items:baseline;flex-wrap:nowrap;display:none}.um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-footer .um-member-card-reveal-buttons .um-member-less a{color:#666;display:inline-block}.um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-footer .um-member-card-reveal-buttons .um-member-less a i{display:block;font-size:28px;height:28px;line-height:28px}.um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-footer.no-photo.no-reveal .um-member-card-footer-buttons{width:100%}.um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-footer.no-photo:not(.no-reveal) .um-member-card-footer-buttons{width:calc(100% - 30px)}.um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-footer.no-reveal:not(.no-photo) .um-member-card-footer-buttons{width:calc(100% - 125px)}.um-directory .um-members-wrapper .um-members .um-members-none{text-align:center;font-size:18px}.um-directory .um-members-pagination-box{width:100%;float:left;margin:0 0 10px 0;padding:0}.um-directory .um-members-pagination-box .um-members-pagi{display:flex;flex-direction:row;justify-content:center;align-items:baseline;flex-wrap:nowrap;width:100%;margin:0;padding:0;font-size:15px}.um-directory .um-members-pagination-box .um-members-pagi .pagi{cursor:pointer;display:inline-block;width:auto;height:34px;line-height:34px;transition:all .2s linear;padding:0 14px;color:#666!important;font-weight:400}.um-directory .um-members-pagination-box .um-members-pagi .pagi.pagi-arrow{line-height:38px}.um-directory .um-members-pagination-box .um-members-pagi .pagi.pagi-arrow i:before{font-size:20px;vertical-align:middle!important;height:34px;line-height:34px;top:-2px;position:relative}.um-directory .um-members-pagination-box .um-members-pagi .pagi.current{cursor:default;color:#fff!important}.um-directory .um-members-pagination-box .um-members-pagi .pagi.current:hover{color:#fff!important}.um-directory .um-members-pagination-box .um-members-pagi .pagi.disabled{cursor:default;opacity:.4}.um-directory .um-members-pagination-box .um-members-pagi .pagi.none{color:#aaa!important}.um-directory .um-members-pagination-box .um-members-pagidrop{width:100%;float:left;margin:0;text-align:center;padding:5px 0;font-size:15px}.um-directory.um-loaded .um-members-wrapper{height:auto}.um-directory[data-view_type=list] .um-member-directory-header .um-member-directory-header-row .um-member-directory-view-type .um-member-directory-view-type-a[data-type=list]{display:block}.um-directory[data-view_type=grid] .um-member-directory-header .um-member-directory-header-row .um-member-directory-view-type .um-member-directory-view-type-a[data-type=grid]{display:block}.um-directory[data-view_type=map] .um-member-directory-header .um-member-directory-header-row .um-member-directory-view-type .um-member-directory-view-type-a[data-type=map]{display:block}.um-directory.uimob340 .um-member-directory-header .um-member-directory-header-row .um-member-directory-search-line{width:100%}.um-directory.uimob340 .um-member-directory-header .um-member-directory-header-row.um-member-directory-search-row{justify-content:flex-start}.um-directory.uimob340 .um-member-directory-header .um-member-directory-header-row .um-member-directory-nav-line{flex-wrap:wrap}.um-directory.uimob340 .um-member-directory-header .um-member-directory-header-row .um-member-directory-nav-line .um-member-directory-view-type{width:20px;font-size:20px;line-height:20px;margin:0 2px 0 0}.um-directory.uimob340 .um-member-directory-header .um-member-directory-header-row .um-member-directory-nav-line .um-member-directory-sorting{width:calc(100% - 25px);justify-content:flex-end}.um-directory.uimob340 .um-member-directory-header .um-member-directory-header-row .um-member-directory-nav-line .um-member-directory-sorting .um-new-dropdown{right:0;left:auto}.um-directory.uimob340 .um-member-directory-header .um-member-directory-header-row .um-member-directory-nav-line .um-member-directory-filters{flex:none;width:100%}.um-directory.uimob340 .um-member-directory-header .um-search{grid-template-columns:repeat(1,1fr)}.um-directory.uimob340 .um-members-wrapper .um-members .um-member{width:100%}.um-directory.uimob340 .um-members-wrapper .um-members.um-members-grid .um-gutter-sizer{width:0}.um-directory.uimob340 .um-members-wrapper .um-members.um-members-list .um-member{padding:10px}.um-directory.uimob340 .um-members-wrapper .um-members.um-members-list .um-member .um-member-photo{width:50px;margin:0 10px 0 0}.um-directory.uimob340 .um-members-wrapper .um-members.um-members-list .um-member .um-member-photo a{width:50px;height:50px}.um-directory.uimob340 .um-members-wrapper .um-members.um-members-list .um-member .um-member-photo a img{width:50px;height:50px}.um-directory.uimob340 .um-members-wrapper .um-members.um-members-list .um-member .um-member-card{width:calc(100% - 60px)}.um-directory.uimob340 .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-footer{align-items:flex-start}.um-directory.uimob340 .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-footer .um-member-card-footer-buttons{display:flex;flex-direction:column;justify-content:flex-start;align-items:stretch;flex-wrap:nowrap;width:calc(100% - 90px);margin:0 10px 0 0}.um-directory.uimob340 .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-footer .um-member-card-footer-buttons .um-members-list-footer-button-wrapper{margin:0 0 5px 0}.um-directory.uimob340 .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-footer .um-member-card-footer-buttons .um-members-list-footer-button-wrapper a.um-button{width:100%!important}.um-directory.uimob340 .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-footer.no-reveal:not(.no-photo) .um-member-card-footer-buttons{width:calc(100% - 70px)}.um-directory.uimob340 .um-members-pagination-box .um-members-pagi{display:none}.um-directory.uimob500 .um-member-directory-header .um-member-directory-header-row .um-member-directory-search-line{width:100%}.um-directory.uimob500 .um-member-directory-header .um-member-directory-header-row.um-member-directory-search-row{justify-content:flex-start}.um-directory.uimob500 .um-member-directory-header .um-member-directory-header-row .um-member-directory-nav-line .um-member-directory-view-type{width:20px;font-size:20px;line-height:20px;margin:0 5px 0 0}.um-directory.uimob500 .um-member-directory-header .um-search{grid-template-columns:repeat(1,1fr)}.um-directory.uimob500 .um-members-wrapper .um-members .um-member{width:100%}.um-directory.uimob500 .um-members-wrapper .um-members.um-members-grid .um-gutter-sizer{width:0}.um-directory.uimob500 .um-members-wrapper .um-members.um-members-list .um-member .um-member-photo{width:70px;margin:0 10px 0 0}.um-directory.uimob500 .um-members-wrapper .um-members.um-members-list .um-member .um-member-photo a{width:70px;height:70px}.um-directory.uimob500 .um-members-wrapper .um-members.um-members-list .um-member .um-member-photo a img{width:70px;height:70px}.um-directory.uimob500 .um-members-wrapper .um-members.um-members-list .um-member .um-member-card{width:calc(100% - 80px)}.um-directory.uimob500 .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-footer{align-items:flex-start}.um-directory.uimob500 .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-footer .um-member-card-footer-buttons{flex-wrap:wrap;width:calc(100% - 110px);margin:0 10px 0 0}.um-directory.uimob500 .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-footer .um-member-card-footer-buttons .um-members-list-footer-button-wrapper{margin:0 10px 5px 0}.um-directory.uimob500 .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-footer.no-reveal:not(.no-photo) .um-member-card-footer-buttons{width:calc(100% - 90px)}.um-directory.uimob500 .um-members-pagination-box .um-members-pagi{display:none}.um-directory.uimob800 .um-member-directory-header .um-member-directory-header-row .um-member-directory-search-line{width:100%}.um-directory.uimob800 .um-member-directory-header .um-search{grid-template-columns:repeat(2,1fr)}.um-directory.uimob800 .um-members-wrapper .um-members.um-members-grid .um-gutter-sizer{width:4%}.um-directory.uimob800 .um-members-wrapper .um-members.um-members-grid .um-member{width:48%}.um-directory.uimob800 .um-members-wrapper .um-members.um-members-list .um-member .um-member-photo{width:80px;margin:0 10px 0 0}.um-directory.uimob800 .um-members-wrapper .um-members.um-members-list .um-member .um-member-photo a{width:80px;height:80px}.um-directory.uimob800 .um-members-wrapper .um-members.um-members-list .um-member .um-member-photo a img{width:80px;height:80px}.um-directory.uimob800 .um-members-wrapper .um-members.um-members-list .um-member .um-member-card{width:calc(100% - 90px)}.um-directory.uimob800 .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-footer{align-items:flex-start}.um-directory.uimob800 .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-footer .um-member-card-footer-buttons{flex-wrap:wrap;width:calc(100% - 120px);margin:0 10px 0 0}.um-directory.uimob800 .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-footer .um-member-card-footer-buttons .um-members-list-footer-button-wrapper{margin:0 10px 5px 0}.um-directory.uimob800 .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-footer.no-reveal:not(.no-photo) .um-member-card-footer-buttons{width:calc(100% - 100px)}.um-directory.uimob960 .um-member-directory-header .um-search{grid-template-columns:repeat(2,1fr)}.um-directory.uimob960 .um-members-wrapper .um-members.um-members-grid .um-gutter-sizer{width:4%}.um-directory.uimob960 .um-members-wrapper .um-members.um-members-grid .um-member{width:48%}.select2-container .select2-results li.select2-results__option[aria-disabled=true]{display:none} \ No newline at end of file diff --git a/assets/js/admin/block-restrictions.min.js b/assets/js/admin/block-restrictions.min.js index 203ca795..becb5ed6 100644 --- a/assets/js/admin/block-restrictions.min.js +++ b/assets/js/admin/block-restrictions.min.js @@ -1 +1 @@ -var um_components=wp.components,umSelectControl=um_components.SelectControl,umTextareaControl=um_components.TextareaControl;function um_admin_blocks_custom_fields(e,t){return wp.hooks.applyFilters("um_admin_blocks_custom_fields",[],e,t)}var um_block_restriction=wp.compose.createHigherOrderComponent(function(s){var _={um_who_access:"um_block_settings_hide",um_roles_access:"um_block_settings_hide",um_message_type:"um_block_settings_hide",um_message_content:"um_block_settings_hide"},_=wp.hooks.applyFilters("um_admin_blocks_condition_fields_default",_);return function(t){var e=void 0!==t.attributes.um_is_restrict&&t.attributes.um_is_restrict;return!0!==t.attributes.um_is_restrict?(_.um_who_access="um_block_settings_hide",_.um_roles_access="um_block_settings_hide",_.um_message_type="um_block_settings_hide",_.um_message_content="um_block_settings_hide"):(_.um_who_access="",0===parseInt(t.attributes.um_who_access)||void 0===t.attributes.um_who_access?(_.um_roles_access="um_block_settings_hide",_.um_message_type="um_block_settings_hide",_.um_message_content="um_block_settings_hide"):(1===parseInt(t.attributes.um_who_access)&&(_.um_roles_access=""),_.um_message_type="",2===parseInt(t.attributes.um_message_type)?_.um_message_content="":_.um_message_content="um_block_settings_hide")),_=wp.hooks.applyFilters("um_admin_blocks_condition_fields",_,t),wp.element.createElement(wp.element.Fragment,{},wp.element.createElement(s,t),wp.element.createElement(wp.blockEditor.InspectorControls,{},wp.element.createElement(wp.components.PanelBody,{title:wp.i18n.__("Ultimate Member: Content Restriction","ultimate-member"),className:"um_block_settings"},wp.element.createElement(wp.components.ToggleControl,{label:wp.i18n.__("Restrict access?","ultimate-member"),checked:e,onChange:function(e){t.setAttributes({um_is_restrict:e}),!1===e?(_.um_who_access="um_block_settings_hide",_.um_roles_access="um_block_settings_hide",_.um_message_type="um_block_settings_hide",_.um_message_content="um_block_settings_hide"):_.um_who_access="",_=wp.hooks.applyFilters("um_admin_blocks_condition_fields_on_change",_,"um_is_restrict",e)}}),wp.element.createElement(umSelectControl,{type:"number",className:_.um_who_access,label:wp.i18n.__("Who can access this block?","ultimate-member"),value:t.attributes.um_who_access,options:[{label:wp.i18n.__("Everyone","ultimate-member"),value:0},{label:wp.i18n.__("Logged in users","ultimate-member"),value:1},{label:wp.i18n.__("Logged out users","ultimate-member"),value:2}],onChange:function(e){t.setAttributes({um_who_access:e}),0===parseInt(e)?(_.um_message_type="um_block_settings_hide",_.um_message_content="um_block_settings_hide",_.um_roles_access="um_block_settings_hide"):1===parseInt(e)?(_.um_message_type="",_.um_roles_access=""):(_.um_message_type="",_.um_roles_access="um_block_settings_hide"),_=wp.hooks.applyFilters("um_admin_blocks_condition_fields_on_change",_,"um_who_access",e)}}),wp.element.createElement(umSelectControl,{multiple:!0,className:_.um_roles_access,label:wp.i18n.__("What roles can access this block?","ultimate-member"),value:t.attributes.um_roles_access,options:um_restrict_roles,onChange:function(e){t.setAttributes({um_roles_access:e})}}),wp.element.createElement(umSelectControl,{type:"number",className:_.um_message_type,label:wp.i18n.__("Restriction action","ultimate-member"),value:t.attributes.um_message_type,options:[{label:wp.i18n.__("Hide block","ultimate-member"),value:0},{label:wp.i18n.__("Show global default message","ultimate-member"),value:1},{label:wp.i18n.__("Show custom message","ultimate-member"),value:2}],onChange:function(e){t.setAttributes({um_message_type:e}),2===parseInt(e)?_.um_message_content="":_.um_message_content="um_block_settings_hide"}}),wp.element.createElement(umTextareaControl,{type:"number",className:_.um_message_content,label:wp.i18n.__("Custom restricted access message","ultimate-member"),value:t.attributes.um_message_content,onChange:function(e){t.setAttributes({um_message_content:e})}}),um_admin_blocks_custom_fields(_,t))))}},"um_block_restriction");wp.hooks.addFilter("editor.BlockEdit","um-block/um_block_restriction",um_block_restriction); \ No newline at end of file +var um_components=wp.components,umSelectControl=um_components.SelectControl,umTextareaControl=um_components.TextareaControl;function um_admin_blocks_custom_fields(e,t){return wp.hooks.applyFilters("um_admin_blocks_custom_fields",[],e,t)}function um_add_restriction_attributes(e,t){return e.attributes=Object.assign(e.attributes,{um_is_restrict:{type:"boolean",default:!1},um_who_access:{type:"string",default:"0"},um_roles_access:{type:"array",default:[]},um_message_type:{type:"string",default:"0"},um_message_content:{type:"string",default:""}}),e}wp.hooks.addFilter("blocks.registerBlockType","um-block/add-restriction-attributes",um_add_restriction_attributes);var um_block_restriction=wp.compose.createHigherOrderComponent(function(s){var _={um_who_access:"um_block_settings_hide",um_roles_access:"um_block_settings_hide",um_message_type:"um_block_settings_hide",um_message_content:"um_block_settings_hide"},_=wp.hooks.applyFilters("um_admin_blocks_condition_fields_default",_);return function(t){var e=void 0!==t.attributes.um_is_restrict&&t.attributes.um_is_restrict;return!0!==t.attributes.um_is_restrict?(_.um_who_access="um_block_settings_hide",_.um_roles_access="um_block_settings_hide",_.um_message_type="um_block_settings_hide",_.um_message_content="um_block_settings_hide"):(_.um_who_access="",0===parseInt(t.attributes.um_who_access)||void 0===t.attributes.um_who_access?(_.um_roles_access="um_block_settings_hide",_.um_message_type="um_block_settings_hide",_.um_message_content="um_block_settings_hide"):(1===parseInt(t.attributes.um_who_access)&&(_.um_roles_access=""),_.um_message_type="",2===parseInt(t.attributes.um_message_type)?_.um_message_content="":_.um_message_content="um_block_settings_hide")),_=wp.hooks.applyFilters("um_admin_blocks_condition_fields",_,t),wp.element.createElement(wp.element.Fragment,{},wp.element.createElement(s,t),wp.element.createElement(wp.blockEditor.InspectorControls,{},wp.element.createElement(wp.components.PanelBody,{title:wp.i18n.__("Ultimate Member: Content Restriction","ultimate-member"),className:"um_block_settings"},wp.element.createElement(wp.components.ToggleControl,{label:wp.i18n.__("Restrict access?","ultimate-member"),checked:e,onChange:function(e){t.setAttributes({um_is_restrict:e}),!1===e?(_.um_who_access="um_block_settings_hide",_.um_roles_access="um_block_settings_hide",_.um_message_type="um_block_settings_hide",_.um_message_content="um_block_settings_hide"):_.um_who_access="",_=wp.hooks.applyFilters("um_admin_blocks_condition_fields_on_change",_,"um_is_restrict",e)}}),wp.element.createElement(umSelectControl,{type:"number",className:_.um_who_access,label:wp.i18n.__("Who can access this block?","ultimate-member"),value:t.attributes.um_who_access,options:[{label:wp.i18n.__("Everyone","ultimate-member"),value:0},{label:wp.i18n.__("Logged in users","ultimate-member"),value:1},{label:wp.i18n.__("Logged out users","ultimate-member"),value:2}],onChange:function(e){t.setAttributes({um_who_access:e}),0===parseInt(e)?(_.um_message_type="um_block_settings_hide",_.um_message_content="um_block_settings_hide",_.um_roles_access="um_block_settings_hide"):1===parseInt(e)?(_.um_message_type="",_.um_roles_access=""):(_.um_message_type="",_.um_roles_access="um_block_settings_hide"),_=wp.hooks.applyFilters("um_admin_blocks_condition_fields_on_change",_,"um_who_access",e)}}),wp.element.createElement(umSelectControl,{multiple:!0,className:_.um_roles_access,label:wp.i18n.__("What roles can access this block?","ultimate-member"),value:t.attributes.um_roles_access,options:um_restrict_roles,onChange:function(e){t.setAttributes({um_roles_access:e})}}),wp.element.createElement(umSelectControl,{type:"number",className:_.um_message_type,label:wp.i18n.__("Restriction action","ultimate-member"),value:t.attributes.um_message_type,options:[{label:wp.i18n.__("Hide block","ultimate-member"),value:0},{label:wp.i18n.__("Show global default message","ultimate-member"),value:1},{label:wp.i18n.__("Show custom message","ultimate-member"),value:2}],onChange:function(e){t.setAttributes({um_message_type:e}),2===parseInt(e)?_.um_message_content="":_.um_message_content="um_block_settings_hide"}}),wp.element.createElement(umTextareaControl,{type:"number",className:_.um_message_content,label:wp.i18n.__("Custom restricted access message","ultimate-member"),value:t.attributes.um_message_content,onChange:function(e){t.setAttributes({um_message_content:e})}}),um_admin_blocks_custom_fields(_,t))))}},"um_block_restriction");wp.hooks.addFilter("editor.BlockEdit","um-block/um_block_restriction",um_block_restriction); \ No newline at end of file diff --git a/changelog.txt b/changelog.txt index f1eb47df..742e1b2e 100644 --- a/changelog.txt +++ b/changelog.txt @@ -13,6 +13,8 @@ - Fixed: Action Scheduler library errors. Updated to the recent 3.9.2 version. - Fixed: Secondary email field validation. - Fixed: Action Scheduler batch actions with users who have Undefined status. + - Fixed: Restrictions for 3rd-party Gutenberg Blocks. + - Fixed: Date/time picker filter-types range query on Member Directories. * Templates required update: diff --git a/readme.txt b/readme.txt index 6f532427..184c1783 100644 --- a/readme.txt +++ b/readme.txt @@ -180,6 +180,8 @@ IMPORTANT: PLEASE UPDATE THE PLUGIN TO AT LEAST VERSION 2.6.7 IMMEDIATELY. VERSI * Fixed: Action Scheduler library errors. Updated to the recent 3.9.2 version. * Fixed: Secondary email field validation. * Fixed: Action Scheduler batch actions with users who have Undefined status. +* Fixed: Restrictions for 3rd-party Gutenberg Blocks. +* Fixed: Date/time picker filter-types range query on Member Directories. **Templates required update** From d2dcfb645ad9a50a72b98d13b23433cda5d081a3 Mon Sep 17 00:00:00 2001 From: Mykyta Synelnikov Date: Tue, 24 Jun 2025 16:42:20 +0300 Subject: [PATCH 25/28] Refactor debug information structure across plugins Updated the structure of debug information methods by replacing `array_merge` with simpler array extensions and renaming variables for clarity. This ensures consistent handling of role metadata and improves readability and maintainability of code across multiple plugins. --- includes/admin/class-site-health.php | 2930 +++++++++--------- includes/admin/core/class-admin-settings.php | 2 + includes/core/class-profile.php | 80 +- 3 files changed, 1478 insertions(+), 1534 deletions(-) diff --git a/includes/admin/class-site-health.php b/includes/admin/class-site-health.php index 96e21340..027e3502 100644 --- a/includes/admin/class-site-health.php +++ b/includes/admin/class-site-health.php @@ -1,8 +1,6 @@ __( 'All', 'ultimate-member' ), 'default' => __( 'Default', 'ultimate-member' ), 'nopages' => __( 'No predefined page', 'ultimate-member' ), + 'empty' => __( 'Empty', 'ultimate-member' ), ); } return self::$labels; } + /** + * Register site status tests. + * + * @param array $tests The array of site status tests. + * + * @return array The modified array of site status tests. + */ public function register_site_status_tests( $tests ) { + // Searching for custom templates and outdated versions. $custom_templates = UM()->common()->theme()->get_custom_templates_list(); - if ( ! empty( $custom_templates ) ) { $tests['direct']['um_override_templates'] = array( 'label' => esc_html__( 'Are the Ultimate Member templates out of date?', 'ultimate-member' ), @@ -58,6 +76,7 @@ class Site_Health { ); } + // Searching for outdated icons. $first_activation_date = get_option( 'um_first_activation_date', false ); if ( ! empty( $first_activation_date ) && $first_activation_date < 1716336000 ) { $tests['direct']['um_outdated_icons'] = array( @@ -83,6 +102,11 @@ class Site_Health { return $tests; } + /** + * Calculates the status of custom Ultimate Member templates and provides a detailed result array. + * + * @return array Result array containing details about the custom templates status. + */ public function override_templates_test() { $result = array( 'label' => __( 'You have the most recent version of custom Ultimate Member templates', 'ultimate-member' ), @@ -118,7 +142,9 @@ class Site_Health { } /** - * @return bool|array + * Retrieves outdated icons in Ultimate Member forms and provides details and actions for updating. + * + * @return array|bool Returns an array with description and actions for updating outdated icons, or null if nothing needs updating. */ private function get_outdated_icons() { $result = array( @@ -197,6 +223,17 @@ class Site_Health { ); } + /** + * Filters the site health test information about outdated icons. + * + * @hook um_get_outdated_icons_result + * + * @since 2.8.6 + * + * @param {array} $result The site health test information about outdated icons. + * + * @return {array} The site health test information about outdated icons. + */ $result = apply_filters( 'um_get_outdated_icons_result', $result, $old_icons ); if ( ! empty( $result['description'] ) ) { @@ -213,6 +250,11 @@ class Site_Health { return false; } + /** + * Retrieve information about outdated icons in Ultimate Member forms and settings. + * + * @return array Information about the status of icons, including label, status, badge, description, actions, and test name. + */ public function outdated_icons_test() { $result = array( 'label' => __( 'You have the most recent version of icons in Ultimate Member forms and settings', 'ultimate-member' ), @@ -242,10 +284,22 @@ class Site_Health { return $result; } + /** + * Check if a specific field is banned for a user based on the meta key. + * + * @param string $metakey The meta key to check if it's banned. + * + * @return bool True if the field is banned, false otherwise. + */ private static function field_is_banned( $metakey ) { return UM()->user()->is_metakey_banned( $metakey ) || in_array( strtolower( $metakey ), UM()->builtin()->blacklist_fields, true ); } + /** + * Retrieve information about banned fields in Ultimate Member forms. + * + * @return bool|array Information about banned fields, including description, actions, and form data. + */ public function get_banned_fields() { $result = array( 'description' => '', @@ -303,11 +357,13 @@ class Site_Health { foreach ( $break_forms as $form_id => $form_data ) { $fields = array(); foreach ( $form_data['fields'] as $metakey => $field_title ) { - $fields[] = sprintf( __( '%s (%s)', 'ultimate-member' ), $field_title, $metakey ); + // translators: %1$s is the field title, %2$s is the field metakey + $fields[] = sprintf( __( '%1$s (%2$s)', 'ultimate-member' ), $field_title, $metakey ); } $forms_description[] = '

' . sprintf( - __( 'Fields in %s (#ID: %s):', 'ultimate-member' ), + // translators: %1$s is the form link, %2$s is the form title, %3$s is the form ID + __( 'Fields in %2$s (#ID: %3$s):', 'ultimate-member' ), esc_url( $form_data['link'] ), esc_html( $form_data['title'] ), esc_html( $form_id ) @@ -324,6 +380,17 @@ class Site_Health { ); } + /** + * Filters the site health test information about banned fields. + * + * @hook um_get_banned_fields_result + * + * @since 2.10.3 + * + * @param {array} $result The site health test information about banned fields. + * + * @return {array} The site health test information about banned fields. + */ $result = apply_filters( 'um_get_banned_fields_result', $result ); if ( ! empty( $result['description'] ) ) { @@ -340,6 +407,11 @@ class Site_Health { return false; } + /** + * Retrieve information about banned fields in Ultimate Member forms. + * + * @return array Information about the status of banned fields, including label, status, badge, description, actions, and test name. + */ public function banned_fields_test() { $result = array( 'label' => __( 'You have correct Ultimate Member fields', 'ultimate-member' ), @@ -368,64 +440,46 @@ class Site_Health { return $result; } - private function get_roles() { - return UM()->roles()->get_roles(); + /** + * Retrieve role metadata by slug. + * + * @todo replace with UM()->roles()->role_data( $slug ); + * + * @param string $slug The slug of the role. + * + * @return mixed|false Role metadata if found, false if not found. + */ + private function get_role_meta( $slug ) { + return get_option( "um_role_{$slug}_meta", false ); } - private function get_forms() { - $forms_data = get_posts( - array( - 'post_type' => 'um_form', - 'posts_per_page' => -1, - ) + /** + * Retrieve field data based on the field key and field configuration. + * + * @param string $field_key The key of the field. + * @param array $field The configuration of the field. + * + * @return array Field data including label and value. + */ + private function get_field_data( $field_key, $field ) { + $row = array_key_exists( 'type', $field ) && 'row' === $field['type']; + $title = $row ? __( 'Row: ', 'ultimate-member' ) . $field['id'] : __( 'Field: ', 'ultimate-member' ) . $field['metakey']; + $field = array_map( + function ( $item ) { + if ( is_array( $item ) ) { + $item = maybe_serialize( $item ); + } + return $item; + }, + $field ); - $forms = array(); - foreach ( $forms_data as $form ) { - $forms[ 'ID#' . $form->ID ] = $form->post_title; - } - return $forms; - } - private function get_role_meta( $key ) { - return get_option( "um_role_{$key}_meta", false ); - } - - public function array_map( $item ) { - if ( is_array( $item ) ) { - $item = maybe_serialize( $item ); - } - return $item; - } - - private function get_field_data( $info, $key, $field_key, $field ) { - $row = array_key_exists( 'type', $field ) && 'row' === $field['type']; - $title = $row ? __( 'Row: ', 'ultimate-member' ) . $field['id'] : __( 'Field: ', 'ultimate-member' ) . $field['metakey']; - $field = array_map( array( &$this, 'array_map' ), $field ); - $field_info = array( - 'um-field_' . $field_key => array( + return array( + 'field_' . $field_key => array( 'label' => $title, 'value' => $field, ), ); - - return $field_info; - } - - private function get_member_directories() { - $query = new WP_Query(); - $member_directories = $query->query( - array( - 'post_type' => 'um_directory', - 'posts_per_page' => -1, - ) - ); - - $directories = array(); - foreach ( $member_directories as $directory ) { - $directories[ 'ID#' . $directory->ID ] = $directory->post_title; - } - - return $directories; } /** @@ -439,39 +493,21 @@ class Site_Health { */ public function debug_information( $info ) { $info['ultimate-member'] = array( - 'label' => __( 'Ultimate Member', 'ultimate-member' ), + 'label' => __( 'Ultimate Member Settings', 'ultimate-member' ), 'description' => __( 'This debug information for your Ultimate Member installation can assist you in getting support.', 'ultimate-member' ), - 'fields' => array(), + 'fields' => $this->settings_debug_information(), ); - // General settings sitehealth - $general_sitehealth = $this->general_siteheath(); + // User roles settings + $info = $this->roles_debug_information( $info ); - // Access settings sitehealth - $access_sitehealth = $this->access_sitehealth(); + // Forms settings + $info = $this->forms_debug_information( $info ); - // Emails settings sitehealth - $emails_sitehealth = $this->emails_sitehealth(); - - // Appearance settings sitehealth - $appearance_sitehealth = $this->appearance_sitehealth(); - - // Advanced settings sitehealth - $advanced_sitehealth = $this->advanced_sitehealth(); - - // License settings sitehealth - $license_sitehealth = $this->license_sitehealth(); - - $info['ultimate-member']['fields'] = array_merge( $info['ultimate-member']['fields'], $general_sitehealth, $access_sitehealth, $emails_sitehealth, $appearance_sitehealth, $advanced_sitehealth, $license_sitehealth ); - - // User roles settings sitehealth - $info = $this->roles_sitehealth( $info ); - - // Forms settings sitehealth - $info = $this->forms_sitehealth( $info ); - - // Members directory sitehealth - $info = $this->get_member_directories_sitehealth( $info ); + // Members directory + if ( UM()->options()->get( 'members_page' ) ) { + $info = $this->member_directories_debug_information( $info ); + } /** * Filters the site health information. @@ -487,7 +523,39 @@ class Site_Health { return apply_filters( 'um_site_health_extend', $info ); } - public function general_siteheath() { + /** + * Retrieve debug information for various settings in the application. + * + * @return array Debug information for general, access, emails, appearance, advanced, and license settings. + */ + public function settings_debug_information() { + // General settings + $general = $this->general_settings_debug_information(); + + // Access settings + $access = $this->access_settings_debug_information(); + + // Emails settings + $emails = $this->emails_settings_debug_information(); + + // Appearance settings + $appearance = $this->appearance_settings_debug_information(); + + // Advanced settings + $advanced = $this->advanced_settings_debug_information(); + + // License settings + $license = $this->license_settings_debug_information(); + + return array_merge( $general, $access, $emails, $appearance, $advanced, $license ); + } + + /** + * Retrieve debug information about general settings in Ultimate Member. + * + * @return array Information about the general settings including pages, user settings, and related options. + */ + public function general_settings_debug_information() { $labels = self::get_labels(); // Pages settings. @@ -510,10 +578,12 @@ class Site_Health { $pages[ $page_title ] = sprintf( __( '%1$s (ID#%2$d) | %3$s', 'ultimate-member' ), get_the_title( $predefined_page_id ), $predefined_page_id, get_permalink( $predefined_page_id ) ); } - $pages = apply_filters( 'um_debug_information_pages', $pages ); - $pages_settings = array( - 'um-pages' => array( + 'pages_separator' => array( + 'label' => __( 'General > Pages', 'ultimate-member' ), + 'value' => '---------------------------------------------------------------------', + ), + 'pages' => array( 'label' => __( 'Pages', 'ultimate-member' ), 'value' => $pages, ), @@ -524,34 +594,55 @@ class Site_Health { $display_name = UM()->config()->display_name_options; $user_settings = array( - 'um-user_separator' => array( - 'label' => __( 'User settings', 'ultimate-member' ), + 'user_separator' => array( + 'label' => __( 'General > Users', 'ultimate-member' ), 'value' => '---------------------------------------------------------------------', ), - 'um-register_role' => array( + 'register_role' => array( 'label' => __( 'Registration Default Role', 'ultimate-member' ), 'value' => ! empty( UM()->options()->get( 'register_role' ) ) ? UM()->options()->get( 'register_role' ) : __( 'Default', 'ultimate-member' ), ), - 'um-permalink_base' => array( + 'permalink_base' => array( 'label' => __( 'Profile Permalink Base', 'ultimate-member' ), 'value' => isset( $permalink_base[ UM()->options()->get( 'permalink_base' ) ] ) ? $permalink_base[ UM()->options()->get( 'permalink_base' ) ] : $labels['no'], ), - 'um-display_name' => array( - 'label' => __( 'User Display Name', 'ultimate-member' ), - 'value' => isset( $display_name[ UM()->options()->get( 'display_name' ) ] ) ? $display_name[ UM()->options()->get( 'display_name' ) ] : $labels['no'], - ), - 'um-author_redirect' => array( - 'label' => __( 'Hide author pages (enable author page redirect to user profile)', 'ultimate-member' ), - 'value' => UM()->options()->get( 'author_redirect' ) ? $labels['yes'] : $labels['no'], - ), - 'um-members_page' => array( - 'label' => __( 'Enable Members Directory', 'ultimate-member' ), - 'value' => UM()->options()->get( 'members_page' ) ? $labels['yes'] : $labels['no'], - ), - 'um-use_gravatars' => array( - 'label' => __( 'Use Gravatars?', 'ultimate-member' ), - 'value' => UM()->options()->get( 'use_gravatars' ) ? $labels['yes'] : $labels['no'], - ), + ); + + if ( 'custom_meta' === UM()->options()->get( 'permalink_base' ) ) { + $user_settings['permalink_base_custom_meta'] = array( + 'label' => __( 'Profile Permalink Base Custom Meta Key', 'ultimate-member' ), + 'value' => UM()->options()->get( 'permalink_base_custom_meta' ), + ); + } + + $user_settings['display_name'] = array( + 'label' => __( 'User Display Name', 'ultimate-member' ), + 'value' => isset( $display_name[ UM()->options()->get( 'display_name' ) ] ) ? $display_name[ UM()->options()->get( 'display_name' ) ] : $labels['no'], + ); + + if ( 'field' === UM()->options()->get( 'display_name' ) ) { + $user_settings['display_name_field'] = array( + 'label' => __( 'Display Name Custom Field(s)', 'ultimate-member' ), + 'value' => UM()->options()->get( 'display_name_field' ), + ); + } + + $user_settings = array_merge( + $user_settings, + array( + 'author_redirect' => array( + 'label' => __( 'Hide author pages (enable author page redirect to user profile)', 'ultimate-member' ), + 'value' => UM()->options()->get( 'author_redirect' ) ? $labels['yes'] : $labels['no'], + ), + 'members_page' => array( + 'label' => __( 'Enable Members Directory', 'ultimate-member' ), + 'value' => UM()->options()->get( 'members_page' ) ? $labels['yes'] : $labels['no'], + ), + 'use_gravatars' => array( + 'label' => __( 'Use Gravatars?', 'ultimate-member' ), + 'value' => UM()->options()->get( 'use_gravatars' ) ? $labels['yes'] : $labels['no'], + ), + ) ); if ( UM()->options()->get( 'use_gravatars' ) ) { @@ -566,12 +657,12 @@ class Site_Health { 'blank' => __( 'Blank ( a transparent PNG image )', 'ultimate-member' ), ); - $user_settings['um-use_um_gravatar_default_builtin_image'] = array( + $user_settings['use_um_gravatar_default_builtin_image'] = array( 'label' => __( 'Use Gravatar builtin image', 'ultimate-member' ), 'value' => $gravatar_options[ UM()->options()->get( 'use_um_gravatar_default_builtin_image' ) ], ); if ( 'default' === UM()->options()->get( 'use_um_gravatar_default_builtin_image' ) ) { - $user_settings['um-use_um_gravatar_default_image'] = array( + $user_settings['use_um_gravatar_default_image'] = array( 'label' => __( 'Replace Gravatar\'s Default avatar (Set Default plugin avatar as Gravatar\'s Default avatar)', 'ultimate-member' ), 'value' => UM()->options()->get( 'use_um_gravatar_default_image' ) ? $labels['yes'] : $labels['no'], ); @@ -581,19 +672,19 @@ class Site_Health { $user_settings = array_merge( $user_settings, array( - 'um-admin_ignore_user_status' => array( + 'admin_ignore_user_status' => array( 'label' => __( 'Ignore the "User Role > Registration Options" if this user is added from the wp-admin dashboard', 'ultimate-member' ), 'value' => UM()->options()->get( 'admin_ignore_user_status' ) ? $labels['yes'] : $labels['no'], ), - 'um-delete_comments' => array( + 'delete_comments' => array( 'label' => __( 'Delete user comments (enable deleting user comments after deleting a user)', 'ultimate-member' ), 'value' => UM()->options()->get( 'delete_comments' ) ? $labels['yes'] : $labels['no'], ), - 'um-toggle_password' => array( + 'toggle_password' => array( 'label' => __( 'Toggle Password Visibility (enable password show/hide icon on password field)', 'ultimate-member' ), 'value' => UM()->options()->get( 'toggle_password' ) ? $labels['yes'] : $labels['no'], ), - 'um-require_strongpass' => array( + 'require_strongpass' => array( 'label' => __( 'Require Strong Passwords', 'ultimate-member' ), 'value' => UM()->options()->get( 'require_strongpass' ) ? $labels['yes'] : $labels['no'], ), @@ -604,11 +695,11 @@ class Site_Health { $user_settings = array_merge( $user_settings, array( - 'um-password_min_chars' => array( + 'password_min_chars' => array( 'label' => __( 'Password minimum length', 'ultimate-member' ), 'value' => UM()->options()->get( 'password_min_chars' ), ), - 'um-password_max_chars' => array( + 'password_max_chars' => array( 'label' => __( 'Password maximum length', 'ultimate-member' ), 'value' => UM()->options()->get( 'password_max_chars' ), ), @@ -619,74 +710,48 @@ class Site_Health { $user_settings = array_merge( $user_settings, array( - 'um-activation_link_expiry_time' => array( + 'activation_link_expiry_time' => array( 'label' => __( 'Email activation link expiration (days)', 'ultimate-member' ), - 'value' => UM()->options()->get( 'activation_link_expiry_time' ), + 'value' => UM()->options()->get( 'activation_link_expiry_time' ) ? UM()->options()->get( 'activation_link_expiry_time' ) : __( 'Not expired', 'ultimate-member' ), ), - 'um-profile_noindex' => array( + 'profile_noindex' => array( 'label' => __( 'Avoid indexing profile by search engines', 'ultimate-member' ), 'value' => UM()->options()->get( 'profile_noindex' ) ? $labels['yes'] : $labels['no'], ), - 'um-profile_title' => array( + 'profile_title' => array( 'label' => __( 'User Profile Title', 'ultimate-member' ), 'value' => stripslashes( UM()->options()->get( 'profile_title' ) ), ), - 'um-profile_desc' => array( + 'profile_desc' => array( 'label' => __( 'User Profile Dynamic Meta Description', 'ultimate-member' ), 'value' => stripslashes( UM()->options()->get( 'profile_desc' ) ), ), ) ); - if ( 'custom_meta' === UM()->options()->get( 'permalink_base' ) ) { - $user_settings = UM()->array_insert_before( - $user_settings, - 'um-display_name', - array( - 'um-permalink_base_custom_meta' => array( - 'label' => __( 'Profile Permalink Base Custom Meta Key', 'ultimate-member' ), - 'value' => UM()->options()->get( 'permalink_base_custom_meta' ), - ), - ) - ); - } - - if ( 'field' === UM()->options()->get( 'display_name' ) ) { - $user_settings = UM()->array_insert_before( - $user_settings, - 'um-author_redirect', - array( - 'um-display_name_field' => array( - 'label' => __( 'Display Name Custom Field(s)', 'ultimate-member' ), - 'value' => UM()->options()->get( 'display_name_field' ), - ), - ) - ); - } - // Account settings $account_settings = array( - 'um-account_separator' => array( - 'label' => __( 'Account settings', 'ultimate-member' ), + 'account_separator' => array( + 'label' => __( 'General > Account', 'ultimate-member' ), 'value' => '---------------------------------------------------------------------', ), - 'um-account_name' => array( + 'account_name' => array( 'label' => __( 'Display First & Last name fields (enable to display First & Last name fields)', 'ultimate-member' ), 'value' => UM()->options()->get( 'account_name' ) ? $labels['yes'] : $labels['no'], ), - 'um-account_email' => array( + 'account_email' => array( 'label' => __( 'Allow users to change email (enable changing email via the account page)', 'ultimate-member' ), 'value' => UM()->options()->get( 'account_email' ) ? $labels['yes'] : $labels['no'], ), - 'um-account_general_password' => array( + 'account_general_password' => array( 'label' => __( 'Require password to update account (enable required password)', 'ultimate-member' ), 'value' => UM()->options()->get( 'account_general_password' ) ? $labels['yes'] : $labels['no'], ), - 'um-account_tab_password' => array( + 'account_tab_password' => array( 'label' => __( 'Password Account Tab', 'ultimate-member' ), 'value' => UM()->options()->get( 'account_tab_password' ) ? $labels['yes'] : $labels['no'], ), - 'um-account_tab_privacy' => array( + 'account_tab_privacy' => array( 'label' => __( 'Privacy Account Tab', 'ultimate-member' ), 'value' => UM()->options()->get( 'account_tab_privacy' ) ? $labels['yes'] : $labels['no'], ), @@ -695,13 +760,13 @@ class Site_Health { if ( UM()->options()->get( 'account_name' ) ) { $account_settings = UM()->array_insert_before( $account_settings, - 'um-account_email', + 'account_email', array( - 'um-account_name_disable' => array( + 'account_name_disable' => array( 'label' => __( 'Disable First & Last name field editing', 'ultimate-member' ), 'value' => UM()->options()->get( 'account_name_disable' ) ? $labels['yes'] : $labels['no'], ), - 'um-account_name_require' => array( + 'account_name_require' => array( 'label' => __( 'Require First & Last Name', 'ultimate-member' ), 'value' => UM()->options()->get( 'account_name_require' ) ? $labels['yes'] : $labels['no'], ), @@ -709,45 +774,51 @@ class Site_Health { ); } - if ( false !== UM()->account()->is_notifications_tab_visible() ) { - $account_settings['um-account_tab_notifications'] = array( - 'label' => __( 'Notifications Account Tab', 'ultimate-member' ), - 'value' => UM()->options()->get( 'account_tab_notifications' ) ? $labels['yes'] : $labels['no'], - ); - } - if ( UM()->options()->get( 'account_tab_privacy' ) ) { - $account_settings['um-account_hide_in_directory'] = array( + $account_settings['account_hide_in_directory'] = array( 'label' => __( 'Allow users to hide their profiles from directory', 'ultimate-member' ), 'value' => UM()->options()->get( 'account_hide_in_directory' ) ? $labels['yes'] : $labels['no'], ); if ( UM()->options()->get( 'account_hide_in_directory' ) ) { - $account_settings['um-account_hide_in_directory_default'] = array( + $account_settings['account_hide_in_directory_default'] = array( 'label' => __( 'Hide profiles from directory by default', 'ultimate-member' ), 'value' => UM()->options()->get( 'account_hide_in_directory_default' ), ); } } + if ( false !== UM()->account()->is_notifications_tab_visible() ) { + $account_settings['account_tab_notifications'] = array( + 'label' => __( 'Notifications Account Tab', 'ultimate-member' ), + 'value' => UM()->options()->get( 'account_tab_notifications' ) ? $labels['yes'] : $labels['no'], + ); + } + $account_settings = array_merge( $account_settings, array( - 'um-account_tab_delete' => array( + 'account_tab_delete' => array( 'label' => __( 'Delete Account Tab', 'ultimate-member' ), 'value' => UM()->options()->get( 'account_tab_delete' ) ? $labels['yes'] : $labels['no'], ), - 'um-delete_account_text' => array( - 'label' => __( 'Account Deletion Text', 'ultimate-member' ), - 'value' => UM()->options()->get( 'delete_account_text' ), - ), - 'um-delete_account_no_pass_required_text' => array( - 'label' => __( 'Account Deletion without password Text', 'ultimate-member' ), - 'value' => UM()->options()->get( 'delete_account_no_pass_required_text' ), - ), ) ); + if ( UM()->options()->get( 'account_tab_delete' ) ) { + if ( UM()->account()->current_password_is_required( 'delete' ) ) { + $account_settings['delete_account_text'] = array( + 'label' => __( 'Account Deletion Text', 'ultimate-member' ), + 'value' => UM()->options()->get( 'delete_account_text' ), + ); + } else { + $account_settings['delete_account_no_pass_required_text'] = array( + 'label' => __( 'Account Deletion without password Text', 'ultimate-member' ), + 'value' => UM()->options()->get( 'delete_account_no_pass_required_text' ), + ); + } + } + // Uploads settings $profile_sizes_list = ''; $profile_sizes = UM()->options()->get( 'photo_thumb_sizes' ); @@ -764,39 +835,39 @@ class Site_Health { } } $uploads_settings = array( - 'um-account_separator' => array( - 'label' => __( 'Upload settings', 'ultimate-member' ), + 'uploads_separator' => array( + 'label' => __( 'General > Uploads', 'ultimate-member' ), 'value' => '---------------------------------------------------------------------', ), - 'um-image_orientation_by_exif' => array( + 'image_orientation_by_exif' => array( 'label' => __( 'Change image orientation', 'ultimate-member' ), 'value' => UM()->options()->get( 'image_orientation_by_exif' ) ? $labels['yes'] : $labels['no'], ), - 'um-image_compression' => array( + 'image_compression' => array( 'label' => __( 'Image Quality', 'ultimate-member' ), 'value' => UM()->options()->get( 'image_compression' ), ), - 'um-image_max_width' => array( + 'image_max_width' => array( 'label' => __( 'Image Upload Maximum Width (px)', 'ultimate-member' ), 'value' => UM()->options()->get( 'image_max_width' ), ), - 'um-profile_photo_max_size' => array( + 'profile_photo_max_size' => array( 'label' => __( 'Profile Photo Maximum File Size (bytes)', 'ultimate-member' ), 'value' => UM()->options()->get( 'profile_photo_max_size' ), ), - 'um-photo_thumb_sizes' => array( + 'photo_thumb_sizes' => array( 'label' => __( 'Profile Photo Thumbnail Sizes (px)', 'ultimate-member' ), 'value' => $profile_sizes_list, ), - 'um-cover_photo_max_size' => array( + 'cover_photo_max_size' => array( 'label' => __( 'Cover Photo Maximum File Size (bytes)', 'ultimate-member' ), 'value' => UM()->options()->get( 'cover_photo_max_size' ), ), - 'um-cover_min_width' => array( + 'cover_min_width' => array( 'label' => __( 'Cover Photo Minimum Width (px)', 'ultimate-member' ), 'value' => UM()->options()->get( 'cover_min_width' ), ), - 'um-cover_thumb_sizes' => array( + 'cover_thumb_sizes' => array( 'label' => __( 'Cover Photo Thumbnail Sizes (px)', 'ultimate-member' ), 'value' => $cover_sizes_list, ), @@ -805,7 +876,12 @@ class Site_Health { return array_merge( $pages_settings, $user_settings, $account_settings, $uploads_settings ); } - public function access_sitehealth() { + /** + * Retrieve debug information related to access settings in Ultimate Member. + * + * @return array Debug information about access settings, including restrictions, accessible options, and other settings. + */ + public function access_settings_debug_information() { $labels = self::get_labels(); // Content Restriction settings @@ -827,11 +903,11 @@ class Site_Health { $accessible = absint( UM()->options()->get( 'accessible' ) ); $restrict_settings = array( - 'um-accessible_separator' => array( - 'label' => __( 'Access settings', 'ultimate-member' ), + 'access_separator' => array( + 'label' => __( 'Access > Restriction Content', 'ultimate-member' ), 'value' => '---------------------------------------------------------------------', ), - 'um-accessible' => array( + 'accessible' => array( 'label' => __( 'Global Site Access', 'ultimate-member' ), 'value' => 0 === $accessible ? __( 'Site accessible to Everyone', 'ultimate-member' ) : __( 'Site accessible to Logged In Users', 'ultimate-member' ), ), @@ -843,54 +919,54 @@ class Site_Health { if ( ! empty( $exclude_uris ) ) { $exclude_uris_list = implode( ', ', $exclude_uris ); } - $restrict_settings['um-access_redirect'] = array( + $restrict_settings['access_redirect'] = array( 'label' => __( 'Custom Redirect URL', 'ultimate-member' ), 'value' => UM()->options()->get( 'access_redirect' ), ); - $restrict_settings['um-access_exclude_uris'] = array( + $restrict_settings['access_exclude_uris'] = array( 'label' => __( 'Exclude the following URLs', 'ultimate-member' ), 'value' => $exclude_uris_list, ); - $restrict_settings['um-home_page_accessible'] = array( + $restrict_settings['home_page_accessible'] = array( 'label' => __( 'Allow Homepage to be accessible', 'ultimate-member' ), 'value' => UM()->options()->get( 'home_page_accessible' ) ? $labels['yes'] : $labels['no'], ); - $restrict_settings['um-category_page_accessible'] = array( + $restrict_settings['category_page_accessible'] = array( 'label' => __( 'Allow Category pages to be accessible', 'ultimate-member' ), 'value' => UM()->options()->get( 'category_page_accessible' ) ? $labels['yes'] : $labels['no'], ); } - $restrict_settings['um-restricted_post_title_replace'] = array( + $restrict_settings['restricted_post_title_replace'] = array( 'label' => __( 'Restricted Post Title', 'ultimate-member' ), 'value' => UM()->options()->get( 'restricted_post_title_replace' ) ? $labels['yes'] : $labels['no'], ); if ( UM()->options()->get( 'restricted_post_title_replace' ) ) { - $restrict_settings['um-restricted_access_post_title'] = array( + $restrict_settings['restricted_access_post_title'] = array( 'label' => __( 'Restricted Access Post Title', 'ultimate-member' ), 'value' => stripslashes( UM()->options()->get( 'restricted_access_post_title' ) ), ); } - $restrict_settings['um-restricted_access_message'] = array( + $restrict_settings['restricted_access_message'] = array( 'label' => __( 'Restricted Access Message', 'ultimate-member' ), 'value' => stripslashes( UM()->options()->get( 'restricted_access_message' ) ), ); - $restrict_settings['um-restricted_blocks'] = array( + $restrict_settings['restricted_blocks'] = array( 'label' => __( 'Restricted Gutenberg Blocks (enable the "Content Restriction" settings for the Gutenberg Blocks)', 'ultimate-member' ), 'value' => UM()->options()->get( 'restricted_blocks' ) ? $labels['yes'] : $labels['no'], ); if ( UM()->options()->get( 'restricted_blocks' ) ) { - $restrict_settings['um-restricted_block_message'] = array( + $restrict_settings['restricted_block_message'] = array( 'label' => __( 'Restricted Access Block Message', 'ultimate-member' ), 'value' => stripslashes( UM()->options()->get( 'restricted_block_message' ) ), ); } - $restrict_settings['um-restricted_access_post_metabox'] = array( + $restrict_settings['restricted_access_post_metabox'] = array( 'label' => __( 'Enable the "Content Restriction" settings for post types', 'ultimate-member' ), 'value' => $restricted_posts_list, ); - $restrict_settings['um-restricted_access_taxonomy_metabox'] = array( + $restrict_settings['restricted_access_taxonomy_metabox'] = array( 'label' => __( 'Enable the "Content Restriction" settings for taxonomies', 'ultimate-member' ), 'value' => $restricted_taxonomy_list, ); @@ -900,30 +976,34 @@ class Site_Health { $blocked_words = str_replace( '
', ', ', nl2br( UM()->options()->get( 'blocked_words' ) ) ); $access_other_settings = array( - 'um-enable_reset_password_limit' => array( + 'access_other_separator' => array( + 'label' => __( 'Access > Other', 'ultimate-member' ), + 'value' => '---------------------------------------------------------------------', + ), + 'enable_reset_password_limit' => array( 'label' => __( 'Enable the Reset Password Limit?', 'ultimate-member' ), 'value' => UM()->options()->get( 'enable_reset_password_limit' ) ? $labels['yes'] : $labels['no'], ), ); if ( UM()->options()->get( 'enable_reset_password_limit' ) ) { - $access_other_settings['um-reset_password_limit_number'] = array( + $access_other_settings['reset_password_limit_number'] = array( 'label' => __( 'Password Limit (maximum reset password limit)', 'ultimate-member' ), 'value' => UM()->options()->get( 'reset_password_limit_number' ), ); } - $access_other_settings['um-change_password_request_limit'] = array( + $access_other_settings['change_password_request_limit'] = array( 'label' => __( 'Change Password request limit ', 'ultimate-member' ), 'value' => UM()->options()->get( 'change_password_request_limit' ) ? $labels['yes'] : $labels['no'], ); - $access_other_settings['um-only_approved_user_reset_password'] = array( + $access_other_settings['only_approved_user_reset_password'] = array( 'label' => __( 'Only approved user Reset Password', 'ultimate-member' ), 'value' => UM()->options()->get( 'only_approved_user_reset_password' ) ? $labels['yes'] : $labels['no'], ); - $access_other_settings['um-blocked_emails'] = array( + $access_other_settings['blocked_emails'] = array( 'label' => __( 'Blocked Email Addresses', 'ultimate-member' ), 'value' => stripslashes( $blocked_emails ), ); - $access_other_settings['um-blocked_words'] = array( + $access_other_settings['blocked_words'] = array( 'label' => __( 'Blacklist Words', 'ultimate-member' ), 'value' => stripslashes( $blocked_words ), ); @@ -931,28 +1011,33 @@ class Site_Health { return array_merge( $restrict_settings, $access_other_settings ); } - public function emails_sitehealth() { + /** + * Retrieve debug information about the email settings in Ultimate Member. + * + * @return array Information about the email settings, including labels, values, and template status. + */ + public function emails_settings_debug_information() { $labels = self::get_labels(); // Email settings $email_settings = array( - 'um-email_separator' => array( - 'label' => __( 'Emails settings', 'ultimate-member' ), + 'email_separator' => array( + 'label' => __( 'Emails', 'ultimate-member' ), 'value' => '---------------------------------------------------------------------', ), - 'um-admin_email' => array( + 'admin_email' => array( 'label' => __( 'Admin Email Address', 'ultimate-member' ), 'value' => UM()->options()->get( 'admin_email' ), ), - 'um-mail_from' => array( + 'mail_from' => array( 'label' => __( 'Mail appears from', 'ultimate-member' ), 'value' => UM()->options()->get( 'mail_from' ), ), - 'um-mail_from_addr' => array( + 'mail_from_addr' => array( 'label' => __( 'Mail appears from address', 'ultimate-member' ), 'value' => UM()->options()->get( 'mail_from_addr' ), ), - 'um-email_html' => array( + 'email_html' => array( 'label' => __( 'Use HTML for Emails?', 'ultimate-member' ), 'value' => UM()->options()->get( 'email_html' ) ? $labels['yes'] : $labels['no'], ), @@ -960,14 +1045,20 @@ class Site_Health { $emails = UM()->config()->email_notifications; foreach ( $emails as $key => $email ) { + $email_settings[ $key . '-enabled' ] = array( + // translators: %s is email template title. + 'label' => sprintf( __( 'Email "%s" Enabled', 'ultimate-member' ), $email['title'] ), + 'value' => UM()->options()->get( $key . '_on' ) ? $labels['yes'] : $labels['no'], + ); + if ( UM()->options()->get( $key . '_on' ) ) { - $email_settings[ 'um-' . $key ] = array( + $email_settings[ $key . '-subject' ] = array( // translators: %s is email template title. 'label' => sprintf( __( '"%s" Subject', 'ultimate-member' ), $email['title'] ), 'value' => UM()->options()->get( $key . '_sub' ), ); - $email_settings[ 'um-theme_' . $key ] = array( + $email_settings[ $key . '-in-theme' ] = array( // translators: %s is email template title. 'label' => sprintf( __( 'Template "%s" in theme?', 'ultimate-member' ), $email['title'] ), 'value' => '' !== locate_template( array( 'ultimate-member/emails/' . $key . '.php' ) ) ? $labels['yes'] : $labels['no'], @@ -978,7 +1069,12 @@ class Site_Health { return $email_settings; } - public function appearance_sitehealth() { + /** + * Retrieve debug information related to appearance settings in Ultimate Member. + * + * @return array Debug information about appearance settings, including profile template, profile photo settings, cover photo settings, and more. + */ + public function appearance_settings_debug_information() { $labels = self::get_labels(); // > Profile section. @@ -1002,51 +1098,51 @@ class Site_Health { $default_cover = UM()->options()->get( 'default_cover' ); $appearance_settings = array( - 'um-appearance_separator' => array( - 'label' => __( 'Appearance settings', 'ultimate-member' ), + 'appearance_separator' => array( + 'label' => __( 'Appearance > Profile', 'ultimate-member' ), 'value' => '---------------------------------------------------------------------', ), - 'um-profile_template' => array( + 'profile_template' => array( 'label' => __( 'Profile Default Template', 'ultimate-member' ), // translators: %1$s - profile template name, %2$s - profile template filename 'value' => sprintf( __( '%1$s (filename: %2$s.php)', 'ultimate-member' ), $profile_template_title, $profile_template_key ), ), - 'um-profile_max_width' => array( + 'profile_max_width' => array( 'label' => __( 'Profile Maximum Width', 'ultimate-member' ), 'value' => UM()->options()->get( 'profile_max_width' ), ), - 'um-profile_area_max_width' => array( + 'profile_area_max_width' => array( 'label' => __( 'Profile Area Maximum Width', 'ultimate-member' ), 'value' => UM()->options()->get( 'profile_area_max_width' ), ), - 'um-default_avatar' => array( + 'default_avatar' => array( 'label' => __( 'Default Profile Photo', 'ultimate-member' ), 'value' => ! empty( $default_avatar['url'] ) ? $default_avatar['url'] : '', ), - 'um-disable_profile_photo_upload' => array( + 'disable_profile_photo_upload' => array( 'label' => __( 'Disable Profile Photo Upload', 'ultimate-member' ), 'value' => UM()->options()->get( 'disable_profile_photo_upload' ) ? $labels['yes'] : $labels['no'], ), - 'um-profile_photosize' => array( + 'profile_photosize' => array( 'label' => __( 'Profile Photo Size', 'ultimate-member' ), 'value' => UM()->options()->get( 'profile_photosize' ) . 'x' . UM()->options()->get( 'profile_photosize' ) . 'px', ), - 'um-default_cover' => array( + 'default_cover' => array( 'label' => __( 'Default Cover Photo', 'ultimate-member' ), 'value' => ! empty( $default_cover['url'] ) ? $default_cover['url'] : '', ), - 'um-profile_cover_enabled' => array( + 'profile_cover_enabled' => array( 'label' => __( 'Profile Cover Photos', 'ultimate-member' ), 'value' => $profile_cover_enabled ? $labels['yes'] : $labels['no'], ), ); if ( ! empty( $profile_cover_enabled ) ) { - $appearance_settings['um-profile_coversize'] = array( + $appearance_settings['profile_coversize'] = array( 'label' => __( 'Profile Cover Size', 'ultimate-member' ), 'value' => UM()->options()->get( 'profile_coversize' ) . 'px', ); - $appearance_settings['um-profile_cover_ratio'] = array( + $appearance_settings['profile_cover_ratio'] = array( 'label' => __( 'Profile Cover Ratio', 'ultimate-member' ), 'value' => UM()->options()->get( 'profile_cover_ratio' ), ); @@ -1055,19 +1151,19 @@ class Site_Health { $appearance_settings = array_merge( $appearance_settings, array( - 'um-profile_show_metaicon' => array( + 'profile_show_metaicon' => array( 'label' => __( 'Profile Header Meta Text Icon', 'ultimate-member' ), 'value' => UM()->options()->get( 'profile_show_metaicon' ) ? $labels['yes'] : $labels['no'], ), - 'um-profile_show_name' => array( + 'profile_show_name' => array( 'label' => __( 'Show display name in profile header', 'ultimate-member' ), 'value' => UM()->options()->get( 'profile_show_name' ) ? $labels['yes'] : $labels['no'], ), - 'um-profile_show_social_links' => array( + 'profile_show_social_links' => array( 'label' => __( 'Show social links in profile header', 'ultimate-member' ), 'value' => UM()->options()->get( 'profile_show_social_links' ) ? $labels['yes'] : $labels['no'], ), - 'um-profile_show_bio' => array( + 'profile_show_bio' => array( 'label' => __( 'Show user description in profile header', 'ultimate-member' ), 'value' => UM()->options()->get( 'profile_show_bio' ) ? $labels['yes'] : $labels['no'], ), @@ -1075,7 +1171,7 @@ class Site_Health { ); if ( UM()->options()->get( 'profile_show_bio' ) ) { - $appearance_settings['um-profile_bio_maxchars'] = array( + $appearance_settings['profile_bio_maxchars'] = array( 'label' => __( 'User description maximum chars', 'ultimate-member' ), 'value' => UM()->options()->get( 'profile_bio_maxchars' ), ); @@ -1084,19 +1180,19 @@ class Site_Health { $appearance_settings = array_merge( $appearance_settings, array( - 'um-profile_show_html_bio' => array( + 'profile_show_html_bio' => array( 'label' => __( 'Enable HTML support for user description', 'ultimate-member' ), 'value' => UM()->options()->get( 'profile_show_html_bio' ) ? $labels['yes'] : $labels['no'], ), - 'um-profile_header_menu' => array( + 'profile_header_menu' => array( 'label' => __( 'Profile Header Menu Position', 'ultimate-member' ), 'value' => $profile_header_menu_options[ UM()->options()->get( 'profile_header_menu' ) ], ), - 'um-profile_primary_btn_word' => array( + 'profile_primary_btn_word' => array( 'label' => __( 'Profile Primary Button Text', 'ultimate-member' ), 'value' => UM()->options()->get( 'profile_primary_btn_word' ), ), - 'um-profile_secondary_btn' => array( + 'profile_secondary_btn' => array( 'label' => __( 'Profile Secondary Button', 'ultimate-member' ), 'value' => $profile_secondary_btn ? $labels['yes'] : $labels['no'], ), @@ -1104,7 +1200,7 @@ class Site_Health { ); if ( ! empty( $profile_secondary_btn ) ) { - $appearance_settings['um-profile_secondary_btn_word'] = array( + $appearance_settings['profile_secondary_btn_word'] = array( 'label' => __( 'Profile Secondary Button Text ', 'ultimate-member' ), 'value' => UM()->options()->get( 'profile_secondary_btn_word' ), ); @@ -1113,11 +1209,11 @@ class Site_Health { $appearance_settings = array_merge( $appearance_settings, array( - 'um-profile_icons' => array( + 'profile_icons' => array( 'label' => __( 'Profile Field Icons', 'ultimate-member' ), 'value' => $icons_display_options[ UM()->options()->get( 'profile_icons' ) ], ), - 'um-profile_empty_text' => array( + 'profile_empty_text' => array( 'label' => __( 'Show a custom message if profile is empty', 'ultimate-member' ), 'value' => $profile_empty_text ? $labels['yes'] : $labels['no'], ), @@ -1125,7 +1221,7 @@ class Site_Health { ); if ( ! empty( $profile_empty_text ) ) { - $appearance_settings['um-profile_empty_text_emo'] = array( + $appearance_settings['profile_empty_text_emo'] = array( 'label' => __( 'Show the emoticon', 'ultimate-member' ), 'value' => UM()->options()->get( 'profile_empty_text_emo' ) ? $labels['yes'] : $labels['no'], ); @@ -1134,29 +1230,17 @@ class Site_Health { // > Profile Menu section. $profile_menu = UM()->options()->get( 'profile_menu' ); - $appearance_settings['um-profile_menu'] = array( + $appearance_settings['appearance_profile_menu_separator'] = array( + 'label' => __( 'Appearance > Profile Menu', 'ultimate-member' ), + 'value' => '---------------------------------------------------------------------', + ); + + $appearance_settings['profile_menu'] = array( 'label' => __( 'Enable profile menu', 'ultimate-member' ), 'value' => $profile_menu ? $labels['yes'] : $labels['no'], ); if ( ! empty( $profile_menu ) ) { - /** - * Filters a privacy list extend. - * - * @since 2.7.0 - * @hook um_profile_tabs_privacy_list - * - * @param {array} $privacy_option Add options for profile tabs' privacy. - * - * @return {array} Options for profile tabs' privacy. - * - * @example Add options for profile tabs' privacy. - * function um_profile_menu_link_attrs( $privacy_option ) { - * // your code here - * return $privacy_option; - * } - * add_filter( 'um_profile_tabs_privacy_list', 'um_profile_tabs_privacy_list', 10, 1 ); - */ $privacy_option = UM()->profile()->tabs_privacy(); $tabs = UM()->profile()->tabs(); @@ -1167,7 +1251,7 @@ class Site_Health { $tab_enabled = UM()->options()->get( 'profile_tab_' . $id ); - $appearance_settings[ 'um-profile_tab_' . $id ] = array( + $appearance_settings[ 'profile_tab_' . $id ] = array( // translators: %s Profile Tab Title 'label' => sprintf( __( '%s Tab', 'ultimate-member' ), $tab['name'] ), 'value' => $tab_enabled ? $labels['yes'] : $labels['no'], @@ -1176,7 +1260,7 @@ class Site_Health { if ( ! isset( $tab['default_privacy'] ) && ! empty( $tab_enabled ) ) { $privacy = UM()->options()->get( 'profile_tab_' . $id . '_privacy' ); if ( is_numeric( $privacy ) ) { - $appearance_settings[ 'um-profile_tab_' . $id . '_privacy' ] = array( + $appearance_settings[ 'profile_tab_' . $id . '_privacy' ] = array( // translators: %s Profile Tab Title 'label' => sprintf( __( 'Who can see %s Tab?', 'ultimate-member' ), $tab['name'] ), 'value' => $privacy_option[ UM()->options()->get( 'profile_tab_' . $id . '_privacy' ) ], @@ -1203,46 +1287,11 @@ class Site_Health { */ $appearance_settings = apply_filters( 'um_profile_tabs_site_health', $appearance_settings ); - /** - * Filters user profile tabs - * - * @since 2.7.0 - * @hook um_profile_tabs - * - * @param {array} $tabs tabs list. - * - * @return {array} tabs list. - * - * @example Add options for profile tabs' privacy. - * function um_profile_tabs( $tabs ) { - * // your code here - * return $tabs; - * } - * add_filter( 'um_profile_tabs', 'um_profile_tabs', 10, 1 ); - */ - $tabs_options = apply_filters( - 'um_profile_tabs', - array( - 'main' => array( - 'name' => __( 'About', 'ultimate-member' ), - 'icon' => 'um-faicon-user', - ), - 'posts' => array( - 'name' => __( 'Posts', 'ultimate-member' ), - 'icon' => 'um-faicon-pencil', - ), - 'comments' => array( - 'name' => __( 'Comments', 'ultimate-member' ), - 'icon' => 'um-faicon-comment', - ), - ) - ); - - $appearance_settings['um-profile_menu_default_tab'] = array( + $appearance_settings['profile_menu_default_tab'] = array( 'label' => __( 'Profile menu default tab', 'ultimate-member' ), - 'value' => $tabs_options[ UM()->options()->get( 'profile_menu_default_tab' ) ], + 'value' => isset( $tabs[ UM()->options()->get( 'profile_menu_default_tab' ) ]['name'] ) ? $tabs[ UM()->options()->get( 'profile_menu_default_tab' ) ]['name'] : '', ); - $appearance_settings['um-profile_menu_icons'] = array( + $appearance_settings['profile_menu_icons'] = array( 'label' => __( 'Enable menu icons in desktop view', 'ultimate-member' ), 'value' => UM()->options()->get( 'profile_menu_icons' ) ? $labels['yes'] : $labels['no'], ); @@ -1263,24 +1312,28 @@ class Site_Health { $appearance_settings = array_merge( $appearance_settings, array( - 'um-register_template' => array( + 'appearance_register_separator' => array( + 'label' => __( 'Appearance > Registration Form', 'ultimate-member' ), + 'value' => '---------------------------------------------------------------------', + ), + 'register_template' => array( 'label' => __( 'Registration Default Template', 'ultimate-member' ), // translators: %1$s - register template name, %2$s - register template filename 'value' => sprintf( __( '%1$s (filename: %2$s.php)', 'ultimate-member' ), $register_template_title, $register_template_key ), ), - 'um-register_max_width' => array( + 'register_max_width' => array( 'label' => __( 'Registration Maximum Width', 'ultimate-member' ), 'value' => UM()->options()->get( 'register_max_width' ), ), - 'um-register_align' => array( + 'register_align' => array( 'label' => __( 'Registration Shortcode Alignment', 'ultimate-member' ), 'value' => $form_align_options[ UM()->options()->get( 'register_align' ) ], ), - 'um-register_primary_btn_word' => array( + 'register_primary_btn_word' => array( 'label' => __( 'Registration Primary Button Text ', 'ultimate-member' ), 'value' => UM()->options()->get( 'register_primary_btn_word' ), ), - 'um-register_secondary_btn' => array( + 'register_secondary_btn' => array( 'label' => __( 'Registration Secondary Button', 'ultimate-member' ), 'value' => $register_secondary_btn ? $labels['yes'] : $labels['no'], ), @@ -1288,17 +1341,17 @@ class Site_Health { ); if ( ! empty( $register_secondary_btn ) ) { - $appearance_settings['um-register_secondary_btn_word'] = array( + $appearance_settings['register_secondary_btn_word'] = array( 'label' => __( 'Registration Secondary Button Text', 'ultimate-member' ), 'value' => UM()->options()->get( 'register_secondary_btn_word' ), ); - $appearance_settings['um-register_secondary_btn_url'] = array( + $appearance_settings['register_secondary_btn_url'] = array( 'label' => __( 'Registration Secondary Button URL', 'ultimate-member' ), 'value' => UM()->options()->get( 'register_secondary_btn_url' ), ); } - $appearance_settings['um-register_icons'] = array( + $appearance_settings['register_icons'] = array( 'label' => __( 'Registration Field Icons', 'ultimate-member' ), 'value' => $icons_display_options[ UM()->options()->get( 'register_icons' ) ], ); @@ -1312,24 +1365,28 @@ class Site_Health { $appearance_settings = array_merge( $appearance_settings, array( - 'um-login_template' => array( + 'appearance_login_separator' => array( + 'label' => __( 'Appearance > Login Form', 'ultimate-member' ), + 'value' => '---------------------------------------------------------------------', + ), + 'login_template' => array( 'label' => __( 'Login Default Template', 'ultimate-member' ), // translators: %1$s - login template name, %2$s - login template filename 'value' => sprintf( __( '%1$s (filename: %2$s.php)', 'ultimate-member' ), $login_template_title, $login_template_key ), ), - 'um-login_max_width' => array( + 'login_max_width' => array( 'label' => __( 'Login Maximum Width', 'ultimate-member' ), 'value' => UM()->options()->get( 'login_max_width' ), ), - 'um-login_align' => array( + 'login_align' => array( 'label' => __( 'Login Shortcode Alignment', 'ultimate-member' ), 'value' => $form_align_options[ UM()->options()->get( 'login_align' ) ], ), - 'um-login_primary_btn_word' => array( + 'login_primary_btn_word' => array( 'label' => __( 'Login Primary Button Text', 'ultimate-member' ), 'value' => UM()->options()->get( 'login_primary_btn_word' ), ), - 'um-login_secondary_btn' => array( + 'login_secondary_btn' => array( 'label' => __( 'Login Secondary Button', 'ultimate-member' ), 'value' => $login_secondary_btn ? $labels['yes'] : $labels['no'], ), @@ -1337,11 +1394,11 @@ class Site_Health { ); if ( ! empty( $login_secondary_btn ) ) { - $appearance_settings['um-login_secondary_btn_word'] = array( + $appearance_settings['login_secondary_btn_word'] = array( 'label' => __( 'Login Secondary Button Text', 'ultimate-member' ), 'value' => UM()->options()->get( 'login_secondary_btn_word' ), ); - $appearance_settings['um-login_secondary_btn_url'] = array( + $appearance_settings['login_secondary_btn_url'] = array( 'label' => __( 'Login Secondary Button URL', 'ultimate-member' ), 'value' => UM()->options()->get( 'login_secondary_btn_url' ), ); @@ -1350,15 +1407,15 @@ class Site_Health { $appearance_settings = array_merge( $appearance_settings, array( - 'um-login_forgot_pass_link' => array( + 'login_forgot_pass_link' => array( 'label' => __( 'Login Forgot Password Link', 'ultimate-member' ), 'value' => UM()->options()->get( 'login_forgot_pass_link' ) ? $labels['yes'] : $labels['no'], ), - 'um-login_show_rememberme' => array( - 'label' => __( 'Login Maximum Width', 'ultimate-member' ), - 'value' => UM()->options()->get( 'login_max_width' ), + 'login_show_rememberme' => array( + 'label' => __( 'Show "Remember Me" checkbox', 'ultimate-member' ), + 'value' => UM()->options()->get( 'login_show_rememberme' ), ), - 'um-login_icons' => array( + 'login_icons' => array( 'label' => __( 'Login Field Icons', 'ultimate-member' ), 'value' => $icons_display_options[ UM()->options()->get( 'login_icons' ) ], ), @@ -1368,42 +1425,51 @@ class Site_Health { return $appearance_settings; } - public function advanced_sitehealth() { + /** + * Retrieve advanced settings debug information for Ultimate Member. + * + * @return array An array containing detailed information about various advanced settings, including labels and values. + */ + public function advanced_settings_debug_information() { $labels = self::get_labels(); $general = array( - 'um-advanced_separator' => array( - 'label' => __( 'Advanced settings', 'ultimate-member' ), + 'advanced_separator' => array( + 'label' => __( 'Advanced > General', 'ultimate-member' ), 'value' => '---------------------------------------------------------------------', ), - 'um-form_asterisk' => array( + 'form_asterisk' => array( 'label' => __( 'Required fields\' asterisk (Show an asterisk for required fields)', 'ultimate-member' ), 'value' => UM()->options()->get( 'form_asterisk' ) ? $labels['yes'] : $labels['no'], ), - 'um-um_profile_object_cache_stop' => array( + 'profile_object_cache_stop' => array( 'label' => __( 'Disable Cache User Profile', 'ultimate-member' ), 'value' => UM()->options()->get( 'um_profile_object_cache_stop' ) ? $labels['yes'] : $labels['no'], ), - 'um-uninstall_on_delete' => array( + 'uninstall_on_delete' => array( 'label' => __( 'Remove Data on Uninstall?', 'ultimate-member' ), 'value' => UM()->options()->get( 'uninstall_on_delete' ) ? $labels['yes'] : $labels['no'], ), ); $feature = array( - 'um-enable_blocks' => array( + 'advanced_features_separator' => array( + 'label' => __( 'Advanced > Features', 'ultimate-member' ), + 'value' => '---------------------------------------------------------------------', + ), + 'enable_blocks' => array( 'label' => __( 'Enable Gutenberg Blocks', 'ultimate-member' ), 'value' => UM()->options()->get( 'enable_blocks' ) ? $labels['yes'] : $labels['no'], ), - 'um-member_directory_own_table' => array( + 'member_directory_own_table' => array( 'label' => __( 'Enable custom table for usermeta', 'ultimate-member' ), 'value' => UM()->options()->get( 'member_directory_own_table' ) ? $labels['yes'] : $labels['no'], ), - 'um-enable_as_email_sending' => array( + 'enable_as_email_sending' => array( 'label' => __( 'Email sending by Action Scheduler', 'ultimate-member' ), 'value' => UM()->options()->get( 'enable_as_email_sending' ) ? $labels['yes'] : $labels['no'], ), - 'um-disable_restriction_pre_queries' => array( + 'disable_restriction_pre_queries' => array( 'label' => __( 'Disable pre-queries for restriction content logic (advanced)', 'ultimate-member' ), 'value' => UM()->options()->get( 'disable_restriction_pre_queries' ) ? $labels['yes'] : $labels['no'], ), @@ -1423,19 +1489,23 @@ class Site_Health { } $secure_settings = array( - 'um-banned_capabilities' => array( + 'advanced_security_separator' => array( + 'label' => __( 'Advanced > Security', 'ultimate-member' ), + 'value' => '---------------------------------------------------------------------', + ), + 'banned_capabilities' => array( 'label' => __( 'Banned Administrative Capabilities', 'ultimate-member' ), 'value' => ! empty( $banned_capabilities ) ? implode( ', ', $banned_capabilities ) : '', ), - 'um-lock_register_forms' => array( + 'lock_register_forms' => array( 'label' => __( 'Lock All Register Forms', 'ultimate-member' ), 'value' => UM()->options()->get( 'lock_register_forms' ) ? $labels['yes'] : $labels['no'], ), - 'um-display_login_form_notice' => array( + 'display_login_form_notice' => array( 'label' => __( 'Display Login form notice to reset passwords', 'ultimate-member' ), 'value' => UM()->options()->get( 'display_login_form_notice' ) ? $labels['yes'] : $labels['no'], ), - 'um-secure_ban_admins_accounts' => array( + 'secure_ban_admins_accounts' => array( 'label' => __( 'Administrative capabilities ban (enable ban for administrative capabilities)', 'ultimate-member' ), 'value' => $secure_ban_admins_accounts ? $labels['yes'] : $labels['no'], ), @@ -1443,7 +1513,7 @@ class Site_Health { if ( ! empty( $secure_ban_admins_accounts ) ) { $secure_notify_admins_banned_accounts = UM()->options()->get( 'secure_notify_admins_banned_accounts' ); - $secure_settings['um-secure_notify_admins_banned_accounts'] = array( + $secure_settings['secure_notify_admins_banned_accounts'] = array( 'label' => __( 'Notify Administrators', 'ultimate-member' ), 'value' => $secure_notify_admins_banned_accounts ? $labels['yes'] : $labels['no'], ); @@ -1454,7 +1524,7 @@ class Site_Health { 'daily' => __( 'Daily', 'ultimate-member' ), ); - $secure_settings['um-secure_notify_admins_banned_accounts__interval'] = array( + $secure_settings['secure_notify_admins_banned_accounts__interval'] = array( 'label' => __( 'Notification Schedule', 'ultimate-member' ), 'value' => $secure_notify_admins_banned_accounts_options[ UM()->options()->get( 'secure_notify_admins_banned_accounts__interval' ) ], ); @@ -1464,21 +1534,25 @@ class Site_Health { $secure_allowed_redirect_hosts = UM()->options()->get( 'secure_allowed_redirect_hosts' ); $secure_allowed_redirect_hosts = explode( PHP_EOL, $secure_allowed_redirect_hosts ); - $secure_settings['um-secure_allowed_redirect_hosts'] = array( + $secure_settings['secure_allowed_redirect_hosts'] = array( 'label' => __( 'Allowed hosts for safe redirect', 'ultimate-member' ), 'value' => $secure_allowed_redirect_hosts, ); $developers = array( - 'um-allowed_choice_callbacks' => array( + 'advanced_developers_separator' => array( + 'label' => __( 'Advanced > Developers', 'ultimate-member' ), + 'value' => '---------------------------------------------------------------------', + ), + 'allowed_choice_callbacks' => array( 'label' => __( 'Allowed Choice Callbacks', 'ultimate-member' ), 'value' => UM()->options()->get( 'allowed_choice_callbacks' ), ), - 'um-rest_api_version' => array( + 'rest_api_version' => array( 'label' => __( 'REST API version', 'ultimate-member' ), 'value' => UM()->options()->get( 'rest_api_version' ), ), - 'um-allow_url_redirect_confirm' => array( + 'allow_url_redirect_confirm' => array( 'label' => __( 'Allow external link redirect confirm (enable JS.confirm for external links)', 'ultimate-member' ), 'value' => UM()->options()->get( 'allow_url_redirect_confirm' ) ? $labels['yes'] : $labels['no'], ), @@ -1487,10 +1561,15 @@ class Site_Health { return array_merge( $general, $feature, $secure_settings, $developers ); } - public function license_sitehealth() { + /** + * Retrieve license settings debug information for Ultimate Member. + * + * @return array License settings for Site Health, including label and value. + */ + public function license_settings_debug_information() { // Licenses settings. $license_settings = array( - 'um-licenses' => array( + 'licenses' => array( 'label' => __( 'Licenses', 'ultimate-member' ), 'value' => array(), ), @@ -1513,534 +1592,28 @@ class Site_Health { * } * add_filter( 'um_licenses_site_health', 'um_licenses_site_health', 10, 1 ); */ - $license_settings = apply_filters( 'um_licenses_site_health', $license_settings ); - - return $license_settings; + return apply_filters( 'um_licenses_site_health', $license_settings ); } - public function get_member_directories_sitehealth( $info ) { - $labels = self::get_labels(); - $options = array( - 'country' => __( 'Country', 'ultimate-member' ), - 'gender' => __( 'Gender', 'ultimate-member' ), - 'languages' => __( 'Languages', 'ultimate-member' ), - 'role' => __( 'Roles', 'ultimate-member' ), - 'birth_date' => __( 'Age', 'ultimate-member' ), - 'last_login' => __( 'Last Login', 'ultimate-member' ), - 'user_registered' => __( 'User Registered', 'ultimate-member' ), - 'first_name' => __( 'First Name', 'ultimate-member' ), - 'last_name' => __( 'Last Name', 'ultimate-member' ), - 'nickname' => __( 'Nickname', 'ultimate-member' ), - 'secondary_user_email' => __( 'Secondary Email Address', 'ultimate-member' ), - 'description' => __( 'Biography', 'ultimate-member' ), - 'phone_number' => __( 'Phone Number', 'ultimate-member' ), - 'mobile_number' => __( 'Mobile Number', 'ultimate-member' ), - 'role_select' => __( 'Roles (Dropdown)', 'ultimate-member' ), - 'role_radio' => __( 'Roles (Radio)', 'ultimate-member' ), - 'whatsapp' => __( 'WhatsApp number', 'ultimate-member' ), - 'facebook' => __( 'Facebook', 'ultimate-member' ), - 'twitter' => __( 'X (formerly Twitter)', 'ultimate-member' ), - 'viber' => __( 'Viber number', 'ultimate-member' ), - 'skype' => __( 'Skype ID', 'ultimate-member' ), - 'telegram' => __( 'Telegram', 'ultimate-member' ), - 'discord' => __( 'Discord', 'ultimate-member' ), - 'youtube' => __( 'Youtube', 'ultimate-member' ), - 'soundcloud' => __( 'SoundCloud', 'ultimate-member' ), - 'user_registered_desc' => __( 'New users first', 'ultimate-member' ), - 'user_registered_asc' => __( 'Old users first', 'ultimate-member' ), - 'username' => __( 'Username', 'ultimate-member' ), - 'display_name' => __( 'Display name', 'ultimate-member' ), - 'last_first_name' => __( 'Last & First name', 'ultimate-member' ), - 'random' => __( 'Random', 'ultimate-member' ), - 'other' => __( 'Other (Custom Field)', 'ultimate-member' ), - ); - - $info['ultimate-member-directories'] = array( - 'label' => __( 'Ultimate Member Directories', 'ultimate-member' ), - 'description' => __( 'This debug information about Ultimate Member directories.', 'ultimate-member' ), - 'fields' => array( - 'um-directory' => array( - 'label' => __( 'Member directories', 'ultimate-member' ), - 'value' => ! empty( $this->get_member_directories() ) ? $this->get_member_directories() : $labels['no-dir'], - ), - ), - ); - - if ( ! empty( $this->get_member_directories() ) ) { - foreach ( $this->get_member_directories() as $key => $directory ) { - if ( 0 === strpos( $key, 'ID#' ) ) { - $key = substr( $key, 3 ); - } - - $_um_view_types_value = get_post_meta( $key, '_um_view_types', true ); - $_um_view_types_value = empty( $_um_view_types_value ) ? array( 'grid', 'list' ) : $_um_view_types_value; - $_um_view_types_value = is_string( $_um_view_types_value ) ? array( $_um_view_types_value ) : $_um_view_types_value; - - $info[ 'ultimate-member-directory-' . $key ] = array( - 'label' => ' - ' . $directory . __( ' directory settings', 'ultimate-member' ), - 'description' => __( 'This debug information for your Ultimate Member directory.', 'ultimate-member' ), - 'fields' => array( - 'um-directory-shortcode' => array( - 'label' => __( 'Shortcode', 'ultimate-member' ), - 'value' => '[ultimatemember_directory id="' . $key . '"]', - ), - 'um-directory_template' => array( - 'label' => __( 'Template', 'ultimate-member' ), - 'value' => get_post_meta( $key, '_um_directory_template', true ) ? get_post_meta( $key, '_um_directory_template', true ) : $labels['default'], - ), - 'um-directory-view_types' => array( - 'label' => __( 'View types', 'ultimate-member' ), - 'value' => implode( ', ', $_um_view_types_value ), - ), - 'um-directory-default_view' => array( - 'label' => __( 'Default view type', 'ultimate-member' ), - 'value' => get_post_meta( $key, '_um_default_view', true ), - ), - ), - ); - - if ( isset( $options[ get_post_meta( $key, '_um_sortby', true ) ] ) ) { - $sortby_label = $options[ get_post_meta( $key, '_um_sortby', true ) ]; - } else { - $sortby_label = get_post_meta( $key, '_um_sortby', true ); - } - - $directory_roles_meta = get_post_meta( $key, '_um_roles', true ); - $directory_roles = array(); - if ( ! empty( $directory_roles_meta ) ) { - if ( is_string( $directory_roles_meta ) ) { - $directory_roles = array( $directory_roles_meta ); - } else { - $directory_roles = $directory_roles_meta; - } - } - - $directory_show_these_users_meta = get_post_meta( $key, '_um_show_these_users', true ); - $show_these_users = array(); - if ( ! empty( $directory_show_these_users_meta ) ) { - if ( is_string( $directory_show_these_users_meta ) ) { - $show_these_users = array( $directory_show_these_users_meta ); - } else { - $show_these_users = $directory_show_these_users_meta; - } - } - - $directory_exclude_these_users_meta = get_post_meta( $key, '_um_exclude_these_users', true ); - $exclude_these_users = array(); - if ( ! empty( $directory_exclude_these_users_meta ) ) { - if ( is_string( $directory_exclude_these_users_meta ) ) { - $exclude_these_users = array( $directory_exclude_these_users_meta ); - } else { - $exclude_these_users = $directory_exclude_these_users_meta; - } - } - - $info[ 'ultimate-member-directory-' . $key ]['fields'] = array_merge( - $info[ 'ultimate-member-directory-' . $key ]['fields'], - array( - 'um-directory-roles' => array( - 'label' => __( 'User Roles to display', 'ultimate-member' ), - 'value' => ! empty( $directory_roles ) ? implode( ', ', $directory_roles ) : $labels['all'], - ), - 'um-directory-has_profile_photo' => array( - 'label' => __( 'Only show members who have uploaded a profile photo', 'ultimate-member' ), - 'value' => get_post_meta( $key, '_um_has_profile_photo', true ) ? $labels['yes'] : $labels['no'], - ), - 'um-directory-has_cover_photo' => array( - 'label' => __( 'Only show members who have uploaded a cover photo', 'ultimate-member' ), - 'value' => get_post_meta( $key, '_um_has_cover_photo', true ) ? $labels['yes'] : $labels['no'], - ), - 'um-directory-show_these_users' => array( - 'label' => __( 'Only show specific users', 'ultimate-member' ), - 'value' => ! empty( $show_these_users ) ? implode( ', ', $show_these_users ) : '', - ), - 'um-directory-exclude_these_users' => array( - 'label' => __( 'Exclude specific users', 'ultimate-member' ), - 'value' => ! empty( $exclude_these_users ) ? implode( ', ', $exclude_these_users ) : '', - ), - ) - ); - - $info = apply_filters( 'um_debug_member_directory_general_extend', $info, $key ); - - $info[ 'ultimate-member-directory-' . $key ]['fields'] = array_merge( - $info[ 'ultimate-member-directory-' . $key ]['fields'], - array( - 'um-directory-sortby' => array( - 'label' => __( 'Default sort users by', 'ultimate-member' ), - 'value' => $sortby_label, - ), - ) - ); - - if ( 'other' === get_post_meta( $key, '_um_sortby', true ) ) { - $sort_type_opts = array( - 'CHAR' => __( 'CHAR', 'ultimate-member' ), - 'NUMERIC' => __( 'NUMERIC', 'ultimate-member' ), - 'BINARY' => __( 'BINARY', 'ultimate-member' ), - 'DATE' => __( 'DATE', 'ultimate-member' ), - 'DATETIME' => __( 'DATETIME', 'ultimate-member' ), - 'DECIMAL' => __( 'DECIMAL', 'ultimate-member' ), - 'SIGNED' => __( 'SIGNED', 'ultimate-member' ), - 'TIME' => __( 'TIME', 'ultimate-member' ), - 'UNSIGNED' => __( 'UNSIGNED', 'ultimate-member' ), - ); - - $info[ 'ultimate-member-directory-' . $key ]['fields'] = array_merge( - $info[ 'ultimate-member-directory-' . $key ]['fields'], - array( - 'um-directory-um_sortby_custom' => array( - 'label' => __( 'Meta key', 'ultimate-member' ), - 'value' => get_post_meta( $key, '_um_sortby_custom', true ), - ), - 'um-directory-um_sortby_custom_type' => array( - 'label' => __( 'Data type', 'ultimate-member' ), - 'value' => $sort_type_opts[ get_post_meta( $key, '_um_sortby_custom_type', true ) ], - ), - 'um-directory-um_sortby_custom_order' => array( - 'label' => __( 'Order', 'ultimate-member' ), - 'value' => 'ASC' === get_post_meta( $key, '_um_sortby_custom_order', true ) ? __( 'Ascending', 'ultimate-member' ) : __( 'Descending', 'ultimate-member' ), - ), - 'um-directory-um_sortby_custom_label' => array( - 'label' => __( 'Label of custom sort', 'ultimate-member' ), - 'value' => get_post_meta( $key, '_um_sortby_custom_label', true ), - ), - ) - ); - } - - $info[ 'ultimate-member-directory-' . $key ]['fields'] = array_merge( - $info[ 'ultimate-member-directory-' . $key ]['fields'], - array( - 'um-directory-enable_sorting' => array( - 'label' => __( 'Enable custom sorting', 'ultimate-member' ), - 'value' => get_post_meta( $key, '_um_enable_sorting', true ) ? $labels['yes'] : $labels['no'], - ), - ) - ); - - if ( 1 === absint( get_post_meta( $key, '_um_enable_sorting', true ) ) ) { - $sorting_fields = get_post_meta( $key, '_um_sorting_fields', true ); - if ( ! empty( $sorting_fields ) ) { - foreach ( $sorting_fields as $k => $field ) { - if ( is_array( $field ) ) { - $info[ 'ultimate-member-directory-' . $key ]['fields'] = array_merge( - $info[ 'ultimate-member-directory-' . $key ]['fields'], - array( - 'um-directory-sorting_fields-' . $k => array( - 'label' => __( 'Field(s) to enable in sorting', 'ultimate-member' ), - 'value' => __( 'Label: ', 'ultimate-member' ) . array_values( $field )[0] . ' | ' . __( 'Meta key: ', 'ultimate-member' ) . stripslashes( array_keys( $field )[0] ), - ), - ) - ); - } else { - $sortby_label = isset( $options[ $field ] ) ? $options[ $field ] : $field; - $info[ 'ultimate-member-directory-' . $key ]['fields'] = array_merge( - $info[ 'ultimate-member-directory-' . $key ]['fields'], - array( - 'um-directory-sorting_fields-' . $k => array( - 'label' => __( 'Field to enable in sorting', 'ultimate-member' ), - 'value' => $sortby_label, - ), - ) - ); - } - } - } - } - - $info[ 'ultimate-member-directory-' . $key ]['fields'] = array_merge( - $info[ 'ultimate-member-directory-' . $key ]['fields'], - array( - 'um-directory-search' => array( - 'label' => __( 'Enable Search feature', 'ultimate-member' ), - 'value' => get_post_meta( $key, '_um_search', true ) ? $labels['yes'] : $labels['no'], - ), - ) - ); - - if ( 1 === absint( get_post_meta( $key, '_um_search', true ) ) ) { - $directory_roles_can_search_meta = get_post_meta( $key, '_um_roles_can_search', true ); - $roles_can_search = array(); - if ( ! empty( $directory_roles_can_search_meta ) ) { - if ( is_string( $directory_roles_can_search_meta ) ) { - $roles_can_search = array( $directory_roles_can_search_meta ); - } else { - $roles_can_search = $directory_roles_can_search_meta; - } - } - - $info[ 'ultimate-member-directory-' . $key ]['fields'] = array_merge( - $info[ 'ultimate-member-directory-' . $key ]['fields'], - array( - 'um-directory-roles_can_search' => array( - 'label' => __( 'User Roles that can use search', 'ultimate-member' ), - 'value' => ! empty( $roles_can_search ) ? implode( ', ', $roles_can_search ) : $labels['all'], - ), - ) - ); - } - - if ( ! empty( get_post_meta( $key, '_um_search_exclude_fields', true ) ) ) { - $info[ 'ultimate-member-directory-' . $key ]['fields'] = array_merge( - $info[ 'ultimate-member-directory-' . $key ]['fields'], - array( - 'um-directory-um_search_exclude_fields' => array( - 'label' => __( 'Exclude fields from search', 'ultimate-member' ), - 'value' => get_post_meta( $key, '_um_search_exclude_fields', true ), - ), - ) - ); - } - - if ( ! empty( get_post_meta( $key, '_um_search_include_fields', true ) ) ) { - $info[ 'ultimate-member-directory-' . $key ]['fields'] = array_merge( - $info[ 'ultimate-member-directory-' . $key ]['fields'], - array( - 'um-directory-um_search_include_fields' => array( - 'label' => __( 'Fields to search by', 'ultimate-member' ), - 'value' => get_post_meta( $key, '_um_search_include_fields', true ), - ), - ) - ); - } - - $info[ 'ultimate-member-directory-' . $key ]['fields'] = array_merge( - $info[ 'ultimate-member-directory-' . $key ]['fields'], - array( - 'um-directory-filters' => array( - 'label' => __( 'Enable Filters feature', 'ultimate-member' ), - 'value' => get_post_meta( $key, '_um_filters', true ) ? $labels['yes'] : $labels['no'], - ), - ) - ); - - if ( 1 === absint( get_post_meta( $key, '_um_filters', true ) ) ) { - $directory_roles_can_filter_meta = get_post_meta( $key, '_um_roles_can_filter', true ); - $roles_can_filter = array(); - if ( ! empty( $directory_roles_can_filter_meta ) ) { - if ( is_string( $directory_roles_can_filter_meta ) ) { - $roles_can_filter = array( $directory_roles_can_filter_meta ); - } else { - $roles_can_filter = $directory_roles_can_filter_meta; - } - } - - $info[ 'ultimate-member-directory-' . $key ]['fields'] = array_merge( - $info[ 'ultimate-member-directory-' . $key ]['fields'], - array( - 'um-directory-roles_can_filter' => array( - 'label' => __( 'User Roles that can use filters', 'ultimate-member' ), - 'value' => ! empty( $roles_can_filter ) ? implode( ', ', $roles_can_filter ) : $labels['all'], - ), - ) - ); - - $search_fields = get_post_meta( $key, '_um_search_fields', true ); - if ( ! empty( $search_fields ) && is_array( $search_fields ) ) { - $field_labels = array(); - foreach ( $search_fields as $k => $field ) { - $field_label = isset( $options[ $field ] ) ? $options[ $field ] : $field; - $field_labels[] = $field_label; - } - $info[ 'ultimate-member-directory-' . $key ]['fields'] = array_merge( - $info[ 'ultimate-member-directory-' . $key ]['fields'], - array( - 'um-directory-search_fields-' . $k => array( - 'label' => __( 'Filter meta to enable', 'ultimate-member' ), - 'value' => $field_labels, - ), - ) - ); - } - - $info[ 'ultimate-member-directory-' . $key ]['fields'] = array_merge( - $info[ 'ultimate-member-directory-' . $key ]['fields'], - array( - 'um-directory-filters_expanded' => array( - 'label' => __( 'Expand the filter bar by default', 'ultimate-member' ), - 'value' => get_post_meta( $key, '_um_filters_expanded', true ) ? $labels['yes'] : $labels['no'], - ), - ) - ); - - if ( 1 === absint( get_post_meta( $key, '_um_filters_expanded', true ) ) ) { - $info[ 'ultimate-member-directory-' . $key ]['fields'] = array_merge( - $info[ 'ultimate-member-directory-' . $key ]['fields'], - array( - 'um-directory-filters_is_collapsible' => array( - 'label' => __( 'Can filter bar be collapsed', 'ultimate-member' ), - 'value' => get_post_meta( $key, '_um_filters_is_collapsible', true ) ? $labels['yes'] : $labels['no'], - ), - ) - ); - } - } - - $search_filters = get_post_meta( $key, '_um_search_filters', true ); - if ( ! empty( $search_filters ) && is_array( $search_filters ) ) { - $field_labels = array(); - foreach ( $search_filters as $k => $field ) { - $field_label = isset( $options[ $k ] ) ? $options[ $k ] : $k; - $value = $field; - if ( is_array( $field ) ) { - // @todo: check if field 'From' and 'To' is set. $value = __( 'From ', 'ultimate-member' ) . $field[0] . __( ' to ', 'ultimate-member' ) . $field[1]; - $value = implode( ', ', $field ); - } - $field_labels[] = $field_label . ' - ' . $value; - } - $info[ 'ultimate-member-directory-' . $key ]['fields'] = array_merge( - $info[ 'ultimate-member-directory-' . $key ]['fields'], - array( - 'um-directory-search_filters-' . $k => array( - 'label' => __( 'Admin filtering', 'ultimate-member' ), - 'value' => $field_labels, - ), - ) - ); - } - - $info[ 'ultimate-member-directory-' . $key ]['fields'] = array_merge( - $info[ 'ultimate-member-directory-' . $key ]['fields'], - array( - 'um-directory-profile_photo' => array( - 'label' => __( 'Enable Profile Photo', 'ultimate-member' ), - 'value' => get_post_meta( $key, '_um_profile_photo', true ) ? $labels['yes'] : $labels['no'], - ), - 'um-directory-cover_photos' => array( - 'label' => __( 'Enable Cover Photo', 'ultimate-member' ), - 'value' => get_post_meta( $key, '_um_cover_photos', true ) ? $labels['yes'] : $labels['no'], - ), - 'um-directory-show_name' => array( - 'label' => __( 'Show display name', 'ultimate-member' ), - 'value' => get_post_meta( $key, '_um_show_name', true ) ? $labels['yes'] : $labels['no'], - ), - ) - ); - - $info = apply_filters( 'um_debug_member_directory_profile_extend', $info, $key ); - - $info[ 'ultimate-member-directory-' . $key ]['fields'] = array_merge( - $info[ 'ultimate-member-directory-' . $key ]['fields'], - array( - 'um-directory-show_tagline' => array( - 'label' => __( 'Show tagline below profile name', 'ultimate-member' ), - 'value' => get_post_meta( $key, '_um_show_tagline', true ) ? $labels['yes'] : $labels['no'], - ), - ) - ); - - if ( 1 === absint( get_post_meta( $key, '_um_show_tagline', true ) ) ) { - $tagline_fields = get_post_meta( $key, '_um_tagline_fields', true ); - if ( ! empty( $tagline_fields ) && is_array( $tagline_fields ) ) { - $field_labels = array(); - foreach ( $tagline_fields as $k => $field ) { - $label = isset( $options[ $field ] ) ? $options[ $field ] : $field; - $field_labels[] = $label; - } - - $info[ 'ultimate-member-directory-' . $key ]['fields'] = array_merge( - $info[ 'ultimate-member-directory-' . $key ]['fields'], - array( - 'um-directory-tagline_fields-' . $k => array( - 'label' => __( 'Field to display in tagline', 'ultimate-member' ), - 'value' => $field_labels, - ), - ) - ); - } - } - - $info[ 'ultimate-member-directory-' . $key ]['fields'] = array_merge( - $info[ 'ultimate-member-directory-' . $key ]['fields'], - array( - 'um-directory-show_userinfo' => array( - 'label' => __( 'Show extra user information below tagline?', 'ultimate-member' ), - 'value' => get_post_meta( $key, '_um_show_userinfo', true ) ? $labels['yes'] : $labels['no'], - ), - ) - ); - - if ( 1 === absint( get_post_meta( $key, '_um_show_userinfo', true ) ) ) { - $reveal_fields = get_post_meta( $key, '_um_reveal_fields', true ); - if ( ! empty( $reveal_fields ) && is_array( $reveal_fields ) ) { - $field_labels = array(); - foreach ( $reveal_fields as $k => $field ) { - $label = isset( $options[ $field ] ) ? $options[ $field ] : $field; - $field_labels[] = $label; - } - - $info[ 'ultimate-member-directory-' . $key ]['fields'] = array_merge( - $info[ 'ultimate-member-directory-' . $key ]['fields'], - array( - 'um-directory-reveal_fields-' . $k => array( - 'label' => __( 'Field to display in extra user information section', 'ultimate-member' ), - 'value' => $field_labels, - ), - ) - ); - } - } - - $info[ 'ultimate-member-directory-' . $key ]['fields'] = array_merge( - $info[ 'ultimate-member-directory-' . $key ]['fields'], - array( - 'um-directory-um_show_social' => array( - 'label' => __( 'Show social connect icons in extra user information section', 'ultimate-member' ), - 'value' => get_post_meta( $key, '_um_show_social', true ) ? $labels['yes'] : $labels['no'], - ), - 'um-directory-um_userinfo_animate' => array( - 'label' => __( 'Hide extra user information to the reveal section', 'ultimate-member' ), - 'value' => get_post_meta( $key, '_um_userinfo_animate', true ) ? $labels['yes'] : $labels['no'], - ), - 'um-directory-um_must_search' => array( - 'label' => __( 'Show results only after search/filtration', 'ultimate-member' ), - 'value' => get_post_meta( $key, '_um_must_search', true ) ? $labels['yes'] : $labels['no'], - ), - 'um-directory-um_max_users' => array( - 'label' => __( 'Maximum number of profiles', 'ultimate-member' ), - 'value' => get_post_meta( $key, '_um_max_users', true ), - ), - 'um-directory-profiles_per_page' => array( - 'label' => __( 'Number of profiles per page', 'ultimate-member' ), - 'value' => get_post_meta( $key, '_um_profiles_per_page', true ), - ), - 'um-directory-um_profiles_per_page_mobile' => array( - 'label' => __( 'Maximum number of profiles', 'ultimate-member' ), - 'value' => get_post_meta( $key, '_um_profiles_per_page_mobile', true ), - ), - 'um-directory-um_directory_header' => array( - 'label' => __( 'Results Text', 'ultimate-member' ), - 'value' => get_post_meta( $key, '_um_directory_header', true ), - ), - 'um-directory-um_directory_header_single' => array( - 'label' => __( 'Single Result Text', 'ultimate-member' ), - 'value' => get_post_meta( $key, '_um_directory_header_single', true ), - ), - 'um-directory-um_directory_no_users' => array( - 'label' => __( 'Custom text if no users were found', 'ultimate-member' ), - 'value' => get_post_meta( $key, '_um_directory_no_users', true ), - ), - ) - ); - - $info = apply_filters( 'um_debug_member_directory_extend', $info, $key ); - } - } - - return $info; - } - - public function roles_sitehealth( $info ) { + /** + * Retrieve information about roles and role settings in the site health check. + * + * @param array $info The existing site health information array. + * + * @return array Updated site health information including user roles and their settings. + */ + public function roles_debug_information( $info ) { $labels = self::get_labels(); + $all_roles = UM()->roles()->get_roles(); + // User roles settings $roles_array = array(); - foreach ( $this->get_roles() as $key => $role ) { - if ( strpos( $key, 'um_' ) === 0 ) { - $key = substr( $key, 3 ); + foreach ( $all_roles as $slug => $role ) { + if ( strpos( $slug, 'um_' ) === 0 ) { + $slug = substr( $slug, 3 ); } - $rolemeta = $this->get_role_meta( $key ); + $rolemeta = $this->get_role_meta( $slug ); if ( false === $rolemeta ) { continue; } @@ -2053,69 +1626,56 @@ class Site_Health { } $info['ultimate-member-user-roles'] = array( - 'label' => __( 'User roles', 'ultimate-member' ), + 'label' => __( 'Ultimate Member User Roles', 'ultimate-member' ), 'description' => __( 'This debug information about user roles.', 'ultimate-member' ), 'fields' => array( - 'um-roles' => array( + 'roles' => array( 'label' => __( 'User Roles (priority)', 'ultimate-member' ), 'value' => implode( ', ', $roles_array ), ), - 'um-register_role' => array( + 'register_role' => array( 'label' => __( 'WordPress Default New User Role', 'ultimate-member' ), - 'value' => get_option( 'default_role' ), + 'value' => $all_roles[ get_option( 'default_role' ) ], ), ), ); - foreach ( $this->get_roles() as $key => $role ) { - if ( strpos( $key, 'um_' ) === 0 ) { - $key = substr( $key, 3 ); + foreach ( $all_roles as $slug => $role ) { + if ( strpos( $slug, 'um_' ) === 0 ) { + $slug = substr( $slug, 3 ); } - $rolemeta = $this->get_role_meta( $key ); + $rolemeta = $this->get_role_meta( $slug ); if ( false === $rolemeta ) { continue; } - $info[ 'ultimate-member-' . $key ] = array( - 'label' => ' - ' . $role . __( ' role settings', 'ultimate-member' ), - 'description' => __( 'This debug information about user role.', 'ultimate-member' ), - 'fields' => array(), - ); + $debug_info = array(); if ( array_key_exists( '_um_can_access_wpadmin', $rolemeta ) ) { - $info[ 'ultimate-member-' . $key ]['fields'] = array_merge( - $info[ 'ultimate-member-' . $key ]['fields'], - array( - 'um-can_access_wpadmin' => array( - 'label' => __( 'Can access wp-admin?', 'ultimate-member' ), - 'value' => $rolemeta['_um_can_access_wpadmin'] ? $labels['yes'] : $labels['no'], - ), - ) + $debug_info[] = array( + 'can_access_wpadmin' => array( + 'label' => __( 'Can access wp-admin?', 'ultimate-member' ), + 'value' => $rolemeta['_um_can_access_wpadmin'] ? $labels['yes'] : $labels['no'], + ), ); } if ( array_key_exists( '_um_can_not_see_adminbar', $rolemeta ) ) { - $info[ 'ultimate-member-' . $key ]['fields'] = array_merge( - $info[ 'ultimate-member-' . $key ]['fields'], - array( - 'um-can_not_see_adminbar' => array( - 'label' => __( 'Force hiding adminbar in frontend?', 'ultimate-member' ), - 'value' => $rolemeta['_um_can_not_see_adminbar'] ? $labels['yes'] : $labels['no'], - ), - ) + $debug_info[] = array( + 'can_not_see_adminbar' => array( + 'label' => __( 'Force hiding adminbar in frontend?', 'ultimate-member' ), + 'value' => $rolemeta['_um_can_not_see_adminbar'] ? $labels['yes'] : $labels['no'], + ), ); } if ( array_key_exists( '_um_can_edit_everyone', $rolemeta ) ) { - $info[ 'ultimate-member-' . $key ]['fields'] = array_merge( - $info[ 'ultimate-member-' . $key ]['fields'], - array( - 'um-can_edit_everyone' => array( - 'label' => __( 'Can edit other member accounts?', 'ultimate-member' ), - 'value' => $rolemeta['_um_can_edit_everyone'] ? $labels['yes'] : $labels['no'], - ), - ) + $debug_info[] = array( + 'can_edit_everyone' => array( + 'label' => __( 'Can edit other member accounts?', 'ultimate-member' ), + 'value' => $rolemeta['_um_can_edit_everyone'] ? $labels['yes'] : $labels['no'], + ), ); } @@ -2130,26 +1690,20 @@ class Site_Health { } } - $info[ 'ultimate-member-' . $key ]['fields'] = array_merge( - $info[ 'ultimate-member-' . $key ]['fields'], - array( - 'um-can_edit_roles' => array( - 'label' => __( 'Can edit these user roles only', 'ultimate-member' ), - 'value' => ! empty( $can_edit_roles ) ? implode( ', ', $can_edit_roles ) : $labels['all'], - ), - ) + $debug_info[] = array( + 'can_edit_roles' => array( + 'label' => __( 'Can edit these user roles only', 'ultimate-member' ), + 'value' => ! empty( $can_edit_roles ) ? implode( ', ', $can_edit_roles ) : $labels['all'], + ), ); } if ( array_key_exists( '_um_can_delete_everyone', $rolemeta ) ) { - $info[ 'ultimate-member-' . $key ]['fields'] = array_merge( - $info[ 'ultimate-member-' . $key ]['fields'], - array( - 'um-can_delete_everyone' => array( - 'label' => __( 'Can delete other member accounts?', 'ultimate-member' ), - 'value' => $rolemeta['_um_can_delete_everyone'] ? $labels['yes'] : $labels['no'], - ), - ) + $debug_info[] = array( + 'can_delete_everyone' => array( + 'label' => __( 'Can delete other member accounts?', 'ultimate-member' ), + 'value' => $rolemeta['_um_can_delete_everyone'] ? $labels['yes'] : $labels['no'], + ), ); } @@ -2164,50 +1718,38 @@ class Site_Health { } } - $info[ 'ultimate-member-' . $key ]['fields'] = array_merge( - $info[ 'ultimate-member-' . $key ]['fields'], - array( - 'um-can_delete_roles' => array( - 'label' => __( 'Can delete these user roles only', 'ultimate-member' ), - 'value' => ! empty( $can_delete_roles ) ? implode( ', ', $can_delete_roles ) : $labels['all'], - ), - ) + $debug_info[] = array( + 'can_delete_roles' => array( + 'label' => __( 'Can delete these user roles only', 'ultimate-member' ), + 'value' => ! empty( $can_delete_roles ) ? implode( ', ', $can_delete_roles ) : $labels['all'], + ), ); } if ( array_key_exists( '_um_can_edit_profile', $rolemeta ) ) { - $info[ 'ultimate-member-' . $key ]['fields'] = array_merge( - $info[ 'ultimate-member-' . $key ]['fields'], - array( - 'um-can_edit_profile' => array( - 'label' => __( 'Can edit their profile?', 'ultimate-member' ), - 'value' => $rolemeta['_um_can_edit_profile'] ? $labels['yes'] : $labels['no'], - ), - ) + $debug_info[] = array( + 'can_edit_profile' => array( + 'label' => __( 'Can edit their profile?', 'ultimate-member' ), + 'value' => $rolemeta['_um_can_edit_profile'] ? $labels['yes'] : $labels['no'], + ), ); } if ( array_key_exists( '_um_can_delete_profile', $rolemeta ) ) { - $info[ 'ultimate-member-' . $key ]['fields'] = array_merge( - $info[ 'ultimate-member-' . $key ]['fields'], - array( - 'um-can_delete_profile' => array( - 'label' => __( 'Can delete their account?', 'ultimate-member' ), - 'value' => $rolemeta['_um_can_delete_profile'] ? $labels['yes'] : $labels['no'], - ), - ) + $debug_info[] = array( + 'can_delete_profile' => array( + 'label' => __( 'Can delete their account?', 'ultimate-member' ), + 'value' => $rolemeta['_um_can_delete_profile'] ? $labels['yes'] : $labels['no'], + ), ); } if ( array_key_exists( '_um_can_view_all', $rolemeta ) ) { - $info[ 'ultimate-member-' . $key ]['fields'] = array_merge( - $info[ 'ultimate-member-' . $key ]['fields'], - array( - 'um-can_view_all' => array( - 'label' => __( 'Can view other member profiles?', 'ultimate-member' ), - 'value' => $rolemeta['_um_can_view_all'] ? $labels['yes'] : $labels['no'], - ), - ) + $debug_info[] = array( + 'can_view_all' => array( + 'label' => __( 'Can view other member profiles?', 'ultimate-member' ), + 'value' => $rolemeta['_um_can_view_all'] ? $labels['yes'] : $labels['no'], + ), ); } @@ -2222,14 +1764,29 @@ class Site_Health { } } - $info[ 'ultimate-member-' . $key ]['fields'] = array_merge( - $info[ 'ultimate-member-' . $key ]['fields'], - array( - 'um-can_view_roles' => array( - 'label' => __( 'Can view these user roles only', 'ultimate-member' ), - 'value' => ! empty( $can_view_roles ) ? implode( ', ', $can_view_roles ) : $labels['all'], - ), - ) + $debug_info[] = array( + 'can_view_roles' => array( + 'label' => __( 'Can view these user roles only', 'ultimate-member' ), + 'value' => ! empty( $can_view_roles ) ? implode( ', ', $can_view_roles ) : $labels['all'], + ), + ); + } + + if ( array_key_exists( '_um_can_make_private_profile', $rolemeta ) ) { + $debug_info[] = array( + 'can_make_private_profile' => array( + 'label' => __( 'Can make their profile private?', 'ultimate-member' ), + 'value' => $rolemeta['_um_can_make_private_profile'] ? $labels['yes'] : $labels['no'], + ), + ); + } + + if ( array_key_exists( '_um_can_access_private_profile', $rolemeta ) ) { + $debug_info[] = array( + 'can_access_private_profile' => array( + 'label' => __( 'Can view/access private profiles?', 'ultimate-member' ), + 'value' => $rolemeta['_um_can_access_private_profile'] ? $labels['yes'] : $labels['no'], + ), ); } @@ -2244,53 +1801,23 @@ class Site_Health { $default_homepage = __( 'No such option', 'ultimate-member' ); } - if ( array_key_exists( '_um_can_make_private_profile', $rolemeta ) ) { - $info[ 'ultimate-member-' . $key ]['fields'] = array_merge( - $info[ 'ultimate-member-' . $key ]['fields'], - array( - 'um-can_make_private_profile' => array( - 'label' => __( 'Can make their profile private?', 'ultimate-member' ), - 'value' => $rolemeta['_um_can_make_private_profile'] ? $labels['yes'] : $labels['no'], - ), - ) - ); - } - - if ( array_key_exists( '_um_can_access_private_profile', $rolemeta ) ) { - $info[ 'ultimate-member-' . $key ]['fields'] = array_merge( - $info[ 'ultimate-member-' . $key ]['fields'], - array( - 'um-can_access_private_profile' => array( - 'label' => __( 'Can view/access private profiles?', 'ultimate-member' ), - 'value' => $rolemeta['_um_can_access_private_profile'] ? $labels['yes'] : $labels['no'], - ), - ) - ); - } - - $info[ 'ultimate-member-' . $key ]['fields'] = array_merge( - $info[ 'ultimate-member-' . $key ]['fields'], - array( - 'um-profile_noindex' => array( - 'label' => __( 'Avoid indexing profile by search engines', 'ultimate-member' ), - 'value' => $profile_noindex, - ), - 'um-default_homepage' => array( - 'label' => __( 'Can view default homepage?', 'ultimate-member' ), - 'value' => $default_homepage, - ), - ) + $debug_info[] = array( + 'profile_noindex' => array( + 'label' => __( 'Avoid indexing profile by search engines', 'ultimate-member' ), + 'value' => $profile_noindex, + ), + 'default_homepage' => array( + 'label' => __( 'Can view default homepage?', 'ultimate-member' ), + 'value' => $default_homepage, + ), ); if ( isset( $rolemeta['_um_default_homepage'] ) && 0 === absint( $rolemeta['_um_default_homepage'] ) ) { - $info[ 'ultimate-member-' . $key ]['fields'] = array_merge( - $info[ 'ultimate-member-' . $key ]['fields'], - array( - 'um-redirect_homepage' => array( - 'label' => __( 'Custom Homepage Redirect', 'ultimate-member' ), - 'value' => $rolemeta['_um_redirect_homepage'], - ), - ) + $debug_info[] = array( + 'redirect_homepage' => array( + 'label' => __( 'Custom Homepage Redirect', 'ultimate-member' ), + 'value' => $rolemeta['_um_redirect_homepage'], + ), ); } @@ -2301,14 +1828,11 @@ class Site_Health { ); if ( array_key_exists( '_um_status', $rolemeta ) && isset( $status_options[ $rolemeta['_um_status'] ] ) ) { - $info[ 'ultimate-member-' . $key ]['fields'] = array_merge( - $info[ 'ultimate-member-' . $key ]['fields'], - array( - 'um-status' => array( - 'label' => __( 'Registration Status', 'ultimate-member' ), - 'value' => $status_options[ $rolemeta['_um_status'] ], - ), - ) + $debug_info[] = array( + 'status' => array( + 'label' => __( 'Registration Status', 'ultimate-member' ), + 'value' => $status_options[ $rolemeta['_um_status'] ], + ), ); } @@ -2319,141 +1843,103 @@ class Site_Health { ); if ( isset( $auto_approve_act[ $rolemeta['_um_auto_approve_act'] ] ) ) { - $info[ 'ultimate-member-' . $key ]['fields'] = array_merge( - $info[ 'ultimate-member-' . $key ]['fields'], - array( - 'um-auto_approve_act' => array( - 'label' => __( 'Custom Homepage Redirect', 'ultimate-member' ), - 'value' => $auto_approve_act[ $rolemeta['_um_auto_approve_act'] ], - ), - ) + $debug_info[] = array( + 'auto_approve_act' => array( + 'label' => __( 'Auto-approve action', 'ultimate-member' ), + 'value' => $auto_approve_act[ $rolemeta['_um_auto_approve_act'] ], + ), ); } if ( 'redirect_url' === $rolemeta['_um_auto_approve_act'] && array_key_exists( '_um_auto_approve_url', $rolemeta ) ) { - $info[ 'ultimate-member-' . $key ]['fields'] = array_merge( - $info[ 'ultimate-member-' . $key ]['fields'], - array( - 'um-auto_approve_url' => array( - 'label' => __( 'Set Custom Redirect URL', 'ultimate-member' ), - 'value' => $rolemeta['_um_auto_approve_url'], - ), - ) + $debug_info[] = array( + 'auto_approve_url' => array( + 'label' => __( 'Set Custom Redirect URL', 'ultimate-member' ), + 'value' => $rolemeta['_um_auto_approve_url'], + ), ); } - } - - if ( array_key_exists( '_um_status', $rolemeta ) && 'checkmail' === $rolemeta['_um_status'] ) { + } elseif ( array_key_exists( '_um_status', $rolemeta ) && 'checkmail' === $rolemeta['_um_status'] ) { $checkmail_action = array( 'show_message' => __( 'Show custom message', 'ultimate-member' ), 'redirect_url' => __( 'Redirect to URL', 'ultimate-member' ), ); if ( array_key_exists( '_um_login_email_activate', $rolemeta ) ) { - $info[ 'ultimate-member-' . $key ]['fields'] = array_merge( - $info[ 'ultimate-member-' . $key ]['fields'], - array( - 'um-login_email_activate' => array( - 'label' => __( 'Login user after validating the activation link?', 'ultimate-member' ), - 'value' => $rolemeta['_um_login_email_activate'] ? $labels['yes'] : $labels['no'], - ), - ) + $debug_info[] = array( + 'login_email_activate' => array( + 'label' => __( 'Login user after validating the activation link?', 'ultimate-member' ), + 'value' => $rolemeta['_um_login_email_activate'] ? $labels['yes'] : $labels['no'], + ), ); } if ( isset( $checkmail_action[ $rolemeta['_um_checkmail_action'] ] ) ) { - $info[ 'ultimate-member-' . $key ]['fields'] = array_merge( - $info[ 'ultimate-member-' . $key ]['fields'], - array( - 'um-checkmail_action' => array( - 'label' => __( 'Action to be taken after registration', 'ultimate-member' ), - 'value' => $checkmail_action[ $rolemeta['_um_checkmail_action'] ], - ), - ) + $debug_info[] = array( + 'checkmail_action' => array( + 'label' => __( 'Action to be taken after registration', 'ultimate-member' ), + 'value' => $checkmail_action[ $rolemeta['_um_checkmail_action'] ], + ), ); } if ( 'show_message' === $rolemeta['_um_checkmail_action'] ) { if ( array_key_exists( '_um_checkmail_message', $rolemeta ) ) { - $info[ 'ultimate-member-' . $key ]['fields'] = array_merge( - $info[ 'ultimate-member-' . $key ]['fields'], - array( - 'um-checkmail_message' => array( - 'label' => __( 'Personalize the custom message', 'ultimate-member' ), - 'value' => stripslashes( $rolemeta['_um_checkmail_message'] ), - ), - ) - ); - } - } else { - if ( array_key_exists( '_um_checkmail_url', $rolemeta ) ) { - $info[ 'ultimate-member-' . $key ]['fields'] = array_merge( - $info[ 'ultimate-member-' . $key ]['fields'], - array( - 'um-checkmail_url' => array( - 'label' => __( 'Set Custom Redirect URL', 'ultimate-member' ), - 'value' => $rolemeta['_um_checkmail_url'], - ), - ) + $debug_info[] = array( + 'checkmail_message' => array( + 'label' => __( 'Personalize the custom message', 'ultimate-member' ), + 'value' => stripslashes( $rolemeta['_um_checkmail_message'] ), + ), ); } + } elseif ( array_key_exists( '_um_checkmail_url', $rolemeta ) ) { + $debug_info[] = array( + 'checkmail_url' => array( + 'label' => __( 'Set Custom Redirect URL', 'ultimate-member' ), + 'value' => $rolemeta['_um_checkmail_url'], + ), + ); } if ( array_key_exists( '_um_url_email_activate', $rolemeta ) ) { - $info[ 'ultimate-member-' . $key ]['fields'] = array_merge( - $info[ 'ultimate-member-' . $key ]['fields'], - array( - 'um-url_email_activate' => array( - 'label' => __( 'URL redirect after email activation', 'ultimate-member' ), - 'value' => $rolemeta['_um_url_email_activate'], - ), - ) + $debug_info[] = array( + 'url_email_activate' => array( + 'label' => __( 'URL redirect after email activation', 'ultimate-member' ), + 'value' => $rolemeta['_um_url_email_activate'], + ), ); } - } - - if ( array_key_exists( '_um_status', $rolemeta ) && 'pending' === $rolemeta['_um_status'] ) { + } elseif ( array_key_exists( '_um_status', $rolemeta ) && 'pending' === $rolemeta['_um_status'] ) { $pending_action = array( 'show_message' => __( 'Show custom message', 'ultimate-member' ), 'redirect_url' => __( 'Redirect to URL', 'ultimate-member' ), ); if ( array_key_exists( '_um_pending_action', $rolemeta ) ) { - $info[ 'ultimate-member-' . $key ]['fields'] = array_merge( - $info[ 'ultimate-member-' . $key ]['fields'], - array( - 'um-pending_action' => array( - 'label' => __( 'Action to be taken after registration', 'ultimate-member' ), - 'value' => $pending_action[ $rolemeta['_um_pending_action'] ], - ), - ) + $debug_info[] = array( + 'pending_action' => array( + 'label' => __( 'Action to be taken after registration', 'ultimate-member' ), + 'value' => $pending_action[ $rolemeta['_um_pending_action'] ], + ), ); } if ( 'show_message' === $rolemeta['_um_pending_action'] ) { if ( array_key_exists( '_um_pending_message', $rolemeta ) ) { - $info[ 'ultimate-member-' . $key ]['fields'] = array_merge( - $info[ 'ultimate-member-' . $key ]['fields'], - array( - 'um-pending_message' => array( - 'label' => __( 'Personalize the custom message', 'ultimate-member' ), - 'value' => stripslashes( $rolemeta['_um_pending_message'] ), - ), - ) - ); - } - } else { - if ( array_key_exists( '_um_pending_url', $rolemeta ) ) { - $info[ 'ultimate-member-' . $key ]['fields'] = array_merge( - $info[ 'ultimate-member-' . $key ]['fields'], - array( - 'um-pending_url' => array( - 'label' => __( 'Set Custom Redirect URL', 'ultimate-member' ), - 'value' => $rolemeta['_um_pending_url'], - ), - ) + $debug_info[] = array( + 'pending_message' => array( + 'label' => __( 'Personalize the custom message', 'ultimate-member' ), + 'value' => stripslashes( $rolemeta['_um_pending_message'] ), + ), ); } + } elseif ( array_key_exists( '_um_pending_url', $rolemeta ) ) { + $debug_info[] = array( + 'pending_url' => array( + 'label' => __( 'Set Custom Redirect URL', 'ultimate-member' ), + 'value' => $rolemeta['_um_pending_url'], + ), + ); } } @@ -2465,25 +1951,19 @@ class Site_Health { ); if ( array_key_exists( '_um_after_login', $rolemeta ) && isset( $after_login_options[ $rolemeta['_um_after_login'] ] ) ) { - $info[ 'ultimate-member-' . $key ]['fields'] = array_merge( - $info[ 'ultimate-member-' . $key ]['fields'], - array( - 'um-after_login' => array( - 'label' => __( 'Action to be taken after login', 'ultimate-member' ), - 'value' => $after_login_options[ $rolemeta['_um_after_login'] ], - ), - ) + $debug_info[] = array( + 'after_login' => array( + 'label' => __( 'Action to be taken after login', 'ultimate-member' ), + 'value' => $after_login_options[ $rolemeta['_um_after_login'] ], + ), ); if ( 'redirect_url' === $rolemeta['_um_after_login'] && array_key_exists( '_um_login_redirect_url', $rolemeta ) ) { - $info[ 'ultimate-member-' . $key ]['fields'] = array_merge( - $info[ 'ultimate-member-' . $key ]['fields'], - array( - 'um-login_redirect_url' => array( - 'label' => __( 'Set Custom Redirect URL', 'ultimate-member' ), - 'value' => $rolemeta['_um_login_redirect_url'], - ), - ) + $debug_info[] = array( + 'login_redirect_url' => array( + 'label' => __( 'Set Custom Redirect URL', 'ultimate-member' ), + 'value' => $rolemeta['_um_login_redirect_url'], + ), ); } } @@ -2496,25 +1976,19 @@ class Site_Health { $rolemeta['_um_after_logout'] = 'redirect_home'; } if ( array_key_exists( '_um_after_logout', $rolemeta ) && isset( $redirect_options[ $rolemeta['_um_after_logout'] ] ) ) { - $info[ 'ultimate-member-' . $key ]['fields'] = array_merge( - $info[ 'ultimate-member-' . $key ]['fields'], - array( - 'um-after_logout' => array( - 'label' => __( 'Action to be taken after logout', 'ultimate-member' ), - 'value' => $redirect_options[ $rolemeta['_um_after_logout'] ], - ), - ) + $debug_info[] = array( + 'after_logout' => array( + 'label' => __( 'Action to be taken after logout', 'ultimate-member' ), + 'value' => $redirect_options[ $rolemeta['_um_after_logout'] ], + ), ); if ( 'redirect_url' === $rolemeta['_um_after_logout'] && array_key_exists( '_um_logout_redirect_url', $rolemeta ) ) { - $info[ 'ultimate-member-' . $key ]['fields'] = array_merge( - $info[ 'ultimate-member-' . $key ]['fields'], - array( - 'um-logout_redirect_url' => array( - 'label' => __( 'Set Custom Redirect URL', 'ultimate-member' ), - 'value' => $rolemeta['_um_logout_redirect_url'], - ), - ) + $debug_info[] = array( + 'logout_redirect_url' => array( + 'label' => __( 'Set Custom Redirect URL', 'ultimate-member' ), + 'value' => $rolemeta['_um_logout_redirect_url'], + ), ); } } @@ -2523,197 +1997,203 @@ class Site_Health { $rolemeta['_um_after_delete'] = 'redirect_home'; } if ( array_key_exists( '_um_after_delete', $rolemeta ) && isset( $redirect_options[ $rolemeta['_um_after_delete'] ] ) ) { - $info[ 'ultimate-member-' . $key ]['fields'] = array_merge( - $info[ 'ultimate-member-' . $key ]['fields'], - array( - 'um-after_delete' => array( - 'label' => __( 'Action to be taken after account is deleted', 'ultimate-member' ), - 'value' => $redirect_options[ $rolemeta['_um_after_delete'] ], - ), - ) + $debug_info[] = array( + 'after_delete' => array( + 'label' => __( 'Action to be taken after account is deleted', 'ultimate-member' ), + 'value' => $redirect_options[ $rolemeta['_um_after_delete'] ], + ), ); if ( 'redirect_url' === $rolemeta['_um_after_delete'] && array_key_exists( '_um_delete_redirect_url', $rolemeta ) ) { - $info[ 'ultimate-member-' . $key ]['fields'] = array_merge( - $info[ 'ultimate-member-' . $key ]['fields'], - array( - 'um-delete_redirect_url' => array( - 'label' => __( 'Set Custom Redirect URL', 'ultimate-member' ), - 'value' => $rolemeta['_um_delete_redirect_url'], - ), - ) + $debug_info[] = array( + 'delete_redirect_url' => array( + 'label' => __( 'Set Custom Redirect URL', 'ultimate-member' ), + 'value' => $rolemeta['_um_delete_redirect_url'], + ), ); } } if ( ! empty( $rolemeta['wp_capabilities'] ) ) { - $info[ 'ultimate-member-' . $key ]['fields'] = array_merge( - $info[ 'ultimate-member-' . $key ]['fields'], - array( - 'um-wp_capabilities' => array( - 'label' => __( 'WP Capabilities', 'ultimate-member' ), - 'value' => $rolemeta['wp_capabilities'], - ), - ) + $debug_info[] = array( + 'wp_capabilities' => array( + 'label' => __( 'WP Capabilities', 'ultimate-member' ), + 'value' => $rolemeta['wp_capabilities'], + ), ); } - $info = apply_filters( 'um_debug_information_user_role', $info, $key ); + /** + * Filters user role settings for Site Health. + * + * @since 2.10.5 + * @hook um_debug_information_user_role + * + * @param {array} $debug_info User Role settings for Site Health. + * @param {array} $rolemeta User Role metadata. + * @param {string} $slug User Role slug. + * + * @return {array} User Role settings for Site Health. + * + * @example Extend User Role settings for Site Health. + * function um_debug_information_user_role( $debug_info, $rolemeta, $slug ) { + * // your code here + * return $debug_info; + * } + * add_filter( 'um_debug_information_user_role', 'um_debug_information_user_role', 10, 3 ); + */ + $debug_info = apply_filters( 'um_debug_information_user_role', $debug_info, $rolemeta, $slug ); + + $debug_info = array_merge( ...$debug_info ); + + $info[ 'ultimate-member-role-' . $slug ] = array( + 'label' => ' - ' . $role . __( ' role settings', 'ultimate-member' ), + 'description' => __( 'This debug information about user role.', 'ultimate-member' ), + 'fields' => $debug_info, + ); } return $info; } - public function forms_sitehealth( $info ) { - $labels = self::get_labels(); - - $icons_display_options = array( - 'field' => __( 'Show inside text field', 'ultimate-member' ), - 'label' => __( 'Show with label', 'ultimate-member' ), - 'off' => __( 'Turn off', 'ultimate-member' ), + /** + * Retrieve debug information about Ultimate Member forms. + * + * @param array $info Information array containing debug information. + * + * @return array Information about Ultimate Member forms including form IDs, titles, settings, and labels. + */ + public function forms_debug_information( $info ) { + $all_forms = get_posts( + array( + 'post_type' => 'um_form', + 'posts_per_page' => -1, + 'fields' => 'ids', + ) ); - if ( ! empty( $this->get_forms() ) ) { - $info['ultimate-member-forms'] = array( - 'label' => __( 'Ultimate Member Forms', 'ultimate-member' ), - 'description' => __( 'This debug information for your Ultimate Member forms.', 'ultimate-member' ), - 'fields' => array( - 'um-forms' => array( - 'label' => __( 'UM Forms', 'ultimate-member' ), - 'value' => $this->get_forms(), - ), + $forms_formatted = array(); + if ( ! empty( $all_forms ) ) { + foreach ( $all_forms as $form_id ) { + $forms_formatted[ 'ID#' . $form_id ] = get_the_title( $form_id ); + } + } + + $info['ultimate-member-forms'] = array( + 'label' => __( 'Ultimate Member Forms', 'ultimate-member' ), + 'description' => __( 'This debug information for your Ultimate Member forms.', 'ultimate-member' ), + 'fields' => array( + 'forms' => array( + 'label' => __( 'UM Forms', 'ultimate-member' ), + 'value' => ! empty( $forms_formatted ) ? $forms_formatted : __( 'No Ultimate Member Forms', 'ultimate-member' ), ), + ), + ); + + if ( ! empty( $all_forms ) ) { + $labels = self::get_labels(); + + $icons_display_options = array( + 'field' => __( 'Show inside text field', 'ultimate-member' ), + 'label' => __( 'Show with label', 'ultimate-member' ), + 'off' => __( 'Turn off', 'ultimate-member' ), ); - foreach ( $this->get_forms() as $key => $form ) { - if ( strpos( $key, 'ID#' ) === 0 ) { - $key = substr( $key, 3 ); - } - - $info[ 'ultimate-member-' . $key ] = array( - 'label' => ' - ' . $form . __( ' form settings', 'ultimate-member' ), - 'description' => __( 'This debug information for your Ultimate Member form.', 'ultimate-member' ), - 'fields' => array( - 'um-form-shortcode' => array( + foreach ( $all_forms as $form_id ) { + $form_mode = get_post_meta( $form_id, '_um_mode', true ); + $debug_info = array( + array( + 'form-shortcode' => array( 'label' => __( 'Shortcode', 'ultimate-member' ), - 'value' => '[ultimatemember form_id="' . $key . '"]', + 'value' => '[ultimatemember form_id="' . $form_id . '"]', ), - 'um-mode' => array( + 'mode' => array( 'label' => __( 'Type', 'ultimate-member' ), - 'value' => get_post_meta( $key, '_um_mode', true ), + 'value' => $form_mode, ), ), ); - if ( 'register' === get_post_meta( $key, '_um_mode', true ) ) { - $info[ 'ultimate-member-' . $key ]['fields'] = array_merge( - $info[ 'ultimate-member-' . $key ]['fields'], - array( - 'um-um_register_use_custom_settings' => array( - 'label' => __( 'Apply custom settings to this form', 'ultimate-member' ), - 'value' => get_post_meta( $key, '_um_register_use_custom_settings', true ) ? $labels['yes'] : $labels['no'], - ), - ) + if ( 'register' === $form_mode ) { + $debug_info[] = array( + 'use_custom_settings' => array( + 'label' => __( 'Apply custom settings to this form', 'ultimate-member' ), + 'value' => get_post_meta( $form_id, '_um_register_use_custom_settings', true ) ? $labels['yes'] : $labels['no'], + ), ); - if ( get_post_meta( $key, '_um_register_use_custom_settings', true ) ) { - $info[ 'ultimate-member-' . $key ]['fields'] = array_merge( - $info[ 'ultimate-member-' . $key ]['fields'], - array( - 'um-register_role' => array( - 'label' => __( 'User registration role', 'ultimate-member' ), - 'value' => 0 === absint( get_post_meta( $key, '_um_register_role', true ) ) ? $labels['default'] : get_post_meta( $key, '_um_register_role', true ), - ), - 'um-register_template' => array( - 'label' => __( 'Template', 'ultimate-member' ), - 'value' => 0 === absint( get_post_meta( $key, '_um_register_template', true ) ) ? $labels['default'] : get_post_meta( $key, '_um_register_template', true ), - ), - 'um-um_register_max_width' => array( - 'label' => __( 'Max. Width (px)', 'ultimate-member' ), - 'value' => get_post_meta( $key, '_um_register_max_width', true ), - ), - 'um-um_register_icons' => array( - 'label' => __( 'Field Icons', 'ultimate-member' ), - 'value' => $icons_display_options[ get_post_meta( $key, '_um_register_icons', true ) ], - ), - 'um-register_primary_btn_word' => array( - 'label' => __( 'Primary Button Text', 'ultimate-member' ), - 'value' => ! get_post_meta( $key, '_um_register_primary_btn_word', true ) ? $labels['default'] : get_post_meta( $key, '_um_register_primary_btn_word', true ), - ), - 'um-um_register_secondary_btn' => array( - 'label' => __( 'Show Secondary Button', 'ultimate-member' ), - 'value' => get_post_meta( $key, '_um_register_secondary_btn', true ) ? $labels['yes'] : $labels['no'], - ), - ) + if ( get_post_meta( $form_id, '_um_register_use_custom_settings', true ) ) { + $debug_info[] = array( + 'role' => array( + 'label' => __( 'User registration role', 'ultimate-member' ), + 'value' => 0 === absint( get_post_meta( $form_id, '_um_register_role', true ) ) ? $labels['default'] : get_post_meta( $form_id, '_um_register_role', true ), + ), + 'template' => array( + 'label' => __( 'Template', 'ultimate-member' ), + 'value' => 0 === absint( get_post_meta( $form_id, '_um_register_template', true ) ) ? $labels['default'] : get_post_meta( $form_id, '_um_register_template', true ), + ), + 'max_width' => array( + 'label' => __( 'Max. Width (px)', 'ultimate-member' ), + 'value' => get_post_meta( $form_id, '_um_register_max_width', true ), + ), + 'icons' => array( + 'label' => __( 'Field Icons', 'ultimate-member' ), + 'value' => $icons_display_options[ get_post_meta( $form_id, '_um_register_icons', true ) ], + ), + 'primary_btn_word' => array( + 'label' => __( 'Primary Button Text', 'ultimate-member' ), + 'value' => ! get_post_meta( $form_id, '_um_register_primary_btn_word', true ) ? $labels['default'] : get_post_meta( $form_id, '_um_register_primary_btn_word', true ), + ), + 'secondary_btn' => array( + 'label' => __( 'Show Secondary Button', 'ultimate-member' ), + 'value' => get_post_meta( $form_id, '_um_register_secondary_btn', true ) ? $labels['yes'] : $labels['no'], + ), ); - if ( get_post_meta( $key, '_um_register_secondary_btn', true ) ) { - $info[ 'ultimate-member-' . $key ]['fields'] = array_merge( - $info[ 'ultimate-member-' . $key ]['fields'], - array( - 'um-um_register_secondary_btn_word' => array( - 'label' => __( 'Secondary Button Text', 'ultimate-member' ), - 'value' => get_post_meta( $key, '_um_register_secondary_btn_word', true ), - ), - ) + if ( get_post_meta( $form_id, '_um_register_secondary_btn', true ) ) { + $debug_info[] = array( + 'secondary_btn_word' => array( + 'label' => __( 'Secondary Button Text', 'ultimate-member' ), + 'value' => get_post_meta( $form_id, '_um_register_secondary_btn_word', true ), + ), ); } } - $info[ 'ultimate-member-' . $key ]['fields'] = array_merge( - $info[ 'ultimate-member-' . $key ]['fields'], - array( - 'um-register_use_gdpr' => array( - 'label' => __( 'Enable privacy policy agreement', 'ultimate-member' ), - 'value' => get_post_meta( $key, '_um_register_use_gdpr', true ) ? $labels['yes'] : $labels['no'], - ), - ) + $debug_info[] = array( + 'use_gdpr' => array( + 'label' => __( 'Enable privacy policy agreement', 'ultimate-member' ), + 'value' => get_post_meta( $form_id, '_um_register_use_gdpr', true ) ? $labels['yes'] : $labels['no'], + ), ); - if ( get_post_meta( $key, '_um_register_use_gdpr', true ) ) { - $gdpr_content_id = get_post_meta( $key, '_um_register_use_gdpr_content_id', true ); + if ( get_post_meta( $form_id, '_um_register_use_gdpr', true ) ) { + $gdpr_content_id = get_post_meta( $form_id, '_um_register_use_gdpr_content_id', true ); - $info[ 'ultimate-member-' . $key ]['fields'] = array_merge( - $info[ 'ultimate-member-' . $key ]['fields'], - array( - 'um-register_use_gdpr_content_id' => array( - 'label' => __( 'Privacy policy content', 'ultimate-member' ), - 'value' => $gdpr_content_id ? get_the_title( $gdpr_content_id ) . ' (ID#' . $gdpr_content_id . ') ' . get_the_permalink( $gdpr_content_id ) : '', - ), - 'um-register_use_gdpr_toggle_show' => array( - 'label' => __( 'Toggle Show text', 'ultimate-member' ), - 'value' => get_post_meta( $key, '_um_register_use_gdpr_toggle_show', true ), - ), - 'um-register_use_gdpr_toggle_hide' => array( - 'label' => __( 'Toggle Hide text', 'ultimate-member' ), - 'value' => get_post_meta( $key, '_um_register_use_gdpr_toggle_hide', true ), - ), - 'um-register_use_gdpr_agreement' => array( - 'label' => __( 'Checkbox agreement description', 'ultimate-member' ), - 'value' => get_post_meta( $key, '_um_register_use_gdpr_agreement', true ), - ), - 'um-register_use_gdpr_error_text' => array( - 'label' => __( 'Error Text', 'ultimate-member' ), - 'value' => get_post_meta( $key, '_um_register_use_gdpr_error_text', true ), - ), - ) + $debug_info[] = array( + 'use_gdpr_content_id' => array( + 'label' => __( 'Privacy policy content', 'ultimate-member' ), + 'value' => $gdpr_content_id ? get_the_title( $gdpr_content_id ) . ' (ID#' . $gdpr_content_id . ') ' . get_the_permalink( $gdpr_content_id ) : '', + ), + 'use_gdpr_toggle_show' => array( + 'label' => __( 'Toggle Show text', 'ultimate-member' ), + 'value' => get_post_meta( $form_id, '_um_register_use_gdpr_toggle_show', true ), + ), + 'use_gdpr_toggle_hide' => array( + 'label' => __( 'Toggle Hide text', 'ultimate-member' ), + 'value' => get_post_meta( $form_id, '_um_register_use_gdpr_toggle_hide', true ), + ), + 'use_gdpr_agreement' => array( + 'label' => __( 'Checkbox agreement description', 'ultimate-member' ), + 'value' => get_post_meta( $form_id, '_um_register_use_gdpr_agreement', true ), + ), + 'use_gdpr_error_text' => array( + 'label' => __( 'Error Text', 'ultimate-member' ), + 'value' => get_post_meta( $form_id, '_um_register_use_gdpr_error_text', true ), + ), ); } - - $info = apply_filters( 'um_debug_information_register_form', $info, $key ); - - $fields = get_post_meta( $key, '_um_custom_fields', true ); - if ( ! empty( $fields ) && is_array( $fields ) ) { - foreach ( $fields as $field_key => $field ) { - $field_info = $this->get_field_data( $info, $key, $field_key, $field ); - - $info[ 'ultimate-member-' . $key ]['fields'] = array_merge( - $info[ 'ultimate-member-' . $key ]['fields'], - $field_info - ); - } - } - } elseif ( 'login' === get_post_meta( $key, '_um_mode', true ) ) { + } elseif ( 'login' === $form_mode ) { $login_redirect_options = array( '0' => __( 'Default', 'ultimate-member' ), 'redirect_profile' => __( 'Redirect to profile', 'ultimate-member' ), @@ -2722,264 +2202,716 @@ class Site_Health { 'redirect_admin' => __( 'Redirect to WordPress Admin', 'ultimate-member' ), ); - $login_after_login = get_post_meta( $key, '_um_login_after_login', true ); + $login_after_login = get_post_meta( $form_id, '_um_login_after_login', true ); $login_after_login = '' === $login_after_login ? '0' : $login_after_login; - $info[ 'ultimate-member-' . $key ]['fields'] = array_merge( - $info[ 'ultimate-member-' . $key ]['fields'], - array( - 'um-um_login_use_custom_settings' => array( - 'label' => __( 'Apply custom settings to this form', 'ultimate-member' ), - 'value' => get_post_meta( $key, '_um_login_use_custom_settings', true ) ? $labels['yes'] : $labels['no'], - ), - ) + $debug_info[] = array( + 'use_custom_settings' => array( + 'label' => __( 'Apply custom settings to this form', 'ultimate-member' ), + 'value' => get_post_meta( $form_id, '_um_login_use_custom_settings', true ) ? $labels['yes'] : $labels['no'], + ), ); - if ( get_post_meta( $key, '_um_login_use_custom_settings', true ) ) { - $info[ 'ultimate-member-' . $key ]['fields'] = array_merge( - $info[ 'ultimate-member-' . $key ]['fields'], - array( - 'um-login_template' => array( - 'label' => __( 'Template', 'ultimate-member' ), - 'value' => 0 === absint( get_post_meta( $key, '_um_login_template', true ) ) ? $labels['default'] : get_post_meta( $key, '_um_login_template', true ), - ), - 'um-um_login_max_width' => array( - 'label' => __( 'Max. Width (px)', 'ultimate-member' ), - 'value' => get_post_meta( $key, '_um_login_max_width', true ), - ), - 'um-um_login_icons' => array( - 'label' => __( 'Field Icons', 'ultimate-member' ), - 'value' => $icons_display_options[ get_post_meta( $key, '_um_login_icons', true ) ], - ), - 'um-login_primary_btn_word' => array( - 'label' => __( 'Primary Button Text', 'ultimate-member' ), - 'value' => ! get_post_meta( $key, '_um_login_primary_btn_word', true ) ? $labels['default'] : get_post_meta( $key, '_um_login_primary_btn_word', true ), - ), - 'um-um_login_secondary_btn' => array( - 'label' => __( 'Show Secondary Button', 'ultimate-member' ), - 'value' => get_post_meta( $key, '_um_login_secondary_btn', true ) ? $labels['yes'] : $labels['no'], - ), - ) + if ( get_post_meta( $form_id, '_um_login_use_custom_settings', true ) ) { + $debug_info[] = array( + 'template' => array( + 'label' => __( 'Template', 'ultimate-member' ), + 'value' => 0 === absint( get_post_meta( $form_id, '_um_login_template', true ) ) ? $labels['default'] : get_post_meta( $form_id, '_um_login_template', true ), + ), + 'max_width' => array( + 'label' => __( 'Max. Width (px)', 'ultimate-member' ), + 'value' => get_post_meta( $form_id, '_um_login_max_width', true ), + ), + 'icons' => array( + 'label' => __( 'Field Icons', 'ultimate-member' ), + 'value' => $icons_display_options[ get_post_meta( $form_id, '_um_login_icons', true ) ], + ), + 'primary_btn_word' => array( + 'label' => __( 'Primary Button Text', 'ultimate-member' ), + 'value' => ! get_post_meta( $form_id, '_um_login_primary_btn_word', true ) ? $labels['default'] : get_post_meta( $form_id, '_um_login_primary_btn_word', true ), + ), + 'secondary_btn' => array( + 'label' => __( 'Show Secondary Button', 'ultimate-member' ), + 'value' => get_post_meta( $form_id, '_um_login_secondary_btn', true ) ? $labels['yes'] : $labels['no'], + ), ); - if ( get_post_meta( $key, '_um_login_secondary_btn', true ) ) { - $info[ 'ultimate-member-' . $key ]['fields'] = array_merge( - $info[ 'ultimate-member-' . $key ]['fields'], - array( - 'um-um_login_secondary_btn_word' => array( - 'label' => __( 'Secondary Button Text', 'ultimate-member' ), - 'value' => get_post_meta( $key, '_um_login_secondary_btn_word', true ), - ), - ) + if ( get_post_meta( $form_id, '_um_login_secondary_btn', true ) ) { + $debug_info[] = array( + 'secondary_btn_word' => array( + 'label' => __( 'Secondary Button Text', 'ultimate-member' ), + 'value' => get_post_meta( $form_id, '_um_login_secondary_btn_word', true ), + ), ); } - $info[ 'ultimate-member-' . $key ]['fields'] = array_merge( - $info[ 'ultimate-member-' . $key ]['fields'], - array( - 'um-login_forgot_pass_link' => array( - 'label' => __( 'Show Forgot Password Link?', 'ultimate-member' ), - 'value' => get_post_meta( $key, '_um_login_forgot_pass_link', true ) ? $labels['yes'] : $labels['no'], - ), - 'um-login_show_rememberme' => array( - 'label' => __( 'Show "Remember Me"?', 'ultimate-member' ), - 'value' => get_post_meta( $key, '_um_login_show_rememberme', true ) ? $labels['yes'] : $labels['no'], - ), - ) + $debug_info[] = array( + 'forgot_pass_link' => array( + 'label' => __( 'Show Forgot Password Link?', 'ultimate-member' ), + 'value' => get_post_meta( $form_id, '_um_login_forgot_pass_link', true ) ? $labels['yes'] : $labels['no'], + ), + 'show_rememberme' => array( + 'label' => __( 'Show "Remember Me"?', 'ultimate-member' ), + 'value' => get_post_meta( $form_id, '_um_login_show_rememberme', true ) ? $labels['yes'] : $labels['no'], + ), ); } - $info[ 'ultimate-member-' . $key ]['fields'] = array_merge( - $info[ 'ultimate-member-' . $key ]['fields'], - array( - 'um-login_after_login' => array( - 'label' => __( 'Redirection after Login', 'ultimate-member' ), - 'value' => $login_redirect_options[ $login_after_login ], - ), - ) + $debug_info[] = array( + 'after_login' => array( + 'label' => __( 'Redirection after Login', 'ultimate-member' ), + 'value' => $login_redirect_options[ $login_after_login ], + ), ); - if ( 'redirect_url' === get_post_meta( $key, '_um_login_after_login', true ) ) { - $info[ 'ultimate-member-' . $key ]['fields'] = array_merge( - $info[ 'ultimate-member-' . $key ]['fields'], - array( - 'um-login_redirect_url' => array( - 'label' => __( 'Set Custom Redirect URL', 'ultimate-member' ), - 'value' => get_post_meta( $key, '_um_login_redirect_url', true ), - ), - ) + if ( 'redirect_url' === get_post_meta( $form_id, '_um_login_after_login', true ) ) { + $debug_info[] = array( + 'redirect_url' => array( + 'label' => __( 'Set Custom Redirect URL', 'ultimate-member' ), + 'value' => get_post_meta( $form_id, '_um_login_redirect_url', true ), + ), ); } - - $info = apply_filters( 'um_debug_information_login_form', $info, $key ); - - $fields = get_post_meta( $key, '_um_custom_fields', true ); - if ( ! empty( $fields ) && is_array( $fields ) ) { - foreach ( $fields as $field_key => $field ) { - $field_info = $this->get_field_data( $info, $key, $field_key, $field ); - - $info[ 'ultimate-member-' . $key ]['fields'] = array_merge( - $info[ 'ultimate-member-' . $key ]['fields'], - $field_info - ); - } - } - } elseif ( 'profile' === get_post_meta( $key, '_um_mode', true ) ) { - $info[ 'ultimate-member-' . $key ]['fields'] = array_merge( - $info[ 'ultimate-member-' . $key ]['fields'], - array( - 'um-um_profile_use_custom_settings' => array( - 'label' => __( 'Apply custom settings to this form', 'ultimate-member' ), - 'value' => get_post_meta( $key, '_um_profile_use_custom_settings', true ) ? $labels['yes'] : $labels['no'], - ), - ) + } elseif ( 'profile' === $form_mode ) { + $debug_info[] = array( + 'use_custom_settings' => array( + 'label' => __( 'Apply custom settings to this form', 'ultimate-member' ), + 'value' => get_post_meta( $form_id, '_um_profile_use_custom_settings', true ) ? $labels['yes'] : $labels['no'], + ), ); - if ( get_post_meta( $key, '_um_profile_use_custom_settings', true ) ) { - $info[ 'ultimate-member-' . $key ]['fields'] = array_merge( - $info[ 'ultimate-member-' . $key ]['fields'], - array( - 'um-profile_role' => array( - 'label' => __( 'Make this profile form role-specific', 'ultimate-member' ), - 'value' => ! empty( get_post_meta( $key, '_um_profile_role', true ) ) ? get_post_meta( $key, '_um_profile_role', true ) : $labels['all'], - ), - 'um-profile_template' => array( - 'label' => __( 'Template', 'ultimate-member' ), - 'value' => 0 === absint( get_post_meta( $key, '_um_profile_template', true ) ) ? $labels['default'] : get_post_meta( $key, '_um_profile_template', true ), - ), - 'um-um_profile_max_width' => array( - 'label' => __( 'Max. Width (px)', 'ultimate-member' ), - 'value' => get_post_meta( $key, '_um_profile_max_width', true ), - ), - 'um-um_profile_area_max_width' => array( - 'label' => __( 'Profile Area Max. Width (px)', 'ultimate-member' ), - 'value' => get_post_meta( $key, '_um_profile_area_max_width', true ), - ), - 'um-um_profile_icons' => array( - 'label' => __( 'Field Icons', 'ultimate-member' ), - 'value' => $icons_display_options[ get_post_meta( $key, '_um_profile_icons', true ) ], - ), - 'um-profile_primary_btn_word' => array( - 'label' => __( 'Primary Button Text', 'ultimate-member' ), - 'value' => ! get_post_meta( $key, '_um_profile_primary_btn_word', true ) ? $labels['default'] : get_post_meta( $key, '_um_profile_primary_btn_word', true ), - ), - 'um-um_profile_secondary_btn' => array( - 'label' => __( 'Show Secondary Button', 'ultimate-member' ), - 'value' => get_post_meta( $key, '_um_profile_secondary_btn', true ) ? $labels['yes'] : $labels['no'], - ), - ) + if ( get_post_meta( $form_id, '_um_profile_use_custom_settings', true ) ) { + $debug_info[] = array( + 'role' => array( + 'label' => __( 'Make this profile form role-specific', 'ultimate-member' ), + 'value' => ! empty( get_post_meta( $form_id, '_um_profile_role', true ) ) ? get_post_meta( $form_id, '_um_profile_role', true ) : $labels['all'], + ), + 'template' => array( + 'label' => __( 'Template', 'ultimate-member' ), + 'value' => 0 === absint( get_post_meta( $form_id, '_um_profile_template', true ) ) ? $labels['default'] : get_post_meta( $form_id, '_um_profile_template', true ), + ), + 'max_width' => array( + 'label' => __( 'Max. Width (px)', 'ultimate-member' ), + 'value' => get_post_meta( $form_id, '_um_profile_max_width', true ), + ), + 'area_max_width' => array( + 'label' => __( 'Profile Area Max. Width (px)', 'ultimate-member' ), + 'value' => get_post_meta( $form_id, '_um_profile_area_max_width', true ), + ), + 'icons' => array( + 'label' => __( 'Field Icons', 'ultimate-member' ), + 'value' => $icons_display_options[ get_post_meta( $form_id, '_um_profile_icons', true ) ], + ), + 'primary_btn_word' => array( + 'label' => __( 'Primary Button Text', 'ultimate-member' ), + 'value' => ! get_post_meta( $form_id, '_um_profile_primary_btn_word', true ) ? $labels['default'] : get_post_meta( $form_id, '_um_profile_primary_btn_word', true ), + ), + 'secondary_btn' => array( + 'label' => __( 'Show Secondary Button', 'ultimate-member' ), + 'value' => get_post_meta( $form_id, '_um_profile_secondary_btn', true ) ? $labels['yes'] : $labels['no'], + ), ); - if ( get_post_meta( $key, '_um_profile_secondary_btn', true ) ) { - $info[ 'ultimate-member-' . $key ]['fields'] = array_merge( - $info[ 'ultimate-member-' . $key ]['fields'], - array( - 'um-um_profile_secondary_btn_word' => array( - 'label' => __( 'Secondary Button Text', 'ultimate-member' ), - 'value' => get_post_meta( $key, '_um_profile_secondary_btn_word', true ), - ), - ) + if ( get_post_meta( $form_id, '_um_profile_secondary_btn', true ) ) { + $debug_info[] = array( + 'secondary_btn_word' => array( + 'label' => __( 'Secondary Button Text', 'ultimate-member' ), + 'value' => get_post_meta( $form_id, '_um_profile_secondary_btn_word', true ), + ), ); } - $info[ 'ultimate-member-' . $key ]['fields'] = array_merge( - $info[ 'ultimate-member-' . $key ]['fields'], - array( - 'um-profile_cover_enabled' => array( - 'label' => __( 'Enable Cover Photos', 'ultimate-member' ), - 'value' => get_post_meta( $key, '_um_profile_cover_enabled', true ) ? $labels['yes'] : $labels['no'], - ), - ) + $debug_info[] = array( + 'cover_enabled' => array( + 'label' => __( 'Enable Cover Photos', 'ultimate-member' ), + 'value' => get_post_meta( $form_id, '_um_profile_cover_enabled', true ) ? $labels['yes'] : $labels['no'], + ), ); - if ( get_post_meta( $key, '_um_profile_cover_enabled', true ) ) { - $info[ 'ultimate-member-' . $key ]['fields'] = array_merge( - $info[ 'ultimate-member-' . $key ]['fields'], - array( - 'um-um_profile_coversize' => array( - 'label' => __( 'Cover Photo Size', 'ultimate-member' ), - 'value' => get_post_meta( $key, '_um_profile_coversize', true ), - ), - 'um-um_profile_cover_ratio' => array( - 'label' => __( 'Cover photo ratio', 'ultimate-member' ), - 'value' => get_post_meta( $key, '_um_profile_cover_ratio', true ), - ), - ) + if ( get_post_meta( $form_id, '_um_profile_cover_enabled', true ) ) { + $debug_info[] = array( + 'coversize' => array( + 'label' => __( 'Cover Photo Size', 'ultimate-member' ), + 'value' => get_post_meta( $form_id, '_um_profile_coversize', true ), + ), + 'cover_ratio' => array( + 'label' => __( 'Cover photo ratio', 'ultimate-member' ), + 'value' => get_post_meta( $form_id, '_um_profile_cover_ratio', true ), + ), ); } - $info[ 'ultimate-member-' . $key ]['fields'] = array_merge( - $info[ 'ultimate-member-' . $key ]['fields'], - array( - 'um-profile_disable_photo_upload' => array( - 'label' => __( 'Disable Profile Photo Upload', 'ultimate-member' ), - 'value' => get_post_meta( $key, '_um_profile_disable_photo_upload', true ) ? $labels['yes'] : $labels['no'], - ), - ) + $debug_info[] = array( + 'disable_photo_upload' => array( + 'label' => __( 'Disable Profile Photo Upload', 'ultimate-member' ), + 'value' => get_post_meta( $form_id, '_um_profile_disable_photo_upload', true ) ? $labels['yes'] : $labels['no'], + ), ); - if ( 0 === absint( get_post_meta( $key, '_um_profile_disable_photo_upload', true ) ) ) { - $info[ 'ultimate-member-' . $key ]['fields'] = array_merge( - $info[ 'ultimate-member-' . $key ]['fields'], - array( - 'um-profile_photosize' => array( - 'label' => __( 'Profile Photo Size', 'ultimate-member' ), - 'value' => get_post_meta( $key, '_um_profile_photosize', true ), - ), - 'um-profile_photo_required' => array( - 'label' => __( 'Make Profile Photo Required', 'ultimate-member' ), - 'value' => get_post_meta( $key, '_um_profile_photo_required', true ) ? $labels['yes'] : $labels['no'], - ), - ) + if ( 0 === absint( get_post_meta( $form_id, '_um_profile_disable_photo_upload', true ) ) ) { + $debug_info[] = array( + 'photosize' => array( + 'label' => __( 'Profile Photo Size', 'ultimate-member' ), + 'value' => get_post_meta( $form_id, '_um_profile_photosize', true ), + ), + 'photo_required' => array( + 'label' => __( 'Make Profile Photo Required', 'ultimate-member' ), + 'value' => get_post_meta( $form_id, '_um_profile_photo_required', true ) ? $labels['yes'] : $labels['no'], + ), ); } - $info[ 'ultimate-member-' . $key ]['fields'] = array_merge( - $info[ 'ultimate-member-' . $key ]['fields'], - array( - 'um-profile_show_name' => array( - 'label' => __( 'Show display name in profile header?', 'ultimate-member' ), - 'value' => get_post_meta( $key, '_um_profile_show_name', true ) ? $labels['yes'] : $labels['no'], - ), - 'um-profile_show_social_links' => array( - 'label' => __( 'Show social links in profile header?', 'ultimate-member' ), - 'value' => get_post_meta( $key, '_um_profile_show_social_links', true ) ? $labels['yes'] : $labels['no'], - ), - 'um-profile_show_bio' => array( - 'label' => __( 'Show user description in profile header?', 'ultimate-member' ), - 'value' => get_post_meta( $key, '_um_profile_show_bio', true ) ? $labels['yes'] : $labels['no'], - ), - ) + $debug_info[] = array( + 'show_name' => array( + 'label' => __( 'Show display name in profile header?', 'ultimate-member' ), + 'value' => get_post_meta( $form_id, '_um_profile_show_name', true ) ? $labels['yes'] : $labels['no'], + ), + 'show_social_links' => array( + 'label' => __( 'Show social links in profile header?', 'ultimate-member' ), + 'value' => get_post_meta( $form_id, '_um_profile_show_social_links', true ) ? $labels['yes'] : $labels['no'], + ), + 'show_bio' => array( + 'label' => __( 'Show user description in profile header?', 'ultimate-member' ), + 'value' => get_post_meta( $form_id, '_um_profile_show_bio', true ) ? $labels['yes'] : $labels['no'], + ), ); } - $fields = get_post_meta( $key, '_um_custom_fields', true ); - if ( ! empty( $fields ) && is_array( $fields ) ) { - foreach ( $fields as $field_key => $field ) { - $field_info = $this->get_field_data( $info, $key, $field_key, $field ); - - $info[ 'ultimate-member-' . $key ]['fields'] = array_merge( - $info[ 'ultimate-member-' . $key ]['fields'], - $field_info - ); - } - } - - $profile_metafields = get_post_meta( $key, '_um_profile_metafields', true ); + $profile_metafields = get_post_meta( $form_id, '_um_profile_metafields', true ); if ( ! empty( $profile_metafields ) && is_array( $profile_metafields ) ) { - foreach ( $profile_metafields as $k => $field ) { - $info[ 'ultimate-member-' . $key ]['fields'] = array_merge( - $info[ 'ultimate-member-' . $key ]['fields'], - array( - 'um-profile_metafields-' . $k => array( - 'label' => __( 'Field to show in user meta', 'ultimate-member' ), + $debug_info[] = array( + 'metafields-' . $form_id => array( + 'label' => __( 'Field(s) to show in user meta', 'ultimate-member' ), + 'value' => implode( ', ', $profile_metafields ), + ), + ); + } + } + + $fields = get_post_meta( $form_id, '_um_custom_fields', true ); + if ( ! empty( $fields ) && is_array( $fields ) ) { + foreach ( $fields as $field_key => $field ) { + $debug_info[] = $this->get_field_data( $field_key, $field ); + } + } + + /** + * Filters form settings for Site Health. + * + * @since 2.10.5 + * @hook um_debug_information_{$form_mode}_form + * + * @param {array} $info Registration form settings for Site Health. + * @param {string} $form_id Registration form ID. + * + * @return {array} Registration form settings for Site Health. + * + * @example Extend Registration form settings for Site Health. + * function um_debug_information_user_role( $info, $form_id ) { + * // your code here + * return $info; + * } + * add_filter( 'um_debug_information_register_form', 'um_debug_information_register_form', 10, 2 ); + * @example Extend Login form settings for Site Health. + * function um_debug_information_login_form( $info, $form_id ) { + * // your code here + * return $info; + * } + * add_filter( 'um_debug_information_login_form', 'um_debug_information_login_form', 10, 2 ); + */ + $debug_info = apply_filters( "um_debug_information_{$form_mode}_form", $debug_info, $form_id ); + + $debug_info = array_merge( ...$debug_info ); + + $info[ 'ultimate-member-form-' . $form_id ] = array( + // translators: %s is the form title. + 'label' => sprintf( __( ' - Form "%s" settings', 'ultimate-member' ), get_the_title( $form_id ) ), + 'description' => __( 'This debug information for your Ultimate Member form.', 'ultimate-member' ), + 'fields' => $debug_info, + ); + } + } + + return $info; + } + + /** + * Get information about member directories for site health check. + * + * @param array $info Additional information for site health check. + * + * @return array Information about Ultimate Member directories including labels, fields, and debug details. + */ + public function member_directories_debug_information( $info ) { + $all_member_directories = get_posts( + array( + 'post_type' => 'um_directory', + 'posts_per_page' => -1, + 'fields' => 'ids', + ) + ); + + $formatted_directories = array(); + foreach ( $all_member_directories as $directory_id ) { + $formatted_directories[ 'ID#' . $directory_id ] = get_the_title( $directory_id ); + } + + $info['ultimate-member-directories'] = array( + 'label' => __( 'Ultimate Member Directories', 'ultimate-member' ), + 'description' => __( 'This debug information about Ultimate Member directories.', 'ultimate-member' ), + 'fields' => array( + 'directory' => array( + 'label' => __( 'Member directories', 'ultimate-member' ), + 'value' => ! empty( $formatted_directories ) ? $formatted_directories : __( 'No member directories', 'ultimate-member' ), + ), + ), + ); + + if ( ! empty( $all_member_directories ) ) { + $labels = self::get_labels(); + $options = array_unique( array_merge( UM()->member_directory()->filter_fields, UM()->member_directory()->default_sorting, UM()->member_directory()->sort_fields, UM()->member_directory()->searching_fields ) ); + + foreach ( $all_member_directories as $directory_id ) { + $_um_view_types_value = get_post_meta( $directory_id, '_um_view_types', true ); + $_um_view_types_value = empty( $_um_view_types_value ) ? array( 'grid', 'list' ) : $_um_view_types_value; + $_um_view_types_value = is_string( $_um_view_types_value ) ? array( $_um_view_types_value ) : $_um_view_types_value; + + $debug_info = array( + array( + 'shortcode' => array( + 'label' => __( 'Shortcode', 'ultimate-member' ), + 'value' => '[ultimatemember_directory id="' . $directory_id . '"]', + ), + 'template' => array( + 'label' => __( 'Template', 'ultimate-member' ), + 'value' => get_post_meta( $directory_id, '_um_directory_template', true ) ? get_post_meta( $directory_id, '_um_directory_template', true ) : $labels['default'], + ), + 'view_types' => array( + 'label' => __( 'View types', 'ultimate-member' ), + 'value' => implode( ', ', $_um_view_types_value ), + ), + 'default_view' => array( + 'label' => __( 'Default view type', 'ultimate-member' ), + 'value' => get_post_meta( $directory_id, '_um_default_view', true ), + ), + ), + ); + + $directory_roles_meta = get_post_meta( $directory_id, '_um_roles', true ); + $directory_roles = array(); + if ( ! empty( $directory_roles_meta ) ) { + if ( is_string( $directory_roles_meta ) ) { + $directory_roles = array( $directory_roles_meta ); + } else { + $directory_roles = $directory_roles_meta; + } + } + + $directory_show_these_users_meta = get_post_meta( $directory_id, '_um_show_these_users', true ); + $show_these_users = array(); + if ( ! empty( $directory_show_these_users_meta ) ) { + if ( is_string( $directory_show_these_users_meta ) ) { + $show_these_users = array( $directory_show_these_users_meta ); + } else { + $show_these_users = $directory_show_these_users_meta; + } + } + + $directory_exclude_these_users_meta = get_post_meta( $directory_id, '_um_exclude_these_users', true ); + $exclude_these_users = array(); + if ( ! empty( $directory_exclude_these_users_meta ) ) { + if ( is_string( $directory_exclude_these_users_meta ) ) { + $exclude_these_users = array( $directory_exclude_these_users_meta ); + } else { + $exclude_these_users = $directory_exclude_these_users_meta; + } + } + + $debug_info[] = array( + 'roles' => array( + 'label' => __( 'User Roles to display', 'ultimate-member' ), + 'value' => ! empty( $directory_roles ) ? implode( ', ', $directory_roles ) : $labels['all'], + ), + 'has_profile_photo' => array( + 'label' => __( 'Only show members who have uploaded a profile photo', 'ultimate-member' ), + 'value' => get_post_meta( $directory_id, '_um_has_profile_photo', true ) ? $labels['yes'] : $labels['no'], + ), + 'has_cover_photo' => array( + 'label' => __( 'Only show members who have uploaded a cover photo', 'ultimate-member' ), + 'value' => get_post_meta( $directory_id, '_um_has_cover_photo', true ) ? $labels['yes'] : $labels['no'], + ), + 'show_these_users' => array( + 'label' => __( 'Only show specific users', 'ultimate-member' ), + 'value' => ! empty( $show_these_users ) ? implode( ', ', $show_these_users ) : $labels['empty'], + ), + 'exclude_these_users' => array( + 'label' => __( 'Exclude specific users', 'ultimate-member' ), + 'value' => ! empty( $exclude_these_users ) ? implode( ', ', $exclude_these_users ) : $labels['empty'], + ), + ); + + /** + * Filters general member directory settings for Site Health. + * + * @since 2.10.5 + * @hook um_debug_member_directory_general_extend + * + * @param {array} $info Member directory settings for Site Health. + * @param {string} $directory_id Member directory ID. + * + * @return {array} Member directory settings for Site Health. + * + * @example Extend Member directory settings for Site Health. + * function um_debug_member_directory_general_extend( $info, $directory_id ) { + * // your code here + * return $info; + * } + * add_filter( 'um_debug_member_directory_general_extend', 'um_debug_member_directory_general_extend', 10, 2 ); + */ + $debug_info = apply_filters( 'um_debug_member_directory_general_extend', $debug_info, $directory_id ); + + if ( isset( $options[ get_post_meta( $directory_id, '_um_sortby', true ) ] ) ) { + $sortby_label = $options[ get_post_meta( $directory_id, '_um_sortby', true ) ]; + } else { + $sortby_label = get_post_meta( $directory_id, '_um_sortby', true ); + } + + $debug_info[] = array( + 'sortby' => array( + 'label' => __( 'Default sort users by', 'ultimate-member' ), + 'value' => $sortby_label, + ), + ); + + if ( 'other' === get_post_meta( $directory_id, '_um_sortby', true ) ) { + $debug_info[] = array( + 'sortby_custom' => array( + 'label' => __( 'Meta key', 'ultimate-member' ), + 'value' => get_post_meta( $directory_id, '_um_sortby_custom', true ), + ), + 'sortby_custom_type' => array( + 'label' => __( 'Data type', 'ultimate-member' ), + 'value' => UM()->member_directory()->sort_data_types[ get_post_meta( $directory_id, '_um_sortby_custom_type', true ) ], + ), + 'sortby_custom_order' => array( + 'label' => __( 'Order', 'ultimate-member' ), + 'value' => 'ASC' === get_post_meta( $directory_id, '_um_sortby_custom_order', true ) ? __( 'Ascending', 'ultimate-member' ) : __( 'Descending', 'ultimate-member' ), + ), + 'sortby_custom_label' => array( + 'label' => __( 'Label of custom sort', 'ultimate-member' ), + 'value' => get_post_meta( $directory_id, '_um_sortby_custom_label', true ), + ), + ); + } + + $debug_info[] = array( + 'enable_sorting' => array( + 'label' => __( 'Enable custom sorting', 'ultimate-member' ), + 'value' => get_post_meta( $directory_id, '_um_enable_sorting', true ) ? $labels['yes'] : $labels['no'], + ), + ); + + if ( 1 === absint( get_post_meta( $directory_id, '_um_enable_sorting', true ) ) ) { + $sorting_fields = get_post_meta( $directory_id, '_um_sorting_fields', true ); + if ( ! empty( $sorting_fields ) ) { + foreach ( $sorting_fields as $k => $field ) { + if ( is_array( $field ) ) { + $debug_info[] = array( + 'sorting_fields-' . $k => array( + 'label' => __( 'Field(s) to enable in sorting', 'ultimate-member' ), 'value' => $field, ), - ) - ); + ); + } else { + $sortby_label = isset( $options[ $field ] ) ? $options[ $field ] : $field; + $debug_info[] = array( + 'sorting_fields-' . $k => array( + 'label' => __( 'Field(s) to enable in sorting', 'ultimate-member' ), + 'value' => $sortby_label, + ), + ); + } } } } + + $debug_info[] = array( + 'search' => array( + 'label' => __( 'Enable Search feature', 'ultimate-member' ), + 'value' => get_post_meta( $directory_id, '_um_search', true ) ? $labels['yes'] : $labels['no'], + ), + ); + + if ( 1 === absint( get_post_meta( $directory_id, '_um_search', true ) ) ) { + $directory_roles_can_search_meta = get_post_meta( $directory_id, '_um_roles_can_search', true ); + $roles_can_search = array(); + if ( ! empty( $directory_roles_can_search_meta ) ) { + if ( is_string( $directory_roles_can_search_meta ) ) { + $roles_can_search = array( $directory_roles_can_search_meta ); + } else { + $roles_can_search = $directory_roles_can_search_meta; + } + } + + $debug_info[] = array( + 'roles_can_search' => array( + 'label' => __( 'User Roles that can use search', 'ultimate-member' ), + 'value' => ! empty( $roles_can_search ) ? implode( ', ', $roles_can_search ) : $labels['all'], + ), + ); + + if ( ! empty( get_post_meta( $directory_id, '_um_search_exclude_fields', true ) ) ) { + $debug_info[] = array( + 'search_exclude_fields' => array( + 'label' => __( 'Exclude fields from search', 'ultimate-member' ), + 'value' => get_post_meta( $directory_id, '_um_search_exclude_fields', true ), + ), + ); + } + + if ( ! empty( get_post_meta( $directory_id, '_um_search_include_fields', true ) ) ) { + $debug_info[] = array( + 'search_include_fields' => array( + 'label' => __( 'Fields to search by', 'ultimate-member' ), + 'value' => get_post_meta( $directory_id, '_um_search_include_fields', true ), + ), + ); + } + } + + $debug_info[] = array( + 'filters' => array( + 'label' => __( 'Enable Filters feature', 'ultimate-member' ), + 'value' => get_post_meta( $directory_id, '_um_filters', true ) ? $labels['yes'] : $labels['no'], + ), + ); + + if ( 1 === absint( get_post_meta( $directory_id, '_um_filters', true ) ) ) { + $directory_roles_can_filter_meta = get_post_meta( $directory_id, '_um_roles_can_filter', true ); + $roles_can_filter = array(); + if ( ! empty( $directory_roles_can_filter_meta ) ) { + if ( is_string( $directory_roles_can_filter_meta ) ) { + $roles_can_filter = array( $directory_roles_can_filter_meta ); + } else { + $roles_can_filter = $directory_roles_can_filter_meta; + } + } + + $debug_info[] = array( + 'roles_can_filter' => array( + 'label' => __( 'User Roles that can use filters', 'ultimate-member' ), + 'value' => ! empty( $roles_can_filter ) ? implode( ', ', $roles_can_filter ) : $labels['all'], + ), + ); + + $search_fields = get_post_meta( $directory_id, '_um_search_fields', true ); + if ( ! empty( $search_fields ) && is_array( $search_fields ) ) { + $field_labels = array(); + foreach ( $search_fields as $field ) { + $field_label = isset( $options[ $field ] ) ? $options[ $field ] : $field; + $field_labels[] = $field_label; + } + $debug_info[] = array( + 'search_fields-' . $directory_id => array( + 'label' => __( 'Filter meta to enable', 'ultimate-member' ), + 'value' => $field_labels, + ), + ); + } + + $debug_info[] = array( + 'filters_expanded' => array( + 'label' => __( 'Expand the filter bar by default', 'ultimate-member' ), + 'value' => get_post_meta( $directory_id, '_um_filters_expanded', true ) ? $labels['yes'] : $labels['no'], + ), + ); + + if ( 1 === absint( get_post_meta( $directory_id, '_um_filters_expanded', true ) ) ) { + $debug_info[] = array( + 'filters_is_collapsible' => array( + 'label' => __( 'Can filter bar be collapsed', 'ultimate-member' ), + 'value' => get_post_meta( $directory_id, '_um_filters_is_collapsible', true ) ? $labels['yes'] : $labels['no'], + ), + ); + } + } + + $search_filters = get_post_meta( $directory_id, '_um_search_filters', true ); + if ( ! empty( $search_filters ) && is_array( $search_filters ) ) { + $field_labels = array(); + foreach ( $search_filters as $k => $field ) { + $field_label = isset( $options[ $k ] ) ? $options[ $k ] : $k; + $value = $field; + if ( is_array( $field ) ) { + if ( array_key_exists( $k, UM()->member_directory()->filter_types ) && in_array( UM()->member_directory()->filter_types[ $k ], array( 'datepicker', 'timepicker', 'slider' ), true ) ) { + // translators: %1$s is the "From" value, %2$s is the "To" value. + $value = sprintf( __( 'From %1$s; To %2$s', 'ultimate-member' ), $field[0], $field[1] ); + } else { + $value = implode( ', ', $field ); + } + } + $field_labels[] = $field_label . ' - ' . $value; + } + $debug_info[] = array( + 'search_filters-' . $directory_id => array( + 'label' => __( 'Admin filtering', 'ultimate-member' ), + 'value' => $field_labels, + ), + ); + } + + $debug_info[] = array( + 'show_profile_photo' => array( + 'label' => __( 'Enable Profile Photo', 'ultimate-member' ), + 'value' => get_post_meta( $directory_id, '_um_profile_photo', true ) ? $labels['yes'] : $labels['no'], + ), + 'show_cover_photos' => array( + 'label' => __( 'Enable Cover Photo', 'ultimate-member' ), + 'value' => get_post_meta( $directory_id, '_um_cover_photos', true ) ? $labels['yes'] : $labels['no'], + ), + 'show_display_name' => array( + 'label' => __( 'Show display name', 'ultimate-member' ), + 'value' => get_post_meta( $directory_id, '_um_show_name', true ) ? $labels['yes'] : $labels['no'], + ), + ); + + /** + * Filters member directory profile card settings for Site Health. + * + * @since 2.10.5 + * @hook um_debug_member_directory_profile_extend + * + * @param {array} $info Member directory settings for Site Health. + * @param {string} $directory_id Member directory ID. + * + * @return {array} Member directory settings for Site Health. + * + * @example Extend Member directory settings for Site Health. + * function um_debug_member_directory_profile_extend( $info, $directory_id ) { + * // your code here + * return $info; + * } + * add_filter( 'um_debug_member_directory_profile_extend', 'um_debug_member_directory_profile_extend', 10, 2 ); + */ + $debug_info = apply_filters( 'um_debug_member_directory_profile_extend', $debug_info, $directory_id ); + + $debug_info[] = array( + 'show_tagline' => array( + 'label' => __( 'Show tagline below profile name', 'ultimate-member' ), + 'value' => get_post_meta( $directory_id, '_um_show_tagline', true ) ? $labels['yes'] : $labels['no'], + ), + ); + + if ( 1 === absint( get_post_meta( $directory_id, '_um_show_tagline', true ) ) ) { + $tagline_fields = get_post_meta( $directory_id, '_um_tagline_fields', true ); + if ( ! empty( $tagline_fields ) && is_array( $tagline_fields ) ) { + $field_labels = array(); + foreach ( $tagline_fields as $field ) { + $label = isset( $options[ $field ] ) ? $options[ $field ] : $field; + $field_labels[] = $label; + } + + $debug_info[] = array( + 'tagline_fields-' . $directory_id => array( + 'label' => __( 'Field to display in tagline', 'ultimate-member' ), + 'value' => $field_labels, + ), + ); + } + } + + $debug_info[] = array( + 'show_userinfo' => array( + 'label' => __( 'Show extra user information below tagline?', 'ultimate-member' ), + 'value' => get_post_meta( $directory_id, '_um_show_userinfo', true ) ? $labels['yes'] : $labels['no'], + ), + ); + + if ( 1 === absint( get_post_meta( $directory_id, '_um_show_userinfo', true ) ) ) { + $reveal_fields = get_post_meta( $directory_id, '_um_reveal_fields', true ); + if ( ! empty( $reveal_fields ) && is_array( $reveal_fields ) ) { + $field_labels = array(); + foreach ( $reveal_fields as $field ) { + $label = isset( $options[ $field ] ) ? $options[ $field ] : $field; + $field_labels[] = $label; + } + + $debug_info[] = array( + 'reveal_fields-' . $directory_id => array( + 'label' => __( 'Field to display in extra user information section', 'ultimate-member' ), + 'value' => $field_labels, + ), + ); + } + } + + $debug_info[] = array( + 'show_social' => array( + 'label' => __( 'Show social connect icons in extra user information section', 'ultimate-member' ), + 'value' => get_post_meta( $directory_id, '_um_show_social', true ) ? $labels['yes'] : $labels['no'], + ), + 'userinfo_animate' => array( + 'label' => __( 'Hide extra user information to the reveal section', 'ultimate-member' ), + 'value' => get_post_meta( $directory_id, '_um_userinfo_animate', true ) ? $labels['yes'] : $labels['no'], + ), + 'must_search' => array( + 'label' => __( 'Show results only after search/filtration', 'ultimate-member' ), + 'value' => get_post_meta( $directory_id, '_um_must_search', true ) ? $labels['yes'] : $labels['no'], + ), + 'max_users' => array( + 'label' => __( 'Maximum number of profiles', 'ultimate-member' ), + 'value' => get_post_meta( $directory_id, '_um_max_users', true ), + ), + 'profiles_per_page' => array( + 'label' => __( 'Number of profiles per page', 'ultimate-member' ), + 'value' => get_post_meta( $directory_id, '_um_profiles_per_page', true ), + ), + 'profiles_per_page_mobile' => array( + 'label' => __( 'Maximum number of profiles', 'ultimate-member' ), + 'value' => get_post_meta( $directory_id, '_um_profiles_per_page_mobile', true ), + ), + 'header' => array( + 'label' => __( 'Results Text', 'ultimate-member' ), + 'value' => get_post_meta( $directory_id, '_um_directory_header', true ), + ), + 'header_single' => array( + 'label' => __( 'Single Result Text', 'ultimate-member' ), + 'value' => get_post_meta( $directory_id, '_um_directory_header_single', true ), + ), + 'no_users_text' => array( + 'label' => __( 'Custom text if no users were found', 'ultimate-member' ), + 'value' => get_post_meta( $directory_id, '_um_directory_no_users', true ), + ), + ); + + /** + * Filters member directory settings for Site Health. + * + * @since 2.10.5 + * @hook um_debug_member_directory_extend + * + * @param {array} $info Member directory settings for Site Health. + * @param {string} $directory_id Member directory ID. + * + * @return {array} Member directory settings for Site Health. + * + * @example Extend Member directory settings for Site Health. + * function um_debug_member_directory_extend( $info, $directory_id ) { + * // your code here + * return $info; + * } + * add_filter( 'um_debug_member_directory_extend', 'um_debug_member_directory_extend', 10, 2 ); + */ + $debug_info = apply_filters( 'um_debug_member_directory_extend', $debug_info, $directory_id ); + + $debug_info = array_merge( ...$debug_info ); + + $info[ 'ultimate-member-directory-' . $directory_id ] = array( + // translators: %s is the member directory title. + 'label' => sprintf( __( ' - Member directory "%s" settings', 'ultimate-member' ), get_the_title( $directory_id ) ), + 'description' => __( 'This debug information for your Ultimate Member directory.', 'ultimate-member' ), + 'fields' => $debug_info, + ); } } diff --git a/includes/admin/core/class-admin-settings.php b/includes/admin/core/class-admin-settings.php index bdef709a..9821763c 100644 --- a/includes/admin/core/class-admin-settings.php +++ b/includes/admin/core/class-admin-settings.php @@ -1403,6 +1403,7 @@ if ( ! class_exists( 'um\admin\core\Admin_Settings' ) ) { 'args' => array( 'textarea_rows' => 6, ), + 'conditional' => array( 'account_tab_delete', '=', '1' ), ), array( 'id' => 'delete_account_no_pass_required_text', @@ -1412,6 +1413,7 @@ if ( ! class_exists( 'um\admin\core\Admin_Settings' ) ) { 'args' => array( 'textarea_rows' => 6, ), + 'conditional' => array( 'account_tab_delete', '=', '1' ), ), ), ), diff --git a/includes/core/class-profile.php b/includes/core/class-profile.php index b469209e..14e7aa3b 100644 --- a/includes/core/class-profile.php +++ b/includes/core/class-profile.php @@ -103,7 +103,24 @@ if ( ! class_exists( 'um\core\Profile' ) ) { * @return array */ public function tabs_privacy() { - $privacy = apply_filters( + /** + * Filters a privacy list extend. + * + * @since 2.7.0 + * @hook um_profile_tabs_privacy_list + * + * @param {array} $privacy_option Add options for profile tabs' privacy. + * + * @return {array} Options for profile tabs' privacy. + * + * @example Add options for profile tabs' privacy. + * function um_profile_menu_link_attrs( $privacy_option ) { + * // your code here + * return $privacy_option; + * } + * add_filter( 'um_profile_tabs_privacy_list', 'um_profile_tabs_privacy_list', 10, 1 ); + */ + return apply_filters( 'um_profile_tabs_privacy_list', array( 0 => __( 'Anyone', 'ultimate-member' ), @@ -114,53 +131,46 @@ if ( ! class_exists( 'um\core\Profile' ) ) { 5 => __( 'Owner and specific roles', 'ultimate-member' ), ) ); - - return $privacy; } - /** * All tab data * * @return array */ - function tabs() { - - /** - * UM hook - * - * @type filter - * @title um_profile_tabs - * @description Extend user profile tabs - * @input_vars - * [{"var":"$tabs","type":"array","desc":"Profile tabs"}] - * @change_log - * ["Since: 2.0"] - * @usage - * - * @example - * - */ - $tabs = apply_filters( 'um_profile_tabs', array( - 'main' => array( + public function tabs() { + $tabs = array( + 'main' => array( 'name' => __( 'About', 'ultimate-member' ), - 'icon' => 'um-faicon-user' + 'icon' => 'um-faicon-user', ), - 'posts' => array( + 'posts' => array( 'name' => __( 'Posts', 'ultimate-member' ), - 'icon' => 'um-faicon-pencil' + 'icon' => 'um-faicon-pencil', ), 'comments' => array( 'name' => __( 'Comments', 'ultimate-member' ), - 'icon' => 'um-faicon-comment' - ) - ) ); + 'icon' => 'um-faicon-comment', + ), + ); + /** + * Filters user profile tabs + * + * @since 1.3.x + * @hook um_profile_tabs + * + * @param {array} $tabs tabs list. + * + * @return {array} tabs list. + * + * @example Add user profile tabs. + * function um_profile_tabs( $tabs ) { + * // your code here + * return $tabs; + * } + * add_filter( 'um_profile_tabs', 'um_profile_tabs' ); + */ + $tabs = apply_filters( 'um_profile_tabs', $tabs ); // disable private tabs if ( ! is_admin() ) { From a102d22ce1f011d0c68e9843813299db16f22e12 Mon Sep 17 00:00:00 2001 From: Mykyta Synelnikov Date: Tue, 24 Jun 2025 17:16:28 +0300 Subject: [PATCH 26/28] Prevent shortcode execution in user input sanitization. Added `strip_shortcodes` across various sanitization routines to ensure user inputs do not execute shortcodes. This enhances security by blocking unintended shortcode processing in fields such as text, email, URLs, and form descriptions. --- includes/core/class-form.php | 20 ++++++++++---------- includes/core/um-actions-account.php | 6 +++--- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/includes/core/class-form.php b/includes/core/class-form.php index e7a553db..8c34c24b 100644 --- a/includes/core/class-form.php +++ b/includes/core/class-form.php @@ -857,10 +857,10 @@ if ( ! class_exists( 'um\core\Form' ) ) { 'allowfullscreen' => true, ); } - $form[ $k ] = wp_kses( $form[ $k ], $allowed_html ); + $form[ $k ] = wp_kses( strip_shortcodes( $form[ $k ] ), $allowed_html ); add_filter( 'wp_kses_allowed_html', array( &$this, 'wp_kses_user_desc' ), 10, 2 ); } else { - $form[ $k ] = sanitize_textarea_field( $form[ $k ] ); + $form[ $k ] = sanitize_textarea_field( strip_shortcodes( $form[ $k ] ) ); } break; case 'oembed': @@ -915,9 +915,9 @@ if ( ! class_exists( 'um\core\Form' ) ) { } } - $form[ $k ] = esc_url_raw( $v ); + $form[ $k ] = esc_url_raw( strip_shortcodes( $v ) ); } else { - $form[ $k ] = esc_url_raw( $form[ $k ] ); + $form[ $k ] = esc_url_raw( strip_shortcodes( $form[ $k ] ) ); } break; case 'password': @@ -939,12 +939,12 @@ if ( ! class_exists( 'um\core\Form' ) ) { case 'soundcloud_track': case 'spotify': case 'tel': - $form[ $k ] = sanitize_text_field( $form[ $k ] ); + $form[ $k ] = sanitize_text_field( strip_shortcodes( $form[ $k ] ) ); break; case 'multiselect': case 'radio': case 'checkbox': - $form[ $k ] = is_array( $form[ $k ] ) ? array_map( 'sanitize_text_field', $form[ $k ] ) : sanitize_text_field( $form[ $k ] ); + $form[ $k ] = is_array( $form[ $k ] ) ? array_map( 'sanitize_text_field', array_map( 'strip_shortcodes', $form[ $k ] ) ) : sanitize_text_field( strip_shortcodes( $form[ $k ] ) ); break; } } @@ -997,11 +997,11 @@ if ( ! class_exists( 'um\core\Form' ) ) { 'allowfullscreen' => true, ); } - $form[ $description_key ] = wp_kses( $form[ $description_key ], $allowed_html ); + $form[ $description_key ] = wp_kses( strip_shortcodes( $form[ $description_key ] ), $allowed_html ); add_filter( 'wp_kses_allowed_html', array( &$this, 'wp_kses_user_desc' ), 10, 2 ); } else { - $form[ $description_key ] = sanitize_textarea_field( $form[ $description_key ] ); + $form[ $description_key ] = sanitize_textarea_field( strip_shortcodes( $form[ $description_key ] ) ); } } } @@ -1025,11 +1025,11 @@ if ( ! class_exists( 'um\core\Form' ) ) { 'allowfullscreen' => true, ); } - $form[ $description_key ] = wp_kses( $form[ $description_key ], $allowed_html ); + $form[ $description_key ] = wp_kses( strip_shortcodes( $form[ $description_key ] ), $allowed_html ); add_filter( 'wp_kses_allowed_html', array( &$this, 'wp_kses_user_desc' ), 10, 2 ); } else { - $form[ $description_key ] = sanitize_textarea_field( $form[ $description_key ] ); + $form[ $description_key ] = sanitize_textarea_field( strip_shortcodes( $form[ $description_key ] ) ); } } } diff --git a/includes/core/um-actions-account.php b/includes/core/um-actions-account.php index 952ec739..82d251a1 100644 --- a/includes/core/um-actions-account.php +++ b/includes/core/um-actions-account.php @@ -329,11 +329,11 @@ function um_submit_account_details( $args ) { } if ( 'first_name' === $k || 'last_name' === $k || 'user_password' === $k ) { - $v = sanitize_text_field( $v ); + $v = sanitize_text_field( strip_shortcodes( $v ) ); } elseif ( 'user_email' === $k ) { - $v = sanitize_email( $v ); + $v = sanitize_email( strip_shortcodes( $v ) ); } elseif ( 'hide_in_members' === $k || 'um_show_last_login' === $k ) { - $v = array_map( 'sanitize_text_field', $v ); + $v = array_map( 'sanitize_text_field', array_map( 'strip_shortcodes', $v ) ); } $changes[ $k ] = $v; From 213b41991331e805e8c38a85101361d8eaadd261 Mon Sep 17 00:00:00 2001 From: Mykyta Synelnikov Date: Tue, 24 Jun 2025 17:19:48 +0300 Subject: [PATCH 27/28] Fix user ID comparison with absint to ensure type safety Updated the user ID comparison logic in the Ultimate Member plugin to use `absint` for both values. This prevents type mismatches and ensures robust validation during form submission. --- includes/core/um-actions-form.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/includes/core/um-actions-form.php b/includes/core/um-actions-form.php index f89e9480..74c592af 100644 --- a/includes/core/um-actions-form.php +++ b/includes/core/um-actions-form.php @@ -956,7 +956,7 @@ function um_submit_form_errors_hook_( $submitted_data, $form_data ) { $the_similar_users = get_users( $args ); foreach ( $the_similar_users as $user ) { - if ( empty( $submitted_data['user_id'] ) || $user->ID !== $submitted_data['user_id'] ) { + if ( empty( $submitted_data['user_id'] ) || absint( $user->ID ) !== absint( $submitted_data['user_id'] ) ) { UM()->form()->add_error( $key, __( 'The email you entered is incorrect', 'ultimate-member' ) ); break; } From ff55ea2a595db933d1dc86321f2a4a7a6238985c Mon Sep 17 00:00:00 2001 From: Mykyta Synelnikov Date: Tue, 24 Jun 2025 17:30:12 +0300 Subject: [PATCH 28/28] Update changelog and readme with new fixes and enhancements Added filter hooks for button classes and tweaked Site Health data logic for better 3rd-party integration. Fixed shortcode handling, email placeholder issues, and corrected naming inconsistencies like "North Macedonia." --- changelog.txt | 3 +++ readme.txt | 3 +++ 2 files changed, 6 insertions(+) diff --git a/changelog.txt b/changelog.txt index 742e1b2e..2127063c 100644 --- a/changelog.txt +++ b/changelog.txt @@ -5,9 +5,11 @@ * Enhancements: - Added: Filter hooks for primary button classes in UM forms. + - Tweak: Refactored Site Health data, added hooks for 3rd-party integration. * Bugfixes: + - Fixed: Stripped shortcodes in the user data during the Account, Registration and Profile forms submission. (Thanks to [MissVeronica](https://github.com/MissVeronica)) - Fixed: Email placeholders values. - Fixed: Refactor deactivation logic to un-schedule Action Scheduler actions. - Fixed: Action Scheduler library errors. Updated to the recent 3.9.2 version. @@ -15,6 +17,7 @@ - Fixed: Action Scheduler batch actions with users who have Undefined status. - Fixed: Restrictions for 3rd-party Gutenberg Blocks. - Fixed: Date/time picker filter-types range query on Member Directories. + - Fixed: Renamed "Macedonia, the former Yugoslav Republic of" to the official "North Macedonia". * Templates required update: diff --git a/readme.txt b/readme.txt index 184c1783..11c7e4d5 100644 --- a/readme.txt +++ b/readme.txt @@ -172,9 +172,11 @@ IMPORTANT: PLEASE UPDATE THE PLUGIN TO AT LEAST VERSION 2.6.7 IMMEDIATELY. VERSI **Enhancements** * Added: Filter hooks for primary button classes in UM forms. +* Tweak: Refactored Site Health data, added hooks for 3rd-party integration. **Bugfixes** +* Fixed: Stripped shortcodes in the user data during the Account, Registration and Profile forms submission. (Thanks to [MissVeronica](https://github.com/MissVeronica)) * Fixed: Email placeholders values. * Fixed: Refactor deactivation logic to un-schedule Action Scheduler actions. * Fixed: Action Scheduler library errors. Updated to the recent 3.9.2 version. @@ -182,6 +184,7 @@ IMPORTANT: PLEASE UPDATE THE PLUGIN TO AT LEAST VERSION 2.6.7 IMMEDIATELY. VERSI * Fixed: Action Scheduler batch actions with users who have Undefined status. * Fixed: Restrictions for 3rd-party Gutenberg Blocks. * Fixed: Date/time picker filter-types range query on Member Directories. +* Fixed: Renamed "Macedonia, the former Yugoslav Republic of" to the official "North Macedonia". **Templates required update**