diff --git a/README.md b/README.md
index 8aa62665..46cc9bc0 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.6.10](https://github.com/ultimatemember/ultimatemember/releases/tag/2.6.10).
+[Official Release Version: 2.6.11](https://github.com/ultimatemember/ultimatemember/releases/tag/2.6.11).
## Changelog
diff --git a/includes/admin/assets/js/um-admin-forms.js b/includes/admin/assets/js/um-admin-forms.js
index 5bd8e40f..531919f4 100644
--- a/includes/admin/assets/js/um-admin-forms.js
+++ b/includes/admin/assets/js/um-admin-forms.js
@@ -1,14 +1,20 @@
function um_admin_init_users_select() {
- if ( jQuery('.um-user-select-field').length ) {
+ if ( jQuery('.um-user-select-field:visible').length ) {
function avatarformat( data ) {
var option;
if ( ! data.id ) {
return data.text;
}
+
if ( 'undefined' !== typeof data.img ) {
option = jQuery('
' + data.text + '');
} else {
- var img = data.element.attributes['data-img']['value'];
+ let img;
+ if ( 'undefined' !== typeof data.element ) {
+ if ( 'undefined' !== typeof data.element.attributes['data-img'] ) {
+ img = data.element.attributes['data-img']['value'];
+ }
+ }
if ( img ) {
option = jQuery('
' + data.text + '');
} else {
@@ -78,7 +84,13 @@ function um_admin_init_users_select() {
templateResult: avatarformat
};
- jQuery('.um-user-select-field').select2( select2_atts );
+ jQuery('.um-user-select-field:visible').each( function() {
+ if ( jQuery(this).hasClass('select2-hidden-accessible') ) {
+ jQuery(this).select2( 'destroy' );
+ }
+ });
+
+ jQuery('.um-user-select-field:visible').select2( select2_atts );
}
}
@@ -798,6 +810,7 @@ jQuery(document).ready( function() {
if ( check_condition( jQuery(this) ) ) {
jQuery(this).show();
+ um_admin_init_users_select();
} else {
jQuery(this).hide();
}
diff --git a/includes/admin/core/class-admin-metabox.php b/includes/admin/core/class-admin-metabox.php
index 4e35a663..776e25a8 100644
--- a/includes/admin/core/class-admin-metabox.php
+++ b/includes/admin/core/class-admin-metabox.php
@@ -2378,15 +2378,26 @@ if ( ! class_exists( 'um\admin\core\Admin_Metabox' ) ) {
break;
case '_editable':
+ // Make a new field editable by default.
+ if ( false === $this->in_edit ) {
+ $this->edit_mode_value = true;
+ }
+
+ // Set to true if `editable` doesn't exist (legacy case). It will be saved to DB as `true` after the first field update.
+ if ( null === $this->edit_mode_value ) {
+ $this->edit_mode_value = true;
+ }
+
+ if ( empty( $this->edit_mode_value ) ) {
+ $this->edit_mode_value = false;
+ }
?>
+
@@ -3700,7 +3701,13 @@ Use Only Cookies: core_form_meta['register'] = array(
- '_um_custom_fields' => 'a:6:{s:10:"user_login";a:15:{s:5:"title";s:8:"Username";s:7:"metakey";s:10:"user_login";s:4:"type";s:4:"text";s:5:"label";s:8:"Username";s:8:"required";i:1;s:6:"public";i:1;s:8:"editable";i:0;s:8:"validate";s:15:"unique_username";s:9:"min_chars";i:3;s:9:"max_chars";i:24;s:8:"position";s:1:"1";s:6:"in_row";s:9:"_um_row_1";s:10:"in_sub_row";s:1:"0";s:9:"in_column";s:1:"1";s:8:"in_group";s:0:"";}s:10:"user_email";a:13:{s:5:"title";s:14:"E-mail Address";s:7:"metakey";s:10:"user_email";s:4:"type";s:4:"text";s:5:"label";s:14:"E-mail Address";s:8:"required";i:0;s:6:"public";i:1;s:8:"editable";i:1;s:8:"validate";s:12:"unique_email";s:8:"position";s:1:"4";s:6:"in_row";s:9:"_um_row_1";s:10:"in_sub_row";s:1:"0";s:9:"in_column";s:1:"1";s:8:"in_group";s:0:"";}s:13:"user_password";a:16:{s:5:"title";s:8:"Password";s:7:"metakey";s:13:"user_password";s:4:"type";s:8:"password";s:5:"label";s:8:"Password";s:8:"required";i:1;s:6:"public";i:1;s:8:"editable";i:1;s:9:"min_chars";i:8;s:9:"max_chars";i:30;s:15:"force_good_pass";i:1;s:18:"force_confirm_pass";i:1;s:8:"position";s:1:"5";s:6:"in_row";s:9:"_um_row_1";s:10:"in_sub_row";s:1:"0";s:9:"in_column";s:1:"1";s:8:"in_group";s:0:"";}s:10:"first_name";a:12:{s:5:"title";s:10:"First Name";s:7:"metakey";s:10:"first_name";s:4:"type";s:4:"text";s:5:"label";s:10:"First Name";s:8:"required";i:0;s:6:"public";i:1;s:8:"editable";i:1;s:8:"position";s:1:"2";s:6:"in_row";s:9:"_um_row_1";s:10:"in_sub_row";s:1:"0";s:9:"in_column";s:1:"1";s:8:"in_group";s:0:"";}s:9:"last_name";a:12:{s:5:"title";s:9:"Last Name";s:7:"metakey";s:9:"last_name";s:4:"type";s:4:"text";s:5:"label";s:9:"Last Name";s:8:"required";i:0;s:6:"public";i:1;s:8:"editable";i:1;s:8:"position";s:1:"3";s:6:"in_row";s:9:"_um_row_1";s:10:"in_sub_row";s:1:"0";s:9:"in_column";s:1:"1";s:8:"in_group";s:0:"";}s:9:"_um_row_1";a:4:{s:4:"type";s:3:"row";s:2:"id";s:9:"_um_row_1";s:8:"sub_rows";s:1:"1";s:4:"cols";s:1:"1";}}',
+ '_um_custom_fields' => 'a:6:{s:10:"user_login";a:15:{s:5:"title";s:8:"Username";s:7:"metakey";s:10:"user_login";s:4:"type";s:4:"text";s:5:"label";s:8:"Username";s:8:"required";i:1;s:6:"public";i:1;s:8:"editable";b:0;s:8:"validate";s:15:"unique_username";s:9:"min_chars";i:3;s:9:"max_chars";i:24;s:8:"position";s:1:"1";s:6:"in_row";s:9:"_um_row_1";s:10:"in_sub_row";s:1:"0";s:9:"in_column";s:1:"1";s:8:"in_group";s:0:"";}s:10:"user_email";a:13:{s:5:"title";s:14:"E-mail Address";s:7:"metakey";s:10:"user_email";s:4:"type";s:4:"text";s:5:"label";s:14:"E-mail Address";s:8:"required";i:0;s:6:"public";i:1;s:8:"editable";b:1;s:8:"validate";s:12:"unique_email";s:8:"position";s:1:"4";s:6:"in_row";s:9:"_um_row_1";s:10:"in_sub_row";s:1:"0";s:9:"in_column";s:1:"1";s:8:"in_group";s:0:"";}s:13:"user_password";a:16:{s:5:"title";s:8:"Password";s:7:"metakey";s:13:"user_password";s:4:"type";s:8:"password";s:5:"label";s:8:"Password";s:8:"required";i:1;s:6:"public";i:1;s:8:"editable";b:1;s:9:"min_chars";i:8;s:9:"max_chars";i:30;s:15:"force_good_pass";i:1;s:18:"force_confirm_pass";i:1;s:8:"position";s:1:"5";s:6:"in_row";s:9:"_um_row_1";s:10:"in_sub_row";s:1:"0";s:9:"in_column";s:1:"1";s:8:"in_group";s:0:"";}s:10:"first_name";a:12:{s:5:"title";s:10:"First Name";s:7:"metakey";s:10:"first_name";s:4:"type";s:4:"text";s:5:"label";s:10:"First Name";s:8:"required";i:0;s:6:"public";i:1;s:8:"editable";b:1;s:8:"position";s:1:"2";s:6:"in_row";s:9:"_um_row_1";s:10:"in_sub_row";s:1:"0";s:9:"in_column";s:1:"1";s:8:"in_group";s:0:"";}s:9:"last_name";a:12:{s:5:"title";s:9:"Last Name";s:7:"metakey";s:9:"last_name";s:4:"type";s:4:"text";s:5:"label";s:9:"Last Name";s:8:"required";i:0;s:6:"public";i:1;s:8:"editable";b:1;s:8:"position";s:1:"3";s:6:"in_row";s:9:"_um_row_1";s:10:"in_sub_row";s:1:"0";s:9:"in_column";s:1:"1";s:8:"in_group";s:0:"";}s:9:"_um_row_1";a:4:{s:4:"type";s:3:"row";s:2:"id";s:9:"_um_row_1";s:8:"sub_rows";s:1:"1";s:4:"cols";s:1:"1";}}',
'_um_mode' => 'register',
'_um_core' => 'register',
'_um_register_use_custom_settings' => 0,
);
$this->core_form_meta['login'] = array(
- '_um_custom_fields' => 'a:3:{s:8:"username";a:13:{s:5:"title";s:18:"Username or E-mail";s:7:"metakey";s:8:"username";s:4:"type";s:4:"text";s:5:"label";s:18:"Username or E-mail";s:8:"required";i:1;s:6:"public";i:1;s:8:"editable";i:0;s:8:"validate";s:24:"unique_username_or_email";s:8:"position";s:1:"1";s:6:"in_row";s:9:"_um_row_1";s:10:"in_sub_row";s:1:"0";s:9:"in_column";s:1:"1";s:8:"in_group";s:0:"";}s:13:"user_password";a:16:{s:5:"title";s:8:"Password";s:7:"metakey";s:13:"user_password";s:4:"type";s:8:"password";s:5:"label";s:8:"Password";s:8:"required";i:1;s:6:"public";i:1;s:8:"editable";i:1;s:9:"min_chars";i:8;s:9:"max_chars";i:30;s:15:"force_good_pass";i:1;s:18:"force_confirm_pass";i:1;s:8:"position";s:1:"2";s:6:"in_row";s:9:"_um_row_1";s:10:"in_sub_row";s:1:"0";s:9:"in_column";s:1:"1";s:8:"in_group";s:0:"";}s:9:"_um_row_1";a:4:{s:4:"type";s:3:"row";s:2:"id";s:9:"_um_row_1";s:8:"sub_rows";s:1:"1";s:4:"cols";s:1:"1";}}',
+ '_um_custom_fields' => 'a:3:{s:8:"username";a:13:{s:5:"title";s:18:"Username or E-mail";s:7:"metakey";s:8:"username";s:4:"type";s:4:"text";s:5:"label";s:18:"Username or E-mail";s:8:"required";i:1;s:6:"public";i:1;s:8:"editable";b:0;s:8:"validate";s:24:"unique_username_or_email";s:8:"position";s:1:"1";s:6:"in_row";s:9:"_um_row_1";s:10:"in_sub_row";s:1:"0";s:9:"in_column";s:1:"1";s:8:"in_group";s:0:"";}s:13:"user_password";a:16:{s:5:"title";s:8:"Password";s:7:"metakey";s:13:"user_password";s:4:"type";s:8:"password";s:5:"label";s:8:"Password";s:8:"required";i:1;s:6:"public";i:1;s:8:"editable";b:1;s:9:"min_chars";i:8;s:9:"max_chars";i:30;s:15:"force_good_pass";i:1;s:18:"force_confirm_pass";i:1;s:8:"position";s:1:"2";s:6:"in_row";s:9:"_um_row_1";s:10:"in_sub_row";s:1:"0";s:9:"in_column";s:1:"1";s:8:"in_group";s:0:"";}s:9:"_um_row_1";a:4:{s:4:"type";s:3:"row";s:2:"id";s:9:"_um_row_1";s:8:"sub_rows";s:1:"1";s:4:"cols";s:1:"1";}}',
'_um_mode' => 'login',
'_um_core' => 'login',
'_um_login_use_custom_settings' => 0,
diff --git a/includes/core/class-account.php b/includes/core/class-account.php
index 6668d2ba..d48e08d1 100644
--- a/includes/core/class-account.php
+++ b/includes/core/class-account.php
@@ -567,7 +567,7 @@ if ( ! class_exists( 'um\core\Account' ) ) {
function get_tab_fields( $id, $shortcode_args ) {
$output = null;
- UM()->fields()->set_id = $id;
+ UM()->fields()->set_id = absint( $id );
UM()->fields()->set_mode = 'account';
UM()->fields()->editing = true;
@@ -610,8 +610,8 @@ if ( ! class_exists( 'um\core\Account' ) ) {
$this->init_displayed_fields( $fields, $id );
foreach ( $fields as $key => $data ) {
- if ( isset( $shortcode_args['is_block'] ) && 1 === (int) $shortcode_args['is_block'] ) {
- $data['is_block'] = 1;
+ if ( ! empty( $shortcode_args['is_block'] ) ) {
+ $data['is_block'] = true;
}
$output .= UM()->fields()->edit_field( $key, $data );
}
@@ -653,8 +653,8 @@ if ( ! class_exists( 'um\core\Account' ) ) {
$this->init_displayed_fields( $fields, $id );
foreach ( $fields as $key => $data ) {
- if ( isset( $shortcode_args['is_block'] ) && 1 === (int) $shortcode_args['is_block'] ) {
- $data['is_block'] = 1;
+ if ( ! empty( $shortcode_args['is_block'] ) ) {
+ $data['is_block'] = true;
}
$output .= UM()->fields()->edit_field( $key, $data );
}
@@ -710,8 +710,8 @@ if ( ! class_exists( 'um\core\Account' ) ) {
$this->init_displayed_fields( $fields, $id );
foreach ( $fields as $key => $data ) {
- if ( isset( $shortcode_args['is_block'] ) && 1 === (int) $shortcode_args['is_block'] ) {
- $data['is_block'] = 1;
+ if ( ! empty( $shortcode_args['is_block'] ) ) {
+ $data['is_block'] = true;
}
$output .= UM()->fields()->edit_field( $key, $data );
}
@@ -751,8 +751,8 @@ if ( ! class_exists( 'um\core\Account' ) ) {
$this->init_displayed_fields( $fields, $id );
foreach ( $fields as $key => $data ) {
- if ( isset( $shortcode_args['is_block'] ) && 1 === (int) $shortcode_args['is_block'] ) {
- $data['is_block'] = 1;
+ if ( ! empty( $shortcode_args['is_block'] ) ) {
+ $data['is_block'] = true;
}
$output .= UM()->fields()->edit_field( $key, $data );
}
diff --git a/includes/core/class-builtin.php b/includes/core/class-builtin.php
index aa8fd090..d296ac55 100644
--- a/includes/core/class-builtin.php
+++ b/includes/core/class-builtin.php
@@ -740,7 +740,7 @@ if ( ! class_exists( 'um\core\Builtin' ) ) {
'label' => __('Username','ultimate-member'),
'required' => 1,
'public' => 1,
- 'editable' => 0,
+ 'editable' => false,
'validate' => 'unique_username',
'min_chars' => 3,
'max_chars' => 24
@@ -753,7 +753,7 @@ if ( ! class_exists( 'um\core\Builtin' ) ) {
'label' => __('Username or E-mail','ultimate-member'),
'required' => 1,
'public' => 1,
- 'editable' => 0,
+ 'editable' => false,
'validate' => 'unique_username_or_email',
),
@@ -764,7 +764,7 @@ if ( ! class_exists( 'um\core\Builtin' ) ) {
'label' => __('Password','ultimate-member'),
'required' => 1,
'public' => 1,
- 'editable' => 1,
+ 'editable' => true,
'min_chars' => 8,
'max_chars' => 30,
'force_good_pass' => 1,
@@ -779,7 +779,7 @@ if ( ! class_exists( 'um\core\Builtin' ) ) {
'label' => __('First Name','ultimate-member'),
'required' => 0,
'public' => 1,
- 'editable' => 1,
+ 'editable' => true,
),
'last_name' => array(
@@ -789,7 +789,7 @@ if ( ! class_exists( 'um\core\Builtin' ) ) {
'label' => __('Last Name','ultimate-member'),
'required' => 0,
'public' => 1,
- 'editable' => 1,
+ 'editable' => true,
),
'nickname' => array(
@@ -799,7 +799,7 @@ if ( ! class_exists( 'um\core\Builtin' ) ) {
'label' => __('Nickname','ultimate-member'),
'required' => 0,
'public' => 1,
- 'editable' => 1,
+ 'editable' => true,
),
'user_url' => array(
@@ -809,7 +809,7 @@ if ( ! class_exists( 'um\core\Builtin' ) ) {
'label' => __('Website URL','ultimate-member'),
'required' => 1,
'public' => 1,
- 'editable' => 1,
+ 'editable' => true,
'validate' => 'url'
),
@@ -820,7 +820,7 @@ if ( ! class_exists( 'um\core\Builtin' ) ) {
'label' => __('Registration Date','ultimate-member'),
'required' => 0,
'public' => 1,
- 'editable' => 1,
+ 'editable' => true,
'edit_forbidden' => 1,
),
@@ -831,7 +831,7 @@ if ( ! class_exists( 'um\core\Builtin' ) ) {
'label' => __('Last Login','ultimate-member'),
'required' => 0,
'public' => 1,
- 'editable' => 1,
+ 'editable' => true,
'edit_forbidden' => 1,
),
@@ -853,7 +853,7 @@ if ( ! class_exists( 'um\core\Builtin' ) ) {
'label' => __('Secondary E-mail Address','ultimate-member'),
'required' => 0,
'public' => 1,
- 'editable' => 1,
+ 'editable' => true,
'validate' => 'unique_email',
'autocomplete' => 'off'
),
@@ -866,7 +866,7 @@ if ( ! class_exists( 'um\core\Builtin' ) ) {
'html' => 0,
'required' => 0,
'public' => 1,
- 'editable' => 1,
+ 'editable' => true,
'max_words' => 40,
'placeholder' => __('Enter a bit about yourself...','ultimate-member'),
),
@@ -878,7 +878,7 @@ if ( ! class_exists( 'um\core\Builtin' ) ) {
'label' => __('Birth Date','ultimate-member'),
'required' => 0,
'public' => 1,
- 'editable' => 1,
+ 'editable' => true,
'pretty_format' => 1,
'years' => 115,
'years_x' => 'past',
@@ -892,7 +892,7 @@ if ( ! class_exists( 'um\core\Builtin' ) ) {
'label' => __('Gender','ultimate-member'),
'required' => 0,
'public' => 1,
- 'editable' => 1,
+ 'editable' => true,
'options' => array( __('Male','ultimate-member'), __('Female','ultimate-member') )
),
@@ -904,7 +904,7 @@ if ( ! class_exists( 'um\core\Builtin' ) ) {
'placeholder' => __('Choose a Country','ultimate-member'),
'required' => 0,
'public' => 1,
- 'editable' => 1,
+ 'editable' => true,
'options' => $this->get('countries')
),
@@ -915,7 +915,7 @@ if ( ! class_exists( 'um\core\Builtin' ) ) {
'label' => __('Facebook','ultimate-member'),
'required' => 0,
'public' => 1,
- 'editable' => 1,
+ 'editable' => true,
'url_target' => '_blank',
'url_rel' => 'nofollow',
'icon' => 'um-faicon-facebook',
@@ -933,7 +933,7 @@ if ( ! class_exists( 'um\core\Builtin' ) ) {
'label' => __('Twitter','ultimate-member'),
'required' => 0,
'public' => 1,
- 'editable' => 1,
+ 'editable' => true,
'url_target' => '_blank',
'url_rel' => 'nofollow',
'icon' => 'um-faicon-twitter',
@@ -951,7 +951,7 @@ if ( ! class_exists( 'um\core\Builtin' ) ) {
'label' => __('LinkedIn','ultimate-member'),
'required' => 0,
'public' => 1,
- 'editable' => 1,
+ 'editable' => true,
'url_target' => '_blank',
'url_rel' => 'nofollow',
'icon' => 'um-faicon-linkedin',
@@ -969,7 +969,7 @@ if ( ! class_exists( 'um\core\Builtin' ) ) {
'label' => __('Instagram','ultimate-member'),
'required' => 0,
'public' => 1,
- 'editable' => 1,
+ 'editable' => true,
'url_target' => '_blank',
'url_rel' => 'nofollow',
'icon' => 'um-faicon-instagram',
@@ -987,7 +987,7 @@ if ( ! class_exists( 'um\core\Builtin' ) ) {
'label' => __('Skype ID','ultimate-member'),
'required' => 0,
'public' => 1,
- 'editable' => 1,
+ 'editable' => true,
'url_target' => '_blank',
'url_rel' => 'nofollow',
'icon' => 'um-faicon-skype',
@@ -1002,7 +1002,7 @@ if ( ! class_exists( 'um\core\Builtin' ) ) {
'label' => __('Viber number','ultimate-member'),
'required' => 0,
'public' => 1,
- 'editable' => 1,
+ 'editable' => true,
'url_target' => '_blank',
'url_rel' => 'nofollow',
'icon' => 'um-icon-ios-telephone',
@@ -1016,7 +1016,7 @@ if ( ! class_exists( 'um\core\Builtin' ) ) {
'label' => __('WhatsApp number','ultimate-member'),
'required' => 0,
'public' => 1,
- 'editable' => 1,
+ 'editable' => true,
'url_target' => '_blank',
'url_rel' => 'nofollow',
'icon' => 'um-icon-social-whatsapp',
@@ -1030,7 +1030,7 @@ if ( ! class_exists( 'um\core\Builtin' ) ) {
'label' => __('Telegram','ultimate-member'),
'required' => 0,
'public' => 1,
- 'editable' => 1,
+ 'editable' => true,
'url_target' => '_blank',
'url_rel' => 'nofollow',
'icon' => 'um-faicon-paper-plane',
@@ -1046,7 +1046,7 @@ if ( ! class_exists( 'um\core\Builtin' ) ) {
'label' => __('Discord ID','ultimate-member'),
'required' => 0,
'public' => 1,
- 'editable' => 1,
+ 'editable' => true,
'url_target' => '_blank',
'url_rel' => 'nofollow',
'validate' => 'discord',
@@ -1059,7 +1059,7 @@ if ( ! class_exists( 'um\core\Builtin' ) ) {
'label' => __('TikTok','ultimate-member'),
'required' => 0,
'public' => 1,
- 'editable' => 1,
+ 'editable' => true,
'url_target' => '_blank',
'url_rel' => 'nofollow',
'icon' => 'um-icon-ios-musical-note',
@@ -1077,7 +1077,7 @@ if ( ! class_exists( 'um\core\Builtin' ) ) {
'label' => __('Twitch','ultimate-member'),
'required' => 0,
'public' => 1,
- 'editable' => 1,
+ 'editable' => true,
'icon' => 'um-faicon-twitch',
'url_target' => '_blank',
'url_rel' => 'nofollow',
@@ -1095,7 +1095,7 @@ if ( ! class_exists( 'um\core\Builtin' ) ) {
'label' => __('Reddit','ultimate-member'),
'required' => 0,
'public' => 1,
- 'editable' => 1,
+ 'editable' => true,
'icon' => 'um-icon-social-reddit',
'url_target' => '_blank',
'url_rel' => 'nofollow',
@@ -1113,7 +1113,7 @@ if ( ! class_exists( 'um\core\Builtin' ) ) {
'label' => __( 'YouTube', 'ultimate-member' ),
'required' => 0,
'public' => 1,
- 'editable' => 1,
+ 'editable' => true,
'url_target' => '_blank',
'url_rel' => 'nofollow',
'icon' => 'um-faicon-youtube',
@@ -1134,7 +1134,7 @@ if ( ! class_exists( 'um\core\Builtin' ) ) {
'label' => __( 'SoundCloud', 'ultimate-member' ),
'required' => 0,
'public' => 1,
- 'editable' => 1,
+ 'editable' => true,
'url_target' => '_blank',
'url_rel' => 'nofollow',
'icon' => 'um-faicon-soundcloud',
@@ -1153,7 +1153,7 @@ if ( ! class_exists( 'um\core\Builtin' ) ) {
'placeholder' => 'Choose account type',
'required' => 0,
'public' => 1,
- 'editable' => 1,
+ 'editable' => true,
'options' => $um_roles,
),
@@ -1164,7 +1164,7 @@ if ( ! class_exists( 'um\core\Builtin' ) ) {
'label' => __('Account Type','ultimate-member'),
'required' => 0,
'public' => 1,
- 'editable' => 1,
+ 'editable' => true,
'options' => $um_roles,
),
@@ -1176,7 +1176,7 @@ if ( ! class_exists( 'um\core\Builtin' ) ) {
'placeholder' => __('Select languages','ultimate-member'),
'required' => 0,
'public' => 1,
- 'editable' => 1,
+ 'editable' => true,
'options' => $this->get('languages'),
),
@@ -1187,7 +1187,7 @@ if ( ! class_exists( 'um\core\Builtin' ) ) {
'label' => __('Phone Number','ultimate-member'),
'required' => 0,
'public' => 1,
- 'editable' => 1,
+ 'editable' => true,
'validate' => 'phone_number',
'icon' => 'um-faicon-phone',
),
@@ -1199,7 +1199,7 @@ if ( ! class_exists( 'um\core\Builtin' ) ) {
'label' => __('Mobile Number','ultimate-member'),
'required' => 0,
'public' => 1,
- 'editable' => 1,
+ 'editable' => true,
'validate' => 'phone_number',
'icon' => 'um-faicon-mobile',
),
@@ -1242,7 +1242,7 @@ if ( ! class_exists( 'um\core\Builtin' ) ) {
'placeholder' => __('Enter your username or email','ultimate-member'),
'required' => 1,
'public' => 1,
- 'editable' => 0,
+ 'editable' => false,
'private_use' => true,
),
@@ -1256,7 +1256,7 @@ if ( ! class_exists( 'um\core\Builtin' ) ) {
'help' => __( 'Who can see your public profile?', 'ultimate-member' ),
'required' => 0,
'public' => 1,
- 'editable' => 1,
+ 'editable' => true,
'default' => 'Everyone',
'options' => $profile_privacy,
'allowclear' => 0,
@@ -1272,7 +1272,7 @@ if ( ! class_exists( 'um\core\Builtin' ) ) {
'help' => __( 'Hide my profile for robots?', 'ultimate-member' ),
'required' => 0,
'public' => 1,
- 'editable' => 1,
+ 'editable' => true,
'default' => UM()->roles()->um_user_can( 'profile_noindex' ) ? '1' : '0',
'options' => array(
'0' => __( 'No', 'ultimate-member' ),
@@ -1291,7 +1291,7 @@ if ( ! class_exists( 'um\core\Builtin' ) ) {
'help' => __( 'Here you can hide yourself from appearing in public directory', 'ultimate-member' ),
'required' => 0,
'public' => 1,
- 'editable' => 1,
+ 'editable' => true,
'default' => UM()->member_directory()->get_hide_in_members_default() ? 'Yes' : 'No',
'options' => array(
'No' => __( 'No', 'ultimate-member' ),
@@ -1309,7 +1309,7 @@ if ( ! class_exists( 'um\core\Builtin' ) ) {
'help' => __( 'If you confirm, everything related to your profile will be deleted permanently from the site', 'ultimate-member' ),
'required' => 0,
'public' => 1,
- 'editable' => 1,
+ 'editable' => true,
'default' => __( 'No', 'ultimate-member' ),
'options' => array(
__( 'Yes', 'ultimate-member' ),
@@ -1325,7 +1325,7 @@ if ( ! class_exists( 'um\core\Builtin' ) ) {
'label' => __( 'Password', 'ultimate-member' ),
'required' => 1,
'public' => 1,
- 'editable' => 1,
+ 'editable' => true,
'account_only' => true,
),
diff --git a/includes/core/class-fields.php b/includes/core/class-fields.php
index c7171e38..026f6322 100644
--- a/includes/core/class-fields.php
+++ b/includes/core/class-fields.php
@@ -15,13 +15,13 @@ if ( ! class_exists( 'um\core\Fields' ) ) {
/**
- * @var string
+ * @var null|string
*/
- public $set_mode = '';
+ public $set_mode = null;
/**
- * @var int form_id
+ * @var null|int form_id
*/
public $set_id = null;
@@ -1547,30 +1547,39 @@ if ( ! class_exists( 'um\core\Fields' ) ) {
/**
* Get form fields
*
+ * @var null|int $form_id
+ *
* @return array
*/
public function get_fields() {
- if ( empty( $this->fields ) ) {
+ if ( empty( $this->set_id ) ) {
+ return array();
+ }
+
+ if ( empty( $this->fields[ $this->set_id ] ) ) {
/**
* Filters the form fields.
*
- * @param {array} $fields Form fields.
+ * @param {array} $fields Form fields.
+ * @param {int} $form_id Form ID. Since 2.6.11
*
* @return {array} Form fields.
*
* @since 1.3.x
+ * @since 2.6.11 Added Form ID attribute.
* @hook um_get_form_fields
*
* @example Extend form fields.
- * function my_form_fields( $fields ) {
+ * function my_form_fields( $fields, $form_id ) {
* // your code here
* return $fields;
* }
- * add_filter( 'um_get_form_fields', 'my_form_fields' );
+ * add_filter( 'um_get_form_fields', 'my_form_fields', 10, 2 );
*/
- $this->fields = apply_filters( 'um_get_form_fields', $this->fields );
+ $this->fields[ $this->set_id ] = apply_filters( 'um_get_form_fields', array(), $this->set_id );
}
- return $this->fields;
+
+ return $this->fields[ $this->set_id ];
}
/**
@@ -1581,7 +1590,7 @@ if ( ! class_exists( 'um\core\Fields' ) ) {
* @return mixed
* @throws \Exception
*/
- function get_field( $key ) {
+ public function get_field( $key ) {
$fields = $this->get_fields();
if ( isset( $fields ) && is_array( $fields ) && isset( $fields[ $key ] ) ) {
@@ -2085,7 +2094,7 @@ if ( ! class_exists( 'um\core\Fields' ) ) {
public function edit_field( $key, $data, $rule = false, $args = array() ) {
global $_um_profile_id;
- if ( isset( $data['is_block'] ) && 1 === (int) $data['is_block'] ) {
+ if ( ! empty( $data['is_block'] ) ) {
$form_suffix = '';
} else {
$form_suffix = UM()->form()->form_suffix;
@@ -2097,7 +2106,7 @@ if ( ! class_exists( 'um\core\Fields' ) ) {
$_um_profile_id = um_user( 'ID' );
}
- if ( isset( $data['is_block'] ) && 1 === (int) $data['is_block'] && ! is_user_logged_in() ) {
+ if ( ! empty( $data['is_block'] ) && ! is_user_logged_in() ) {
$_um_profile_id = 0;
}
@@ -2177,7 +2186,8 @@ if ( ! class_exists( 'um\core\Fields' ) ) {
if ( true === $this->editing && 'profile' === $this->set_mode ) {
if ( ! UM()->roles()->um_user_can( 'can_edit_everyone' ) ) {
- if ( empty( $data['editable'] ) ) {
+ // It's for a legacy case `array_key_exists( 'editable', $data )`.
+ if ( array_key_exists( 'editable', $data ) && empty( $data['editable'] ) ) {
$disabled = ' disabled="disabled" ';
}
}
@@ -3626,7 +3636,8 @@ if ( ! class_exists( 'um\core\Fields' ) ) {
$class = 'um-icon-android-radio-button-off';
}
- if ( empty( $data['editable'] ) ) {
+ // It's for a legacy case `array_key_exists( 'editable', $data )`.
+ if ( array_key_exists( 'editable', $data ) && empty( $data['editable'] ) ) {
$col_class .= ' um-field-radio-state-disabled';
}
@@ -3745,7 +3756,8 @@ if ( ! class_exists( 'um\core\Fields' ) ) {
$class = 'um-icon-android-checkbox-outline-blank';
}
- if ( empty( $data['editable'] ) ) {
+ // It's for a legacy case `array_key_exists( 'editable', $data )`.
+ if ( array_key_exists( 'editable', $data ) && empty( $data['editable'] ) ) {
$col_class .= ' um-field-radio-state-disabled';
}
@@ -4034,7 +4046,7 @@ if ( ! class_exists( 'um\core\Fields' ) ) {
* @return string|null
* @throws \Exception
*/
- function display( $mode, $args ) {
+ public function display( $mode, $args ) {
$output = null;
$this->global_args = $args;
@@ -4047,7 +4059,7 @@ if ( ! class_exists( 'um\core\Fields' ) ) {
UM()->form()->nonce = wp_create_nonce( 'um-profile-nonce' . UM()->user()->target_id );
}
- $this->set_id = $this->global_args['form_id'];
+ $this->set_id = absint( $this->global_args['form_id'] );
$this->field_icons = ( isset( $this->global_args['icons'] ) ) ? $this->global_args['icons'] : 'label';
@@ -4115,7 +4127,7 @@ if ( ! class_exists( 'um\core\Fields' ) ) {
if ( $col1_fields ) {
foreach ( $col1_fields as $key => $data ) {
if ( ! empty( $args['is_block'] ) ) {
- $data['is_block'] = 1;
+ $data['is_block'] = true;
}
$output .= $this->edit_field( $key, $data );
}
@@ -4129,7 +4141,7 @@ if ( ! class_exists( 'um\core\Fields' ) ) {
if ( $col1_fields ) {
foreach ( $col1_fields as $key => $data ) {
if ( ! empty( $args['is_block'] ) ) {
- $data['is_block'] = 1;
+ $data['is_block'] = true;
}
$output .= $this->edit_field( $key, $data );
}
@@ -4141,7 +4153,7 @@ if ( ! class_exists( 'um\core\Fields' ) ) {
if ( $col2_fields ) {
foreach ( $col2_fields as $key => $data ) {
if ( ! empty( $args['is_block'] ) ) {
- $data['is_block'] = 1;
+ $data['is_block'] = true;
}
$output .= $this->edit_field( $key, $data );
}
@@ -4540,7 +4552,7 @@ if ( ! class_exists( 'um\core\Fields' ) ) {
* @return string|null
* @throws \Exception
*/
- function display_view( $mode, $args ) {
+ public function display_view( $mode, $args ) {
$output = null;
$this->global_args = $args;
@@ -4548,7 +4560,7 @@ if ( ! class_exists( 'um\core\Fields' ) ) {
UM()->form()->form_suffix = '-' . $this->global_args['form_id'];
$this->set_mode = $mode;
- $this->set_id = $this->global_args['form_id'];
+ $this->set_id = absint( $this->global_args['form_id'] );
$this->field_icons = ( isset( $this->global_args['icons'] ) ) ? $this->global_args['icons'] : 'label';
diff --git a/includes/core/class-form.php b/includes/core/class-form.php
index 8821984f..6a3b74d4 100644
--- a/includes/core/class-form.php
+++ b/includes/core/class-form.php
@@ -710,7 +710,7 @@ if ( ! class_exists( 'um\core\Form' ) ) {
public function beautify( $form ) {
if ( isset( $form['form_id'] ) ) {
$this->form_suffix = '-' . $form['form_id'];
- $this->processing = $form['form_id'];
+ $this->processing = absint( $form['form_id'] );
foreach ( $form as $key => $value ) {
if ( strstr( $key, $this->form_suffix ) ) {
@@ -1065,7 +1065,8 @@ if ( ! class_exists( 'um\core\Form' ) ) {
if ( strstr( $field_key, 'role_' ) && array_key_exists( 'options', $field_settings ) && is_array( $field_settings['options'] ) ) {
if ( isset( $this->post_form['mode'] ) && 'profile' === $this->post_form['mode'] ) {
- if ( empty( $field_settings['editable'] ) || ! um_can_edit_field( $field_settings ) ) {
+ // It's for a legacy case `array_key_exists( 'editable', $field_settings )`.
+ if ( ( array_key_exists( 'editable', $field_settings ) && empty( $field_settings['editable'] ) ) || ! um_can_edit_field( $field_settings ) ) {
continue;
}
}
diff --git a/includes/core/class-mail.php b/includes/core/class-mail.php
index 3610d467..b46854ea 100644
--- a/includes/core/class-mail.php
+++ b/includes/core/class-mail.php
@@ -435,7 +435,9 @@ if ( ! class_exists( 'um\core\Mail' ) ) {
do_action( 'um_before_email_notification_sending', $email, $template, $args );
$this->attachments = array();
- $this->headers = 'From: ' . stripslashes( UM()->options()->get( 'mail_from' ) ) . ' <' . UM()->options()->get( 'mail_from_addr' ) . '>' . "\r\n";
+ $mail_from = UM()->options()->get( 'mail_from' ) ? UM()->options()->get( 'mail_from' ) : get_bloginfo( 'name' );
+ $mail_from_addr = UM()->options()->get( 'mail_from_addr' ) ? UM()->options()->get( 'mail_from_addr' ) : get_bloginfo( 'admin_email' );
+ $this->headers = 'From: ' . stripslashes( $mail_from ) . ' <' . $mail_from_addr . '>' . "\r\n";
add_filter( 'um_template_tags_patterns_hook', array( UM()->mail(), 'add_placeholder' ), 10, 1 );
add_filter( 'um_template_tags_replaces_hook', array( UM()->mail(), 'add_replace_placeholder' ), 10, 1 );
diff --git a/includes/core/class-password.php b/includes/core/class-password.php
index d62a712f..a5e1c882 100644
--- a/includes/core/class-password.php
+++ b/includes/core/class-password.php
@@ -170,7 +170,7 @@ if ( ! class_exists( 'um\core\Password' ) ) {
return '';
}
- UM()->fields()->set_id = $args['form_id'];
+ UM()->fields()->set_id = absint( $args['form_id'] );
ob_start();
diff --git a/includes/core/class-shortcodes.php b/includes/core/class-shortcodes.php
index 896019dd..063a09ee 100644
--- a/includes/core/class-shortcodes.php
+++ b/includes/core/class-shortcodes.php
@@ -203,7 +203,7 @@ if ( ! class_exists( 'um\core\Shortcodes' ) ) {
if ( ! empty( $role ) && ! empty( $role['status'] ) ) {
$message_key = $role['status'] . '_message';
- $this->custom_message = ! empty( $role[ $message_key ] ) ? stripslashes( $role[ $message_key ] ) : '';
+ $this->custom_message = ! empty( $role[ $message_key ] ) ? $this->convert_user_tags( stripslashes( $role[ $message_key ] ) ) : '';
}
}
}
@@ -602,6 +602,20 @@ if ( ! class_exists( 'um\core\Shortcodes' ) ) {
* @return string
*/
public function ultimatemember( $args = array() ) {
+ // There is possible to use 'shortcode_atts_ultimatemember' filter for getting customized `$args`.
+ $args = shortcode_atts(
+ array(
+ 'form_id' => '',
+ 'is_block' => false,
+ ),
+ $args,
+ 'ultimatemember'
+ );
+
+ // Sanitize shortcode arguments.
+ $args['form_id'] = ! empty( $args['form_id'] ) ? absint( $args['form_id'] ) : '';
+ $args['is_block'] = (bool) $args['is_block'];
+
/**
* Filters variable for enable singleton shortcode loading on the same page.
* Note: Set it to `false` if you don't need to render the same form twice or more on the same page.
@@ -648,7 +662,11 @@ if ( ! class_exists( 'um\core\Shortcodes' ) ) {
if ( ! array_key_exists( 'form_id', $args ) ) {
return '';
}
+
$this->form_id = $args['form_id'];
+ if ( empty( $this->form_id ) ) {
+ return '';
+ }
$this->form_status = get_post_status( $this->form_id );
if ( 'publish' !== $this->form_status ) {
@@ -765,7 +783,7 @@ if ( ! class_exists( 'um\core\Shortcodes' ) ) {
}
}
- if ( isset( $args['is_block'] ) && 1 === (int) $args['is_block'] && 'profile' === $mode && ! is_user_logged_in() ) {
+ if ( 'profile' === $mode && ! empty( $args['is_block'] ) && ! is_user_logged_in() ) {
ob_get_clean();
return '';
}
@@ -805,6 +823,12 @@ if ( ! class_exists( 'um\core\Shortcodes' ) ) {
}
}
+ $content = apply_filters( 'um_force_shortcode_render', false, $args );
+ if ( false !== $content ) {
+ ob_get_clean();
+ return $content;
+ }
+
/**
* Fires before loading form shortcode.
*
@@ -1119,16 +1143,14 @@ if ( ! class_exists( 'um\core\Shortcodes' ) ) {
return um_convert_tags( $str, array(), false );
}
-
/**
* Convert user tags in a string
*
- * @param $str
+ * @param string $str
*
- * @return mixed
+ * @return string
*/
- function convert_user_tags( $str ) {
-
+ public function convert_user_tags( $str ) {
$pattern_array = array(
'{first_name}',
'{last_name}',
@@ -1136,89 +1158,97 @@ if ( ! class_exists( 'um\core\Shortcodes' ) ) {
'{user_avatar_small}',
'{username}',
'{nickname}',
+ '{user_email}',
);
-
/**
- * UM hook
+ * Filters the user placeholders patterns.
*
- * @type filter
- * @title um_allowed_user_tags_patterns
- * @description Extend user placeholders patterns
- * @input_vars
- * [{"var":"$patterns","type":"array","desc":"Placeholders"}]
- * @change_log
- * ["Since: 2.0"]
- * @usage
- *
- * @example
- * Add the `{user_description}` placeholder.
* function my_allowed_user_tags( $patterns ) {
- * // your code here
+ * $patterns[] = '{user_description}';
* return $patterns;
* }
- * ?>
+ * add_filter( 'um_allowed_user_tags_patterns', 'my_allowed_user_tags' );
*/
$pattern_array = apply_filters( 'um_allowed_user_tags_patterns', $pattern_array );
-
- //$matches = false;
foreach ( $pattern_array as $pattern ) {
-
if ( preg_match( $pattern, $str ) ) {
- $value = '';
+ $value = '';
+ $usermeta = str_replace( array( '{', '}' ), '', $pattern );
if ( is_user_logged_in() ) {
- $usermeta = str_replace( '{', '', $pattern );
- $usermeta = str_replace( '}', '', $usermeta );
-
- if ( $usermeta == 'user_avatar_small' ) {
+ if ( 'user_avatar_small' === $usermeta ) {
$value = get_avatar( um_user( 'ID' ), 40 );
} elseif ( um_user( $usermeta ) ) {
$value = um_user( $usermeta );
}
- if ( $usermeta == 'username' ) {
+ if ( 'username' === $usermeta ) {
$value = um_user( 'user_login' );
}
- if ( $usermeta == 'nickname' ) {
+ if ( 'nickname' === $usermeta ) {
$value = um_profile( 'nickname' );
}
+ if ( 'user_email' === $usermeta ) {
+ $value = um_user( 'user_email' );
+ }
+
/**
- * UM hook
+ * Filters the user placeholders value of pattern for logged-in user.
*
- * @type filter
- * @title um_profile_tag_hook__{$usermeta}
- * @description Change usermeta field value
- * @input_vars
- * [{"var":"$value","type":"array","desc":"Meta field value"},
- * {"var":"$user_id","type":"array","desc":"User ID"}]
- * @change_log
- * ["Since: 2.0"]
- * @usage
- *
- * @example
- * Add the replacement value for `{user_description}` placeholder.
+ * function my_user_description( $value, $user_id ) {
+ * $value = get_user_meta( $user_id, 'user_description', true );
* return $value;
* }
- * ?>
+ * add_filter( 'um_profile_tag_hook__user_description', 'my_user_description', 10, 2 );
*/
$value = apply_filters( "um_profile_tag_hook__{$usermeta}", $value, um_user( 'ID' ) );
+ } else {
+ /**
+ * Filters the user placeholders value of pattern for not logged-in user.
+ *
+ * @since 2.6.11
+ * @hook um_profile_nopriv_tag_hook__{$usermeta}
+ *
+ * @param {string} $value User meta field value.
+ *
+ * @return {string} User meta field value.
+ *
+ * @example Add the replacement value for `{user_description}` placeholder for not logged-in user.
+ * function my_nopriv_user_description( $value ) {
+ * $value = ! empty( $_GET['user_description'] ) ? sanitize_text_field( $_GET['user_description'] ) : '';
+ * return $value;
+ * }
+ * add_filter( 'um_profile_nopriv_tag_hook__user_description', 'my_nopriv_user_description' );
+ */
+ $value = apply_filters( "um_profile_nopriv_tag_hook__{$usermeta}", $value );
}
$str = preg_replace( '/' . $pattern . '/', $value, $str );
}
-
}
return $str;
}
-
/**
* Shortcode: Show custom content to specific role
*
diff --git a/includes/core/class-user.php b/includes/core/class-user.php
index 5da5373c..21276e42 100644
--- a/includes/core/class-user.php
+++ b/includes/core/class-user.php
@@ -1,9 +1,9 @@
fields()->editing ) {
if ( um_get_requested_user() ) {
if ( ! UM()->roles()->um_current_user_can( 'edit', um_get_requested_user() ) ) {
diff --git a/includes/core/um-actions-register.php b/includes/core/um-actions-register.php
index a0aaa51a..fee265bc 100644
--- a/includes/core/um-actions-register.php
+++ b/includes/core/um-actions-register.php
@@ -282,6 +282,27 @@ function um_check_user_status( $user_id, $args, $form_data = null ) {
// Add only priority role to URL.
$url = add_query_arg( 'um_role', esc_attr( um_user( 'role' ) ), $url );
$url = add_query_arg( 'um_form_id', esc_attr( $form_data['form_id'] ), $url );
+ /**
+ * Filters the redirect URL for user after registration based on its status when need to show message.
+ *
+ * @since 2.6.11
+ * @hook um_registration_show_message_redirect_url
+ *
+ * @param {string} $url Redirect URL.
+ * @param {string} $status User status.
+ * @param {int} $user_id User ID.
+ * @param {array} $form_data Form data.
+ *
+ * @return {string} Redirect URL.
+ *
+ * @example Change redirect URL for user after registration based on its status when need to show message.
+ * function my_um_registration_show_message_redirect_url( $url, $status, $user_id ) {
+ * // your code here
+ * return $url;
+ * }
+ * add_filter( 'um_registration_show_message_redirect_url', 'my_um_registration_show_message_redirect_url', 10, 4 );
+ */
+ $url = apply_filters( 'um_registration_show_message_redirect_url', $url, $status, um_user( 'ID' ), $form_data );
// Not `um_safe_redirect()` because UM()->permalinks()->get_current_url() is situated on the same host.
wp_safe_redirect( $url );
exit;
@@ -742,12 +763,12 @@ function um_registration_set_profile_full_name( $user_id, $args ) {
add_action( 'um_registration_set_extra_data', 'um_registration_set_profile_full_name', 10, 2 );
/**
- * Redirect from default registration to UM registration page
+ * Redirect from default registration to UM registration page
*/
function um_form_register_redirect() {
- $page_id = UM()->options()->get( UM()->options()->get_core_page_id( 'register' ) );
- $register_post = get_post( $page_id );
- if ( ! empty( $register_post ) ) {
+ $page_id = UM()->options()->get( UM()->options()->get_core_page_id( 'register' ) );
+ // Do not redirect if the registration page is not published.
+ if ( ! empty( $page_id ) && 'publish' === get_post_status( $page_id ) ) {
// Not `um_safe_redirect()` because predefined register page is situated on the same host.
wp_safe_redirect( get_permalink( $page_id ) );
exit();
diff --git a/includes/core/um-filters-fields.php b/includes/core/um-filters-fields.php
index b4b7e41d..1727b234 100644
--- a/includes/core/um-filters-fields.php
+++ b/includes/core/um-filters-fields.php
@@ -511,25 +511,21 @@ add_filter( 'um_profile_field_filter_hook__', 'um_profile_field_filter_hook__',
/**
* Get form fields
*
- * @param $array
+ * @param string|array $array
+ * @param int $form_id
*
- * @return mixed|string
+ * @return array|string
*/
-function um_get_form_fields( $array ) {
-
- $form_id = (isset ( UM()->fields()->set_id ) ) ? UM()->fields()->set_id : null;
- $mode = (isset( UM()->fields()->set_mode ) ) ? UM()->fields()->set_mode : null;
-
- if ( $form_id && $mode ) {
- $array = UM()->query()->get_attr('custom_fields', $form_id );
+function um_get_form_fields( $array, $form_id ) {
+ if ( $form_id && UM()->fields()->set_mode ) {
+ $array = UM()->query()->get_attr( 'custom_fields', $form_id );
} else {
$array = '';
}
return $array;
-
}
-add_filter( 'um_get_form_fields', 'um_get_form_fields', 99 );
+add_filter( 'um_get_form_fields', 'um_get_form_fields', 99, 2 );
/**
diff --git a/includes/um-short-functions.php b/includes/um-short-functions.php
index 7f82e9ff..8fedfccd 100644
--- a/includes/um-short-functions.php
+++ b/includes/um-short-functions.php
@@ -1667,7 +1667,8 @@ function um_can_edit_field( $data ) {
$can_edit = false;
} else {
if ( ! UM()->roles()->um_user_can( 'can_edit_everyone' ) ) {
- if ( empty( $data['editable'] ) ) {
+ // It's for a legacy case `array_key_exists( 'editable', $data )`.
+ if ( array_key_exists( 'editable', $data ) && empty( $data['editable'] ) ) {
$can_edit = false;
} else {
if ( ! um_is_user_himself() ) {
@@ -2303,7 +2304,7 @@ function um_get_default_cover_uri() {
* @param $data
* @param null $attrs
*
- * @return string|array
+ * @return int|string|array
*/
function um_user( $data, $attrs = null ) {
diff --git a/readme.txt b/readme.txt
index d096b04c..d611a68a 100644
--- a/readme.txt
+++ b/readme.txt
@@ -7,7 +7,7 @@ Tags: community, member, membership, user-profile, user-registration
Requires PHP: 5.6
Requires at least: 5.5
Tested up to: 6.3
-Stable tag: 2.6.10
+Stable tag: 2.6.11
License: GNU Version 2 or Any Later Version
License URI: http://www.gnu.org/licenses/gpl-3.0.txt
@@ -166,6 +166,16 @@ 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.6.11: September 06, 2023 =
+
+* Bugfixes:
+
+ - Fixed: Empty mail From data when there isn't set an option
+ - Fixed: Nonce validation for the admin actions handler
+ - Fixed: REST API endpoint List Pages redirecting to the homepage
+ - Fixed: Standardize the 'editable' attribute for the UM fields and hooks that can extend these fields
+ - Fixed: Redirection from default WordPress registration to UM registration page (if it's not a published)
+
= 2.6.10: August 17, 2023 =
* Enhancements:
diff --git a/ultimate-member.php b/ultimate-member.php
index e93c957c..5e8517cd 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.6.10
+ * Version: 2.6.11
* Author: Ultimate Member
* Author URI: http://ultimatemember.com/
* Text Domain: ultimate-member