From 2e90965a9259355891f9e8c95546f854cb60baf6 Mon Sep 17 00:00:00 2001 From: Mykyta Synelnikov Date: Wed, 25 Jun 2025 13:39:37 +0300 Subject: [PATCH 01/26] Bump Ultimate Member to version 2.10.6-alpha Bump version across plugin files and update references to reflect the new official release, 2.10.6. This ensures consistency in documentation and downloadable resources. --- .wordpress-org/blueprints/blueprint.json | 2 +- README.md | 2 +- package.json | 2 +- readme.txt | 4 ++++ ultimate-member.php | 2 +- 5 files changed, 8 insertions(+), 4 deletions(-) diff --git a/.wordpress-org/blueprints/blueprint.json b/.wordpress-org/blueprints/blueprint.json index 9b356790..1572d6ac 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.5.zip" + "url": "https:\/\/downloads.wordpress.org\/plugin\/ultimate-member.2.10.6.zip" }, "options": { "activate": true diff --git a/README.md b/README.md index c475cff6..b8e6a86d 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.5](https://github.com/ultimatemember/ultimatemember/releases/tag/2.10.5). +[Official Release Version: 2.10.6](https://github.com/ultimatemember/ultimatemember/releases/tag/2.10.6). ## Changelog diff --git a/package.json b/package.json index a7c73a87..546f2deb 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ultimate-member", - "version": "2.6.3", + "version": "2.10.6", "author": { "name": "Ultimate Member", "email": "team@ultimatemember.com", diff --git a/readme.txt b/readme.txt index 11c7e4d5..1760daf6 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.6 2025-07-xx = + + + = 2.10.5 2025-06-25 = **Enhancements** diff --git a/ultimate-member.php b/ultimate-member.php index cd65c785..3e71ce30 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 + * Version: 2.10.6-alpha * Author: Ultimate Member * Author URI: http://ultimatemember.com/ * License: GPLv3 From 0845f55604494bebdc4d091f5f9c002021f5baaa Mon Sep 17 00:00:00 2001 From: Mykyta Synelnikov Date: Fri, 27 Jun 2025 14:24:08 +0300 Subject: [PATCH 02/26] Fix: exclude empty meta values in directory filtering Previously, empty `meta_value` entries were included in the query, potentially causing inaccurate results. This update adds a condition to exclude empty `meta_value` entries, ensuring more reliable directory filtering. --- includes/core/class-member-directory.php | 15 +++++---------- 1 file changed, 5 insertions(+), 10 deletions(-) diff --git a/includes/core/class-member-directory.php b/includes/core/class-member-directory.php index 81c825fc..dd5dccda 100644 --- a/includes/core/class-member-directory.php +++ b/includes/core/class-member-directory.php @@ -995,16 +995,15 @@ if ( ! class_exists( 'um\core\Member_Directory' ) ) { $range = false; switch ( $filter ) { - - default: { - + default: $meta = $wpdb->get_row( $wpdb->prepare( "SELECT MIN( CONVERT( meta_value, DECIMAL ) ) as min_meta, MAX( CONVERT( meta_value, DECIMAL ) ) as max_meta, COUNT( DISTINCT meta_value ) as amount FROM {$wpdb->usermeta} - WHERE meta_key = %s", + WHERE meta_key = %s AND + meta_value != ''", $filter ), ARRAY_A @@ -1016,10 +1015,9 @@ if ( ! class_exists( 'um\core\Member_Directory' ) ) { $range = apply_filters( 'um_member_directory_filter_slider_common', $range, $directory_data, $filter ); $range = apply_filters( "um_member_directory_filter_{$filter}_slider", $range, $directory_data ); - break; - } - case 'birth_date': { + + case 'birth_date': $meta = $wpdb->get_row( "SELECT MIN( meta_value ) as min_meta, MAX( meta_value ) as max_meta, @@ -1033,16 +1031,13 @@ if ( ! class_exists( 'um\core\Member_Directory' ) ) { if ( isset( $meta['min_meta'] ) && isset( $meta['max_meta'] ) && isset( $meta['amount'] ) && $meta['amount'] > 1 ) { $range = array( $this->borndate( strtotime( $meta['max_meta'] ) ), $this->borndate( strtotime( $meta['min_meta'] ) ) ); } - break; - } } return $range; } - /** * @param $filter * From 976c0c75e28c801c8ad248eeffbec69236c4e0e6 Mon Sep 17 00:00:00 2001 From: Mykyta Synelnikov Date: Mon, 7 Jul 2025 13:04:19 +0300 Subject: [PATCH 03/26] Add Extensions_Updater class for handling extension updates Introduced a new `Extensions_Updater` class to manage extension update processes, including version checks and file execution. Added a corresponding `extension_updater` method in `class-admin.php` to initialize and manage updater instances based on provided data. --- includes/admin/class-admin.php | 17 +++ includes/admin/class-extensions-updater.php | 124 ++++++++++++++++++++ 2 files changed, 141 insertions(+) create mode 100644 includes/admin/class-extensions-updater.php diff --git a/includes/admin/class-admin.php b/includes/admin/class-admin.php index 05995bad..526ea925 100644 --- a/includes/admin/class-admin.php +++ b/includes/admin/class-admin.php @@ -2100,5 +2100,22 @@ if ( ! class_exists( 'um\admin\Admin' ) ) { } return UM()->classes['um\admin\users_columns']; } + + /** + * @since 2.10.6 + * + * @param bool|array $data + * @return null|Extensions_Updater + */ + public function extension_updater( $data = false ) { + if ( empty( $data['slug'] ) ) { + return null; + } + $class_index = 'um\admin\extensions_updater_' . $data['slug']; + if ( ! isset( UM()->classes[ $class_index ] ) || empty( UM()->classes[ $class_index ] ) ) { + UM()->classes[ $class_index ] = new Extensions_Updater( $data ); + } + return UM()->classes[ $class_index ]; + } } } diff --git a/includes/admin/class-extensions-updater.php b/includes/admin/class-extensions-updater.php new file mode 100644 index 00000000..11d3aa40 --- /dev/null +++ b/includes/admin/class-extensions-updater.php @@ -0,0 +1,124 @@ +updater_data = wp_parse_args( + $args, + array( + 'slug' => '', + 'version' => '0.0.0', + 'path' => '', + ) + ); + + add_action( 'admin_init', array( $this, 'maybe_run_updater' ) ); + } + + /** + * Maybe run upgrade if needed. + */ + public function maybe_run_updater() { + $last_version_upgrade = $this->get_last_version_upgrade(); + if ( ! empty( $last_version_upgrade ) && version_compare( $last_version_upgrade, $this->updater_data['version'], '>=' ) ) { + // Don't need update. + return; + } + + $packages = $this->get_packages(); + if ( ! empty( $packages ) ) { + $packages_dir = $this->get_packages_dir(); + foreach ( $packages as $package_version ) { + if ( version_compare( $package_version, $last_version_upgrade, '<=' ) ) { + continue; + } + + if ( version_compare( $package_version, $this->updater_data['version'], '>' ) ) { + continue; + } + + $file_path = $packages_dir . $package_version . '.php'; + if ( ! file_exists( $file_path ) ) { + continue; + } + + include_once $file_path; + $this->set_last_version_upgrade( $package_version ); + } + } + + $this->set_last_version_upgrade( $this->updater_data['version'] ); + } + + /** + * Get packages list, based on the files in packages dir. + */ + private function get_packages() { + $packages = array(); + + $handle = opendir( $this->get_packages_dir() ); + // phpcs:ignore Generic.CodeAnalysis.AssignmentInCondition.FoundInWhileCondition, WordPress.CodeAnalysis.AssignmentInCondition.FoundInWhileCondition -- reading folder's content here + while ( false !== ( $filename = readdir( $handle ) ) ) { + if ( '.' !== $filename && '..' !== $filename ) { + $packages[] = preg_replace( '/(.*?)\.php/i', '$1', $filename ); + } + } + closedir( $handle ); + + usort( + $packages, + static function ( $a, $b ) { + return version_compare( $a, $b ); + } + ); + + return $packages; + } + + /** + * Retrieve the directory path where packages are stored for updates. + * + * @return string The normalized path to the packages' directory. + */ + private function get_packages_dir() { + return wp_normalize_path( $this->updater_data['path'] . 'includes/updates/' ); + } + + /** + * Gets the last version upgrade from options. + * + * @return string The last version upgrade. + */ + private function get_last_version_upgrade() { + return get_option( 'um_' . $this->updater_data['slug'] . '_last_version_upgrade', '0.0.0' ); + } + + /** + * Set the last version upgrade for the updater. + * + * @param string $version The version to set as the last upgrade version. + */ + private function set_last_version_upgrade( $version ) { + update_option( 'um_' . $this->updater_data['slug'] . '_last_version_upgrade', $version ); + } +} From a50ab6306773437b18004814adcac6b49709ef79 Mon Sep 17 00:00:00 2001 From: Mykyta Synelnikov Date: Tue, 15 Jul 2025 12:59:39 +0300 Subject: [PATCH 04/26] Update Action Scheduler dependency to use version 3.9.x Changed the version constraint for the woocommerce/action-scheduler dependency from 3.9.2 to 3.9.* in composer.json. This ensures compatibility with all minor updates within the 3.9 release. --- composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/composer.json b/composer.json index 16f2034c..6fb5386f 100644 --- a/composer.json +++ b/composer.json @@ -24,7 +24,7 @@ "ext-iconv": "*", "ext-tidy": "*", "composer/installers": "^2.3", - "woocommerce/action-scheduler": "3.9.2" + "woocommerce/action-scheduler": "3.9.*" }, "require-dev": { "wp-cli/wp-cli": "*", From 824c95e4143ee348d75483a14d0d98882795b82d Mon Sep 17 00:00:00 2001 From: ashubawork Date: Wed, 30 Jul 2025 10:07:01 +0300 Subject: [PATCH 05/26] - fix block restrictions 3rd party plugin --- assets/js/admin/block-restrictions.js | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/assets/js/admin/block-restrictions.js b/assets/js/admin/block-restrictions.js index 04067f60..64f66ef9 100644 --- a/assets/js/admin/block-restrictions.js +++ b/assets/js/admin/block-restrictions.js @@ -9,6 +9,19 @@ 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 ) { + // Some blocks have a strict attribute scheme. + // They reject any attributes that were not originally defined in them. + // When the editor tries to render such a block, the server sees an unfamiliar + // attribute um_is_restrict and returns a 400 error, prohibiting "foreign" properties. + const excludedPrefixes = [ + 'llms/' + ]; + + // Check the blocklist of prefixes. + if ( excludedPrefixes.some( prefix => name.startsWith( prefix ) ) ) { + return settings; + } + // add attributes for all blocks const restrictionAttributes = { um_is_restrict: { From 982dbd4e7f169add1d8b9d0d0bede6fae8cfcbf5 Mon Sep 17 00:00:00 2001 From: ashubawork Date: Wed, 30 Jul 2025 12:24:10 +0300 Subject: [PATCH 06/26] - fix edit user link --- includes/frontend/class-user-profile.php | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/includes/frontend/class-user-profile.php b/includes/frontend/class-user-profile.php index a2fb176e..5c08c915 100644 --- a/includes/frontend/class-user-profile.php +++ b/includes/frontend/class-user-profile.php @@ -19,6 +19,7 @@ if ( ! class_exists( 'um\frontend\User_Profile' ) ) { */ public function __construct() { add_action( 'template_redirect', array( $this, 'handle_edit_screen' ), 10000 ); + add_filter( 'get_edit_user_link', array( $this, 'get_um_edit_user_link' ), 10, 2 ); } /** @@ -30,6 +31,7 @@ if ( ! class_exists( 'um\frontend\User_Profile' ) ) { return; } + // phpcs:disable WordPress.Security.NonceVerification if ( ! isset( $_REQUEST['um_action'] ) ) { return; } @@ -44,6 +46,7 @@ if ( ! class_exists( 'um\frontend\User_Profile' ) ) { if ( isset( $_REQUEST['uid'] ) ) { $uid = absint( $_REQUEST['uid'] ); } + // phpcs:enable WordPress.Security.NonceVerification if ( ! empty( $uid ) && ! UM()->common()->users()::user_exists( $uid ) ) { return; @@ -65,5 +68,9 @@ if ( ! class_exists( 'um\frontend\User_Profile' ) ) { exit; } } + + public function get_um_edit_user_link( $link, $user_id ) { + return um_edit_profile_url( $user_id ); + } } } From 4522e6d64c10ce3c6b85ea8ef09a9dbcb7d48d9a Mon Sep 17 00:00:00 2001 From: ashubawork Date: Wed, 30 Jul 2025 13:09:54 +0300 Subject: [PATCH 07/26] - fix fatal error 2.0-beta1 package update --- includes/admin/core/packages/2.0-beta1/um-cpt.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/includes/admin/core/packages/2.0-beta1/um-cpt.php b/includes/admin/core/packages/2.0-beta1/um-cpt.php index 6c073707..62e5502a 100644 --- a/includes/admin/core/packages/2.0-beta1/um-cpt.php +++ b/includes/admin/core/packages/2.0-beta1/um-cpt.php @@ -25,7 +25,7 @@ foreach ( $forms as $form_id ) { delete_post_meta( $form_id, "_um_{$form_type}_use_globals" ); $role_slug = get_post_meta( $form_id, "_um_{$form_type}_role", true ); - if ( $role_slug && array_key_exists( $role_slug, $roles_associations ) ) { + if ( $role_slug && is_array( $roles_associations ) && array_key_exists( $role_slug, $roles_associations ) ) { update_post_meta( $form_id, "_um_{$form_type}_role", $roles_associations[ $role_slug ] ); } } From 91b15a80ef3ed7e48967d4d565a3706cbfde21c0 Mon Sep 17 00:00:00 2001 From: ashubawork Date: Thu, 31 Jul 2025 13:49:45 +0300 Subject: [PATCH 08/26] - fix contain in conditional logic --- includes/um-short-functions.php | 136 +++++++++++++++++++------------- 1 file changed, 81 insertions(+), 55 deletions(-) diff --git a/includes/um-short-functions.php b/includes/um-short-functions.php index 45ac1b56..c75af9b9 100644 --- a/includes/um-short-functions.php +++ b/includes/um-short-functions.php @@ -287,15 +287,14 @@ function um_field_conditions_are_met( $data ) { return true; } - $state = ( isset( $data['conditional_action'] ) && $data['conditional_action'] == 'show' ) ? 1 : 0; + $state = ( isset( $data['conditional_action'] ) && 'show' === $data['conditional_action'] ) ? 1 : 0; $first_group = 0; $state_array = array(); - $count = count( $state_array ); + $count = count( $state_array ); foreach ( $data['conditions'] as $k => $arr ) { - $val = $arr[3]; - $op = $arr[2]; + $op = $arr[2]; if ( strstr( $arr[1], 'role_' ) ) { $arr[1] = 'role'; @@ -303,70 +302,74 @@ function um_field_conditions_are_met( $data ) { $field = um_profile( $arr[1] ); - if ( ! isset( $arr[5] ) || $arr[5] != $first_group ) { + if ( 'show' === $arr[0] ) { - - if ( $arr[0] == 'show' ) { - - switch ($op) { + switch ( $op ) { case 'equals to': - $field = maybe_unserialize( $field ); - if (is_array( $field )) + if ( is_array( $field ) ) { $state = in_array( $val, $field ) ? 'show' : 'hide'; - else + } else { $state = ( $field == $val ) ? 'show' : 'hide'; + } break; case 'not equals': - $field = maybe_unserialize( $field ); - if (is_array( $field )) - $state = !in_array( $val, $field ) ? 'show' : 'hide'; - else + if ( is_array( $field ) ) { + $state = ! in_array( $val, $field ) ? 'show' : 'hide'; + } else { $state = ( $field != $val ) ? 'show' : 'hide'; + } break; case 'empty': - - $state = ( !$field ) ? 'show' : 'hide'; + $state = ( ! $field ) ? 'show' : 'hide'; break; case 'not empty': - $state = ( $field ) ? 'show' : 'hide'; break; case 'greater than': - if ($field > $val) { + if ( $field > $val ) { $state = 'show'; } else { $state = 'hide'; } break; case 'less than': - if ($field < $val) { + if ( $field < $val ) { $state = 'show'; } else { $state = 'hide'; } break; case 'contains': - if (strstr( $field, $val )) { - $state = 'show'; + $match = false; + if ( is_array( $field ) ) { + foreach ( $field as $item ) { + if ( is_string( $item ) && false !== strpos( $item, $val ) ) { + $match = true; + break; + } + } } else { - $state = 'hide'; + if ( false !== strpos( $field, $val ) ) { + $match = true; + } } + + $state = $match ? 'show' : 'hide'; break; } - } elseif ( $arr[0] == 'hide' ) { + } elseif ( 'hide' === $arr[0] ) { switch ( $op ) { case 'equals to': - $field = maybe_unserialize( $field ); if ( is_array( $field ) ) { @@ -377,7 +380,6 @@ function um_field_conditions_are_met( $data ) { break; case 'not equals': - $field = maybe_unserialize( $field ); if ( is_array( $field ) ) { @@ -388,12 +390,10 @@ function um_field_conditions_are_met( $data ) { break; case 'empty': - $state = ( ! $field ) ? 'hide' : 'show'; break; case 'not empty': - $state = ( $field ) ? 'hide' : 'show'; break; @@ -412,19 +412,29 @@ function um_field_conditions_are_met( $data ) { } break; case 'contains': - if ( strstr( $field, $val ) ) { - $state = 'hide'; + $match = true; + if ( is_array( $field ) ) { + foreach ( $field as $item ) { + if ( is_string( $item ) && false !== strpos( $item, $val ) ) { + $match = false; + break; + } + } } else { - $state = 'show'; + if ( false !== strpos( $field, $val ) ) { + $match = false; + } } + + $state = $match ? 'show' : 'hide'; + break; } } - $first_group++; + ++$first_group; array_push( $state_array, $state ); } else { - - if ( $arr[0] == 'show' ) { + if ( 'show' === $arr[0] ) { switch ( $op ) { case 'equals to': @@ -448,13 +458,11 @@ function um_field_conditions_are_met( $data ) { break; case 'empty': - $state = ( ! $field ) ? 'show' : 'not_show'; break; case 'not empty': - - $state = ( $field ) ? 'show': 'not_show'; + $state = ( $field ) ? 'show' : 'not_show'; break; case 'greater than': @@ -472,14 +480,25 @@ function um_field_conditions_are_met( $data ) { } break; case 'contains': - if ( strstr( $field, $val ) ) { - $state = 'show'; + $match = false; + if ( is_array( $field ) ) { + foreach ( $field as $item ) { + if ( is_string( $item ) && false !== strpos( $item, $val ) ) { + $match = true; + break; + } + } } else { - $state = 'not_show'; + if ( false !== strpos( $field, $val ) ) { + $match = true; + } } + + $state = $match ? 'show' : 'not_show'; + break; } - } elseif ( $arr[0] == 'hide' ) { + } elseif ( 'hide' === $arr[0] ) { switch ( $op ) { case 'equals to': @@ -493,7 +512,6 @@ function um_field_conditions_are_met( $data ) { break; case 'not equals': - $field = maybe_unserialize( $field ); if ( is_array( $field ) ) { @@ -504,12 +522,10 @@ function um_field_conditions_are_met( $data ) { break; case 'empty': - $state = ( ! $field ) ? 'hide' : 'not_hide'; break; case 'not empty': - $state = ( $field ) ? 'hide' : 'not_hide'; break; @@ -528,30 +544,41 @@ function um_field_conditions_are_met( $data ) { } break; case 'contains': - if ( strstr( $field, $val ) ) { - $state = 'hide'; + $match = true; + if ( is_array( $field ) ) { + foreach ( $field as $item ) { + if ( is_string( $item ) && false !== strpos( $item, $val ) ) { + $match = false; + break; + } + } } else { - $state = 'not_hide'; + if ( false !== strpos( $field, $val ) ) { + $match = false; + } } + + $state = $match ? 'not_hide' : 'hide'; + break; } } if ( isset( $state_array[ $count ] ) ) { - if ( $state_array[ $count ] == 'show' || $state_array[ $count ] == 'not_hide' ) { - if ( $state == 'show' || $state == 'not_hide' ) { + if ( 'show' === $state_array[ $count ] || 'not_hide' === $state_array[ $count ] ) { + if ( 'show' === $state || 'not_hide' === $state ) { $state_array[ $count ] = 'show'; } else { $state_array[ $count ] = 'hide'; } } else { - if ( $state == 'hide' || $state == 'not_show' ) { + if ( 'hide' === $state || 'not_show' === $state ) { $state_array[ $count ] = 'hide'; } else { $state_array[ $count ] = 'hide'; } } } else { - if ( $state == 'show' || $state == 'not_hide' ) { + if ( 'show' === $state || 'not_hide' === $state ) { $state_array[ $count ] = 'show'; } else { $state_array[ $count ] = 'hide'; @@ -559,10 +586,9 @@ function um_field_conditions_are_met( $data ) { } } - } $result = array_unique( $state_array ); - if ( ! in_array( 'show', $result ) ) { + if ( ! in_array( 'show', $result, true ) ) { return $state = false; } else { return $state = true; @@ -2852,7 +2878,7 @@ function um_is_amp( $check_theme_support = true ) { $is_amp = false; if ( ( function_exists( 'is_amp_endpoint' ) && is_amp_endpoint() ) || - ( function_exists( 'is_better_amp' ) && is_better_amp() ) ) { + ( function_exists( 'is_better_amp' ) && is_better_amp() ) ) { $is_amp = true; } From 6434218f961810308888b4cb7fcd6065ac081dc8 Mon Sep 17 00:00:00 2001 From: Mykyta Synelnikov Date: Mon, 4 Aug 2025 12:47:13 +0300 Subject: [PATCH 09/26] Add mobile cache bypass for specific Ultimate Member pages Prevent caching on mobile devices for login, register, and account pages in Ultimate Member. This ensures updated content is always displayed and avoids caching-related issues on these critical pages. --- includes/common/class-screen.php | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/includes/common/class-screen.php b/includes/common/class-screen.php index e9328e74..435662dc 100644 --- a/includes/common/class-screen.php +++ b/includes/common/class-screen.php @@ -19,6 +19,7 @@ if ( ! class_exists( 'um\common\Screen' ) ) { */ public function __construct() { add_filter( 'body_class', array( &$this, 'remove_admin_bar' ), 1000 ); + add_action( 'send_headers', array( &$this, 'avoid_mobile_cache' ) ); } /** @@ -40,5 +41,21 @@ if ( ! class_exists( 'um\common\Screen' ) ) { return $classes; } + + /** + * Avoid caching for mobile devices on specific pages. + */ + public function avoid_mobile_cache() { + if ( ! wp_is_mobile() ) { + return; + } + + if ( um_is_predefined_page( 'login' ) || um_is_predefined_page( 'register' ) || um_is_predefined_page( 'account' ) ) { + header( 'Cache-Control: no-store, no-cache, must-revalidate, max-age=0' ); + header( 'Cache-Control: post-check=0, pre-check=0', false ); + header( 'Pragma: no-cache' ); + header( 'Expires: 0' ); + } + } } } From 6905df14ea2c210d3f63236b9bc28577592a2053 Mon Sep 17 00:00:00 2001 From: ashubawork Date: Tue, 26 Aug 2025 09:59:53 +0300 Subject: [PATCH 10/26] - fixed comment author link in commetns block --- includes/frontend/class-user-profile.php | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/includes/frontend/class-user-profile.php b/includes/frontend/class-user-profile.php index 5c08c915..428450b5 100644 --- a/includes/frontend/class-user-profile.php +++ b/includes/frontend/class-user-profile.php @@ -20,6 +20,7 @@ if ( ! class_exists( 'um\frontend\User_Profile' ) ) { public function __construct() { add_action( 'template_redirect', array( $this, 'handle_edit_screen' ), 10000 ); add_filter( 'get_edit_user_link', array( $this, 'get_um_edit_user_link' ), 10, 2 ); + add_filter('get_comment_author_url', array( $this, 'get_comment_author_url' ), 10, 3); } /** @@ -72,5 +73,9 @@ if ( ! class_exists( 'um\frontend\User_Profile' ) ) { public function get_um_edit_user_link( $link, $user_id ) { return um_edit_profile_url( $user_id ); } + + public function get_comment_author_url( $comment_author_url, $comment_id, $comment ) { + return um_user_profile_url( $comment->user_id ); + } } } From 58fdd9f9433187407c5bcfb8e697630e92e98a28 Mon Sep 17 00:00:00 2001 From: Mykyta Synelnikov Date: Fri, 5 Sep 2025 12:08:19 +0300 Subject: [PATCH 11/26] Update user profile link handling in frontend Refactored methods to change user profile edit and comment author URL logic, ensuring compatibility with Ultimate Member plugin's structure. Updated readme file to reflect changes and fixed bugs related to profile link display in the comments section. --- includes/frontend/class-user-profile.php | 27 ++++++++++++++++++++---- readme.txt | 8 ++++++- 2 files changed, 30 insertions(+), 5 deletions(-) diff --git a/includes/frontend/class-user-profile.php b/includes/frontend/class-user-profile.php index 428450b5..5a155640 100644 --- a/includes/frontend/class-user-profile.php +++ b/includes/frontend/class-user-profile.php @@ -1,6 +1,8 @@ user_id ); } } diff --git a/readme.txt b/readme.txt index 01ccf2e3..002955c8 100644 --- a/readme.txt +++ b/readme.txt @@ -167,9 +167,15 @@ 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.6 2025-07-xx = += 2.10.6 2025-09-xx = +**Enhancements** +* Added: Avoid caching of the UM Forms on the mobile devices via adding the nocache headers to the screens with UM Forms. + +**Bugfixes** + +* Fixed: Changed the view and the edit user profile links in the comments section on the frontend. = 2.10.5 2025-06-25 = From 6ae2ec4ec837a88aa72dcb5e9ba4c21d354582dd Mon Sep 17 00:00:00 2001 From: Mykyta Synelnikov Date: Fri, 5 Sep 2025 12:17:15 +0300 Subject: [PATCH 12/26] Add filter hook to customize empty status user queries Introduced the `um_get_empty_status_users_query_result` filter to allow customization of the query used for fetching users with empty statuses. This enhances flexibility and enables optimization for different website setups. Updated relevant documentation in the readme file. --- includes/common/class-users.php | 36 +++++++++++++++++++++++++-------- readme.txt | 1 + 2 files changed, 29 insertions(+), 8 deletions(-) diff --git a/includes/common/class-users.php b/includes/common/class-users.php index 6505ec0e..d83d545e 100644 --- a/includes/common/class-users.php +++ b/includes/common/class-users.php @@ -979,14 +979,34 @@ class Users { public static function get_empty_status_users() { global $wpdb; - $total_users = $wpdb->get_var( - "SELECT COUNT(DISTINCT u.ID) - FROM {$wpdb->users} u - LEFT JOIN {$wpdb->usermeta} um ON u.ID = um.user_id AND um.meta_key = 'account_status' - LEFT JOIN {$wpdb->usermeta} um2 ON u.ID = um2.user_id AND um2.meta_key = '_um_registration_in_progress' - WHERE ( um.meta_value IS NULL OR um.meta_value = '' ) AND - ( um2.meta_value IS NULL OR um2.meta_value != '1' )" - ); + /** + * Filters whitelisted usermeta keys that can be stored inside DB after UM Form submission. + * + * @param {int} $total_users Count of the users with empty status. Query result, by default is null. + * + * @return {int} Count of the users with empty status. Or null. + * + * @since 2.10.6 + * @hook um_get_empty_status_users_query_result + * + * @example Customize the empty status users query. + * function my_get_empty_status_users_query( $total_users ) { + * $total_users = $wpdb->get_var( "your custom DB query here" ); + * return $total_users; + * } + * add_filter( 'um_get_empty_status_users_query_result', 'my_get_empty_status_users_query' ); + */ + $total_users = apply_filters( 'um_get_empty_status_users_query_result', null ); + if ( is_null( $total_users ) ) { + $total_users = $wpdb->get_var( + "SELECT COUNT(DISTINCT u.ID) + FROM {$wpdb->users} u + LEFT JOIN {$wpdb->usermeta} um ON u.ID = um.user_id AND um.meta_key = 'account_status' + LEFT JOIN {$wpdb->usermeta} um2 ON u.ID = um2.user_id AND um2.meta_key = '_um_registration_in_progress' + WHERE ( um.meta_value IS NULL OR um.meta_value = '' ) AND + ( um2.meta_value IS NULL OR um2.meta_value != '1' )" + ); + } $total_users = absint( $total_users ); if ( $total_users > 0 ) { diff --git a/readme.txt b/readme.txt index 002955c8..42f7ba9d 100644 --- a/readme.txt +++ b/readme.txt @@ -172,6 +172,7 @@ IMPORTANT: PLEASE UPDATE THE PLUGIN TO AT LEAST VERSION 2.6.7 IMMEDIATELY. VERSI **Enhancements** * Added: Avoid caching of the UM Forms on the mobile devices via adding the nocache headers to the screens with UM Forms. +* Added: Filter hook `um_get_empty_status_users_query_result` for changing default query on the different websites to optimize it. **Bugfixes** From f7768d8477a30ef4e535bfc3cc0741f76b0c79f1 Mon Sep 17 00:00:00 2001 From: Mykyta Synelnikov Date: Fri, 5 Sep 2025 12:21:57 +0300 Subject: [PATCH 13/26] Add filter to exclude third-party Gutenberg block prefixes Introduced the `um_admin_blocks_prefixes_excluded` JS filter hook to allow exclusion of third-party Gutenberg blocks with specific prefixes from UM restriction attributes. This improves compatibility and flexibility when handling external blocks. Updated relevant JS and documentation files to support this feature. --- assets/js/admin/block-restrictions.js | 3 ++- assets/js/admin/block-restrictions.min.js | 2 +- readme.txt | 1 + 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/assets/js/admin/block-restrictions.js b/assets/js/admin/block-restrictions.js index 64f66ef9..9f8b4215 100644 --- a/assets/js/admin/block-restrictions.js +++ b/assets/js/admin/block-restrictions.js @@ -13,9 +13,10 @@ function um_add_restriction_attributes( settings, name ) { // They reject any attributes that were not originally defined in them. // When the editor tries to render such a block, the server sees an unfamiliar // attribute um_is_restrict and returns a 400 error, prohibiting "foreign" properties. - const excludedPrefixes = [ + let excludedPrefixes = [ 'llms/' ]; + excludedPrefixes = wp.hooks.applyFilters( 'um_admin_blocks_prefixes_excluded', excludedPrefixes, settings, name ); // Check the blocklist of prefixes. if ( excludedPrefixes.some( prefix => name.startsWith( prefix ) ) ) { diff --git a/assets/js/admin/block-restrictions.min.js b/assets/js/admin/block-restrictions.min.js index becb5ed6..7eec1407 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)}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 +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){var s=["llms/"];return(s=wp.hooks.applyFilters("um_admin_blocks_prefixes_excluded",s,e,t)).some(e=>t.startsWith(e))||(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/readme.txt b/readme.txt index 42f7ba9d..2ca70b34 100644 --- a/readme.txt +++ b/readme.txt @@ -173,6 +173,7 @@ IMPORTANT: PLEASE UPDATE THE PLUGIN TO AT LEAST VERSION 2.6.7 IMMEDIATELY. VERSI * Added: Avoid caching of the UM Forms on the mobile devices via adding the nocache headers to the screens with UM Forms. * Added: Filter hook `um_get_empty_status_users_query_result` for changing default query on the different websites to optimize it. +* Added: JS filter hook `um_admin_blocks_prefixes_excluded` for excluding 3rd-party Gutenberg blocks with predefined prefixes from UM restriction arguments. **Bugfixes** From 3cafd12137e9e27d75e70d3aa433c28f30475594 Mon Sep 17 00:00:00 2001 From: Mykyta Synelnikov Date: Fri, 5 Sep 2025 15:24:28 +0300 Subject: [PATCH 14/26] Fix invalid 'start_of_week' handling in weekly events logic Ensure 'start_of_week' option is validated as numeric to prevent incorrect calculations. This fixes potential issues when non-numeric values are stored in the option. --- includes/core/class-cron.php | 4 +++- readme.txt | 2 ++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/includes/core/class-cron.php b/includes/core/class-cron.php index 63b0ad34..34244c41 100644 --- a/includes/core/class-cron.php +++ b/includes/core/class-cron.php @@ -80,7 +80,9 @@ if ( ! class_exists( 'um\core\Cron' ) ) { */ private function weekly_events() { $sunday_start = wp_date( 'w' ); - $week_start = $sunday_start - absint( get_option( 'start_of_week' ) ); + $start_of_week = get_option( 'start_of_week', 0 ); + $start_of_week = is_numeric( $start_of_week ) ? $start_of_week : 0; + $week_start = $sunday_start - absint( $start_of_week ); $week_start_day = strtotime( '-' . $week_start . ' days' ); $time = mktime( 0, 0, 0, wp_date( 'm', $week_start_day ), wp_date( 'd', $week_start_day ), wp_date( 'Y', $week_start_day ) ); if ( ! wp_next_scheduled( 'um_weekly_scheduled_events' ) ) { diff --git a/readme.txt b/readme.txt index 2ca70b34..03c62e0c 100644 --- a/readme.txt +++ b/readme.txt @@ -178,6 +178,8 @@ IMPORTANT: PLEASE UPDATE THE PLUGIN TO AT LEAST VERSION 2.6.7 IMMEDIATELY. VERSI **Bugfixes** * Fixed: Changed the view and the edit user profile links in the comments section on the frontend. +* Fixed: `Contains` conditional logic operand when value is array. +* Fixed: Integer validation for the 'start_of_week' WP native setting. = 2.10.5 2025-06-25 = From 5c67164cc235e5805081f12d9eac6b28e6e51c06 Mon Sep 17 00:00:00 2001 From: Mykyta Synelnikov Date: Sat, 6 Sep 2025 14:42:15 +0300 Subject: [PATCH 15/26] Fix cover image size handling and add fallback for invalid sizes Improved logic to handle cases where the cover image size array is invalid or empty by adding a fallback default size. For mobile devices, the second size is used if available, or the first size is used as a fallback. This ensures proper cover size selection and prevents potential errors. --- includes/core/class-member-directory-meta.php | 8 +++++++- includes/core/class-member-directory.php | 8 +++++++- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/includes/core/class-member-directory-meta.php b/includes/core/class-member-directory-meta.php index 272fbe0d..6ebcefb1 100644 --- a/includes/core/class-member-directory-meta.php +++ b/includes/core/class-member-directory-meta.php @@ -1104,8 +1104,14 @@ if ( ! class_exists( 'um\core\Member_Directory_Meta' ) ) { $pagination_data = $this->calculate_pagination( $directory_data, $total_users ); $sizes = UM()->options()->get( 'cover_thumb_sizes' ); + // Ensure we have valid sizes array and handle case when only one size is defined + if ( ! is_array( $sizes ) || empty( $sizes ) ) { + $sizes = array( 300 ); // fallback to default + } - $this->cover_size = wp_is_mobile() ? $sizes[1] : end( $sizes ); + // For mobile, use second size if available, otherwise use first size + $available_mobile = isset( $sizes[1] ) ? $sizes[1] : $sizes[0]; + $this->cover_size = wp_is_mobile() ? $available_mobile : end( $sizes ); $avatar_size = UM()->options()->get( 'profile_photosize' ); $this->avatar_size = str_replace( 'px', '', $avatar_size ); diff --git a/includes/core/class-member-directory.php b/includes/core/class-member-directory.php index dd5dccda..4241720f 100644 --- a/includes/core/class-member-directory.php +++ b/includes/core/class-member-directory.php @@ -2951,8 +2951,14 @@ if ( ! class_exists( 'um\core\Member_Directory' ) ) { $user_ids = apply_filters( 'um_prepare_user_results_array', $user_ids, $this->query_args ); $sizes = UM()->options()->get( 'cover_thumb_sizes' ); + // Ensure we have valid sizes array and handle case when only one size is defined + if ( ! is_array( $sizes ) || empty( $sizes ) ) { + $sizes = array( 300 ); // fallback to default + } - $this->cover_size = wp_is_mobile() ? $sizes[1] : end( $sizes ); + // For mobile, use second size if available, otherwise use first size + $available_mobile = isset( $sizes[1] ) ? $sizes[1] : $sizes[0]; + $this->cover_size = wp_is_mobile() ? $available_mobile : end( $sizes ); $this->cover_size = apply_filters( 'um_member_directory_cover_image_size', $this->cover_size, $directory_data ); From 39b3b3873ea7c10c6848bf1db48d27b4e5e7718d Mon Sep 17 00:00:00 2001 From: Mykyta Synelnikov Date: Mon, 8 Sep 2025 23:20:59 +0300 Subject: [PATCH 16/26] Add new sanitization cases for array-based input validation Introduced 'sanitize_array_key_int' and 'sanitize_array_key' cases to enhance sanitization of array-based input in admin settings. This ensures default values are used for invalid keys and enforces stricter validation for cleaner and more secure input handling. --- includes/admin/class-admin.php | 29 ++++++++++++++++++++++++----- 1 file changed, 24 insertions(+), 5 deletions(-) diff --git a/includes/admin/class-admin.php b/includes/admin/class-admin.php index 526ea925..08a40d4d 100644 --- a/includes/admin/class-admin.php +++ b/includes/admin/class-admin.php @@ -1405,6 +1405,13 @@ if ( ! class_exists( 'um\admin\Admin' ) ) { $sanitized[ $k ] = ( '' !== $v ) ? absint( $v ) : ''; } break; + case 'sanitize_array_key_int': + if ( ! array_key_exists( 'default', $this->builder_input[ $k ] ) || ! array_key_exists( 'array', $this->builder_input[ $k ] ) ) { + continue 2; + } + + $sanitized[ $k ] = ! in_array( absint( $v ), $this->builder_input[ $k ]['array'], true ) ? $this->builder_input[ $k ]['default'] : absint( $v ); + break; } } @@ -1565,14 +1572,26 @@ if ( ! class_exists( 'um\admin\Admin' ) ) { case 'text': $sanitized[ $k ] = sanitize_text_field( $v ); break; + case 'sanitize_array_key': + if ( ! array_key_exists( 'default', UM()->admin_settings()->settings_map[ $k ] ) || ! array_key_exists( 'array', UM()->admin_settings()->settings_map[ $k ] ) ) { + continue 2; + } + + if ( is_array( $v ) ) { + $sanitized[ $k ] = array(); + foreach ( $v as $v_v ) { + if ( in_array( sanitize_key( $v_v ), UM()->admin_settings()->settings_map[ $k ]['array'], true ) ) { + $sanitized[ $k ][] = sanitize_key( $v_v ); + } + } + } else { + $sanitized[ $k ] = ! in_array( sanitize_key( $v ), UM()->admin_settings()->settings_map[ $k ]['array'], true ) ? UM()->admin_settings()->settings_map[ $k ]['default'] : sanitize_key( $v ); + } + break; } } - $data = $sanitized; - - $data = apply_filters( 'um_save_settings_sanitize', $data ); - - return $data; + return apply_filters( 'um_save_settings_sanitize', $sanitized ); } /** From da4a5ccce6454975674a9be5093edf8d463bef91 Mon Sep 17 00:00:00 2001 From: Mykyta Synelnikov Date: Tue, 16 Sep 2025 16:00:26 +0300 Subject: [PATCH 17/26] Add function to check if a post is a predefined page Introduce `um_post_is_predefined_page` to determine if a given post ID corresponds to a predefined page. This enhances functionality by allowing checks against predefined page slugs mapped in the plugin configuration. --- includes/um-core-functions.php | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/includes/um-core-functions.php b/includes/um-core-functions.php index d2d7c397..4940129a 100755 --- a/includes/um-core-functions.php +++ b/includes/um-core-functions.php @@ -20,6 +20,27 @@ function um_predefined_page_slug_exists( $slug ) { return array_key_exists( $slug, $predefined_pages ); } +/** + * @param int $post_id + * + * @return bool + */ +function um_post_is_predefined_page( $post_id ) { + $predefined_pages = UM()->config()->get( 'predefined_pages' ); + $predefined_pages = array_keys( $predefined_pages ); + if ( empty( $predefined_pages ) ) { + return false; + } + + foreach ( $predefined_pages as $slug ) { + if ( um_is_predefined_page( $slug, $post_id ) ) { + return true; + } + } + + return false; +} + /** * @param string $slug * From 2a2d60002d900c9bc6f5d28cf54fe7c4f6129e23 Mon Sep 17 00:00:00 2001 From: Mykyta Synelnikov Date: Tue, 16 Sep 2025 18:04:53 +0300 Subject: [PATCH 18/26] Update plugin version to 2.10.6 stable release Switch the plugin from the alpha version to the stable release. This ensures users have access to the finalized and tested version for production environments. --- ultimate-member.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ultimate-member.php b/ultimate-member.php index 3e71ce30..96a2b298 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.6-alpha + * Version: 2.10.6 * Author: Ultimate Member * Author URI: http://ultimatemember.com/ * License: GPLv3 From bdf96012c8043f0cae1d0c1a1dda4983bfef2103 Mon Sep 17 00:00:00 2001 From: Mykyta Synelnikov Date: Tue, 16 Sep 2025 18:28:49 +0300 Subject: [PATCH 19/26] "Align array keys in allowed HTML definitions for clarity. Standardized indentation across the allowed HTML keys to improve readability and maintain consistency in the codebase. This change ensures better alignment, making it easier to navigate and understand the structure." --- includes/class-functions.php | 154 +++++++++++++++++++++++++++++++---- 1 file changed, 137 insertions(+), 17 deletions(-) diff --git a/includes/class-functions.php b/includes/class-functions.php index bf861f15..61124c73 100644 --- a/includes/class-functions.php +++ b/includes/class-functions.php @@ -548,13 +548,35 @@ if ( ! class_exists( 'UM_Functions' ) ) { break; case 'templates': $allowed_html = array( - 'style' => array(), - 'link' => array( + 'style' => array(), + 'link' => array( 'rel' => true, 'href' => true, 'media' => true, ), - 'form' => array( + 'svg' => array( + 'xmlns' => true, + 'height' => true, + 'preserveaspectratio' => true, + 'viewbox' => true, + 'width' => true, + 'x' => true, + 'y' => true, + 'fill' => true, + 'stroke' => true, + 'stroke-linecap' => true, + 'stroke-linejoin' => true, + 'stroke-width' => true, + ), + 'path' => array( + 'd' => true, + 'stroke' => true, + 'stroke-width' => true, + 'stroke-linecap' => true, + 'stroke-linejoin' => true, + 'fill' => true, + ), + 'form' => array( 'action' => true, 'accept' => true, 'accept-charset' => true, @@ -562,11 +584,12 @@ if ( ! class_exists( 'UM_Functions' ) ) { 'method' => true, 'name' => true, 'target' => true, + 'novalidate' => true, ), - 'label' => array( + 'label' => array( 'for' => true, ), - 'select' => array( + 'select' => array( 'name' => true, 'multiple' => true, 'disabled' => true, @@ -574,12 +597,12 @@ if ( ! class_exists( 'UM_Functions' ) ) { 'required' => true, 'autocomplete' => true, ), - 'option' => array( + 'option' => array( 'value' => true, 'selected' => true, 'disabled' => true, ), - 'input' => array( + 'input' => array( 'type' => true, 'name' => true, 'value' => true, @@ -598,7 +621,7 @@ if ( ! class_exists( 'UM_Functions' ) ) { 'maxlength' => true, 'pattern' => true, ), - 'textarea' => array( + 'textarea' => array( 'cols' => true, 'rows' => true, 'disabled' => true, @@ -606,8 +629,21 @@ if ( ! class_exists( 'UM_Functions' ) ) { 'readonly' => true, 'required' => true, 'autocomplete' => true, + 'placeholder' => true, ), - 'img' => array( + 'button' => array( + 'type' => true, + 'name' => true, + 'value' => true, + 'placeholder' => true, + 'readonly' => true, + 'disabled' => true, + 'checked' => true, + 'selected' => true, + 'required' => true, + 'autocomplete' => true, + ), + 'img' => array( 'alt' => true, 'align' => true, 'border' => true, @@ -621,26 +657,110 @@ if ( ! class_exists( 'UM_Functions' ) ) { 'usemap' => true, 'width' => true, ), - 'h1' => array( + 'h1' => array( 'align' => true, ), - 'h2' => array( + 'h2' => array( 'align' => true, ), - 'h3' => array( + 'h3' => array( 'align' => true, ), - 'p' => array( + 'h4' => array( + 'align' => true, + ), + 'h5' => array( + 'align' => true, + ), + 'h6' => array( + 'align' => true, + ), + 'p' => array( 'align' => true, 'dir' => true, 'lang' => true, ), - 'ol' => array(), - 'ul' => array(), - 'li' => array(), - 'time' => array( + 'ol' => array(), + 'ul' => array(), + 'li' => array(), + 'time' => array( 'datetime' => true, ), + 'section' => array(), + 'table' => array( + 'align' => true, + 'bgcolor' => true, + 'border' => true, + 'cellpadding' => true, + 'cellspacing' => true, + 'dir' => true, + 'rules' => true, + 'summary' => true, + 'width' => true, + ), + 'tbody' => array( + 'align' => true, + 'char' => true, + 'charoff' => true, + 'valign' => true, + ), + 'thead' => array( + 'align' => true, + 'char' => true, + 'charoff' => true, + 'valign' => true, + ), + 'th' => array( + 'abbr' => true, + 'align' => true, + 'axis' => true, + 'bgcolor' => true, + 'char' => true, + 'charoff' => true, + 'colspan' => true, + 'headers' => true, + 'height' => true, + 'nowrap' => true, + 'rowspan' => true, + 'scope' => true, + 'valign' => true, + 'width' => true, + ), + 'tr' => array( + 'align' => true, + 'bgcolor' => true, + 'char' => true, + 'charoff' => true, + 'valign' => true, + ), + 'td' => array( + 'abbr' => true, + 'align' => true, + 'axis' => true, + 'bgcolor' => true, + 'char' => true, + 'charoff' => true, + 'colspan' => true, + 'dir' => true, + 'headers' => true, + 'height' => true, + 'nowrap' => true, + 'rowspan' => true, + 'scope' => true, + 'valign' => true, + 'width' => true, + ), + 'tfoot' => array( + 'align' => true, + 'char' => true, + 'charoff' => true, + 'valign' => true, + ), + 'noscript' => array(), + 'del' => array(), + 'blockquote' => array( + 'cite' => true, + ), ); break; case 'admin_notice': From 1a3a6aec53820e4d2599a2d60ea6d63eac790db5 Mon Sep 17 00:00:00 2001 From: Mykyta Synelnikov Date: Wed, 17 Sep 2025 15:02:40 +0300 Subject: [PATCH 20/26] Add field ID to AJAX data in admin forms JS This update modifies the AJAX request in `forms.js` by including the field ID in the data payload. This improvement enables more precise handling of form fields in the Ultimate Member plugin's admin interface. --- assets/js/admin/forms.js | 2 ++ assets/js/admin/forms.min.js | 2 +- includes/ajax/class-pages.php | 27 ++++++++++++++++++++++++--- 3 files changed, 27 insertions(+), 4 deletions(-) diff --git a/assets/js/admin/forms.js b/assets/js/admin/forms.js index 3869389e..8c0b5c13 100644 --- a/assets/js/admin/forms.js +++ b/assets/js/admin/forms.js @@ -105,10 +105,12 @@ function um_admin_init_pages_select() { dataType: 'json', delay: 250, // delay in ms while typing when to perform a AJAX search data: function( params ) { + let fieldID = jQuery(this).attr('id'); return { search: params.term, // search query action: 'um_get_pages_list', // AJAX action for admin-ajax.php page: params.page || 1, // infinite scroll pagination + field_id: fieldID, // select ID nonce: um_admin_scripts.nonce }; }, diff --git a/assets/js/admin/forms.min.js b/assets/js/admin/forms.min.js index c11f25e9..033f3d4e 100644 --- a/assets/js/admin/forms.min.js +++ b/assets/js/admin/forms.min.js @@ -1 +1 @@ -function um_admin_init_users_select(){function e(a){var t;if(!a.id)return a.text;if(void 0!==a.img)t=jQuery(' '+a.text+"");else{let e;t=(e=void 0!==a.element&&void 0!==a.element.attributes["data-img"]?a.element.attributes["data-img"].value:e)?jQuery(' '+a.text+""):jQuery(""+a.text+"")}return t}var a,t;jQuery(".um-user-select-field:visible:not(.um-select2-inited)").length&&(a={ajax:{url:wp.ajax.settings.url,dataType:"json",delay:250,data:function(e){var a={action:"um_get_users",search:e.term,page:e.page||1,nonce:um_admin_scripts.nonce};return jQuery.each(jQuery(this)[0].attributes,function(){var e;this.specified&&-1!==this.name.indexOf("data-ajax-args-")&&(e=this.name.replace("data-ajax-args-","").trim(),a[e]=this.value)}),a},processResults:function(e,a){a.page=a.page||1;var t=[];return e.data.users&&jQuery.each(e.data.users,function(e,a){void 0!==a.img?t.push({id:a.ID,text:a.user_login+" (#"+a.ID+")",img:a.img}):t.push({id:a.ID,text:a.user_login+" (#"+a.ID+")"})}),{results:t,pagination:{more:20*a.page")}function um_same_page_wrong_ajax(e){um_add_same_page_log(e,wp.i18n.__("Wrong AJAX response...","ultimate-member")),um_add_same_page_log(e,wp.i18n.__("Your upgrade was crashed, please contact with support","ultimate-member"))}function um_same_page_something_wrong(e){um_add_same_page_log(e,wp.i18n.__("Something went wrong with AJAX request...","ultimate-member")),um_add_same_page_log(e,wp.i18n.__("Your upgrade was crashed, please contact with support","ultimate-member"))}jQuery(document).ready(function(){um_admin_init_users_select(),um_admin_init_pages_select(),jQuery(document.body).on("click",".um-forms-field[data-log-object]",function(){var e=jQuery(this).data("log-object");jQuery(this).is(":checked")?jQuery(this).parents("label").siblings(".um-same-page-update-"+e).show():jQuery(this).parents("label").siblings(".um-same-page-update-"+e).hide()}),jQuery(document.body).on("click",".um-admin-form-same-page-update",function(){var t,a,i,s=jQuery(this).data("upgrade_cb");jQuery(this).prop("disabled",!0),um_add_same_page_log(s,wp.i18n.__("Upgrade Process Started...","ultimate-member")),"sync_metatable"===s?(t=0,a=500,jQuery.ajax({url:wp.ajax.settings.url,type:"POST",dataType:"json",data:{action:"um_same_page_update",cb_func:"um_usermeta_fields",nonce:um_admin_scripts.nonce},success:function(e){i=1,um_add_same_page_log(s,wp.i18n.__("Getting metadata","ultimate-member")),jQuery.ajax({url:wp.ajax.settings.url,type:"POST",dataType:"json",data:{action:"um_same_page_update",cb_func:"um_get_metadata",nonce:um_admin_scripts.nonce},success:function(e){void 0!==e.data.count?(um_add_same_page_log(s,wp.i18n.__("There are ","ultimate-member")+e.data.count+wp.i18n.__(" metadata rows...","ultimate-member")),um_add_same_page_log(s,wp.i18n.__("Start metadata upgrading...","ultimate-member")),t=Math.ceil(e.data.count/a),function a(){i<=t?jQuery.ajax({url:wp.ajax.settings.url,type:"POST",dataType:"json",data:{action:"um_same_page_update",cb_func:"um_update_metadata_per_page",page:i,nonce:um_admin_scripts.nonce},success:function(e){void 0!==e.data?(um_add_same_page_log(s,e.data.message),i++,a()):um_same_page_wrong_ajax(s)},error:function(){um_same_page_something_wrong(s)}}):window.location=um_forms_data.successfully_redirect}()):um_same_page_wrong_ajax(s)},error:function(){um_same_page_something_wrong(s)}})},error:function(){um_same_page_something_wrong(s)}})):wp.hooks.doAction("um_same_page_upgrade",s)}),jQuery(".um-sortable-items-field").sortable({items:".um-sortable-item",connectWith:".um-admin-drag-col,.um-admin-drag-group",forcePlaceholderSize:!0,update:function(e,a){var t=[];jQuery(this).find("li").each(function(){jQuery(this).hasClass("um-hidden-item")||t.push(jQuery(this).data("tab-id"))}),jQuery(this).siblings(".um-sortable-items-value").val(t.join(","))}}),jQuery(".um-multi-selects-list.um-sortable-multi-selects").sortable({items:".um-admin-drag-fld",connectWith:".um-admin-drag-col,.um-admin-drag-group",forcePlaceholderSize:!0}),jQuery('.um-multi-selects-list[data-field_id="_um_sorting_fields"] li').each(function(){"other"===jQuery(this).find(".um-field-wrapper:not(.um-custom-order-fields) select").val()?jQuery(this).find(".um-field-wrapper.um-custom-order-fields").show():jQuery(this).find(".um-field-wrapper.um-custom-order-fields").hide()}),jQuery('.um-forms-line[data-field_type="md_sorting_fields"] .um-multi-selects-add-option').on("click",function(){var e=jQuery(this).siblings("ul.um-multi-selects-list"),a=e.hasClass("um-sortable-multi-selects"),t=(e.data("field_id"),0),i=(0").append(e.siblings(".um-hidden-multi-selects").clone()).html()),s='
  • ';a&&(s+='');let l="";jQuery.each(um_forms_data.md_sorting_data_types,function(e,a){l+='"}),s+=''+i+''+wp.i18n.__("Remove","ultimate-member")+'
  • ',e.append(s),e.find("li:last .um-hidden-multi-selects").attr("name",jQuery(this).data("name")).addClass("um-forms-field um-long-field").removeClass("um-hidden-multi-selects").attr("id",e.data("id_attr")+"-"+t).trigger("change"),jQuery("#"+e.data("id_attr")+"-"+t).parents("li").find('.um-field-wrapper.um-custom-order-fields input[name="meta_key"]').attr("name","um_metadata[_um_sorting_fields][other_data]["+t+"][meta_key]"),jQuery("#"+e.data("id_attr")+"-"+t).parents("li").find('.um-field-wrapper.um-custom-order-fields input[name="label"]').attr("name","um_metadata[_um_sorting_fields][other_data]["+t+"][label]"),jQuery("#"+e.data("id_attr")+"-"+t).parents("li").find('.um-field-wrapper.um-custom-order-fields select[name="data_type"]').attr("name","um_metadata[_um_sorting_fields][other_data]["+t+"][data_type]"),jQuery("#"+e.data("id_attr")+"-"+t).parents("li").find('.um-field-wrapper.um-custom-order-fields select[name="order"]').attr("name","um_metadata[_um_sorting_fields][other_data]["+t+"][order]")}),jQuery(document.body).on("change",'.um-multi-selects-list[data-field_id="_um_sorting_fields"] .um-field-wrapper:not(.um-custom-order-fields) select',function(){"other"===jQuery(this).val()?jQuery(this).parents("li").find(".um-field-wrapper.um-custom-order-fields").show():jQuery(this).parents("li").find(".um-field-wrapper.um-custom-order-fields").hide()}),jQuery(document.body).on("click",".um-multi-selects-option-line .um-select-delete",function(){jQuery(this).parents("li.um-multi-selects-option-line").remove()}),jQuery(document.body).on("click",".um-md-default-filters-option-line .um-select-delete",function(){jQuery(this).parents("li.um-md-default-filters-option-line").remove()}),jQuery(".um-multi-selects-add-option").on("click",function(){var e,a,t,i;jQuery(this).parents('.um-forms-line[data-field_type="md_sorting_fields"]').length||(a=(e=jQuery(this).siblings("ul.um-multi-selects-list")).hasClass("um-sortable-multi-selects"),e.data("field_id"),(t=0)',a&&(i+=''),i+=''+jQuery("
    ").append(e.siblings(".um-hidden-multi-selects").clone()).html()+''+wp.i18n.__("Remove","ultimate-member")+"",e.append(i),e.find("li:last .um-hidden-multi-selects").attr("name",jQuery(this).data("name")).addClass("um-forms-field um-long-field").removeClass("um-hidden-multi-selects").attr("id",e.data("id_attr")+"-"+t))}),jQuery('.um-multi-selects-add-option[data-name="um_metadata[_um_search_exclude_fields][]"]').on("click",function(){jQuery('.um-multi-selects-list[data-field_id="_um_search_include_fields"] li.um-multi-selects-option-line').remove()}),jQuery('.um-multi-selects-add-option[data-name="um_metadata[_um_search_include_fields][]"]').on("click",function(){jQuery('.um-multi-selects-list[data-field_id="_um_search_exclude_fields"] li.um-multi-selects-option-line').remove()});var t,e=-(new Date).getTimezoneOffset()/60,i=(jQuery('input[name="um-gmt-offset"]').val(e),jQuery(".um-admin-metabox").find(".um-slider").each(function(){var e=jQuery(this),a=parseInt(e.data("min")),t=parseInt(e.data("max")),a=[a=void 0!==jQuery("#"+e.data("field_name")+"_min").val()?jQuery("#"+e.data("field_name")+"_min").val():a,t=void 0!==jQuery("#"+e.data("field_name")+"_max").val()?jQuery("#"+e.data("field_name")+"_max").val():t];e.slider({range:!0,min:parseInt(e.data("min")),max:parseInt(e.data("max")),values:a,create:function(e,a){},step:1,slide:function(e,a){s(jQuery(this),a)},stop:function(e,a){}}),s(e)}),jQuery(".um-admin-metabox").find(".um-datepicker-filter").each(function(){var e=jQuery(this),a=new Date(1e3*e.data("date_min")),t=new Date(1e3*e.data("date_max")),a=e.pickadate({selectYears:!0,min:a,max:t,formatSubmit:"yyyy/mm/dd",hiddenName:!0,onOpen:function(){e.blur(),e.siblings(".picker").find(".picker__button--close").addClass("button")},onClose:function(){e.blur()},onSet:function(e){}}).pickadate("picker");e.data("value")&&a.set("select",1e3*e.data("value"))}),jQuery(".um-admin-metabox").find(".um-timepicker-filter").each(function(){var e=jQuery(this),a=e.data("min"),t=e.data("max"),a=a.split(":"),t=t.split(":");e.pickatime({format:e.data("format"),interval:parseInt(e.data("intervals")),min:[a[0],a[1]],max:[t[0],t[1]],formatSubmit:"HH:i",hiddenName:!0,onOpen:function(){e.blur()},onClose:function(){e.blur()},onSet:function(e){}})}),!1);function s(e,a){var t,i="",s=e.siblings(".um-slider-range").data("placeholder-s"),l=e.siblings(".um-slider-range").data("placeholder-p"),a=a?(i=(a.values[0]===a.values[1]?s.replace("{value}",a.values[0]):l.replace("{min_range}",a.values[0]).replace("{max_range}",a.values[1])).replace("{field_label}",e.siblings(".um-slider-range").data("label")),t=a.values[0],a.values[1]):(i=(e.slider("values",0)===e.slider("values",1)?s.replace("{value}",e.slider("values",0)):l.replace("{min_range}",e.slider("values",0)).replace("{max_range}",e.slider("values",1))).replace("{field_label}",e.siblings(".um-slider-range").data("label")),t=e.slider("values",0),e.slider("values",1));e.siblings(".um-slider-range").html(i),e.siblings(".um_range_min").val(t),e.siblings(".um_range_max").val(a)}function a(){jQuery(".um-forms-line").removeClass("um-forms-line-conditioned").each(function(){void 0===jQuery(this).data("conditional")||jQuery(this).hasClass("um-forms-line-conditioned")||(!function i(e){e.addClass("um-forms-line-conditioned");var a=e.data("conditional");var t=a[1];var s=a[2];var l=e.data("prefix");var n=!0;{var u,r;"="===t||"!="===t?-1===a[0].indexOf("||")&&void 0!==(r=jQuery("#"+l+"_"+a[0])).parents(".um-forms-line").data("conditional")&&(n=i(r.parents(".um-forms-line"))):"~"===t?(m=a[0].split("|"),u=[],jQuery.each(m,function(e){u.push(jQuery("#"+l+"_"+m[e]))}),void 0!==u[0].parents(".um-forms-line").data("conditional")&&(n=i(u[0].parents(".um-forms-line")))):"><"===t&&void 0!==(r=jQuery("#"+l+"_"+a[0]+"_"+a[2])).parents(".um-forms-line").data("conditional")&&(n=i(r.parents(".um-forms-line")))}var d=!1;{var m,o,c,p,f,_,h,g;if("="===t)return-1!==a[0].indexOf("||")?(m=a[0].split("||"),o=!1,jQuery.each(m,function(e){var a,e=jQuery("#"+l+"_"+m[e]),t=(n=!(d=!1),void 0!==e.parents(".um-forms-line").data("conditional")&&(n=i(e.parents(".um-forms-line"))),e.prop("tagName").toLowerCase());"input"===t?(a=e.attr("type"),d="checkbox"===a?"1"==s?e.is(":checked"):!e.is(":checked"):Array.isArray(s)?-1!==s.indexOf(e.val()):e.val()==s):"select"===t&&(d=Array.isArray(s)?-1!==s.indexOf(e.val()):e.val()==s),d&&n&&(o=!0)}),o):("input"==(h=r.prop("tagName").toLowerCase())?(g=r.attr("type"),d="checkbox"==g?"1"==s?r.is(":checked"):!r.is(":checked"):Array.isArray(s)?-1!==s.indexOf(r.val()):r.val()==s):"select"==h&&(d=Array.isArray(s)?-1!==s.indexOf(r.val()):r.val()==s),d&&n);if("!="===t)return-1!==a[0].indexOf("||")?(m=a[0].split("||"),o=!1,jQuery.each(m,function(e){var a,e=jQuery("#"+l+"_"+m[e]),t=(n=!(d=!1),void 0!==e.parents(".um-forms-line").data("conditional")&&(n=i(e.parents(".um-forms-line"))),e.prop("tagName").toLowerCase());"input"===t?(a=e.attr("type"),d="checkbox"===a?"1"==s?!e.is(":checked"):e.is(":checked"):e.val()!=s):"select"===t&&(d=e.val()!=s),d&&n&&(o=!0)}),o):("input"==(h=r.prop("tagName").toLowerCase())?(g=r.attr("type"),d="checkbox"==g?"1"==s?!r.is(":checked"):r.is(":checked"):r.val()!=s):"select"==h&&(d=r.val()!=s),d&&n);if("~"===t)return p=[],"sortable_items"===e.data("field_type")?(c=e.find(".um-sortable-items-value").data("field_id"),jQuery.each(u,function(e){var e=u[e],a=e.prop("tagName").toLowerCase();"input"===a?"checkbox"===e.attr("type")&&"1"==s&&e.is(":checked")&&p.push(e.data("fill_"+c)):"select"==a&&!s&&e.val()&&(p=(p=p.concat(e.val())).filter(y))}),f=jQuery('[data-field_id="'+c+'"]'),p.length?(f.siblings(".um-sortable-items-field").find("li").addClass("um-hidden-item"),jQuery.each(p,function(e){f.siblings(".um-sortable-items-field").find('li[data-tab-id="'+p[e]+'"]').removeClass("um-hidden-item")}),_=[],f.siblings(".um-sortable-items-field").find("li").each(function(){jQuery(this).hasClass("um-hidden-item")||_.push(jQuery(this).data("tab-id"))}),f.val(_.join(",")),f.siblings(".um-sortable-items-field").sortable("refresh"),d=!0):f.val(null)):(c=e.find(e.data("field_type")).data("field_id"),jQuery.each(u,function(e){var e=u[e],a=e.prop("tagName").toLowerCase();"input"===a?"checkbox"===e.attr("type")&&"1"==s&&e.is(":checked")&&p.push(e.data("fill_"+c)):"select"==a&&!s&&e.val()&&(p=(p=p.concat(e.val())).filter(y))}),f=jQuery('[data-field_id="'+c+'"]'),p.length?(f.find("option").hide(),jQuery.each(p,function(e){f.find('option[value="'+p[e]+'"]').show()}),-1===p.indexOf(f.val())&&(f.val(p[0]),f.find("option").attr("selected",!1).prop("selected",!1),f.find('option[value="'+p[0]+'"]').attr("selected",!0).prop("selected",!0)),d=!0):(f.val(null),f.find("option").attr("selected",!1).prop("selected",!1))),d&&n;if("><"===t)return h=r.prop("tagName").toLowerCase(),(d="input"==h&&"checkbox"==(g=r.attr("type"))?r.is(":checked"):d)&&n}return!1}(jQuery(this))?jQuery(this).hide():(jQuery(this).show(),um_admin_init_users_select()))})}function y(e,a,t){return t.indexOf(e)===a}jQuery(document.body).on("change",".um-md-default-filters-option-line .um-field-wrapper select",function(){var t,e,a;i||(e=(t=jQuery(this)).val(),a=t.data("member_directory"),i=!0,wp.ajax.send("um_member_directory_default_filter_settings",{data:{key:e,directory_id:a,nonce:um_admin_scripts.nonce},success:function(e){var a=t.parents(".um-md-default-filters-option-line").find(".um-field-wrapper2");a.html(e.field_html),i=!1,a.find(".um-slider").each(function(){var e=jQuery(this),a=[parseInt(e.data("min")),parseInt(e.data("max"))];e.slider({range:!0,min:parseInt(e.data("min")),max:parseInt(e.data("max")),values:a,create:function(e,a){},step:1,slide:function(e,a){s(jQuery(this),a)},stop:function(e,a){}}),s(e)}),a.find(".um-datepicker-filter").each(function(){var e=jQuery(this),a=new Date(1e3*e.data("date_min")),t=new Date(1e3*e.data("date_max"));e.pickadate({selectYears:!0,min:a,max:t,formatSubmit:"yyyy/mm/dd",hiddenName:!0,onOpen:function(){e.blur(),e.siblings(".picker").find(".picker__button--close").addClass("button")},onClose:function(){e.blur()},onSet:function(e){}})}),a.find(".um-timepicker-filter").each(function(){var e=jQuery(this),a=e.data("min"),t=e.data("max"),a=a.split(":"),t=t.split(":");e.pickatime({format:e.data("format"),interval:parseInt(e.data("intervals")),min:[a[0],a[1]],max:[t[0],t[1]],formatSubmit:"HH:i",hiddenName:!0,onOpen:function(){e.blur()},onClose:function(){e.blur()},onSet:function(e){}})})},error:function(e){return!1}}))}),jQuery(".um-md-default-filters-add-option").on("click",function(){var e,a,t;i||((e=jQuery(this).siblings("ul.um-md-default-filters-list")).data("field_id"),(a=0)").append(e.siblings(".um-hidden-md-default-filters").clone()).html(),e.append('
  • '+t+''+wp.i18n.__("Remove","ultimate-member")+'
  • '),e.find("li:last .um-hidden-md-default-filters").attr("name",jQuery(this).data("name")).addClass("um-forms-field um-long-field").removeClass("um-hidden-md-default-filters").attr("id",e.data("id_attr")+"-"+a),e.find("li:last .um-field-wrapper select").trigger("change"))}),jQuery(document.body).on("click",".um-text-delete",function(){jQuery(this).parents("li.um-multi-text-option-line").remove()}),jQuery(".um-multi-text-add-option").on("click",function(){var e=jQuery(this).siblings("ul.um-multi-text-list"),a=0,t=(0").append(e.siblings(".um-hidden-multi-text").clone()).html()),i=e.data("item_class");e.append('
  • '+t+''+wp.i18n.__("Remove","ultimate-member")+"
  • "),e.find("li:last .um-hidden-multi-text").attr("name",jQuery(this).data("name")).addClass("um-forms-field um-long-field").removeClass("um-hidden-multi-text").attr("id",e.data("id_attr")+"-"+a)}),jQuery(".um-media-upload").each(function(){var e=jQuery(this).find(".um-forms-field"),a=e.data("default");""!=e.val()&&e.val()!=a?(e.siblings(".um-set-image").hide(),e.siblings(".um-clear-image").show(),e.siblings(".icon_preview").show()):(e.val()==a&&e.siblings(".icon_preview").show(),e.siblings(".um-set-image").show(),e.siblings(".um-clear-image").hide())}),"undefined"!=typeof wp&&wp.media&&wp.media.editor&&(jQuery(".um-set-image").on("click",function(e){var a=jQuery(this);e.preventDefault(),t&&t.remove(),(t=wp.media({title:a.data("upload_frame"),button:{text:wp.i18n.__("Select","ultimate-member")},multiple:!1})).on("select",function(){var e=t.state().get("selection").first().toJSON();a.siblings(".icon_preview").attr("src",e.url).show(),a.siblings(".um-forms-field").val(e.url),a.siblings(".um-media-upload-data-id").val(e.id),a.siblings(".um-media-upload-data-width").val(e.width),a.siblings(".um-media-upload-data-height").val(e.height),a.siblings(".um-media-upload-data-thumbnail").val(e.thumbnail),a.siblings(".um-media-upload-data-url").trigger("change"),a.siblings(".um-media-upload-url").val(e.url),a.siblings(".um-clear-image").show(),a.hide(),jQuery(document).trigger("um_media_upload_select",[a,e])}),t.open()}),jQuery(".icon_preview").on("click",function(e){jQuery(this).siblings(".um-set-image").trigger("click")}),jQuery(".um-clear-image").on("click",function(e){var a=jQuery(this);let t=a.siblings(".um-forms-field").data("default");void 0===t&&(t=""),a.siblings(".um-set-image").show(),a.hide(),a.siblings(".icon_preview").attr("src",t),""===t&&a.siblings(".icon_preview").hide(),a.siblings(".um-media-upload-data-id").val(""),a.siblings(".um-media-upload-data-width").val(""),a.siblings(".um-media-upload-data-height").val(""),a.siblings(".um-media-upload-data-thumbnail").val(""),a.siblings(".um-forms-field").val(t),a.siblings(".um-media-upload-data-url").trigger("change"),a.siblings(".um-media-upload-url").val(t),jQuery(document).trigger("um_media_upload_clear",a)})),jQuery(document.body).on("change",".um-forms-field",function(){(0 '+a.text+"");else{let e;t=(e=void 0!==a.element&&void 0!==a.element.attributes["data-img"]?a.element.attributes["data-img"].value:e)?jQuery(' '+a.text+""):jQuery(""+a.text+"")}return t}var a,t;jQuery(".um-user-select-field:visible:not(.um-select2-inited)").length&&(a={ajax:{url:wp.ajax.settings.url,dataType:"json",delay:250,data:function(e){var a={action:"um_get_users",search:e.term,page:e.page||1,nonce:um_admin_scripts.nonce};return jQuery.each(jQuery(this)[0].attributes,function(){var e;this.specified&&-1!==this.name.indexOf("data-ajax-args-")&&(e=this.name.replace("data-ajax-args-","").trim(),a[e]=this.value)}),a},processResults:function(e,a){a.page=a.page||1;var t=[];return e.data.users&&jQuery.each(e.data.users,function(e,a){void 0!==a.img?t.push({id:a.ID,text:a.user_login+" (#"+a.ID+")",img:a.img}):t.push({id:a.ID,text:a.user_login+" (#"+a.ID+")"})}),{results:t,pagination:{more:20*a.page")}function um_same_page_wrong_ajax(e){um_add_same_page_log(e,wp.i18n.__("Wrong AJAX response...","ultimate-member")),um_add_same_page_log(e,wp.i18n.__("Your upgrade was crashed, please contact with support","ultimate-member"))}function um_same_page_something_wrong(e){um_add_same_page_log(e,wp.i18n.__("Something went wrong with AJAX request...","ultimate-member")),um_add_same_page_log(e,wp.i18n.__("Your upgrade was crashed, please contact with support","ultimate-member"))}jQuery(document).ready(function(){um_admin_init_users_select(),um_admin_init_pages_select(),jQuery(document.body).on("click",".um-forms-field[data-log-object]",function(){var e=jQuery(this).data("log-object");jQuery(this).is(":checked")?jQuery(this).parents("label").siblings(".um-same-page-update-"+e).show():jQuery(this).parents("label").siblings(".um-same-page-update-"+e).hide()}),jQuery(document.body).on("click",".um-admin-form-same-page-update",function(){var t,a,i,s=jQuery(this).data("upgrade_cb");jQuery(this).prop("disabled",!0),um_add_same_page_log(s,wp.i18n.__("Upgrade Process Started...","ultimate-member")),"sync_metatable"===s?(t=0,a=500,jQuery.ajax({url:wp.ajax.settings.url,type:"POST",dataType:"json",data:{action:"um_same_page_update",cb_func:"um_usermeta_fields",nonce:um_admin_scripts.nonce},success:function(e){i=1,um_add_same_page_log(s,wp.i18n.__("Getting metadata","ultimate-member")),jQuery.ajax({url:wp.ajax.settings.url,type:"POST",dataType:"json",data:{action:"um_same_page_update",cb_func:"um_get_metadata",nonce:um_admin_scripts.nonce},success:function(e){void 0!==e.data.count?(um_add_same_page_log(s,wp.i18n.__("There are ","ultimate-member")+e.data.count+wp.i18n.__(" metadata rows...","ultimate-member")),um_add_same_page_log(s,wp.i18n.__("Start metadata upgrading...","ultimate-member")),t=Math.ceil(e.data.count/a),function a(){i<=t?jQuery.ajax({url:wp.ajax.settings.url,type:"POST",dataType:"json",data:{action:"um_same_page_update",cb_func:"um_update_metadata_per_page",page:i,nonce:um_admin_scripts.nonce},success:function(e){void 0!==e.data?(um_add_same_page_log(s,e.data.message),i++,a()):um_same_page_wrong_ajax(s)},error:function(){um_same_page_something_wrong(s)}}):window.location=um_forms_data.successfully_redirect}()):um_same_page_wrong_ajax(s)},error:function(){um_same_page_something_wrong(s)}})},error:function(){um_same_page_something_wrong(s)}})):wp.hooks.doAction("um_same_page_upgrade",s)}),jQuery(".um-sortable-items-field").sortable({items:".um-sortable-item",connectWith:".um-admin-drag-col,.um-admin-drag-group",forcePlaceholderSize:!0,update:function(e,a){var t=[];jQuery(this).find("li").each(function(){jQuery(this).hasClass("um-hidden-item")||t.push(jQuery(this).data("tab-id"))}),jQuery(this).siblings(".um-sortable-items-value").val(t.join(","))}}),jQuery(".um-multi-selects-list.um-sortable-multi-selects").sortable({items:".um-admin-drag-fld",connectWith:".um-admin-drag-col,.um-admin-drag-group",forcePlaceholderSize:!0}),jQuery('.um-multi-selects-list[data-field_id="_um_sorting_fields"] li').each(function(){"other"===jQuery(this).find(".um-field-wrapper:not(.um-custom-order-fields) select").val()?jQuery(this).find(".um-field-wrapper.um-custom-order-fields").show():jQuery(this).find(".um-field-wrapper.um-custom-order-fields").hide()}),jQuery('.um-forms-line[data-field_type="md_sorting_fields"] .um-multi-selects-add-option').on("click",function(){var e=jQuery(this).siblings("ul.um-multi-selects-list"),a=e.hasClass("um-sortable-multi-selects"),t=(e.data("field_id"),0),i=(0").append(e.siblings(".um-hidden-multi-selects").clone()).html()),s='
  • ';a&&(s+='');let l="";jQuery.each(um_forms_data.md_sorting_data_types,function(e,a){l+='"}),s+=''+i+''+wp.i18n.__("Remove","ultimate-member")+'
  • ',e.append(s),e.find("li:last .um-hidden-multi-selects").attr("name",jQuery(this).data("name")).addClass("um-forms-field um-long-field").removeClass("um-hidden-multi-selects").attr("id",e.data("id_attr")+"-"+t).trigger("change"),jQuery("#"+e.data("id_attr")+"-"+t).parents("li").find('.um-field-wrapper.um-custom-order-fields input[name="meta_key"]').attr("name","um_metadata[_um_sorting_fields][other_data]["+t+"][meta_key]"),jQuery("#"+e.data("id_attr")+"-"+t).parents("li").find('.um-field-wrapper.um-custom-order-fields input[name="label"]').attr("name","um_metadata[_um_sorting_fields][other_data]["+t+"][label]"),jQuery("#"+e.data("id_attr")+"-"+t).parents("li").find('.um-field-wrapper.um-custom-order-fields select[name="data_type"]').attr("name","um_metadata[_um_sorting_fields][other_data]["+t+"][data_type]"),jQuery("#"+e.data("id_attr")+"-"+t).parents("li").find('.um-field-wrapper.um-custom-order-fields select[name="order"]').attr("name","um_metadata[_um_sorting_fields][other_data]["+t+"][order]")}),jQuery(document.body).on("change",'.um-multi-selects-list[data-field_id="_um_sorting_fields"] .um-field-wrapper:not(.um-custom-order-fields) select',function(){"other"===jQuery(this).val()?jQuery(this).parents("li").find(".um-field-wrapper.um-custom-order-fields").show():jQuery(this).parents("li").find(".um-field-wrapper.um-custom-order-fields").hide()}),jQuery(document.body).on("click",".um-multi-selects-option-line .um-select-delete",function(){jQuery(this).parents("li.um-multi-selects-option-line").remove()}),jQuery(document.body).on("click",".um-md-default-filters-option-line .um-select-delete",function(){jQuery(this).parents("li.um-md-default-filters-option-line").remove()}),jQuery(".um-multi-selects-add-option").on("click",function(){var e,a,t,i;jQuery(this).parents('.um-forms-line[data-field_type="md_sorting_fields"]').length||(a=(e=jQuery(this).siblings("ul.um-multi-selects-list")).hasClass("um-sortable-multi-selects"),e.data("field_id"),(t=0)',a&&(i+=''),i+=''+jQuery("
    ").append(e.siblings(".um-hidden-multi-selects").clone()).html()+''+wp.i18n.__("Remove","ultimate-member")+"",e.append(i),e.find("li:last .um-hidden-multi-selects").attr("name",jQuery(this).data("name")).addClass("um-forms-field um-long-field").removeClass("um-hidden-multi-selects").attr("id",e.data("id_attr")+"-"+t))}),jQuery('.um-multi-selects-add-option[data-name="um_metadata[_um_search_exclude_fields][]"]').on("click",function(){jQuery('.um-multi-selects-list[data-field_id="_um_search_include_fields"] li.um-multi-selects-option-line').remove()}),jQuery('.um-multi-selects-add-option[data-name="um_metadata[_um_search_include_fields][]"]').on("click",function(){jQuery('.um-multi-selects-list[data-field_id="_um_search_exclude_fields"] li.um-multi-selects-option-line').remove()});var t,e=-(new Date).getTimezoneOffset()/60,i=(jQuery('input[name="um-gmt-offset"]').val(e),jQuery(".um-admin-metabox").find(".um-slider").each(function(){var e=jQuery(this),a=parseInt(e.data("min")),t=parseInt(e.data("max")),a=[a=void 0!==jQuery("#"+e.data("field_name")+"_min").val()?jQuery("#"+e.data("field_name")+"_min").val():a,t=void 0!==jQuery("#"+e.data("field_name")+"_max").val()?jQuery("#"+e.data("field_name")+"_max").val():t];e.slider({range:!0,min:parseInt(e.data("min")),max:parseInt(e.data("max")),values:a,create:function(e,a){},step:1,slide:function(e,a){s(jQuery(this),a)},stop:function(e,a){}}),s(e)}),jQuery(".um-admin-metabox").find(".um-datepicker-filter").each(function(){var e=jQuery(this),a=new Date(1e3*e.data("date_min")),t=new Date(1e3*e.data("date_max")),a=e.pickadate({selectYears:!0,min:a,max:t,formatSubmit:"yyyy/mm/dd",hiddenName:!0,onOpen:function(){e.blur(),e.siblings(".picker").find(".picker__button--close").addClass("button")},onClose:function(){e.blur()},onSet:function(e){}}).pickadate("picker");e.data("value")&&a.set("select",1e3*e.data("value"))}),jQuery(".um-admin-metabox").find(".um-timepicker-filter").each(function(){var e=jQuery(this),a=e.data("min"),t=e.data("max"),a=a.split(":"),t=t.split(":");e.pickatime({format:e.data("format"),interval:parseInt(e.data("intervals")),min:[a[0],a[1]],max:[t[0],t[1]],formatSubmit:"HH:i",hiddenName:!0,onOpen:function(){e.blur()},onClose:function(){e.blur()},onSet:function(e){}})}),!1);function s(e,a){var t,i="",s=e.siblings(".um-slider-range").data("placeholder-s"),l=e.siblings(".um-slider-range").data("placeholder-p"),a=a?(i=(a.values[0]===a.values[1]?s.replace("{value}",a.values[0]):l.replace("{min_range}",a.values[0]).replace("{max_range}",a.values[1])).replace("{field_label}",e.siblings(".um-slider-range").data("label")),t=a.values[0],a.values[1]):(i=(e.slider("values",0)===e.slider("values",1)?s.replace("{value}",e.slider("values",0)):l.replace("{min_range}",e.slider("values",0)).replace("{max_range}",e.slider("values",1))).replace("{field_label}",e.siblings(".um-slider-range").data("label")),t=e.slider("values",0),e.slider("values",1));e.siblings(".um-slider-range").html(i),e.siblings(".um_range_min").val(t),e.siblings(".um_range_max").val(a)}function a(){jQuery(".um-forms-line").removeClass("um-forms-line-conditioned").each(function(){void 0===jQuery(this).data("conditional")||jQuery(this).hasClass("um-forms-line-conditioned")||(!function i(e){e.addClass("um-forms-line-conditioned");var a=e.data("conditional");var t=a[1];var s=a[2];var l=e.data("prefix");var n=!0;{var u,r;"="===t||"!="===t?-1===a[0].indexOf("||")&&void 0!==(r=jQuery("#"+l+"_"+a[0])).parents(".um-forms-line").data("conditional")&&(n=i(r.parents(".um-forms-line"))):"~"===t?(m=a[0].split("|"),u=[],jQuery.each(m,function(e){u.push(jQuery("#"+l+"_"+m[e]))}),void 0!==u[0].parents(".um-forms-line").data("conditional")&&(n=i(u[0].parents(".um-forms-line")))):"><"===t&&void 0!==(r=jQuery("#"+l+"_"+a[0]+"_"+a[2])).parents(".um-forms-line").data("conditional")&&(n=i(r.parents(".um-forms-line")))}var d=!1;{var m,o,c,p,f,_,h,g;if("="===t)return-1!==a[0].indexOf("||")?(m=a[0].split("||"),o=!1,jQuery.each(m,function(e){var a,e=jQuery("#"+l+"_"+m[e]),t=(n=!(d=!1),void 0!==e.parents(".um-forms-line").data("conditional")&&(n=i(e.parents(".um-forms-line"))),e.prop("tagName").toLowerCase());"input"===t?(a=e.attr("type"),d="checkbox"===a?"1"==s?e.is(":checked"):!e.is(":checked"):Array.isArray(s)?-1!==s.indexOf(e.val()):e.val()==s):"select"===t&&(d=Array.isArray(s)?-1!==s.indexOf(e.val()):e.val()==s),d&&n&&(o=!0)}),o):("input"==(h=r.prop("tagName").toLowerCase())?(g=r.attr("type"),d="checkbox"==g?"1"==s?r.is(":checked"):!r.is(":checked"):Array.isArray(s)?-1!==s.indexOf(r.val()):r.val()==s):"select"==h&&(d=Array.isArray(s)?-1!==s.indexOf(r.val()):r.val()==s),d&&n);if("!="===t)return-1!==a[0].indexOf("||")?(m=a[0].split("||"),o=!1,jQuery.each(m,function(e){var a,e=jQuery("#"+l+"_"+m[e]),t=(n=!(d=!1),void 0!==e.parents(".um-forms-line").data("conditional")&&(n=i(e.parents(".um-forms-line"))),e.prop("tagName").toLowerCase());"input"===t?(a=e.attr("type"),d="checkbox"===a?"1"==s?!e.is(":checked"):e.is(":checked"):e.val()!=s):"select"===t&&(d=e.val()!=s),d&&n&&(o=!0)}),o):("input"==(h=r.prop("tagName").toLowerCase())?(g=r.attr("type"),d="checkbox"==g?"1"==s?!r.is(":checked"):r.is(":checked"):r.val()!=s):"select"==h&&(d=r.val()!=s),d&&n);if("~"===t)return p=[],"sortable_items"===e.data("field_type")?(c=e.find(".um-sortable-items-value").data("field_id"),jQuery.each(u,function(e){var e=u[e],a=e.prop("tagName").toLowerCase();"input"===a?"checkbox"===e.attr("type")&&"1"==s&&e.is(":checked")&&p.push(e.data("fill_"+c)):"select"==a&&!s&&e.val()&&(p=(p=p.concat(e.val())).filter(y))}),f=jQuery('[data-field_id="'+c+'"]'),p.length?(f.siblings(".um-sortable-items-field").find("li").addClass("um-hidden-item"),jQuery.each(p,function(e){f.siblings(".um-sortable-items-field").find('li[data-tab-id="'+p[e]+'"]').removeClass("um-hidden-item")}),_=[],f.siblings(".um-sortable-items-field").find("li").each(function(){jQuery(this).hasClass("um-hidden-item")||_.push(jQuery(this).data("tab-id"))}),f.val(_.join(",")),f.siblings(".um-sortable-items-field").sortable("refresh"),d=!0):f.val(null)):(c=e.find(e.data("field_type")).data("field_id"),jQuery.each(u,function(e){var e=u[e],a=e.prop("tagName").toLowerCase();"input"===a?"checkbox"===e.attr("type")&&"1"==s&&e.is(":checked")&&p.push(e.data("fill_"+c)):"select"==a&&!s&&e.val()&&(p=(p=p.concat(e.val())).filter(y))}),f=jQuery('[data-field_id="'+c+'"]'),p.length?(f.find("option").hide(),jQuery.each(p,function(e){f.find('option[value="'+p[e]+'"]').show()}),-1===p.indexOf(f.val())&&(f.val(p[0]),f.find("option").attr("selected",!1).prop("selected",!1),f.find('option[value="'+p[0]+'"]').attr("selected",!0).prop("selected",!0)),d=!0):(f.val(null),f.find("option").attr("selected",!1).prop("selected",!1))),d&&n;if("><"===t)return h=r.prop("tagName").toLowerCase(),(d="input"==h&&"checkbox"==(g=r.attr("type"))?r.is(":checked"):d)&&n}return!1}(jQuery(this))?jQuery(this).hide():(jQuery(this).show(),um_admin_init_users_select()))})}function y(e,a,t){return t.indexOf(e)===a}jQuery(document.body).on("change",".um-md-default-filters-option-line .um-field-wrapper select",function(){var t,e,a;i||(e=(t=jQuery(this)).val(),a=t.data("member_directory"),i=!0,wp.ajax.send("um_member_directory_default_filter_settings",{data:{key:e,directory_id:a,nonce:um_admin_scripts.nonce},success:function(e){var a=t.parents(".um-md-default-filters-option-line").find(".um-field-wrapper2");a.html(e.field_html),i=!1,a.find(".um-slider").each(function(){var e=jQuery(this),a=[parseInt(e.data("min")),parseInt(e.data("max"))];e.slider({range:!0,min:parseInt(e.data("min")),max:parseInt(e.data("max")),values:a,create:function(e,a){},step:1,slide:function(e,a){s(jQuery(this),a)},stop:function(e,a){}}),s(e)}),a.find(".um-datepicker-filter").each(function(){var e=jQuery(this),a=new Date(1e3*e.data("date_min")),t=new Date(1e3*e.data("date_max"));e.pickadate({selectYears:!0,min:a,max:t,formatSubmit:"yyyy/mm/dd",hiddenName:!0,onOpen:function(){e.blur(),e.siblings(".picker").find(".picker__button--close").addClass("button")},onClose:function(){e.blur()},onSet:function(e){}})}),a.find(".um-timepicker-filter").each(function(){var e=jQuery(this),a=e.data("min"),t=e.data("max"),a=a.split(":"),t=t.split(":");e.pickatime({format:e.data("format"),interval:parseInt(e.data("intervals")),min:[a[0],a[1]],max:[t[0],t[1]],formatSubmit:"HH:i",hiddenName:!0,onOpen:function(){e.blur()},onClose:function(){e.blur()},onSet:function(e){}})})},error:function(e){return!1}}))}),jQuery(".um-md-default-filters-add-option").on("click",function(){var e,a,t;i||((e=jQuery(this).siblings("ul.um-md-default-filters-list")).data("field_id"),(a=0)").append(e.siblings(".um-hidden-md-default-filters").clone()).html(),e.append('
  • '+t+''+wp.i18n.__("Remove","ultimate-member")+'
  • '),e.find("li:last .um-hidden-md-default-filters").attr("name",jQuery(this).data("name")).addClass("um-forms-field um-long-field").removeClass("um-hidden-md-default-filters").attr("id",e.data("id_attr")+"-"+a),e.find("li:last .um-field-wrapper select").trigger("change"))}),jQuery(document.body).on("click",".um-text-delete",function(){jQuery(this).parents("li.um-multi-text-option-line").remove()}),jQuery(".um-multi-text-add-option").on("click",function(){var e=jQuery(this).siblings("ul.um-multi-text-list"),a=0,t=(0").append(e.siblings(".um-hidden-multi-text").clone()).html()),i=e.data("item_class");e.append('
  • '+t+''+wp.i18n.__("Remove","ultimate-member")+"
  • "),e.find("li:last .um-hidden-multi-text").attr("name",jQuery(this).data("name")).addClass("um-forms-field um-long-field").removeClass("um-hidden-multi-text").attr("id",e.data("id_attr")+"-"+a)}),jQuery(".um-media-upload").each(function(){var e=jQuery(this).find(".um-forms-field"),a=e.data("default");""!=e.val()&&e.val()!=a?(e.siblings(".um-set-image").hide(),e.siblings(".um-clear-image").show(),e.siblings(".icon_preview").show()):(e.val()==a&&e.siblings(".icon_preview").show(),e.siblings(".um-set-image").show(),e.siblings(".um-clear-image").hide())}),"undefined"!=typeof wp&&wp.media&&wp.media.editor&&(jQuery(".um-set-image").on("click",function(e){var a=jQuery(this);e.preventDefault(),t&&t.remove(),(t=wp.media({title:a.data("upload_frame"),button:{text:wp.i18n.__("Select","ultimate-member")},multiple:!1})).on("select",function(){var e=t.state().get("selection").first().toJSON();a.siblings(".icon_preview").attr("src",e.url).show(),a.siblings(".um-forms-field").val(e.url),a.siblings(".um-media-upload-data-id").val(e.id),a.siblings(".um-media-upload-data-width").val(e.width),a.siblings(".um-media-upload-data-height").val(e.height),a.siblings(".um-media-upload-data-thumbnail").val(e.thumbnail),a.siblings(".um-media-upload-data-url").trigger("change"),a.siblings(".um-media-upload-url").val(e.url),a.siblings(".um-clear-image").show(),a.hide(),jQuery(document).trigger("um_media_upload_select",[a,e])}),t.open()}),jQuery(".icon_preview").on("click",function(e){jQuery(this).siblings(".um-set-image").trigger("click")}),jQuery(".um-clear-image").on("click",function(e){var a=jQuery(this);let t=a.siblings(".um-forms-field").data("default");void 0===t&&(t=""),a.siblings(".um-set-image").show(),a.hide(),a.siblings(".icon_preview").attr("src",t),""===t&&a.siblings(".icon_preview").hide(),a.siblings(".um-media-upload-data-id").val(""),a.siblings(".um-media-upload-data-width").val(""),a.siblings(".um-media-upload-data-height").val(""),a.siblings(".um-media-upload-data-thumbnail").val(""),a.siblings(".um-forms-field").val(t),a.siblings(".um-media-upload-data-url").trigger("change"),a.siblings(".um-media-upload-url").val(t),jQuery(document).trigger("um_media_upload_clear",a)})),jQuery(document.body).on("change",".um-forms-field",function(){(0admin()->check_ajax_nonce(); + check_ajax_referer( 'um-admin-nonce', 'nonce' ); // we will pass post IDs and titles to this array $return = array(); @@ -36,7 +38,7 @@ class Pages { 'post_status' => 'publish', // if you don't want drafts to be returned 'ignore_sticky_posts' => 1, 'posts_per_page' => 10, // how much to show at once - 'paged' => absint( $_GET['page'] ), + 'paged' => ! empty( $_GET['page'] ) ? absint( $_GET['page'] ) : 1, 'orderby' => 'title', 'order' => 'asc', ); @@ -45,7 +47,26 @@ class Pages { $query_args['s'] = sanitize_text_field( $_GET['search'] ); // the search query } - $search_results = new \WP_Query( $query_args ); + $field_id = ! empty( $_GET['field_id'] ) ? sanitize_text_field( $_GET['field_id'] ) : null; + if ( 'form__um_register_use_gdpr_content_id' === $field_id ) { + $predefined_ids = array(); + $predefined_pages = array_keys( UM()->config()->get( 'predefined_pages' ) ); + foreach ( $predefined_pages as $slug ) { + $p_id = um_get_predefined_page_id( $slug ); + if ( empty( $p_id ) ) { + continue; + } + $predefined_ids[] = $p_id; + } + $predefined_ids = array_unique( $predefined_ids ); + if ( ! empty( $predefined_ids ) ) { + $query_args['post__not_in'] = $predefined_ids; + } + } + // since 2.10.6 + $query_args = apply_filters( 'um_admin_settings_get_pages_list_args', $query_args, $field_id ); + + $search_results = new WP_Query( $query_args ); if ( $search_results->have_posts() ) { while ( $search_results->have_posts() ) { From e26bd8eafb1ea2fc08097e8565a5e744b045c930 Mon Sep 17 00:00:00 2001 From: Mykyta Synelnikov Date: Wed, 17 Sep 2025 15:37:13 +0300 Subject: [PATCH 21/26] Fix default page creation check in admin form logic Updated logic to handle the 'predefined' field flag when determining default page creation. This ensures buttons for creating default pages only appear under the correct conditions, improving reliability and consistency. --- includes/admin/core/class-admin-forms.php | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/includes/admin/core/class-admin-forms.php b/includes/admin/core/class-admin-forms.php index 298ea7b4..00de3271 100644 --- a/includes/admin/core/class-admin-forms.php +++ b/includes/admin/core/class-admin-forms.php @@ -1164,9 +1164,11 @@ if ( ! class_exists( 'um\admin\core\Admin_Forms' ) ) { } $button = ''; - $slug = str_replace( 'core_', '', $field_data['id'] ); - if ( ! um_get_predefined_page_id( $slug ) || 'publish' !== get_post_status( um_get_predefined_page_id( $slug ) ) ) { - $button = ' ' . esc_html__( 'Create Default', 'ultimate-member' ) . ''; + if ( ! array_key_exists( 'predefined', $field_data ) || false !== $field_data['predefined'] ) { + $slug = str_replace( 'core_', '', $field_data['id'] ); + if ( ! um_get_predefined_page_id( $slug ) || 'publish' !== get_post_status( um_get_predefined_page_id( $slug ) ) ) { + $button = ' ' . esc_html__( 'Create Default', 'ultimate-member' ) . ''; + } } $html = "$hidden$button"; From d756391f1fdf1018cffeff9fd4189e3b08e3ebbb Mon Sep 17 00:00:00 2001 From: Mykyta Synelnikov Date: Wed, 17 Sep 2025 15:44:35 +0300 Subject: [PATCH 22/26] Make select2 container width 100% in admin forms layout Adjusted the styles for the Select2 container to ensure it spans the full width within the admin forms. This improves layout consistency and resolves display issues for page selector dropdowns. --- assets/css/admin/forms.css | 3 +++ assets/css/admin/forms.min.css | 2 +- assets/css/admin/forms.sass | 3 +++ 3 files changed, 7 insertions(+), 1 deletion(-) diff --git a/assets/css/admin/forms.css b/assets/css/admin/forms.css index 57d170d1..54af8cb8 100644 --- a/assets/css/admin/forms.css +++ b/assets/css/admin/forms.css @@ -65,6 +65,9 @@ margin: 0 0 5px 0; display: inline-block; } +.um-form-table.um-top-label .um-forms-line td select.um-forms-field.um-pages-select2 ~ .select2-container { + width: 100% !important; +} .um-form-table.um-top-label .um-forms-line[data-field_type=icon] td label { width: 100%; display: block; diff --git a/assets/css/admin/forms.min.css b/assets/css/admin/forms.min.css index 5e095bd0..f4b1e722 100644 --- a/assets/css/admin/forms.min.css +++ b/assets/css/admin/forms.min.css @@ -1 +1 @@ -.um-form-table .um-forms-line[data-conditional]{display:none}.um-form-table .um-forms-line label .um-req{color:#a00;margin:0 0 0 3px;font-weight:400}.um-form-table .um-forms-line .um-text-delete{color:#a00;float:left}.um-form-table .um-forms-line .um-text-delete:hover{color:red}.um-form-table .um-forms-line .um-multi-text-add-option{margin-bottom:14px}.um-form-table .um-forms-line .icon_preview{display:none;max-width:200px;max-height:200px;padding:5px;cursor:pointer;border:1px solid #e3e3e3;background:#f7f7f7;border-radius:3px;height:auto;width:auto!important}.um-form-table .um-forms-line td .um-same-page-update-wrapper{display:none;margin:7px 0 0 0}.um-form-table .um-forms-line td .um-same-page-update-wrapper input.um-admin-form-same-page-update{margin:7px 0 0 0}.um-form-table .um-forms-line td .um-same-page-update-wrapper .upgrade_log{margin:7px 0 0 0;width:100%;height:150px;overflow:auto;border:1px solid #a1a1a1}.um-form-table .um-forms-line[data-field_type=same_page_update]{vertical-align:baseline}.um-form-table .um-forms-line[data-field_type=same_page_update] td,.um-form-table .um-forms-line[data-field_type=same_page_update] th{vertical-align:baseline}.um-form-table.um-third-column .um-forms-line th{width:33%}.um-form-table.um-half-column .um-forms-line th{width:50%}.um-form-table.um-two-thirds-column .um-forms-line th{width:83%}.um-form-table.um-top-label .um-forms-line td{padding:0 0 15px 0}.um-form-table.um-top-label .um-forms-line td label{margin:0 0 5px 0;display:inline-block}.um-form-table.um-top-label .um-forms-line[data-field_type=icon] td label{width:100%;display:block;margin:0 0 5px 0}.um-external-link-icon{width:1em;height:1em;margin:0;vertical-align:middle;fill:currentcolor}.um_admin_fonticon_wrapper{display:flex;flex-direction:row;justify-content:flex-start;align-items:center;flex-wrap:nowrap}.um_admin_fonticon_wrapper .um-admin-icon-value{line-height:1}.um_admin_fonticon_wrapper .um-admin-icon-value i{top:0}input[type=date].um-forms-field,input[type=number].um-forms-field,input[type=password].um-forms-field,input[type=text].um-forms-field,input[type=time].um-forms-field,input[type=url].um-forms-field,select.um-forms-field,textarea.um-forms-field{box-sizing:border-box}input[type=date].um-forms-field.um-long-field,input[type=number].um-forms-field.um-long-field,input[type=password].um-forms-field.um-long-field,input[type=text].um-forms-field.um-long-field,input[type=time].um-forms-field.um-long-field,input[type=url].um-forms-field.um-long-field,select.um-forms-field.um-long-field,textarea.um-forms-field.um-long-field{width:100%!important}input[type=date].um-forms-field.um-medium-field,input[type=number].um-forms-field.um-medium-field,input[type=password].um-forms-field.um-medium-field,input[type=text].um-forms-field.um-medium-field,input[type=time].um-forms-field.um-medium-field,input[type=url].um-forms-field.um-medium-field,select.um-forms-field.um-medium-field,textarea.um-forms-field.um-medium-field{width:50%!important}input[type=date].um-forms-field.um-small-field,input[type=number].um-forms-field.um-small-field,input[type=password].um-forms-field.um-small-field,input[type=text].um-forms-field.um-small-field,input[type=time].um-forms-field.um-small-field,input[type=url].um-forms-field.um-small-field,select.um-forms-field.um-small-field,textarea.um-forms-field.um-small-field{width:25%!important}input[type=number].um-forms-field{padding-right:0}.um-md-default-filters-list,.um-multi-selects-list,.um-multi-text-list{float:left;width:100%;margin:0 0 10px 0}.um-hidden-md-default-filters,.um-hidden-multi-selects,.um-hidden-multi-text{display:none!important}.um-md-default-filters-option-line{float:left;width:100%;clear:both;border-bottom:1px solid #eee;padding:0 0 5px 0;margin:5px 0 0 0}.um-md-default-filters-option-line .um-field-wrapper{float:left;width:calc(100% - 60px);line-height:30px;box-sizing:border-box}.um-md-default-filters-option-line .um-field-wrapper2{float:left;width:calc(100% - 60px);line-height:30px;box-sizing:border-box}.um-md-default-filters-option-line .um-field-wrapper2.um{margin:5px 0 0 0}.um-md-default-filters-option-line .um-field-wrapper2 .ui-slider-range.ui-widget-header{background:#44b0ec;border:1px solid #44b0ec!important;margin-top:-1px}.um-md-default-filters-option-line .um-field-wrapper2>select{width:100%;float:left}.um-md-default-filters-option-line .um-field-wrapper2>input{width:100%;float:left}.um-md-default-filters-option-line .um-field-wrapper2>input.um-datepicker-filter,.um-md-default-filters-option-line .um-field-wrapper2>input.um-timepicker-filter{width:calc(50% - 7px)!important;float:left}.um-md-default-filters-option-line .um-field-wrapper2>input.um-datepicker-filter:first-child,.um-md-default-filters-option-line .um-field-wrapper2>input.um-timepicker-filter:first-child{margin-right:11px}.um-md-default-filters-option-line .um-field-wrapper2 .um-slider{margin:5px 9px 0 9px;width:calc(100% - 18px);box-sizing:border-box;display:block}.um-md-default-filters-option-line .um-field-control{float:left;width:60px;line-height:30px;padding:0 10px;box-sizing:border-box}.um-multi-selects-option-line{float:left;width:100%;padding:0;clear:both;margin:0 0 5px 0}.um-multi-selects-option-line.um-admin-drag-fld{display:flex;flex-direction:row;justify-content:flex-start;align-items:center;flex-wrap:nowrap;background:0 0;border:none}.um-multi-selects-option-line.um-admin-drag-fld .um-field-wrapper{width:calc(100% - 90px)}.um-multi-selects-option-line.um-admin-drag-fld .um-field-icon{float:left;width:20px;text-align:left;line-height:30px}.um-multi-selects-option-line .um-field-wrapper{float:left;width:calc(100% - 60px);line-height:30px;box-sizing:border-box}.um-multi-selects-option-line .um-field-wrapper.um-custom-order-fields{margin:5px 0 0 0}.um-multi-selects-option-line .um-field-wrapper.um-custom-order-fields label{float:left;width:100%;line-height:30px;box-sizing:border-box;margin:0!important;padding:0!important;font-weight:700;display:flex;flex-direction:row;justify-content:space-beetween;align-items:baseline;flex-wrap:nowrap}.um-multi-selects-option-line .um-field-wrapper.um-custom-order-fields label input[type=text],.um-multi-selects-option-line .um-field-wrapper.um-custom-order-fields label select{width:auto;display:inline;font-weight:400;max-width:70%;flex:.9}.um-multi-selects-option-line .um-field-wrapper input,.um-multi-selects-option-line .um-field-wrapper select{float:left;width:100%;margin:0}.um-multi-selects-option-line .um-field-control{float:left;width:60px;line-height:30px;padding:0 10px;box-sizing:border-box}.um-multi-text-option-line{float:left;width:100%;padding:0;clear:both;margin:0 0 5px 0}.um-multi-text-option-line .um-field-wrapper{float:left;width:calc(100% - 90px);line-height:30px;box-sizing:border-box}.um-multi-text-option-line .um-field-wrapper input,.um-multi-text-option-line .um-field-wrapper select{float:left;width:100%;margin:0}.um-multi-text-option-line .um-field-control{float:left;width:60px;line-height:30px;padding:0 10px;box-sizing:border-box}.um-form-fields-section{display:flex;flex-direction:column;justify-content:flex-start;align-items:stretch;flex-wrap:nowrap;row-gap:4px;float:left;clear:none;margin:0;padding:0 10px 0 0;box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box}.um-form-fields-section label{float:left;width:100%;margin:0;padding:0}.um-form-fields-section label input{float:left;margin-top:0}.um-form-fields-section label span{float:left;width:calc(100% - 20px)}@media screen and (max-width:782px){input[type=text].um-forms-field.um-medium-field,select.um-forms-field.um-medium-field,textarea.um-forms-field.um-medium-field{width:100%!important}input[type=text].um-forms-field.um-small-field,select.um-forms-field.um-small-field,textarea.um-forms-field.um-small-field{width:50%!important}.um-form-fields-section{width:100%!important}.um-admin-metabox .um-form-fields-section label{line-height:22px!important;margin:0 0 12px 0!important}.um-admin-metabox .um-form-fields-section label span{width:calc(100% - 30px)}.um-multi-selects-option-line,.um-multi-text-option-line{margin:0 0 6px 0}.um-forms-line label{float:left;width:100%}.um-form-table.um-half-column .um-forms-line th,.um-form-table.um-third-column .um-forms-line th,.um-form-table.um-two-thirds-column .um-forms-line th{float:left;width:100%;margin-bottom:5px}.um-form-table.um-half-column .um-forms-line th label,.um-form-table.um-third-column .um-forms-line th label,.um-form-table.um-two-thirds-column .um-forms-line th label{float:left;width:100%}.um-form-table.um-half-column .um-forms-line td,.um-form-table.um-third-column .um-forms-line td,.um-form-table.um-two-thirds-column .um-forms-line td{float:left;width:100%}}.um-sortable-items-field .um-sortable-item{cursor:move!important;padding:5px;box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;border:1px solid #7e8993;border-radius:4px;-moz-border-radius:4px;background:#fff;height:42px;line-height:28px;display:flex;flex-direction:row;justify-content:flex-start;align-items:center;flex-wrap:nowrap}.um-sortable-items-field .um-sortable-item.um-hidden-item{display:none}.um-sortable-items-field .um-sortable-item .um-field-icon{width:20px;text-align:left;margin:0 10px 0 0}.wp-picker-container input.wp-color-picker[type=text]{width:68px!important;float:left!important;padding:2px 4px!important;border-width:1px!important}span.um-admin-icon-value{margin:0 10px;font-size:13px}span.um-admin-icon-value i{font-size:28px;color:#0085ba;position:relative;top:5px}span.um-admin-icon-clear{display:none;cursor:pointer;position:relative;color:#ccc}span.um-admin-icon-clear.show{display:inline-block}span.um-admin-icon-clear:hover{color:#777}span.um-admin-icon-clear i{font-size:20px;vertical-align:middle} \ No newline at end of file +.um-form-table .um-forms-line[data-conditional]{display:none}.um-form-table .um-forms-line label .um-req{color:#a00;margin:0 0 0 3px;font-weight:400}.um-form-table .um-forms-line .um-text-delete{color:#a00;float:left}.um-form-table .um-forms-line .um-text-delete:hover{color:red}.um-form-table .um-forms-line .um-multi-text-add-option{margin-bottom:14px}.um-form-table .um-forms-line .icon_preview{display:none;max-width:200px;max-height:200px;padding:5px;cursor:pointer;border:1px solid #e3e3e3;background:#f7f7f7;border-radius:3px;height:auto;width:auto!important}.um-form-table .um-forms-line td .um-same-page-update-wrapper{display:none;margin:7px 0 0 0}.um-form-table .um-forms-line td .um-same-page-update-wrapper input.um-admin-form-same-page-update{margin:7px 0 0 0}.um-form-table .um-forms-line td .um-same-page-update-wrapper .upgrade_log{margin:7px 0 0 0;width:100%;height:150px;overflow:auto;border:1px solid #a1a1a1}.um-form-table .um-forms-line[data-field_type=same_page_update]{vertical-align:baseline}.um-form-table .um-forms-line[data-field_type=same_page_update] td,.um-form-table .um-forms-line[data-field_type=same_page_update] th{vertical-align:baseline}.um-form-table.um-third-column .um-forms-line th{width:33%}.um-form-table.um-half-column .um-forms-line th{width:50%}.um-form-table.um-two-thirds-column .um-forms-line th{width:83%}.um-form-table.um-top-label .um-forms-line td{padding:0 0 15px 0}.um-form-table.um-top-label .um-forms-line td label{margin:0 0 5px 0;display:inline-block}.um-form-table.um-top-label .um-forms-line td select.um-forms-field.um-pages-select2~.select2-container{width:100%!important}.um-form-table.um-top-label .um-forms-line[data-field_type=icon] td label{width:100%;display:block;margin:0 0 5px 0}.um-external-link-icon{width:1em;height:1em;margin:0;vertical-align:middle;fill:currentcolor}.um_admin_fonticon_wrapper{display:flex;flex-direction:row;justify-content:flex-start;align-items:center;flex-wrap:nowrap}.um_admin_fonticon_wrapper .um-admin-icon-value{line-height:1}.um_admin_fonticon_wrapper .um-admin-icon-value i{top:0}input[type=date].um-forms-field,input[type=number].um-forms-field,input[type=password].um-forms-field,input[type=text].um-forms-field,input[type=time].um-forms-field,input[type=url].um-forms-field,select.um-forms-field,textarea.um-forms-field{box-sizing:border-box}input[type=date].um-forms-field.um-long-field,input[type=number].um-forms-field.um-long-field,input[type=password].um-forms-field.um-long-field,input[type=text].um-forms-field.um-long-field,input[type=time].um-forms-field.um-long-field,input[type=url].um-forms-field.um-long-field,select.um-forms-field.um-long-field,textarea.um-forms-field.um-long-field{width:100%!important}input[type=date].um-forms-field.um-medium-field,input[type=number].um-forms-field.um-medium-field,input[type=password].um-forms-field.um-medium-field,input[type=text].um-forms-field.um-medium-field,input[type=time].um-forms-field.um-medium-field,input[type=url].um-forms-field.um-medium-field,select.um-forms-field.um-medium-field,textarea.um-forms-field.um-medium-field{width:50%!important}input[type=date].um-forms-field.um-small-field,input[type=number].um-forms-field.um-small-field,input[type=password].um-forms-field.um-small-field,input[type=text].um-forms-field.um-small-field,input[type=time].um-forms-field.um-small-field,input[type=url].um-forms-field.um-small-field,select.um-forms-field.um-small-field,textarea.um-forms-field.um-small-field{width:25%!important}input[type=number].um-forms-field{padding-right:0}.um-md-default-filters-list,.um-multi-selects-list,.um-multi-text-list{float:left;width:100%;margin:0 0 10px 0}.um-hidden-md-default-filters,.um-hidden-multi-selects,.um-hidden-multi-text{display:none!important}.um-md-default-filters-option-line{float:left;width:100%;clear:both;border-bottom:1px solid #eee;padding:0 0 5px 0;margin:5px 0 0 0}.um-md-default-filters-option-line .um-field-wrapper{float:left;width:calc(100% - 60px);line-height:30px;box-sizing:border-box}.um-md-default-filters-option-line .um-field-wrapper2{float:left;width:calc(100% - 60px);line-height:30px;box-sizing:border-box}.um-md-default-filters-option-line .um-field-wrapper2.um{margin:5px 0 0 0}.um-md-default-filters-option-line .um-field-wrapper2 .ui-slider-range.ui-widget-header{background:#44b0ec;border:1px solid #44b0ec!important;margin-top:-1px}.um-md-default-filters-option-line .um-field-wrapper2>select{width:100%;float:left}.um-md-default-filters-option-line .um-field-wrapper2>input{width:100%;float:left}.um-md-default-filters-option-line .um-field-wrapper2>input.um-datepicker-filter,.um-md-default-filters-option-line .um-field-wrapper2>input.um-timepicker-filter{width:calc(50% - 7px)!important;float:left}.um-md-default-filters-option-line .um-field-wrapper2>input.um-datepicker-filter:first-child,.um-md-default-filters-option-line .um-field-wrapper2>input.um-timepicker-filter:first-child{margin-right:11px}.um-md-default-filters-option-line .um-field-wrapper2 .um-slider{margin:5px 9px 0 9px;width:calc(100% - 18px);box-sizing:border-box;display:block}.um-md-default-filters-option-line .um-field-control{float:left;width:60px;line-height:30px;padding:0 10px;box-sizing:border-box}.um-multi-selects-option-line{float:left;width:100%;padding:0;clear:both;margin:0 0 5px 0}.um-multi-selects-option-line.um-admin-drag-fld{display:flex;flex-direction:row;justify-content:flex-start;align-items:center;flex-wrap:nowrap;background:0 0;border:none}.um-multi-selects-option-line.um-admin-drag-fld .um-field-wrapper{width:calc(100% - 90px)}.um-multi-selects-option-line.um-admin-drag-fld .um-field-icon{float:left;width:20px;text-align:left;line-height:30px}.um-multi-selects-option-line .um-field-wrapper{float:left;width:calc(100% - 60px);line-height:30px;box-sizing:border-box}.um-multi-selects-option-line .um-field-wrapper.um-custom-order-fields{margin:5px 0 0 0}.um-multi-selects-option-line .um-field-wrapper.um-custom-order-fields label{float:left;width:100%;line-height:30px;box-sizing:border-box;margin:0!important;padding:0!important;font-weight:700;display:flex;flex-direction:row;justify-content:space-beetween;align-items:baseline;flex-wrap:nowrap}.um-multi-selects-option-line .um-field-wrapper.um-custom-order-fields label input[type=text],.um-multi-selects-option-line .um-field-wrapper.um-custom-order-fields label select{width:auto;display:inline;font-weight:400;max-width:70%;flex:.9}.um-multi-selects-option-line .um-field-wrapper input,.um-multi-selects-option-line .um-field-wrapper select{float:left;width:100%;margin:0}.um-multi-selects-option-line .um-field-control{float:left;width:60px;line-height:30px;padding:0 10px;box-sizing:border-box}.um-multi-text-option-line{float:left;width:100%;padding:0;clear:both;margin:0 0 5px 0}.um-multi-text-option-line .um-field-wrapper{float:left;width:calc(100% - 90px);line-height:30px;box-sizing:border-box}.um-multi-text-option-line .um-field-wrapper input,.um-multi-text-option-line .um-field-wrapper select{float:left;width:100%;margin:0}.um-multi-text-option-line .um-field-control{float:left;width:60px;line-height:30px;padding:0 10px;box-sizing:border-box}.um-form-fields-section{display:flex;flex-direction:column;justify-content:flex-start;align-items:stretch;flex-wrap:nowrap;row-gap:4px;float:left;clear:none;margin:0;padding:0 10px 0 0;box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box}.um-form-fields-section label{float:left;width:100%;margin:0;padding:0}.um-form-fields-section label input{float:left;margin-top:0}.um-form-fields-section label span{float:left;width:calc(100% - 20px)}@media screen and (max-width:782px){input[type=text].um-forms-field.um-medium-field,select.um-forms-field.um-medium-field,textarea.um-forms-field.um-medium-field{width:100%!important}input[type=text].um-forms-field.um-small-field,select.um-forms-field.um-small-field,textarea.um-forms-field.um-small-field{width:50%!important}.um-form-fields-section{width:100%!important}.um-admin-metabox .um-form-fields-section label{line-height:22px!important;margin:0 0 12px 0!important}.um-admin-metabox .um-form-fields-section label span{width:calc(100% - 30px)}.um-multi-selects-option-line,.um-multi-text-option-line{margin:0 0 6px 0}.um-forms-line label{float:left;width:100%}.um-form-table.um-half-column .um-forms-line th,.um-form-table.um-third-column .um-forms-line th,.um-form-table.um-two-thirds-column .um-forms-line th{float:left;width:100%;margin-bottom:5px}.um-form-table.um-half-column .um-forms-line th label,.um-form-table.um-third-column .um-forms-line th label,.um-form-table.um-two-thirds-column .um-forms-line th label{float:left;width:100%}.um-form-table.um-half-column .um-forms-line td,.um-form-table.um-third-column .um-forms-line td,.um-form-table.um-two-thirds-column .um-forms-line td{float:left;width:100%}}.um-sortable-items-field .um-sortable-item{cursor:move!important;padding:5px;box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;border:1px solid #7e8993;border-radius:4px;-moz-border-radius:4px;background:#fff;height:42px;line-height:28px;display:flex;flex-direction:row;justify-content:flex-start;align-items:center;flex-wrap:nowrap}.um-sortable-items-field .um-sortable-item.um-hidden-item{display:none}.um-sortable-items-field .um-sortable-item .um-field-icon{width:20px;text-align:left;margin:0 10px 0 0}.wp-picker-container input.wp-color-picker[type=text]{width:68px!important;float:left!important;padding:2px 4px!important;border-width:1px!important}span.um-admin-icon-value{margin:0 10px;font-size:13px}span.um-admin-icon-value i{font-size:28px;color:#0085ba;position:relative;top:5px}span.um-admin-icon-clear{display:none;cursor:pointer;position:relative;color:#ccc}span.um-admin-icon-clear.show{display:inline-block}span.um-admin-icon-clear:hover{color:#777}span.um-admin-icon-clear i{font-size:20px;vertical-align:middle} \ No newline at end of file diff --git a/assets/css/admin/forms.sass b/assets/css/admin/forms.sass index 3eec9d02..e3290df6 100644 --- a/assets/css/admin/forms.sass +++ b/assets/css/admin/forms.sass @@ -85,6 +85,9 @@ margin: 0 0 5px 0 display: inline-block //font-weight: bold + select.#{$prefix}forms-field.#{$prefix}pages-select2 + & ~ .select2-container + width: 100% !important &[data-field_type="icon"] td From 4d2a9928432e75db68df50fd2e5c79f8d96532b2 Mon Sep 17 00:00:00 2001 From: ashubawork Date: Mon, 22 Sep 2025 12:48:39 +0300 Subject: [PATCH 23/26] - allow webp image format --- includes/core/class-fields.php | 2 +- includes/core/class-files.php | 15 +++++++++------ 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/includes/core/class-fields.php b/includes/core/class-fields.php index 7ad67b6f..d868345f 100644 --- a/includes/core/class-fields.php +++ b/includes/core/class-fields.php @@ -1982,7 +1982,7 @@ if ( ! class_exists( 'um\core\Fields' ) ) { $array['invalid_image'] = __( 'Please upload a valid image!', 'ultimate-member' ); } if ( ! isset( $array['allowed_types'] ) ) { - $array['allowed_types'] = 'gif,jpg,jpeg,png'; + $array['allowed_types'] = 'gif,jpg,jpeg,png,webp'; } else { $array['allowed_types'] = implode( ',', $array['allowed_types'] ); } diff --git a/includes/core/class-files.php b/includes/core/class-files.php index 3722d962..be091959 100644 --- a/includes/core/class-files.php +++ b/includes/core/class-files.php @@ -822,12 +822,15 @@ if ( ! class_exists( 'um\core\Files' ) ) { * } * ?> */ - return apply_filters( 'um_allowed_image_types', array( - 'png' => 'PNG', - 'jpeg' => 'JPEG', - 'jpg' => 'JPG', - 'gif' => 'GIF' - ) ); + return apply_filters( + 'um_allowed_image_types', + array( + 'png' => 'PNG', + 'jpeg' => 'JPEG', + 'jpg' => 'JPG', + 'webp' => 'WEBP', + ) + ); } From a338dbb684846b120c25efded761497b30f892ed Mon Sep 17 00:00:00 2001 From: Mykyta Synelnikov Date: Thu, 25 Sep 2025 17:54:25 +0300 Subject: [PATCH 24/26] Add AI assistant and moderation to plugin dependencies New dependencies `ai-assistant` and `ai-moderation` were added to the Ultimate Member plugin. This ensures support for these features, expanding the plugin's capabilities. --- includes/class-dependencies.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/includes/class-dependencies.php b/includes/class-dependencies.php index cc02622c..8b93e386 100644 --- a/includes/class-dependencies.php +++ b/includes/class-dependencies.php @@ -72,6 +72,8 @@ if ( ! class_exists( 'um\Dependencies' ) ) { 'filesharing' => '1.0.0', 'beaver-builder' => '2.0', 'user-events' => '1.0.0', + 'ai-assistant' => '1.0.0', + 'ai-moderation' => '1.0.0', // deprecated 'instagram' => '2.0.5', From 1e300276052838fc6a42ae65c79b9590b3367bf2 Mon Sep 17 00:00:00 2001 From: Mykyta Synelnikov Date: Sat, 27 Sep 2025 10:49:10 +0300 Subject: [PATCH 25/26] Add license request debugging functionality Introduced a new method `is_license_debug_enabled` to check debug conditions and added extensive logging for license requests when debugging is enabled. A new constant `UM_LICENSE_REQUEST_DEBUG` was also defined to control debug mode. These changes enhance visibility into license request handling during development or troubleshooting. --- includes/admin/core/class-admin-settings.php | 74 +++++++++++++------- ultimate-member.php | 1 + 2 files changed, 50 insertions(+), 25 deletions(-) diff --git a/includes/admin/core/class-admin-settings.php b/includes/admin/core/class-admin-settings.php index 9821763c..13d66d89 100644 --- a/includes/admin/core/class-admin-settings.php +++ b/includes/admin/core/class-admin-settings.php @@ -2898,10 +2898,19 @@ if ( ! class_exists( 'um\admin\core\Admin_Settings' ) ) { } } + /** + * Check if license debug is enabled based on defined constants. + * + * @return bool + */ + private static function is_license_debug_enabled() { + return defined( 'UM_LICENSE_REQUEST_DEBUG' ) && UM_LICENSE_REQUEST_DEBUG && defined( 'WP_DEBUG' ) && WP_DEBUG && defined( 'WP_DEBUG_LOG' ) && WP_DEBUG_LOG; + } + /** * */ - function licenses_save() { + public function licenses_save() { if ( empty( $_POST['um_options'] ) || empty( $_POST['licenses_settings'] ) ) { return; } @@ -2931,48 +2940,63 @@ if ( ! class_exists( 'um\admin\core\Admin_Settings' ) ) { $version = false; $author = false; foreach ( $this->settings_structure['licenses']['fields'] as $field_data ) { - if ( $field_data['id'] == $key ) { + if ( $field_data['id'] === $key ) { $item_name = ! empty( $field_data['item_name'] ) ? $field_data['item_name'] : false; $version = ! empty( $field_data['version'] ) ? $field_data['version'] : false; $author = ! empty( $field_data['author'] ) ? $field_data['author'] : false; } } - $api_params = array( - 'edd_action' => $edd_action, - 'license' => $license_key, - 'item_name' => $item_name, - 'version' => $version, - 'author' => $author, - 'url' => home_url(), + $post_attr = array( + 'timeout' => UM()::$request_timeout, + 'sslverify' => false, + 'body' => array( + 'edd_action' => $edd_action, + 'license' => $license_key, + 'item_name' => $item_name, + 'version' => $version, + 'author' => $author, + 'url' => home_url(), + ), ); - $request = wp_remote_post( - UM()::$store_url, - array( - 'timeout' => UM()::$request_timeout, - 'sslverify' => false, - 'body' => $api_params, - ) - ); + // phpcs:disable WordPress.PHP.DevelopmentFunctions.error_log_error_log -- Need to debug license requests sometimes. + if ( self::is_license_debug_enabled() ) { + error_log( '----- License handler starts below -----' ); + error_log( '### Store URL: ' . UM()::$store_url ); + error_log( '### Request:' ); + error_log( maybe_serialize( $post_attr ) ); + } + $request = wp_remote_post( UM()::$store_url, $post_attr ); if ( ! is_wp_error( $request ) ) { $request = json_decode( wp_remote_retrieve_body( $request ) ); } else { - $request = wp_remote_post( - UM()::$store_url, - array( - 'timeout' => UM()::$request_timeout, - 'sslverify' => true, - 'body' => $api_params, - ) - ); + if ( self::is_license_debug_enabled() ) { + error_log( '> Got `wp_error`, try again with `sslverify=true`' ); + } + $post_attr['sslverify'] = true; + + $request = wp_remote_post( UM()::$store_url, $post_attr ); if ( ! is_wp_error( $request ) ) { $request = json_decode( wp_remote_retrieve_body( $request ) ); } } + if ( self::is_license_debug_enabled() ) { + if ( is_wp_error( $request ) ) { + error_log( '> Finally got `wp_error`. Details below.' ); + error_log( '>> Error code: ' . $request->get_error_code() ); + error_log( '>> Error message: ' . $request->get_error_message() ); + } else { + error_log( '### Response from UM website:' ); + error_log( '>' . maybe_serialize( $request ) ); + } + error_log( '^^^^^^ End license handler ^^^^^^' ); + } + // phpcs:enable WordPress.PHP.DevelopmentFunctions.error_log_error_log -- Need to debug license requests sometimes. + $request = ( $request ) ? maybe_unserialize( $request ) : false; if ( in_array( $edd_action, array( 'activate_license', 'check_license' ), true ) ) { diff --git a/ultimate-member.php b/ultimate-member.php index 96a2b298..74686686 100644 --- a/ultimate-member.php +++ b/ultimate-member.php @@ -35,6 +35,7 @@ define( 'UM_PLUGIN', plugin_basename( __FILE__ ) ); define( 'UM_VERSION', $plugin_data['Version'] ); define( 'UM_PLUGIN_NAME', $plugin_data['Name'] ); define( 'UM_WP_FUNCTIONS_VERSION', '6.8.0' ); // Updates every major WordPress release. +define( 'UM_LICENSE_REQUEST_DEBUG', false ); // Set true then need to debug the license request. // define( 'UM_DEV_MODE', true ); require_once 'includes/class-functions.php'; From 1d4d1e4f2f2e56e9bdb31f54c82ed8bc13d816cb Mon Sep 17 00:00:00 2001 From: Mykyta Synelnikov Date: Sat, 27 Sep 2025 11:17:08 +0300 Subject: [PATCH 26/26] Update Ultimate Member to version 2.10.6 This release adds multiple enhancements, including WebP support, new filter hooks, license debugging, and improved extension upgrades. It also fixes issues like numeric field filtering, profile link handling, and dependencies with Action Scheduler. Cached assets should be regenerated post-upgrade. --- changelog.txt | 24 ++++++++++++++++++++++++ includes/ajax/class-pages.php | 13 ++++++++++++- readme.txt | 14 ++++++++++++-- 3 files changed, 48 insertions(+), 3 deletions(-) diff --git a/changelog.txt b/changelog.txt index e969640a..d4849a26 100644 --- a/changelog.txt +++ b/changelog.txt @@ -1,5 +1,29 @@ == Changelog == += 2.10.6 September 30, 2025 = + +* Enhancements: + + - Added: Avoid caching of the UM Forms on the mobile devices via adding the nocache headers to the screens with UM Forms. + - Added: Filter hook `um_get_empty_status_users_query_result` for changing default query on the different websites to optimize it. + - Added: Filter hook `um_admin_settings_get_pages_list_args` for changing WP_Query arguments for getting pages visible in the dropdown fields in UM Settings. + - Added: JS filter hook `um_admin_blocks_prefixes_excluded` for excluding 3rd-party Gutenberg blocks with predefined prefixes from UM restriction arguments. + - Added: WebP file-extension support for UM uploader. + - Added: `UM_LICENSE_REQUEST_DEBUG` constant for debugging license activation process when it's needed. + - Added: `Extensions_Updater` class to standardize the upgrade process in UM extensions. + - Added: Sanitize handlers `sanitize_array_key_int` and `sanitize_array_key` for making sanitize in UM extensions' settings. + +* Bugfixes: + + - Fixed: Changed the view and the edit user profile links in the comments section on the frontend. + - Fixed: `Contains` conditional logic operand when value is array. + - Fixed: Getting cover_size for displaying it in the member directory card. + - Fixed: Filter's range for numeric-type fields to avoid getting the empty values. + - Fixed: Integer validation for the 'start_of_week' WP native setting. + - Fixed: Dependencies with Action Scheduler library. + +* Cached and optimized/minified assets(JS/CSS) must be flushed/re-generated after upgrade * + = 2.10.5 June 25, 2025 = * Enhancements: diff --git a/includes/ajax/class-pages.php b/includes/ajax/class-pages.php index fa6f554e..a41b3877 100644 --- a/includes/ajax/class-pages.php +++ b/includes/ajax/class-pages.php @@ -63,7 +63,18 @@ class Pages { $query_args['post__not_in'] = $predefined_ids; } } - // since 2.10.6 + + /** + * Filters WP_Query arguments for getting pages visible in the dropdown fields in UM Settings. + * + * @since 2.10.6 + * @hook um_admin_settings_get_pages_list_args + * + * @param {array} $query_args Get pages WP_Query arguments. + * @param {string} $field_id Dropdown field ID. + * + * @return {array} Get pages WP_Query arguments. + */ $query_args = apply_filters( 'um_admin_settings_get_pages_list_args', $query_args, $field_id ); $search_results = new WP_Query( $query_args ); diff --git a/readme.txt b/readme.txt index 03c62e0c..abe3d365 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.5 +Stable tag: 2.10.6 License: GPLv3 License URI: http://www.gnu.org/licenses/gpl-3.0.txt @@ -167,19 +167,29 @@ 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.6 2025-09-xx = += 2.10.6 2025-09-30 = **Enhancements** * Added: Avoid caching of the UM Forms on the mobile devices via adding the nocache headers to the screens with UM Forms. * Added: Filter hook `um_get_empty_status_users_query_result` for changing default query on the different websites to optimize it. +* Added: Filter hook `um_admin_settings_get_pages_list_args` for changing WP_Query arguments for getting pages visible in the dropdown fields in UM Settings. * Added: JS filter hook `um_admin_blocks_prefixes_excluded` for excluding 3rd-party Gutenberg blocks with predefined prefixes from UM restriction arguments. +* Added: WebP file-extension support for UM uploader. +* Added: `UM_LICENSE_REQUEST_DEBUG` constant for debugging license activation process when it's needed. +* Added: `Extensions_Updater` class to standardize the upgrade process in UM extensions. +* Added: Sanitize handlers `sanitize_array_key_int` and `sanitize_array_key` for making sanitize in UM extensions' settings. **Bugfixes** * Fixed: Changed the view and the edit user profile links in the comments section on the frontend. * Fixed: `Contains` conditional logic operand when value is array. +* Fixed: Getting cover_size for displaying it in the member directory card. +* Fixed: Filter's range for numeric-type fields to avoid getting the empty values. * Fixed: Integer validation for the 'start_of_week' WP native setting. +* Fixed: Dependencies with Action Scheduler library. + +**Cached and optimized/minified assets(JS/CSS) must be flushed/re-generated after upgrade** = 2.10.5 2025-06-25 =