|
- query()->count_users(); ?>
+ query()->count_users() ); ?>
-
+
|
-
- query()->count_users_by_status( 'awaiting_admin_review' ); ?>
-
-
-
-
+
+ query()->count_users_by_status( 'awaiting_admin_review' ) ); ?>
+
+
+
+
|
|
-
- query()->count_users_by_status( 'approved' ); ?>
-
-
-
-
+
+ query()->count_users_by_status( 'approved' ) ); ?>
+
+
+
+
|
-
- query()->count_users_by_status( 'awaiting_email_confirmation' ); ?>
-
-
-
-
+
+ query()->count_users_by_status( 'awaiting_email_confirmation' ) ); ?>
+
+
+
+
|
|
-
- query()->count_users_by_status( 'rejected' ); ?>
-
-
-
-
+
+ query()->count_users_by_status( 'rejected' ) ); ?>
+
+
+
+
+
|
-
- query()->count_users_by_status( 'inactive' ); ?>
-
-
-
-
+
+ query()->count_users_by_status( 'inactive' ) ); ?>
+
+
+
+
|
diff --git a/includes/admin/templates/role/admin-permissions.php b/includes/admin/templates/role/admin-permissions.php
index 524ca8b5..c38ebd92 100644
--- a/includes/admin/templates/role/admin-permissions.php
+++ b/includes/admin/templates/role/admin-permissions.php
@@ -1,61 +1,66 @@
-
-
-
+
- admin_forms( array(
- 'class' => 'um-role-admin um-half-column',
- 'prefix_id' => 'role',
- 'fields' => array(
- array(
- 'id' => '_um_can_access_wpadmin',
- 'type' => 'checkbox',
- 'label' => __( 'Can access wp-admin?', 'ultimate-member' ),
- 'tooltip' => __( 'The core admin role must always have access to wp-admin / WordPress backend', 'ultimate-member' ),
- 'value' => ! empty( $role['_um_can_access_wpadmin'] ) ? $role['_um_can_access_wpadmin'] : 0,
+ admin_forms(
+ array(
+ 'class' => 'um-role-admin um-half-column',
+ 'prefix_id' => 'role',
+ 'fields' => array(
+ array(
+ 'id' => '_um_can_access_wpadmin',
+ 'type' => 'checkbox',
+ 'label' => __( 'Can access wp-admin?', 'ultimate-member' ),
+ 'tooltip' => __( 'The core admin role must always have access to wp-admin / WordPress backend', 'ultimate-member' ),
+ 'value' => ! empty( $role['_um_can_access_wpadmin'] ) ? $role['_um_can_access_wpadmin'] : 0,
+ ),
+ array(
+ 'id' => '_um_can_not_see_adminbar',
+ 'type' => 'checkbox',
+ 'label' => __( 'Force hiding adminbar in frontend?', 'ultimate-member' ),
+ 'tooltip' => __( 'Mark this option if you need to hide the adminbar on frontend for this role', 'ultimate-member' ),
+ 'value' => isset( $role['_um_can_not_see_adminbar'] ) ? $role['_um_can_not_see_adminbar'] : 1,
+ ),
+ array(
+ 'id' => '_um_can_edit_everyone',
+ 'type' => 'checkbox',
+ 'label' => __( 'Can edit other member accounts?', 'ultimate-member' ),
+ 'tooltip' => __( 'Allow this role to edit accounts of other members', 'ultimate-member' ),
+ 'value' => ! empty( $role['_um_can_edit_everyone'] ) ? $role['_um_can_edit_everyone'] : 0,
+ ),
+ array(
+ 'id' => '_um_can_edit_roles',
+ 'type' => 'select',
+ 'label' => __( 'Can edit these user roles only', 'ultimate-member' ),
+ 'tooltip' => __( 'Multiple selections of which roles this role can edit, none selected to allow this role to edit all member roles.', 'ultimate-member' ),
+ 'options' => UM()->roles()->get_roles(),
+ 'multi' => true,
+ 'value' => ! empty( $role['_um_can_edit_roles'] ) ? $role['_um_can_edit_roles'] : array(),
+ 'conditional' => array( '_um_can_edit_everyone', '=', '1' ),
+ ),
+ array(
+ 'id' => '_um_can_delete_everyone',
+ 'type' => 'checkbox',
+ 'label' => __( 'Can delete other member accounts?', 'ultimate-member' ),
+ 'tooltip' => __( 'Allow this role to delete other user accounts.', 'ultimate-member' ),
+ 'value' => ! empty( $role['_um_can_delete_everyone'] ) ? $role['_um_can_delete_everyone'] : 0,
+ ),
+ array(
+ 'id' => '_um_can_delete_roles',
+ 'type' => 'select',
+ 'label' => __( 'Can delete these user roles only', 'ultimate-member' ),
+ 'tooltip' => __( 'Multiple selections of which roles this role can delete, none selected to allow this role to delete all member roles', 'ultimate-member' ),
+ 'options' => UM()->roles()->get_roles(),
+ 'multi' => true,
+ 'value' => ! empty( $role['_um_can_delete_roles'] ) ? $role['_um_can_delete_roles'] : array(),
+ 'conditional' => array( '_um_can_delete_everyone', '=', '1' ),
+ )
),
- array(
- 'id' => '_um_can_not_see_adminbar',
- 'type' => 'checkbox',
- 'label' => __( 'Force hiding adminbar in frontend?', 'ultimate-member' ),
- 'tooltip' => __( 'Mark this option if you need to hide the adminbar on frontend for this role', 'ultimate-member' ),
- 'value' => isset( $role['_um_can_not_see_adminbar'] ) ? $role['_um_can_not_see_adminbar'] : 1,
- ),
- array(
- 'id' => '_um_can_edit_everyone',
- 'type' => 'checkbox',
- 'label' => __( 'Can edit other member accounts?', 'ultimate-member' ),
- 'tooltip' => __( 'Allow this role to edit accounts of other members', 'ultimate-member' ),
- 'value' => ! empty( $role['_um_can_edit_everyone'] ) ? $role['_um_can_edit_everyone'] : 0,
- ),
- array(
- 'id' => '_um_can_edit_roles',
- 'type' => 'select',
- 'label' => __( 'Can edit these user roles only', 'ultimate-member' ),
- 'tooltip' => __( 'Which roles that role can edit, choose none to allow role to edit all member roles', 'ultimate-member' ),
- 'options' => UM()->roles()->get_roles(),
- 'multi' => true,
- 'value' => ! empty( $role['_um_can_edit_roles'] ) ? $role['_um_can_edit_roles'] : array(),
- 'conditional' => array( '_um_can_edit_everyone', '=', '1' )
- ),
- array(
- 'id' => '_um_can_delete_everyone',
- 'type' => 'checkbox',
- 'label' => __( 'Can delete other member accounts?', 'ultimate-member' ),
- 'tooltip' => __( 'Allow this role to delete other user accounts.', 'ultimate-member' ),
- 'value' => ! empty( $role['_um_can_delete_everyone'] ) ? $role['_um_can_delete_everyone'] : 0,
- ),
- array(
- 'id' => '_um_can_delete_roles',
- 'type' => 'select',
- 'label' => __( 'Can delete these user roles only', 'ultimate-member' ),
- 'tooltip' => __( 'Which roles that role can edit, choose none to allow role to edit all member roles', 'ultimate-member' ),
- 'options' => UM()->roles()->get_roles(),
- 'multi' => true,
- 'value' => ! empty( $role['_um_can_delete_roles'] ) ? $role['_um_can_delete_roles'] : array(),
- 'conditional' => array( '_um_can_delete_everyone', '=', '1' )
- )
)
- ) )->render_form(); ?>
+ )->render_form();
+ ?>
diff --git a/includes/admin/templates/role/profile.php b/includes/admin/templates/role/profile.php
index b5c95bdb..ee2c3378 100644
--- a/includes/admin/templates/role/profile.php
+++ b/includes/admin/templates/role/profile.php
@@ -1,61 +1,65 @@
-
-
-
+
- admin_forms( array(
- 'class' => 'um-role-profile um-half-column',
- 'prefix_id' => 'role',
- 'fields' => array(
- array(
- 'id' => '_um_can_view_all',
- 'type' => 'checkbox',
- 'label' => __( 'Can view other member profiles?', 'ultimate-member' ),
- 'tooltip' => __( 'Can this role view all member profiles?', 'ultimate-member' ),
- 'value' => ! empty( $role['_um_can_view_all'] ) ? $role['_um_can_view_all'] : 0,
+ admin_forms(
+ array(
+ 'class' => 'um-role-profile um-half-column',
+ 'prefix_id' => 'role',
+ 'fields' => array(
+ array(
+ 'id' => '_um_can_view_all',
+ 'type' => 'checkbox',
+ 'label' => __( 'Can view other member profiles?', 'ultimate-member' ),
+ 'tooltip' => __( 'Can this role view all member profiles?', 'ultimate-member' ),
+ 'value' => ! empty( $role['_um_can_view_all'] ) ? $role['_um_can_view_all'] : 0,
+ ),
+ array(
+ 'id' => '_um_can_view_roles',
+ 'type' => 'select',
+ 'label' => __( 'Can view these user roles only', 'ultimate-member' ),
+ 'tooltip' => __( 'Multiple selections of which roles this role can view, none selected to allow this role to view all member roles.', 'ultimate-member' ),
+ 'options' => UM()->roles()->get_roles(),
+ 'multi' => true,
+ 'value' => ! empty( $role['_um_can_view_roles'] ) ? $role['_um_can_view_roles'] : array(),
+ 'conditional' => array( '_um_can_view_all', '=', '1' ),
+ ),
+ array(
+ 'id' => '_um_can_make_private_profile',
+ 'type' => 'checkbox',
+ 'name' => '_um_can_make_private_profile',
+ 'label' => __( 'Can make their profile private?', 'ultimate-member' ),
+ 'tooltip' => __( 'Can this role make their profile private?', 'ultimate-member' ),
+ 'value' => ! empty( $role['_um_can_make_private_profile'] ) ? $role['_um_can_make_private_profile'] : 0,
+ ),
+ array(
+ 'id' => '_um_can_access_private_profile',
+ 'type' => 'checkbox',
+ 'name' => '_um_can_access_private_profile',
+ 'label' => __( 'Can view/access private profiles?', 'ultimate-member' ),
+ 'tooltip' => __( 'Can this role view private profiles?', 'ultimate-member' ),
+ 'value' => ! empty( $role['_um_can_access_private_profile'] ) ? $role['_um_can_access_private_profile'] : 0,
+ ),
+ array(
+ 'id' => '_um_profile_noindex',
+ 'type' => 'select',
+ 'size' => 'medium',
+ 'name' => '_um_profile_noindex',
+ 'label' => __( 'Avoid indexing profile by search engines', 'ultimate-member' ),
+ 'tooltip' => __( 'Hides the profile page for robots. The default value depends on the General > Users setting.', 'ultimate-member' ),
+ 'options' => array(
+ '' => __( 'Default', 'ultimate-member' ),
+ '0' => __( 'No', 'ultimate-member' ),
+ '1' => __( 'Yes', 'ultimate-member' ),
+ ),
+ 'value' => array_key_exists( '_um_profile_noindex', $role ) ? $role['_um_profile_noindex'] : '',
+ ),
),
- array(
- 'id' => '_um_can_view_roles',
- 'type' => 'select',
- 'label' => __( 'Can view these user roles only', 'ultimate-member' ),
- 'tooltip' => __( 'Which roles that role can view, choose none to allow role to view all member roles', 'ultimate-member' ),
- 'options' => UM()->roles()->get_roles(),
- 'multi' => true,
- 'value' => ! empty( $role['_um_can_view_roles'] ) ? $role['_um_can_view_roles'] : array(),
- 'conditional' => array( '_um_can_view_all', '=', '1' )
- ),
- array(
- 'id' => '_um_can_make_private_profile',
- 'type' => 'checkbox',
- 'name' => '_um_can_make_private_profile',
- 'label' => __( 'Can make their profile private?', 'ultimate-member' ),
- 'tooltip' => __( 'Can this role make their profile private?', 'ultimate-member' ),
- 'value' => ! empty( $role['_um_can_make_private_profile'] ) ? $role['_um_can_make_private_profile'] : 0,
- ),
- array(
- 'id' => '_um_can_access_private_profile',
- 'type' => 'checkbox',
- 'name' => '_um_can_access_private_profile',
- 'label' => __( 'Can view/access private profiles?', 'ultimate-member' ),
- 'tooltip' => __( 'Can this role view private profiles?', 'ultimate-member' ),
- 'value' => ! empty( $role['_um_can_access_private_profile'] ) ? $role['_um_can_access_private_profile'] : 0,
- ),
- array(
- 'id' => '_um_profile_noindex',
- 'type' => 'select',
- 'size' => 'medium',
- 'name' => '_um_profile_noindex',
- 'label' => __( 'Avoid indexing profile by search engines', 'ultimate-member' ),
- 'tooltip' => __( 'Hides the profile page for robots. The default value depends on the General > Users setting.', 'ultimate-member' ),
- 'options' => [
- '' => __( 'Default', 'ultimate-member' ),
- '0' => __( 'No', 'ultimate-member' ),
- '1' => __( 'Yes', 'ultimate-member' ),
- ],
- 'value' => array_key_exists( '_um_profile_noindex', $role ) ? $role['_um_profile_noindex'] : '',
- )
)
- ) )->render_form(); ?>
-
-
\ No newline at end of file
+ )->render_form();
+ ?>
+
diff --git a/includes/admin/templates/role/register.php b/includes/admin/templates/role/register.php
index 3952a31b..d2776d9a 100644
--- a/includes/admin/templates/role/register.php
+++ b/includes/admin/templates/role/register.php
@@ -1,113 +1,121 @@
-
-
+
- admin_forms( array(
- 'class' => 'um-role-register um-half-column',
- 'prefix_id' => 'role',
- 'fields' => array(
- array(
- 'id' => '_um_status',
- 'type' => 'select',
- 'label' => __( 'Registration Status', 'ultimate-member' ),
- 'tooltip' => __( 'Select the status you would like this user role to have after they register on your site', 'ultimate-member' ),
- 'value' => ! empty( $role['_um_status'] ) ? __( $role['_um_status'] , 'ultimate-member' ) : array(),
- 'options' => array(
- 'approved' => __( 'Auto Approve', 'ultimate-member' ),
- 'checkmail' => __( 'Require Email Activation', 'ultimate-member' ),
- 'pending' => __( 'Require Admin Review', 'ultimate-member' )
+ admin_forms(
+ array(
+ 'class' => 'um-role-register um-half-column',
+ 'prefix_id' => 'role',
+ 'fields' => array(
+ array(
+ 'id' => '_um_status',
+ 'type' => 'select',
+ 'label' => __( 'Registration Status', 'ultimate-member' ),
+ 'tooltip' => __( 'Select the status you would like this user role to have after they register on your site', 'ultimate-member' ),
+ 'value' => ! empty( $role_data['_um_status'] ) ? $role_data['_um_status'] : array(),
+ 'options' => array(
+ 'approved' => __( 'Auto Approve', 'ultimate-member' ),
+ 'checkmail' => __( 'Require Email Activation', 'ultimate-member' ),
+ 'pending' => __( 'Require Admin Review', 'ultimate-member' ),
+ ),
),
- ),
- array(
- 'id' => '_um_auto_approve_act',
- 'type' => 'select',
- 'label' => __( 'Action to be taken after registration', 'ultimate-member' ),
- 'tooltip' => __( 'Select what action is taken after a person registers on your site. Depending on the status you can redirect them to their profile, a custom url or show a custom message', 'ultimate-member' ),
- 'value' => ! empty( $role['_um_auto_approve_act'] ) ? __( $role['_um_auto_approve_act'], 'ultimate-member' ) : array(),
- 'options' => array(
- 'redirect_profile' => __( 'Redirect to profile', 'ultimate-member' ),
- 'redirect_url' => __( 'Redirect to URL', 'ultimate-member' ),
+ array(
+ 'id' => '_um_auto_approve_act',
+ 'type' => 'select',
+ 'label' => __( 'Action to be taken after registration', 'ultimate-member' ),
+ 'tooltip' => __( 'Select what action is taken after a person registers on your site. Depending on the status you can redirect them to their profile, a custom url or show a custom message', 'ultimate-member' ),
+ 'value' => ! empty( $role_data['_um_auto_approve_act'] ) ? $role_data['_um_auto_approve_act'] : array(),
+ 'options' => array(
+ 'redirect_profile' => __( 'Redirect to profile', 'ultimate-member' ),
+ 'redirect_url' => __( 'Redirect to URL', 'ultimate-member' ),
+ ),
+ 'conditional' => array( '_um_status', '=', 'approved' ),
),
- 'conditional' => array( '_um_status', '=', 'approved' )
- ),
- array(
- 'id' => '_um_auto_approve_url',
- 'type' => 'text',
- 'label' => __( 'Set Custom Redirect URL', 'ultimate-member' ),
- 'value' => ! empty( $role['_um_auto_approve_url'] ) ? __( $role['_um_auto_approve_url'], 'ultimate-member' ) : '',
- 'conditional' => array( '_um_auto_approve_act', '=', 'redirect_url' )
- ),
- array(
- 'id' => '_um_login_email_activate',
- 'type' => 'checkbox',
- 'label' => __( 'Login user after validating the activation link?', 'ultimate-member' ),
- 'tooltip' => __( 'Login the user after validating the activation link', 'ultimate-member' ),
- 'value' => ! empty( $role['_um_login_email_activate'] ) ? __( $role['_um_login_email_activate'], 'ultimate-member' ) : 0,
- 'conditional' => array( '_um_status', '=', 'checkmail' )
- ),
- array(
- 'id' => '_um_checkmail_action',
- 'type' => 'select',
- 'label' => __( 'Action to be taken after registration', 'ultimate-member' ),
- 'tooltip' => __( 'Select what action is taken after a person registers on your site. Depending on the status you can redirect them to their profile, a custom url or show a custom message', 'ultimate-member' ),
- 'value' => ! empty( $role['_um_checkmail_action'] ) ? __( $role['_um_checkmail_action'], 'ultimate-member' ) : array(),
- 'options' => array(
- 'show_message' => __( 'Show custom message', 'ultimate-member' ),
- 'redirect_url' => __( 'Redirect to URL', 'ultimate-member' ),
+ array(
+ 'id' => '_um_auto_approve_url',
+ 'type' => 'text',
+ 'label' => __( 'Set Custom Redirect URL', 'ultimate-member' ),
+ 'value' => ! empty( $role_data['_um_auto_approve_url'] ) ? $role_data['_um_auto_approve_url'] : '',
+ 'conditional' => array( '_um_auto_approve_act', '=', 'redirect_url' ),
),
- 'conditional' => array( '_um_status', '=', 'checkmail' )
- ),
- array(
- 'id' => '_um_checkmail_message',
- 'type' => 'textarea',
- 'label' => __( 'Personalize the custom message', 'ultimate-member' ),
- 'value' => ! empty( $role['_um_checkmail_message'] ) ? __( $role['_um_checkmail_message'], 'ultimate-member' ) : __('Thank you for registering. Before you can login we need you to activate your account by clicking the activation link in the email we just sent you.','ultimate-member'),
- 'conditional' => array( '_um_checkmail_action', '=', 'show_message' )
- ),
- array(
- 'id' => '_um_checkmail_url',
- 'type' => 'text',
- 'label' => __( 'Set Custom Redirect URL', 'ultimate-member' ),
- 'value' => ! empty( $role['_um_checkmail_url'] ) ? __( $role['_um_checkmail_url'], 'ultimate-member' ) : '',
- 'conditional' => array( '_um_checkmail_action', '=', 'redirect_url' )
- ),
- array(
- 'id' => '_um_url_email_activate',
- 'type' => 'text',
- 'label' => __( 'URL redirect after email activation', 'ultimate-member' ),
- 'tooltip' => __( 'If you want users to go to a specific page other than login page after email activation, enter the URL here.', 'ultimate-member' ),
- 'value' => ! empty( $role['_um_url_email_activate'] ) ? __( $role['_um_url_email_activate'], 'ultimate-member' ) : '',
- 'conditional' => array( '_um_status', '=', 'checkmail' ),
- ),
- array(
- 'id' => '_um_pending_action',
- 'type' => 'select',
- 'label' => __( 'Action to be taken after registration', 'ultimate-member' ),
- 'tooltip' => __( 'Select what action is taken after a person registers on your site. Depending on the status you can redirect them to their profile, a custom url or show a custom message', 'ultimate-member' ),
- 'value' => ! empty( $role['_um_pending_action'] ) ? __( $role['_um_pending_action'], 'ultimate-member' ) : array(),
- 'options' => array(
- 'show_message' => __( 'Show custom message', 'ultimate-member' ),
- 'redirect_url' => __( 'Redirect to URL', 'ultimate-member' ),
+ array(
+ 'id' => '_um_checkmail_action',
+ 'type' => 'select',
+ 'label' => __( 'Action to be taken after registration', 'ultimate-member' ),
+ 'tooltip' => __( 'Select what action is taken after a person registers on your site. Depending on the status you can redirect them to their profile, a custom url or show a custom message', 'ultimate-member' ),
+ 'value' => ! empty( $role_data['_um_checkmail_action'] ) ? $role_data['_um_checkmail_action'] : array(),
+ 'options' => array(
+ 'show_message' => __( 'Show custom message', 'ultimate-member' ),
+ 'redirect_url' => __( 'Redirect to URL', 'ultimate-member' ),
+ ),
+ 'conditional' => array( '_um_status', '=', 'checkmail' ),
+ ),
+ array(
+ 'id' => '_um_checkmail_message',
+ 'type' => 'textarea',
+ 'label' => __( 'Personalize the custom message', 'ultimate-member' ),
+ 'value' => ! empty( $role_data['_um_checkmail_message'] ) ? $role_data['_um_checkmail_message'] : __( 'Thank you for registering. Before you can login we need you to activate your account by clicking the activation link in the email we just sent you.', 'ultimate-member' ),
+ 'conditional' => array( '_um_checkmail_action', '=', 'show_message' ),
+ ),
+ array(
+ 'id' => '_um_checkmail_url',
+ 'type' => 'text',
+ 'label' => __( 'Set Custom Redirect URL', 'ultimate-member' ),
+ 'value' => ! empty( $role_data['_um_checkmail_url'] ) ? $role_data['_um_checkmail_url'] : '',
+ 'conditional' => array( '_um_checkmail_action', '=', 'redirect_url' ),
+ ),
+ array(
+ 'id' => '_um_login_email_activate',
+ 'type' => 'checkbox',
+ 'label' => __( 'Login user after validating the activation link?', 'ultimate-member' ),
+ 'tooltip' => __( 'Login the user after validating the activation link', 'ultimate-member' ),
+ 'value' => ! empty( $role_data['_um_login_email_activate'] ) ? $role_data['_um_login_email_activate'] : 0,
+ 'conditional' => array( '_um_status', '=', 'checkmail' ),
+ ),
+ array(
+ 'id' => '_um_url_email_activate',
+ 'type' => 'text',
+ 'label' => __( 'URL redirect after email activation', 'ultimate-member' ),
+ 'tooltip' => __( 'If you want users to go to a specific page other than login page after email activation, enter the URL here.', 'ultimate-member' ),
+ 'value' => ! empty( $role_data['_um_url_email_activate'] ) ? $role_data['_um_url_email_activate'] : '',
+ 'conditional' => array( '_um_status', '=', 'checkmail' ),
+ ),
+ array(
+ 'id' => '_um_pending_action',
+ 'type' => 'select',
+ 'label' => __( 'Action to be taken after registration', 'ultimate-member' ),
+ 'tooltip' => __( 'Select what action is taken after a person registers on your site. Depending on the status you can redirect them to their profile, a custom url or show a custom message', 'ultimate-member' ),
+ 'value' => ! empty( $role_data['_um_pending_action'] ) ? $role_data['_um_pending_action'] : array(),
+ 'options' => array(
+ 'show_message' => __( 'Show custom message', 'ultimate-member' ),
+ 'redirect_url' => __( 'Redirect to URL', 'ultimate-member' ),
+ ),
+ 'conditional' => array( '_um_status', '=', 'pending' ),
+ ),
+ array(
+ 'id' => '_um_pending_message',
+ 'type' => 'textarea',
+ 'label' => __( 'Personalize the custom message', 'ultimate-member' ),
+ 'value' => ! empty( $role_data['_um_pending_message'] ) ? $role_data['_um_pending_message'] : __( 'Thank you for applying for membership to our site. We will review your details and send you an email letting you know whether your application has been successful or not.', 'ultimate-member' ),
+ 'conditional' => array( '_um_pending_action', '=', 'show_message' ),
+ ),
+ array(
+ 'id' => '_um_pending_url',
+ 'type' => 'text',
+ 'label' => __( 'Set Custom Redirect URL', 'ultimate-member' ),
+ 'conditional' => array( '_um_pending_action', '=', 'redirect_url' ),
+ 'value' => ! empty( $role_data['_um_pending_url'] ) ? $role_data['_um_pending_url'] : '',
),
- 'conditional' => array( '_um_status', '=', 'pending' )
- ),
- array(
- 'id' => '_um_pending_message',
- 'type' => 'textarea',
- 'label' => __( 'Personalize the custom message', 'ultimate-member' ),
- 'value' => ! empty( $role['_um_pending_message'] ) ? __( $role['_um_pending_message'], 'ultimate-member' ) : __('Thank you for applying for membership to our site. We will review your details and send you an email letting you know whether your application has been successful or not.','ultimate-member'),
- 'conditional' => array( '_um_pending_action', '=', 'show_message' )
- ),
- array(
- 'id' => '_um_pending_url',
- 'type' => 'text',
- 'label' => __( 'Set Custom Redirect URL', 'ultimate-member' ),
- 'conditional' => array( '_um_pending_action', '=', 'redirect_url' ),
- 'value' => ! empty( $role['_um_pending_url'] ) ? __( $role['_um_pending_url'], 'ultimate-member' ) : '',
),
)
- ) )->render_form(); ?>
-
+ )->render_form();
+ ?>
diff --git a/includes/ajax/class-init.php b/includes/ajax/class-init.php
index 50645233..eeb2e7fc 100644
--- a/includes/ajax/class-init.php
+++ b/includes/ajax/class-init.php
@@ -23,6 +23,7 @@ if ( ! class_exists( 'um\ajax\Init' ) ) {
$this->forms();
$this->pages();
$this->secure();
+ $this->users();
}
/**
@@ -60,5 +61,17 @@ if ( ! class_exists( 'um\ajax\Init' ) ) {
}
return UM()->classes['um\ajax\secure'];
}
+
+ /**
+ * @since 2.8.7
+ *
+ * @return Users
+ */
+ public function users() {
+ if ( empty( UM()->classes['um\ajax\users'] ) ) {
+ UM()->classes['um\ajax\users'] = new Users();
+ }
+ return UM()->classes['um\ajax\users'];
+ }
}
}
diff --git a/includes/ajax/class-secure.php b/includes/ajax/class-secure.php
index f69fc682..898ab5de 100644
--- a/includes/ajax/class-secure.php
+++ b/includes/ajax/class-secure.php
@@ -287,7 +287,7 @@ class Secure {
$content .= ' ' . esc_html__( 'Click here to lock them now.', 'ultimate-member' ) . '';
$content .= ' ' . esc_html__( 'You can unblock the Register forms later. Just go to Ultimate Member > Settings > Advanced > Security and uncheck the option "Lock All Register Forms".', 'ultimate-member' );
$content .= $br . $br;
- $suspicious_accounts_url = admin_url( 'users.php?um_status=inactive' );
+ $suspicious_accounts_url = admin_url( 'users.php?um_user_status=inactive' );
if ( $might_affected_users->get_total() > 0 ) {
$od = gmdate( 'F d, Y', $oldest_date );
diff --git a/includes/ajax/class-users.php b/includes/ajax/class-users.php
new file mode 100644
index 00000000..bd44eaa5
--- /dev/null
+++ b/includes/ajax/class-users.php
@@ -0,0 +1,56 @@
+admin()->check_ajax_nonce();
+
+ $search_request = ! empty( $_REQUEST['search'] ) ? sanitize_text_field( $_REQUEST['search'] ) : '';
+ $page = ! empty( $_REQUEST['page'] ) ? absint( $_REQUEST['page'] ) : 1;
+ $per_page = 20;
+
+ $args = array(
+ 'fields' => array( 'ID', 'user_login' ),
+ 'paged' => $page,
+ 'number' => $per_page,
+ );
+
+ if ( ! empty( $search_request ) ) {
+ $args['search'] = '*' . $search_request . '*';
+ }
+
+ $args = apply_filters( 'um_get_users_list_ajax_args', $args );
+
+ $users_query = new \WP_User_Query( $args );
+ $users = $users_query->get_results();
+ $total_count = $users_query->get_total();
+
+ if ( ! empty( $_REQUEST['avatar'] ) ) {
+ foreach ( $users as $key => $user ) {
+ $url = get_avatar_url( $user->ID );
+ $users[ $key ]->img = $url;
+ }
+ }
+
+ wp_send_json_success(
+ array(
+ 'users' => $users,
+ 'total_count' => $total_count,
+ )
+ );
+ }
+}
diff --git a/includes/class-functions.php b/includes/class-functions.php
index 6c0aff80..c4811570 100644
--- a/includes/class-functions.php
+++ b/includes/class-functions.php
@@ -709,7 +709,7 @@ if ( ! class_exists( 'UM_Functions' ) ) {
),
);
- $allowed_html = array_merge( $global_allowed, $allowed_html );
+ $allowed_html = array_merge_recursive( $global_allowed, $allowed_html );
$allowed_html = array_map( '_wp_add_global_attributes', $allowed_html );
/**
diff --git a/includes/class-init.php b/includes/class-init.php
index dbf13815..7189ddaa 100644
--- a/includes/class-init.php
+++ b/includes/class-init.php
@@ -530,7 +530,6 @@ if ( ! class_exists( 'UM' ) ) {
$this->admin_settings();
$this->columns();
$this->metabox();
- $this->users();
$this->dragdrop();
$this->admin_gdpr();
$this->admin_navmenu();
@@ -555,6 +554,7 @@ if ( ! class_exists( 'UM' ) ) {
$this->user();
$this->profile();
$this->builtin();
+ $this->files();
$this->form()->hooks();
$this->permalinks();
$this->cron();
@@ -906,20 +906,6 @@ if ( ! class_exists( 'UM' ) ) {
return $this->classes['admin_metabox'];
}
-
- /**
- * @since 2.0
- *
- * @return um\admin\core\Admin_Users()
- */
- function users() {
- if ( empty( $this->classes['admin_users'] ) ) {
- $this->classes['admin_users'] = new um\admin\core\Admin_Users();
- }
- return $this->classes['admin_users'];
- }
-
-
/**
* @since 2.0
*
@@ -1292,7 +1278,7 @@ if ( ! class_exists( 'UM' ) ) {
*
* @return um\core\Files
*/
- function files() {
+ public function files() {
if ( empty( $this->classes['files'] ) ) {
$this->classes['files'] = new um\core\Files();
}
@@ -1482,7 +1468,6 @@ if ( ! class_exists( 'UM' ) ) {
require_once 'core/um-actions-form.php';
require_once 'core/um-actions-access.php';
require_once 'core/um-actions-wpadmin.php';
- require_once 'core/um-actions-core.php';
require_once 'core/um-actions-ajax.php';
require_once 'core/um-actions-login.php';
require_once 'core/um-actions-register.php';
diff --git a/includes/common/class-cpt.php b/includes/common/class-cpt.php
index f5751226..022fee00 100644
--- a/includes/common/class-cpt.php
+++ b/includes/common/class-cpt.php
@@ -159,7 +159,16 @@ if ( ! class_exists( 'um\common\CPT' ) ) {
$mode = 'members';
if ( 'um_form' === $post->post_type ) {
$meta_value_mode = get_post_meta( $post_id, '_um_mode', true );
- $mode = ! empty( $meta_value_mode ) ? $meta_value_mode : sanitize_key( $_POST['form']['_um_mode'] ); // phpcs:ignore WordPress.Security.NonceVerification -- already verified here
+ if ( ! empty( $meta_value_mode ) ) {
+ $mode = $meta_value_mode;
+ } elseif ( ! empty( $_POST['form']['_um_mode'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification -- already verified here
+ $mode = sanitize_key( $_POST['form']['_um_mode'] ); // phpcs:ignore WordPress.Security.NonceVerification -- already verified here
+ }
+ }
+
+ // $mode can be empty on the first installation
+ if ( empty( $mode ) ) {
+ return;
}
// Set current published form or member directory as predefined in the case when old default doesn't exist or hasn't a `publish` status.
diff --git a/includes/common/class-filesystem.php b/includes/common/class-filesystem.php
new file mode 100644
index 00000000..b5b092d0
--- /dev/null
+++ b/includes/common/class-filesystem.php
@@ -0,0 +1,293 @@
+init_paths();
+ }
+
+ /**
+ * Init uploading URL and directory
+ *
+ * @since 2.8.7
+ */
+ public function init_paths() {
+ $this->temp_upload_dir = $this->get_upload_dir( 'ultimatemember/temp' );
+ $this->temp_upload_url = $this->get_upload_url( 'ultimatemember/temp' );
+ }
+
+ public function files_age() {
+ /**
+ * Filters the maximum file age in the temp folder. By default, it's 24 hours.
+ *
+ * @since 2.8.7
+ * @hook um_filesystem_max_file_age
+ *
+ * @param {int} $file_age Temp file age in seconds.
+ *
+ * @return {int} Temp file age in seconds.
+ */
+ return apply_filters( 'um_filesystem_max_file_age', 24 * HOUR_IN_SECONDS ); // Temp file age in seconds
+ }
+
+ public static function image_mimes( $context = 'list' ) {
+ $mimes = array();
+
+ static $allowed_for_user = null;
+ if ( empty( $allowed_for_user ) ) {
+ $allowed_for_user = get_allowed_mime_types();
+ }
+
+ if ( empty( $allowed_for_user ) ) {
+ return $mimes;
+ }
+
+ if ( 'list' === $context ) {
+ $all_mimes = wp_get_ext_types();
+ $mimes = array_key_exists( 'image', $all_mimes ) ? $all_mimes['image'] : array( 'jpg', 'jpeg', 'jpe', 'gif', 'png', 'bmp', 'tif', 'tiff', 'ico', 'heic', 'webp', 'avif' );
+
+ $all_extensions = array();
+ foreach ( $allowed_for_user as $extensions => $mime ) {
+ $all_extensions[] = explode( '|', $extensions );
+ }
+ $all_extensions = array_merge( ...$all_extensions );
+ $mimes = array_intersect( $mimes, $all_extensions );
+
+ /**
+ * Filters the MIME-types of the images that can be uploaded as Company Logo.
+ *
+ * @since 2.8.7
+ * @hook um_upload_image_mimes_list
+ *
+ * @param {array} $mime_types MIME types.
+ *
+ * @return {array} MIME types.
+ */
+ $mimes = apply_filters( 'um_upload_image_mimes_list', $mimes );
+ } elseif ( 'allowed' === $context ) {
+ $mimes = array(
+ 'jpg|jpeg|jpe' => 'image/jpeg',
+ 'gif' => 'image/gif',
+ 'png' => 'image/png',
+ 'bmp' => 'image/bmp',
+ 'tiff|tif' => 'image/tiff',
+ 'webp' => 'image/webp',
+ 'avif' => 'image/avif',
+ 'ico' => 'image/x-icon',
+ 'heic' => 'image/heic',
+ );
+
+ $mimes = array_intersect( $mimes, $allowed_for_user );
+
+ /**
+ * Filters the MIME-types of the images that can be uploaded via UM uploader
+ *
+ * @since 2.8.7
+ * @hook um_upload_allowed_image_mimes
+ *
+ * @param {array} $mime_types MIME types.
+ *
+ * @return {array} MIME types.
+ */
+ $mimes = apply_filters( 'um_upload_allowed_image_mimes', $mimes );
+ }
+
+ return $mimes;
+ }
+
+ /**
+ * Remove all files, which are older than 24 hours
+ *
+ * Can duplicate this function functionality `remove_old_files`
+ *
+ * @since 2.8.7
+ */
+ public function clear_temp_dir() {
+ global $wp_filesystem;
+
+ if ( ! $wp_filesystem instanceof WP_Filesystem_Base ) {
+ require_once ABSPATH . 'wp-admin/includes/file.php';
+
+ $credentials = request_filesystem_credentials( site_url() );
+ WP_Filesystem( $credentials );
+ }
+
+ if ( ! $wp_filesystem->is_dir( $this->temp_upload_dir ) ) {
+ return;
+ }
+
+ // phpcs:disable WordPress.PHP.NoSilencedErrors.Discouraged
+ $dir = @opendir( $this->temp_upload_dir );
+ if ( ! $dir ) {
+ return;
+ }
+
+ // phpcs:ignore WordPress.CodeAnalysis.AssignmentInCondition -- reading folder's content here
+ while ( false !== ( $file = readdir( $dir ) ) ) {
+ if ( '.' === $file || '..' === $file ) {
+ continue;
+ }
+
+ $filepath = wp_normalize_path( $this->temp_upload_dir . DIRECTORY_SEPARATOR . $file );
+
+ // Remove temp file if it is older than the max age and is not the current file
+ if ( $wp_filesystem->mtime( $filepath ) < time() - $this->files_age() ) {
+ $wp_filesystem->delete( $filepath );
+ }
+ }
+
+ @closedir( $dir );
+ // phpcs:enable WordPress.PHP.NoSilencedErrors.Discouraged
+ }
+
+ /**
+ * Get upload dir of plugin
+ *
+ * @param string $dir
+ * @param int|null $blog_id
+ *
+ * @return string
+ *
+ * @since 2.8.7
+ */
+ public function get_upload_dir( $dir = '', $blog_id = null ) {
+ // Please add define('FS_METHOD', 'direct'); to avoid question about FTP.
+ global $wp_filesystem;
+
+ if ( ! $wp_filesystem instanceof WP_Filesystem_Base ) {
+ require_once ABSPATH . 'wp-admin/includes/file.php';
+
+ $credentials = request_filesystem_credentials( site_url() );
+ WP_Filesystem( $credentials );
+ }
+
+ if ( ! $blog_id ) {
+ $blog_id = get_current_blog_id();
+ } elseif ( is_multisite() ) {
+ switch_to_blog( $blog_id );
+ }
+
+ if ( empty( $this->upload_dir[ $blog_id ] ) ) {
+ $uploads = wp_upload_dir();
+ if ( ! empty( $uploads['error'] ) ) {
+ return '';
+ }
+ $this->upload_dir[ $blog_id ] = $uploads['basedir'];
+ }
+
+ $upload_dir = wp_normalize_path( trailingslashit( $this->upload_dir[ $blog_id ] ) . untrailingslashit( $dir ) );
+
+ if ( ! $wp_filesystem->is_dir( $upload_dir ) ) {
+ wp_mkdir_p( $upload_dir );
+ }
+
+ if ( is_multisite() ) {
+ restore_current_blog();
+ }
+
+ //return dir path
+ return $upload_dir;
+ }
+
+ /**
+ * Get upload url of plugin
+ *
+ * @param string $url
+ * @param int|null $blog_id
+ *
+ * @return string
+ *
+ * @since 2.8.7
+ */
+ public function get_upload_url( $url = '', $blog_id = null ) {
+ if ( ! $blog_id ) {
+ $blog_id = get_current_blog_id();
+ } elseif ( is_multisite() ) {
+ switch_to_blog( $blog_id );
+ }
+
+ if ( empty( $this->upload_url[ $blog_id ] ) ) {
+ $uploads = wp_upload_dir();
+ if ( ! empty( $uploads['error'] ) ) {
+ return '';
+ }
+ $this->upload_url[ $blog_id ] = $uploads['baseurl'];
+ }
+
+ $upload_url = trailingslashit( $this->upload_url[ $blog_id ] ) . untrailingslashit( $url );
+
+ if ( is_multisite() ) {
+ restore_current_blog();
+ }
+
+ //return dir path
+ return $upload_url;
+ }
+
+ /**
+ * Format Bytes
+ *
+ * @param int $size
+ * @param int $precision
+ *
+ * @return string
+ *
+ * @since 2.8.7
+ */
+ public static function format_bytes( $size, $precision = 1 ) {
+ if ( is_numeric( $size ) ) {
+ $base = log( $size, 1024 );
+ $suffixes = array( '', 'kb', 'MB', 'GB', 'TB' );
+
+ $computed_size = round( 1024 ** ( $base - floor( $base ) ), $precision );
+ $unit = $suffixes[ absint( floor( $base ) ) ];
+
+ return $computed_size . ' ' . $unit;
+ }
+
+ return '';
+ }
+}
diff --git a/includes/common/class-init.php b/includes/common/class-init.php
index d9c7f5f7..4dc96d05 100644
--- a/includes/common/class-init.php
+++ b/includes/common/class-init.php
@@ -27,6 +27,7 @@ if ( ! class_exists( 'um\common\Init' ) ) {
$this->secure()->hooks();
$this->site_health();
$this->theme()->hooks();
+ $this->users()->hooks();
}
/**
@@ -51,6 +52,18 @@ if ( ! class_exists( 'um\common\Init' ) ) {
return UM()->classes['um\common\cpt'];
}
+ /**
+ * @since 2.8.7
+ *
+ * @return Filesystem
+ */
+ public function filesystem() {
+ if ( empty( UM()->classes['um\common\filesystem'] ) ) {
+ UM()->classes['um\common\filesystem'] = new Filesystem();
+ }
+ return UM()->classes['um\common\filesystem'];
+ }
+
/**
* @since 2.6.8
*
@@ -98,5 +111,17 @@ if ( ! class_exists( 'um\common\Init' ) ) {
}
return UM()->classes['um\common\theme'];
}
+
+ /**
+ * @since 2.8.7
+ *
+ * @return Users
+ */
+ public function users() {
+ if ( empty( UM()->classes['um\common\users'] ) ) {
+ UM()->classes['um\common\users'] = new Users();
+ }
+ return UM()->classes['um\common\users'];
+ }
}
}
diff --git a/includes/common/class-secure.php b/includes/common/class-secure.php
index 625056d3..e23b0139 100644
--- a/includes/common/class-secure.php
+++ b/includes/common/class-secure.php
@@ -106,7 +106,7 @@ if ( ! class_exists( 'um\common\Secure' ) ) {
$banned_profile_links = '';
foreach ( $user_ids as $uid ) {
um_fetch_user( $uid );
- $banned_profile_links .= UM()->user()->get_profile_link( $uid ) . ' ' . um_user( 'account_status' ) . '
';
+ $banned_profile_links .= UM()->user()->get_profile_link( $uid ) . ' ' . UM()->common()->users()->get_status( $uid ) . '
';
}
um_reset_user();
@@ -224,18 +224,20 @@ if ( ! class_exists( 'um\common\Secure' ) ) {
'submitted' => ! empty( UM()->form()->post_form ) ? UM()->form()->post_form : '',
'roles' => $user->roles,
'user_agent' => $user_agent,
- 'account_status' => um_user( 'status' ),
+ 'account_status' => UM()->common()->users()->get_status( $user->ID ),
);
update_user_meta( $user->ID, 'um_user_blocked__metadata', $captured );
$user->remove_all_caps();
$user->update_user_level_from_caps();
+ // Force update of the user status without email notifications.
if ( is_user_logged_in() ) {
- UM()->user()->set_status( 'inactive' );
+ UM()->common()->users()->set_status( $user->ID, 'inactive' );
} else {
- UM()->user()->set_status( 'rejected' );
+ UM()->common()->users()->set_status( $user->ID, 'rejected' );
}
+
um_reset_user();
update_user_meta( $user->ID, 'um_user_blocked', 'suspicious_activity' );
update_user_meta( $user->ID, 'um_user_blocked__timestamp', current_time( 'mysql', true ) );
diff --git a/includes/common/class-theme.php b/includes/common/class-theme.php
index 896627ef..d81bf084 100644
--- a/includes/common/class-theme.php
+++ b/includes/common/class-theme.php
@@ -106,6 +106,8 @@ class Theme {
$scan_files = self::get_all_templates();
foreach ( $scan_files as $key => $files ) {
foreach ( $files as $file ) {
+ $file = wp_normalize_path( $file ); // for not a Linux hosting.
+
if ( false === strpos( $file, 'email/' ) ) {
/**
* Filters an array of the template files for scanning versions based on $key.
@@ -133,8 +135,8 @@ class Theme {
'profile/comments-single.php',
'profile/posts.php',
'profile/posts-single.php',
- 'modal/um_upload_single.php',
- 'modal/um_view_photo.php',
+ 'modal/upload-single.php',
+ 'modal/view-photo.php',
);
$theme_file = false;
diff --git a/includes/common/class-users.php b/includes/common/class-users.php
new file mode 100644
index 00000000..9884efa8
--- /dev/null
+++ b/includes/common/class-users.php
@@ -0,0 +1,828 @@
+roles()->um_current_user_can( 'edit', $args[2] ) ) {
+ $allcaps[ $caps[0] ] = false;
+ }
+ } elseif ( 'delete_users' === $caps[0] && 'delete_user' === $args[0] ) {
+ if ( isset( $args[2] ) && ! UM()->roles()->um_current_user_can( 'delete', $args[2] ) ) {
+ $allcaps[ $caps[0] ] = false;
+ }
+ } elseif ( 'list_users' === $caps[0] ) {
+ if ( 'list_users' === $args[0] && ! um_user( 'can_view_all' ) ) {
+ $allcaps[ $caps[0] ] = false;
+ }
+ }
+
+ return $allcaps;
+ }
+
+ /**
+ * Hide role filters with not accessible roles
+ *
+ * @param array $roles
+ * @return array
+ */
+ public function restrict_roles( $roles ) {
+ if ( current_user_can( 'manage_options' ) ) {
+ return $roles;
+ }
+
+ $can_view_roles = UM()->roles()->um_user_can( 'can_view_roles' );
+ if ( UM()->roles()->um_user_can( 'can_view_all' ) && empty( $can_view_roles ) ) {
+ return $roles;
+ }
+
+ if ( ! empty( $can_view_roles ) ) {
+ $wp_roles = wp_roles();
+ foreach ( $wp_roles->get_names() as $this_role => $name ) {
+ if ( ! in_array( $this_role, $can_view_roles, true ) ) {
+ unset( $roles[ $this_role ] );
+ }
+ }
+ }
+
+ return $roles;
+ }
+
+ /**
+ * Get the user statuses list.
+ *
+ * @return array
+ */
+ public function statuses_list() {
+ $statuses = array(
+ 'approved' => __( 'Approved', 'ultimate-member' ),
+ 'awaiting_admin_review' => __( 'Pending administrator review', 'ultimate-member' ),
+ 'awaiting_email_confirmation' => __( 'Waiting email confirmation', 'ultimate-member' ),
+ 'inactive' => __( 'Membership inactive', 'ultimate-member' ),
+ 'rejected' => __( 'Membership rejected', 'ultimate-member' ),
+ );
+ /**
+ * Filters the user statuses added via Ultimate Member plugin.
+ *
+ * Note: Statuses format is 'key' => 'title'
+ *
+ * @since 2.8.7
+ * @hook um_user_statuses
+ *
+ * @param {array} $statuses User statuses in Ultimate Member environment.
+ *
+ * @return {array} User statuses.
+ */
+ return apply_filters( 'um_user_statuses', $statuses );
+ }
+
+ /**
+ * Set user's account status.
+ *
+ * @param int $user_id User ID.
+ * @param string $status Status key.
+ *
+ * @return bool
+ */
+ public function set_status( $user_id, $status ) {
+ $old_status = $this->get_status( $user_id );
+
+ /**
+ * Fires before User status is set.
+ *
+ * @since 2.8.7
+ * @hook um_before_user_status_is_set
+ *
+ * @param {string} $status New status key.
+ * @param {int} $user_id User ID.
+ * @param {string} $old_status Old status key.
+ */
+ do_action( 'um_before_user_status_is_set', $status, $user_id, $old_status );
+
+ $result = update_user_meta( $user_id, 'account_status', $status );
+
+ // false on failure or if the value passed to the function is the same as the one that is already in the database.
+ if ( false !== $result ) {
+ // backward compatibility. @todo maybe uncomment it after some testing.
+ // UM()->user()->profile['account_status'] = $status;
+
+ // Reset cache.
+ $this->remove_cache( $user_id );
+
+ /**
+ * Fires just after User status is changed.
+ *
+ * @since 1.3.x
+ * @since 2.0 Added $user_id
+ * @since 2.8.7 Added $old_status
+ *
+ * @hook um_after_user_status_is_changed
+ *
+ * @param {string} $status Status key.
+ * @param {int} $user_id User ID. Since 2.0
+ * @param {string} $old_status Old status key. Since 2.8.7
+ */
+ do_action( 'um_after_user_status_is_changed', $status, $user_id, $old_status );
+
+ return true;
+ }
+
+ return false;
+ }
+
+ /**
+ * Get user account status.
+ *
+ * @param int $user_id User ID
+ *
+ * @return string
+ */
+ public function get_status( $user_id, $format = 'raw' ) {
+ $status = get_user_meta( $user_id, 'account_status', true );
+ if ( 'raw' === $format ) {
+ return $status;
+ }
+
+ $all_statuses = $this->statuses_list();
+ if ( array_key_exists( $status, $all_statuses ) ) {
+ return $all_statuses[ $status ];
+ }
+
+ return __( 'Undefined', 'ultimate-member' );
+ }
+
+ /**
+ * Check if user has selected account status.
+ *
+ * @since 2.8.7
+ *
+ * @param int $user_id User ID.
+ * @param string $status_control Status key.
+ *
+ * @return bool
+ */
+ public function has_status( $user_id, $status_control ) {
+ $status = $this->get_status( $user_id );
+ return $status === $status_control;
+ }
+
+ /**
+ * Reset User cache
+ *
+ * @param int $user_id User ID.
+ */
+ public function remove_cache( $user_id ) {
+ delete_option( "um_cache_userdata_{$user_id}" );
+ }
+
+ /**
+ * Reset Activation link hash.
+ *
+ * @param int $user_id User ID.
+ */
+ public function reset_activation_link( $user_id ) {
+ delete_user_meta( $user_id, 'account_secret_hash' );
+ delete_user_meta( $user_id, 'account_secret_hash_expiry' );
+ }
+
+ /**
+ * Set user's activation link hash
+ *
+ * @param int $user_id User ID.
+ */
+ public function assign_secretkey( $user_id ) {
+ if ( ! $this->has_status( $user_id, 'awaiting_email_confirmation' ) ) {
+ return;
+ }
+
+ /**
+ * Fires before user activation link hash is generated.
+ *
+ * @since 1.3.x
+ * @since 2.8.7 Added $user_id
+ * @hook um_before_user_hash_is_changed
+ *
+ * @param {int} $user_id User ID. Since 2.8.7
+ */
+ do_action( 'um_before_user_hash_is_changed', $user_id );
+
+ $hash = UM()->validation()->generate();
+ update_user_meta( $user_id, 'account_secret_hash', $hash );
+ // backward compatibility. @todo maybe uncomment it after some testing.
+ // UM()->user()->profile['account_secret_hash'] = $hash;
+
+ $expiration = '';
+ $expiry_time = UM()->options()->get( 'activation_link_expiry_time' );
+ if ( ! empty( $expiry_time ) && is_numeric( $expiry_time ) ) {
+ $expiration = time() + $expiry_time * DAY_IN_SECONDS;
+ update_user_meta( $user_id, 'account_secret_hash_expiry', $expiration );
+ // backward compatibility. @todo maybe uncomment it after some testing.
+ // UM()->user()->profile['account_secret_hash_expiry'] = $expiration;
+ }
+
+ /**
+ * Fires after user activation link hash is changed.
+ *
+ * @since 1.3.x
+ * @since 2.8.7 Added $user_id, $hash, $expiration
+ * @hook um_before_user_hash_is_changed
+ *
+ * @param {int} $user_id User ID. Since 2.8.7.
+ * @param {string} $hash Activation link hash. Since 2.8.7.
+ * @param {int} $expiration Expiration timestamp. Since 2.8.7.
+ */
+ do_action( 'um_after_user_hash_is_changed', $user_id, $hash, $expiration );
+
+ $this->remove_cache( $user_id ); // Don't remove this line. It's required removing cache duplicate for the force case when re-send activation email.
+ }
+
+ /**
+ * @param WP_User $userdata
+ *
+ * @return string|WP_Error
+ */
+ public function maybe_generate_password_reset_key( $userdata ) {
+ return get_password_reset_key( $userdata );
+ }
+
+ /**
+ * @param int $user_id
+ *
+ * @return bool
+ */
+ public function can_current_user_edit_user( $user_id ) {
+ $current_user_id = get_current_user_id();
+ if ( $current_user_id === $user_id ) {
+ return true;
+ }
+
+ if ( ! self::user_exists( $user_id ) ) {
+ return false;
+ }
+
+ $rolename = UM()->roles()->get_priority_user_role( $current_user_id );
+ $role = get_role( $rolename );
+
+ if ( null === $role ) {
+ return false;
+ }
+
+ // Make Ultimate Member bulk actions only when the current user has 'edit_users' capability.
+ if ( ! current_user_can( 'edit_users' ) && ! $role->has_cap( 'edit_users' ) ) {
+ return false;
+ }
+
+ return true;
+ }
+
+ /**
+ * Activation can be sent everytime for every user. Even force for current user.
+ *
+ * @param int $user_id User ID.
+ * @param bool $force If true - ignore current user condition.
+ *
+ * @return bool
+ */
+ public function can_activation_send( $user_id, $force = false ) {
+ if ( ! self::user_exists( $user_id ) ) {
+ return false;
+ }
+
+ if ( ! $force ) {
+ $current_user_id = get_current_user_id();
+ if ( $current_user_id === $user_id ) {
+ return false;
+ }
+ }
+
+ /*if ( ! $this->can_current_user_edit_user( $user_id ) ) {
+ return false;
+ }*/
+
+ return true;
+ }
+
+ /**
+ * @param int $user_id User ID.
+ * @param bool $force If true - ignore current user condition.
+ *
+ * @return bool
+ */
+ public function send_activation( $user_id, $force = false ) {
+ if ( ! $this->can_activation_send( $user_id, $force ) ) {
+ return false;
+ }
+
+ /**
+ * Fires before User has been set as pending email confirmation.
+ *
+ * @since 2.8.7
+ * @hook um_before_user_is_set_as_awaiting_email_confirmation
+ *
+ * @param {int} $user_id User ID.
+ */
+ do_action( 'um_before_user_is_set_as_awaiting_email_confirmation', $user_id );
+
+ $result = $this->set_status( $user_id, 'awaiting_email_confirmation' );
+
+ // It's `false` on failure or if `$force` and the user already has `awaiting_email_confirmation` status.
+ if ( false !== $result || ( $force && $this->has_status( $user_id, 'awaiting_email_confirmation' ) ) ) {
+ // Clear all sessions for email confirmation pending users
+ self::destroy_all_sessions( $user_id );
+
+ // Set activation link hash.
+ $this->assign_secretkey( $user_id );
+
+ $userdata = get_userdata( $user_id );
+
+ $current_user_id = get_current_user_id();
+ um_fetch_user( $user_id );
+
+ add_filter( 'um_template_tags_patterns_hook', array( UM()->user(), 'add_activation_placeholder' ) );
+ add_filter( 'um_template_tags_replaces_hook', array( UM()->user(), 'add_activation_replace_placeholder' ) );
+
+ UM()->mail()->send( $userdata->user_email, 'checkmail_email' );
+
+ um_fetch_user( $current_user_id );
+ /**
+ * Fires after User has been set as pending email confirmation.
+ *
+ * @since 2.8.7
+ * @hook um_after_user_is_set_as_awaiting_email_confirmation
+ *
+ * @param {int} $user_id User ID.
+ */
+ do_action( 'um_after_user_is_set_as_awaiting_email_confirmation', $user_id );
+ return true;
+ }
+
+ return false;
+ }
+
+ /**
+ * @param int $user_id User ID.
+ *
+ * @return bool
+ */
+ public function can_be_deactivated( $user_id ) {
+ $current_user_id = get_current_user_id();
+ if ( $current_user_id === $user_id || ! self::user_exists( $user_id ) ) {
+ return false;
+ }
+
+ /*if ( ! $this->can_current_user_edit_user( $user_id ) ) {
+ return false;
+ }*/
+
+ $status = $this->get_status( $user_id );
+ // Break only if the user already approved
+ return 'inactive' !== $status;
+ }
+
+ /**
+ * @param int $user_id User ID.
+ *
+ * @return bool
+ */
+ public function deactivate( $user_id ) {
+ if ( ! $this->can_be_deactivated( $user_id ) ) {
+ return false;
+ }
+
+ /**
+ * Fires before User has been deactivated.
+ *
+ * @since 2.8.7
+ * @hook um_before_user_is_deactivated
+ *
+ * @param {int} $user_id User ID.
+ */
+ do_action( 'um_before_user_is_deactivated', $user_id );
+
+ $result = $this->set_status( $user_id, 'inactive' );
+
+ // It's `false` on failure or if the user already has approved status.
+ if ( false !== $result ) {
+ // Clear all sessions for inactive users
+ self::destroy_all_sessions( $user_id );
+
+ $this->reset_activation_link( $user_id );
+
+ $userdata = get_userdata( $user_id );
+ UM()->mail()->send( $userdata->user_email, 'inactive_email' );
+
+ /**
+ * Fires after User has been deactivated.
+ *
+ * @since 1.3.x
+ * @hook um_after_user_is_inactive
+ *
+ * @param {int} $user_id User ID.
+ */
+ do_action( 'um_after_user_is_inactive', $user_id );
+ return true;
+ }
+
+ return false;
+ }
+
+ /**
+ * User can be rejected only after awaiting admin review status.
+ *
+ * @param int $user_id User ID.
+ *
+ * @return bool
+ */
+ public function can_be_rejected( $user_id ) {
+ $current_user_id = get_current_user_id();
+ if ( $current_user_id === $user_id || ! self::user_exists( $user_id ) ) {
+ return false;
+ }
+
+ /*if ( ! $this->can_current_user_edit_user( $user_id ) ) {
+ return false;
+ }*/
+
+ $status = $this->get_status( $user_id );
+
+ // User can be rejected only after awaiting admin review status
+ return 'awaiting_admin_review' === $status;
+ }
+
+ /**
+ * Reject user membership.
+ *
+ * @param int $user_id User ID.
+ *
+ * @return bool
+ */
+ public function reject( $user_id ) {
+ if ( ! $this->can_be_rejected( $user_id ) ) {
+ return false;
+ }
+
+ /**
+ * Fires before User has been rejected.
+ *
+ * @since 2.8.7
+ * @hook um_before_user_is_rejected
+ *
+ * @param {int} $user_id User ID.
+ */
+ do_action( 'um_before_user_is_rejected', $user_id );
+
+ $result = $this->set_status( $user_id, 'rejected' );
+
+ // It's `false` on failure or if the user already has rejected status.
+ if ( false !== $result ) {
+ // Clear all sessions for rejected users
+ self::destroy_all_sessions( $user_id );
+
+ $this->reset_activation_link( $user_id );
+
+ $userdata = get_userdata( $user_id );
+ UM()->mail()->send( $userdata->user_email, 'rejected_email' );
+
+ /**
+ * Fires after User has been rejected.
+ *
+ * @since 2.8.7
+ * @hook um_after_user_is_rejected
+ *
+ * @param {int} $user_id User ID.
+ */
+ do_action( 'um_after_user_is_rejected', $user_id );
+ return true;
+ }
+
+ return false;
+ }
+
+ /**
+ * Check if the user can be set as pending admin review. Cannot set the same status but any user can be set to pending admin review.
+ *
+ * @param int $user_id User ID.
+ * @param bool $force If true - ignore current user condition.
+ *
+ * @return bool
+ */
+ public function can_be_set_as_pending( $user_id, $force = false ) {
+ if ( ! self::user_exists( $user_id ) ) {
+ return false;
+ }
+
+ if ( ! $force ) {
+ $current_user_id = get_current_user_id();
+ if ( $current_user_id === $user_id ) {
+ return false;
+ }
+ }
+
+ /*if ( ! $this->can_current_user_edit_user( $user_id ) ) {
+ return false;
+ }*/
+
+ $status = $this->get_status( $user_id );
+ return 'awaiting_admin_review' !== $status;
+ }
+
+ /**
+ * Set user as pending admin review.
+ *
+ * @param int $user_id User ID.
+ * @param bool $force If true - ignore current user condition.
+ *
+ * @return bool
+ */
+ public function set_as_pending( $user_id, $force = false ) {
+ if ( ! $this->can_be_set_as_pending( $user_id, $force ) ) {
+ return false;
+ }
+
+ /**
+ * Fires before User has been set as pending admin review.
+ *
+ * @since 2.8.7
+ * @hook um_before_user_is_set_as_pending
+ *
+ * @param {int} $user_id User ID.
+ */
+ do_action( 'um_before_user_is_set_as_pending', $user_id );
+
+ $result = $this->set_status( $user_id, 'awaiting_admin_review' );
+
+ // It's `false` on failure or if the user already has rejected status.
+ if ( false !== $result ) {
+ // Clear all sessions for awaiting admin confirmation users
+ self::destroy_all_sessions( $user_id );
+
+ $this->reset_activation_link( $user_id );
+
+ $userdata = get_userdata( $user_id );
+ UM()->mail()->send( $userdata->user_email, 'pending_email' );
+
+ /**
+ * Fires after User has been set as pending admin review.
+ *
+ * @since 2.8.7
+ * @hook um_after_user_is_set_as_pending
+ *
+ * @param {int} $user_id User ID.
+ */
+ do_action( 'um_after_user_is_set_as_pending', $user_id );
+ return true;
+ }
+
+ return false;
+ }
+
+ /**
+ * Check if the user can be approved. Any user with status that isn't equal to `approved` can be approved.
+ *
+ * @param int $user_id User ID.
+ * @param bool $force If true - ignore current user condition.
+ *
+ * @return bool
+ */
+ public function can_be_approved( $user_id, $force = false ) {
+ if ( ! self::user_exists( $user_id ) ) {
+ return false;
+ }
+
+ if ( ! $force ) {
+ $current_user_id = get_current_user_id();
+ if ( $current_user_id === $user_id ) {
+ return false;
+ }
+ }
+
+ /*if ( ! $this->can_current_user_edit_user( $user_id ) ) {
+ return false;
+ }*/
+
+ $status = $this->get_status( $user_id );
+ return 'approved' !== $status && 'inactive' !== $status; // inactive can be only reactivated
+ }
+
+ /**
+ * Approve user.
+ *
+ * @param int $user_id User ID.
+ * @param bool $force If true - ignore current user condition.
+ *
+ * @return bool `true` if the user has been approved
+ * `false` on failure or if the user already has approved status.
+ */
+ public function approve( $user_id, $force = false ) {
+ if ( ! $this->can_be_approved( $user_id, $force ) ) {
+ return false;
+ }
+
+ /**
+ * Fires before User has been approved.
+ *
+ * @since 2.8.7
+ * @hook um_before_user_is_approved
+ *
+ * @param {int} $user_id User ID.
+ */
+ do_action( 'um_before_user_is_approved', $user_id );
+
+ $old_status = $this->get_status( $user_id );
+
+ $result = $this->set_status( $user_id, 'approved' );
+
+ // It's `false` on failure or if the user already has approved status.
+ if ( false !== $result ) {
+ $userdata = get_userdata( $user_id );
+
+ $this->reset_activation_link( $user_id );
+
+ $email_slug = 'welcome_email';
+ if ( 'awaiting_admin_review' === $old_status ) {
+ $email_slug = 'approved_email';
+ $this->maybe_generate_password_reset_key( $userdata );
+ }
+
+ $current_user_id = get_current_user_id();
+ um_fetch_user( $user_id );
+
+ add_filter( 'um_template_tags_patterns_hook', array( UM()->password(), 'add_placeholder' ) );
+ add_filter( 'um_template_tags_replaces_hook', array( UM()->password(), 'add_replace_placeholder' ) );
+
+ UM()->mail()->send( $userdata->user_email, $email_slug );
+
+ um_fetch_user( $current_user_id );
+ /**
+ * Fires after User has been approved.
+ *
+ * @since 1.3.x
+ * @hook um_after_user_is_approved
+ *
+ * @param {int} $user_id User ID.
+ */
+ do_action( 'um_after_user_is_approved', $user_id );
+ return true;
+ }
+
+ return false;
+ }
+
+ /**
+ * Reactivated can be only `inactive` user.
+ *
+ * @param int $user_id User ID.
+ *
+ * @return bool
+ */
+ public function can_be_reactivated( $user_id ) {
+ $current_user_id = get_current_user_id();
+ if ( $current_user_id === $user_id || ! self::user_exists( $user_id ) ) {
+ return false;
+ }
+
+ /*if ( ! $this->can_current_user_edit_user( $user_id ) ) {
+ return false;
+ }*/
+
+ $status = $this->get_status( $user_id );
+ return 'inactive' === $status;
+ }
+
+ /**
+ * Reactivate user.
+ *
+ * @param int $user_id User ID.
+ *
+ * @return bool `true` if the user has been reactivated
+ * `false` on failure or if the user already has approved status.
+ */
+ public function reactivate( $user_id ) {
+ if ( ! $this->can_be_reactivated( $user_id ) ) {
+ return false;
+ }
+
+ /**
+ * Fires before User has been reactivated.
+ *
+ * @since 2.8.7
+ * @hook um_before_user_is_reactivated
+ *
+ * @param {int} $user_id User ID.
+ */
+ do_action( 'um_before_user_is_reactivated', $user_id );
+
+ $result = $this->set_status( $user_id, 'approved' );
+
+ // It's `false` on failure or if the user already has approved status.
+ if ( false !== $result ) {
+ // Reset activation link hash.
+ $this->reset_activation_link( $user_id );
+
+ $userdata = get_userdata( $user_id );
+
+ $current_user_id = get_current_user_id();
+ um_fetch_user( $user_id );
+
+ add_filter( 'um_template_tags_patterns_hook', array( UM()->password(), 'add_placeholder' ) );
+ add_filter( 'um_template_tags_replaces_hook', array( UM()->password(), 'add_replace_placeholder' ) );
+
+ UM()->mail()->send( $userdata->user_email, 'welcome_email' );
+
+ um_fetch_user( $current_user_id );
+
+ /**
+ * Fires after User has been reactivated.
+ *
+ * @since 2.8.7
+ * @hook um_after_user_is_reactivated
+ *
+ * @param {int} $user_id User ID.
+ */
+ do_action( 'um_after_user_is_reactivated', $user_id );
+ return true;
+ }
+
+ return false;
+ }
+
+ /**
+ * @param int $user_id
+ *
+ * @return bool
+ */
+ public static function user_exists( $user_id ) {
+ /**
+ * @var bool[] $search_results
+ */
+ static $search_results = array();
+
+ if ( array_key_exists( $user_id, $search_results ) ) {
+ return $search_results[ $user_id ];
+ }
+
+ $user = get_userdata( $user_id );
+
+ $search_results[ $user_id ] = false !== $user;
+ return $search_results[ $user_id ];
+ }
+
+ /**
+ * Clear all sessions for user ID.
+ *
+ * @param int $user_id User ID.
+ *
+ * @return void
+ */
+ public static function destroy_all_sessions( $user_id ) {
+ $user = WP_Session_Tokens::get_instance( $user_id );
+ $user->destroy_all();
+ }
+}
diff --git a/includes/core/class-access.php b/includes/core/class-access.php
index 482abc6d..5277bc8a 100644
--- a/includes/core/class-access.php
+++ b/includes/core/class-access.php
@@ -761,6 +761,8 @@ if ( ! class_exists( 'um\core\Access' ) ) {
return $content;
}
+ $original_post_content = $content;
+
if ( $this->is_restricted( $id ) ) {
$restriction = $this->get_post_privacy_settings( $id );
@@ -770,8 +772,31 @@ if ( ! class_exists( 'um\core\Access' ) ) {
$content = ! empty( $restriction['_um_restrict_custom_message'] ) ? stripslashes( $restriction['_um_restrict_custom_message'] ) : '';
}
- // translators: %s: Restricted post message.
- $content = sprintf( __( '%s', 'ultimate-member' ), $content );
+ // Because we have a late the_content callback priority here we have to apply shortcodes if faced in restricted message.
+ $content = apply_shortcodes( $content );
+ /**
+ * Filters the restricted post content.
+ * Can be used for translations when site is multilingual.
+ *
+ * @param {string} $content Post content prepared from restricted message.
+ * @param {int} $post_id Post ID
+ * @param {string} $original_post_content Original post content.
+ *
+ * @return {string} Maybe changed post content prepared from restricted message.
+ *
+ * @since 2.8.7
+ * @hook um_restricted_post_content
+ *
+ * @example Trim restriction message if post_id = 111.
+ * function my_restricted_post_content( $content, $post_id, $original_post_content ) {
+ * if ( 111 === $post_id ) {
+ * $content = trim( $content );
+ * }
+ * return $content;
+ * }
+ * add_filter( 'um_restricted_post_content', 'my_restricted_post_content', 10, 3 );
+ */
+ $content = apply_filters( 'um_restricted_post_content', $content, $id, $original_post_content );
}
return $content;
@@ -1239,7 +1264,7 @@ if ( ! class_exists( 'um\core\Access' ) ) {
return $block_content;
}
- $default_message = UM()->options()->get( 'restricted_block_message' );
+ $default_message = wp_kses_post( UM()->options()->get( 'restricted_block_message' ) );
switch ( $block['attrs']['um_who_access'] ) {
case '1': {
if ( ! is_user_logged_in() ) {
diff --git a/includes/core/class-builtin.php b/includes/core/class-builtin.php
index cae769cb..a0fd52c4 100644
--- a/includes/core/class-builtin.php
+++ b/includes/core/class-builtin.php
@@ -1074,6 +1074,8 @@ if ( ! class_exists( 'um\core\Builtin' ) ) {
'icon' => 'fab fa-telegram',
'validate' => 'telegram_url',
'url_text' => 'Telegram',
+ 'advanced' => 'social',
+ 'color' => '#24A1DE',
'match' => 'https://t.me/',
),
@@ -1090,7 +1092,9 @@ if ( ! class_exists( 'um\core\Builtin' ) ) {
'url_text' => __( 'Discord', 'ultimate-member' ),
'url_rel' => 'nofollow',
'validate' => 'discord',
+ 'advanced' => 'social',
'color' => '#7289da',
+ 'match' => 'https://discord.com/users/',
),
'tiktok' => array(
diff --git a/includes/core/class-fields.php b/includes/core/class-fields.php
index f4912f3e..b781b30d 100644
--- a/includes/core/class-fields.php
+++ b/includes/core/class-fields.php
@@ -2110,7 +2110,6 @@ if ( ! class_exists( 'um\core\Fields' ) ) {
return apply_filters( 'um_field_non_utf8_value', $option_value );
}
-
/**
* Getting the fields that need to be disabled in edit mode (profile)
*
@@ -2119,6 +2118,13 @@ if ( ! class_exists( 'um\core\Fields' ) ) {
* @return array
*/
public function get_restricted_fields_for_edit( $_um_profile_id = false ) {
+ static $cache = array();
+
+ $cache_key = absint( $_um_profile_id );
+ if ( array_key_exists( $cache_key, $cache ) ) {
+ return $cache[ $cache_key ];
+ }
+
// fields that need to be disabled in edit mode (profile)
$arr_restricted_fields = array( 'user_email', 'username', 'user_login', 'user_password', '_um_last_login', 'user_registered' );
/**
@@ -2141,7 +2147,9 @@ if ( ! class_exists( 'um\core\Fields' ) ) {
* }
* add_filter( 'um_user_profile_restricted_edit_fields', 'my_make_email_editable', 10, 2 );
*/
- return apply_filters( 'um_user_profile_restricted_edit_fields', $arr_restricted_fields, $_um_profile_id );
+ $cache[ $cache_key ] = apply_filters( 'um_user_profile_restricted_edit_fields', $arr_restricted_fields, $_um_profile_id );
+
+ return $cache[ $cache_key ];
}
/**
@@ -2797,7 +2805,7 @@ if ( ! class_exists( 'um\core\Fields' ) ) {
'media_buttons' => false,
'wpautop' => false,
'editor_class' => $this->get_class( $key, $data ),
- 'editor_height' => $data['height'],
+ 'editor_height' => absint( $data['height'] ),
'tinymce' => array(
'toolbar1' => 'formatselect,bullist,numlist,bold,italic,underline,forecolor,blockquote,hr,removeformat,link,unlink,undo,redo',
'toolbar2' => '',
@@ -4299,6 +4307,11 @@ if ( ! class_exists( 'um\core\Fields' ) ) {
$data = $this->get_field( $key );
}
+ // Invalid field data.
+ if ( ! is_array( $data ) ) {
+ return '';
+ }
+
//hide if empty type
if ( ! array_key_exists( 'type', $data ) || empty( $data['type'] ) ) {
return '';
diff --git a/includes/core/class-files.php b/includes/core/class-files.php
index eb8d3297..200849e5 100644
--- a/includes/core/class-files.php
+++ b/includes/core/class-files.php
@@ -80,7 +80,6 @@ if ( ! class_exists( 'um\core\Files' ) ) {
);
}
-
/**
* File download link generate
*
@@ -1244,29 +1243,20 @@ if ( ! class_exists( 'um\core\Files' ) ) {
return $removed_files;
}
-
/**
* Format Bytes
*
+ * @deprecated 2.8.7
* @param $size
* @param int $precision
*
* @return string
*/
- function format_bytes( $size, $precision = 1 ) {
- if ( is_numeric( $size ) ) {
- $base = log( $size, 1024 );
- $suffixes = array( '', 'kb', 'MB', 'GB', 'TB' );
- $computed_size = round( pow( 1024, $base - floor( $base ) ), $precision );
- $unit = $suffixes[ floor( $base ) ];
-
- return $computed_size.' '.$unit;
- }
-
- return '';
+ public function format_bytes( $size, $precision = 1 ) {
+ _deprecated_function( __METHOD__, '2.8.7', 'UM()->common()->filesystem()->format_bytes()' );
+ return UM()->common()->filesystem()::format_bytes( $size, $precision );
}
-
/**
* Get the list of profile/cover sizes
*
diff --git a/includes/core/class-form.php b/includes/core/class-form.php
index 0593c112..ad692d84 100644
--- a/includes/core/class-form.php
+++ b/includes/core/class-form.php
@@ -448,6 +448,11 @@ if ( ! class_exists( 'um\core\Form' ) ) {
$ignore_keys = array();
+ $arr_restricted_fields = array();
+ if ( 'profile' === $this->form_data['mode'] ) {
+ $arr_restricted_fields = UM()->fields()->get_restricted_fields_for_edit();
+ }
+
$field_types_without_metakey = UM()->builtin()->get_fields_without_metakey();
foreach ( $custom_fields as $cf_k => $cf_data ) {
if ( ! array_key_exists( 'type', $cf_data ) || in_array( $cf_data['type'], $field_types_without_metakey, true ) ) {
@@ -493,7 +498,7 @@ if ( ! class_exists( 'um\core\Form' ) ) {
// Column names from wp_users table.
$cf_metakeys = array_values( array_diff( $cf_metakeys, array( 'user_login' ) ) );
// Hidden for edit fields
- $cf_metakeys = array_values( array_diff( $cf_metakeys, UM()->fields()->get_restricted_fields_for_edit() ) );
+ $cf_metakeys = array_values( array_diff( $cf_metakeys, $arr_restricted_fields ) );
$cf_metakeys[] = 'profile_photo';
$cf_metakeys[] = 'cover_photo';
@@ -677,6 +682,7 @@ if ( ! class_exists( 'um\core\Form' ) ) {
/* Continue based on form mode - store data. */
/**
* Fires for make main actions on UM login, registration or profile form submission.
+ * Where $mode equals login, registration or profile
*
* Internal Ultimate Member callbacks (Priority -> Callback name -> Excerpt):
* ### um_submit_form_login:
@@ -691,16 +697,16 @@ if ( ! class_exists( 'um\core\Form' ) ) {
* * 10 - `um_submit_form_profile()` Profile form main handler.
*
* @since 1.3.x
- * @hook um_submit_form_errors_hook
+ * @hook um_submit_form_{$mode}
*
* @param {array} $post $_POST Submission array.
* @param {array} $form_data UM form data. Since 2.6.7
*
- * @example Make any custom action.
- * function my_custom_before_submit_form_post( $post, $form_data ) {
+ * @example Make any custom action on profile submission.
+ * function my_custom_submit_form_profile( $post, $form_data ) {
* // your code here
* }
- * add_action( 'um_submit_form_errors_hook', 'my_custom_submit_form_errors_hook', 10, 2 );
+ * add_action( 'um_submit_form_profile', 'my_custom_submit_form_profile', 10, 2 );
*/
do_action( "um_submit_form_{$this->form_data['mode']}", $this->post_form, $this->form_data );
}
@@ -730,6 +736,59 @@ if ( ! class_exists( 'um\core\Form' ) ) {
return $form;
}
+ /**
+ * Use PHP tidy extension if it's active for getting clean HTML without unclosed tags.
+ *
+ * @param string $html_fragment Textarea with active HTML option field value.
+ * @param array $field_data Ultimate Member form field data.
+ *
+ * @return string|\tidy
+ */
+ private static function maybe_apply_tidy( $html_fragment, $field_data ) {
+ // Break if extension isn't active in php.ini
+ if ( ! function_exists( 'tidy_parse_string' ) ) {
+ return $html_fragment;
+ }
+
+ $tidy_config = array(
+ 'clean' => true,
+ 'output-xhtml' => true,
+ 'show-body-only' => true,
+ 'wrap' => 0,
+ );
+ /**
+ * Filters PHP tidy extension config.
+ * Get more info here https://www.php.net/manual/en/tidy.parsestring.php
+ *
+ * @param {array} $tidy_config Config.
+ * @param {array} $field_data UM Form Field Data.
+ *
+ * @return {array} Config.
+ *
+ * @since 2.8.9
+ * @hook um_tidy_config
+ *
+ * @example Customize tidy config based on field data.
+ * function my_um_tidy_config( $tidy_config, $field_data ) {
+ * // your code here
+ * if ( 'custom_metakey' === $field_data['metakey'] ) {
+ * $tidy_config['clean'] = false;
+ * }
+ * return $tidy_config;
+ * }
+ * add_filter( 'um_tidy_config', 'my_um_tidy_config', 10, 2 );
+ */
+ $tidy_config = apply_filters( 'um_tidy_config', $tidy_config, $field_data );
+
+ // since PHP8.0 $tidy_config, 'UTF8' variables are nullable https://www.php.net/manual/en/tidy.parsestring.php
+ $tidy = tidy_parse_string( $html_fragment, $tidy_config, 'UTF8' );
+ $result = $tidy->cleanRepair();
+ if ( $result ) {
+ return $tidy;
+ }
+
+ return $html_fragment;
+ }
/**
* Beautify form data
@@ -758,6 +817,9 @@ if ( ! class_exists( 'um\core\Form' ) ) {
break;
case 'textarea':
if ( ! empty( $field['html'] ) || ( UM()->profile()->get_show_bio_key( $form ) === $k && UM()->options()->get( 'profile_show_html_bio' ) ) ) {
+ $form[ $k ] = html_entity_decode( $form[ $k ] ); // required because WP_Editor send sometimes encoded content.
+ $form[ $k ] = self::maybe_apply_tidy( $form[ $k ], $field );
+
$allowed_html = UM()->get_allowed_html( 'templates' );
if ( empty( $allowed_html['iframe'] ) ) {
$allowed_html['iframe'] = array(
@@ -856,6 +918,7 @@ if ( ! class_exists( 'um\core\Form' ) ) {
case 'vimeo_video':
case 'soundcloud_track':
case 'spotify':
+ case 'tel':
$form[ $k ] = sanitize_text_field( $form[ $k ] );
break;
case 'multiselect':
@@ -894,6 +957,9 @@ if ( ! class_exists( 'um\core\Form' ) ) {
if ( array_key_exists( $description_key, $custom_fields ) ) {
$field_exists = true;
if ( ! empty( $custom_fields[ $description_key ]['html'] ) && $bio_html ) {
+ $form[ $description_key ] = html_entity_decode( $form[ $description_key ] ); // required because WP_Editor send sometimes encoded content.
+ $form[ $description_key ] = self::maybe_apply_tidy( $form[ $description_key ], $custom_fields[ $description_key ] );
+
$allowed_html = UM()->get_allowed_html( 'templates' );
if ( empty( $allowed_html['iframe'] ) ) {
$allowed_html['iframe'] = array(
diff --git a/includes/core/class-member-directory.php b/includes/core/class-member-directory.php
index d9cdea0e..dd40f0dd 100644
--- a/includes/core/class-member-directory.php
+++ b/includes/core/class-member-directory.php
@@ -2589,21 +2589,18 @@ if ( ! class_exists( 'um\core\Member_Directory' ) ) {
return $pagination_data;
}
-
/**
* @param int $user_id
*
* @return array
*/
- function build_user_actions_list( $user_id ) {
-
+ private function build_user_actions_list( $user_id ) {
$actions = array();
if ( ! is_user_logged_in() ) {
return $actions;
}
- if ( get_current_user_id() != $user_id ) {
-
+ if ( get_current_user_id() !== $user_id ) {
if ( UM()->roles()->um_current_user_can( 'edit', $user_id ) ) {
$actions['um-editprofile'] = array(
'title' => esc_html__( 'Edit Profile', 'ultimate-member' ),
@@ -2611,31 +2608,17 @@ if ( ! class_exists( 'um\core\Member_Directory' ) ) {
);
}
- /**
- * UM hook
- *
- * @type filter
- * @title um_admin_user_actions_hook
- * @description Extend admin actions for each user
- * @input_vars
- * [{"var":"$actions","type":"array","desc":"Actions for user"}]
- * @change_log
- * ["Since: 2.0"]
- * @usage
- *
- * @example
- *
- */
- $admin_actions = apply_filters( 'um_admin_user_actions_hook', array(), $user_id );
+ $admin_actions = UM()->frontend()->users()->get_actions_list( $user_id );
if ( ! empty( $admin_actions ) ) {
foreach ( $admin_actions as $id => $arr ) {
- $url = add_query_arg( array( 'um_action' => $id, 'uid' => $user_id ), um_get_core_page( 'user' ) );
+ $url = add_query_arg(
+ array(
+ 'um_action' => $id,
+ 'uid' => $user_id,
+ 'nonce' => wp_create_nonce( $id . $user_id ),
+ ),
+ um_user_profile_url( $user_id )
+ );
$actions[ $id ] = array(
'title' => esc_html( $arr['label'] ),
@@ -2645,9 +2628,7 @@ if ( ! class_exists( 'um\core\Member_Directory' ) ) {
}
$actions = apply_filters( 'um_member_directory_users_card_actions', $actions, $user_id );
-
} else {
-
if ( empty( UM()->user()->cannot_edit ) ) {
$actions['um-editprofile'] = array(
'title' => esc_html__( 'Edit Profile', 'ultimate-member' ),
@@ -2671,15 +2652,13 @@ if ( ! class_exists( 'um\core\Member_Directory' ) ) {
return $actions;
}
-
/**
* @param int $user_id
* @param array $directory_data
*
* @return array
*/
- function build_user_card_data( $user_id, $directory_data ) {
-
+ public function build_user_card_data( $user_id, $directory_data ) {
um_fetch_user( $user_id );
$dropdown_actions = $this->build_user_actions_list( $user_id );
@@ -2701,8 +2680,8 @@ if ( ! class_exists( 'um\core\Member_Directory' ) ) {
'card_anchor' => esc_html( substr( md5( $user_id ), 10, 5 ) ),
'id' => absint( $user_id ),
'role' => esc_html( um_user( 'role' ) ),
- 'account_status' => esc_html( um_user( 'account_status' ) ),
- 'account_status_name' => esc_html( um_user( 'account_status_name' ) ),
+ 'account_status' => esc_html( UM()->common()->users()->get_status( $user_id ) ),
+ 'account_status_name' => esc_html( UM()->common()->users()->get_status( $user_id, 'formatted' ) ),
'cover_photo' => wp_kses( um_user( 'cover_photo', $this->cover_size ), UM()->get_allowed_html( 'templates' ) ),
'display_name' => esc_html( um_user( 'display_name' ) ),
'profile_url' => esc_url( um_user_profile_url() ),
diff --git a/includes/core/class-permalinks.php b/includes/core/class-permalinks.php
index b2714d45..1ce98f72 100644
--- a/includes/core/class-permalinks.php
+++ b/includes/core/class-permalinks.php
@@ -113,43 +113,43 @@ if ( ! class_exists( 'um\core\Permalinks' ) ) {
isset( $_REQUEST['user_id'] ) && is_numeric( $_REQUEST['user_id'] ) ) { // valid token
$user_id = absint( $_REQUEST['user_id'] );
+ if ( is_user_logged_in() && get_current_user_id() !== $user_id ) {
+ // Cannot activate another user account. Please log out and try again.
+ wp_safe_redirect( um_user_profile_url( get_current_user_id() ) );
+ exit;
+ }
+
delete_option( "um_cache_userdata_{$user_id}" );
$account_secret_hash = get_user_meta( $user_id, 'account_secret_hash', true );
if ( empty( $account_secret_hash ) || strtolower( sanitize_text_field( $_REQUEST['hash'] ) ) !== strtolower( $account_secret_hash ) ) {
- wp_die( __( 'This activation link is expired or have already been used.', 'ultimate-member' ) );
+ wp_safe_redirect( add_query_arg( 'err', 'activation_link_used', um_get_core_page( 'login' ) ) );
+ exit;
}
$account_secret_hash_expiry = get_user_meta( $user_id, 'account_secret_hash_expiry', true );
if ( ! empty( $account_secret_hash_expiry ) && time() > $account_secret_hash_expiry ) {
- wp_die( __( 'This activation link is expired.', 'ultimate-member' ) );
+ wp_safe_redirect( add_query_arg( 'err', 'activation_link_expired', um_get_core_page( 'login' ) ) );
+ exit;
}
$redirect = um_get_core_page( 'login', 'account_active' );
$set_password_required = get_user_meta( $user_id, 'um_set_password_required', true );
um_fetch_user( $user_id );
- UM()->user()->approve();
+ UM()->common()->users()->approve( $user_id, true );
if ( ! empty( $set_password_required ) ) {
$redirect = um_user( 'password_reset_link' );
}
um_reset_user();
- $user_role = UM()->roles()->get_priority_user_role( $user_id );
+ $user_role = UM()->roles()->get_priority_user_role( $user_id );
$user_role_data = UM()->roles()->role_data( $user_role );
// log in automatically
$login = ! empty( $user_role_data['login_email_activate'] ); // Role setting "Login user after validating the activation link?"
if ( ! is_user_logged_in() && $login ) {
- $user = get_userdata( $user_id );
-
- // update wp user
- wp_set_current_user( $user_id, $user->user_login );
- wp_set_auth_cookie( $user_id );
-
- ob_start();
- do_action( 'wp_login', $user->user_login, $user );
- ob_end_clean();
+ UM()->user()->auto_login( $user_id );
}
/**
diff --git a/includes/core/class-query.php b/includes/core/class-query.php
index 0885cc6c..ba8b7cc7 100644
--- a/includes/core/class-query.php
+++ b/includes/core/class-query.php
@@ -307,17 +307,24 @@ if ( ! class_exists( 'um\core\Query' ) ) {
return $users_count;
}
-
/**
* Count all users
*
- * @return mixed
+ * @param bool $force Avoid transient. Default false.
+ *
+ * @return int
*/
- function count_users() {
- $result = count_users();
- return $result['total_users'];
- }
+ public function count_users( $force = false ) {
+ $users_count = get_transient( 'um_count_users_all' );
+ if ( $force || false === $users_count ) {
+ $result = count_users();
+ $users_count = $result['total_users'];
+ set_transient( 'um_count_users_all', $users_count, HOUR_IN_SECONDS );
+ }
+
+ return $users_count;
+ }
/**
* Using wpdb instead of update_post_meta
diff --git a/includes/core/class-rewrite.php b/includes/core/class-rewrite.php
index 13578add..7d238716 100644
--- a/includes/core/class-rewrite.php
+++ b/includes/core/class-rewrite.php
@@ -234,8 +234,8 @@ if ( ! class_exists( 'um\core\Rewrite' ) ) {
$user_id = $this->get_user_id_by_user_login_slug();
}
- if ( 'user_id' === $permalink_base ) {
- $user_id = UM()->user()->user_exists_by_id( um_queried_user() );
+ if ( 'user_id' === $permalink_base && UM()->common()->users()::user_exists( um_queried_user() ) ) {
+ $user_id = um_queried_user();
}
if ( 'hash' === $permalink_base ) {
diff --git a/includes/core/class-shortcodes.php b/includes/core/class-shortcodes.php
index bd5c5ddd..d34a789f 100644
--- a/includes/core/class-shortcodes.php
+++ b/includes/core/class-shortcodes.php
@@ -392,21 +392,18 @@ if ( ! class_exists( 'um\core\Shortcodes' ) ) {
return $classes;
}
-
/**
* Logged-in only content
*
- * @param array $args
+ * @param array $args
* @param string $content
*
* @return string
*/
- function um_loggedin( $args = array(), $content = "" ) {
- ob_start();
-
+ public function um_loggedin( $args = array(), $content = '' ) {
$args = shortcode_atts(
array(
- 'lock_text' => __( 'This content has been restricted to logged in users only. Please login to view this content.', 'ultimate-member' ),
+ 'lock_text' => __( 'This content has been restricted to logged-in users only. Please login to view this content.', 'ultimate-member' ),
'show_lock' => 'yes',
),
$args,
@@ -414,50 +411,52 @@ if ( ! class_exists( 'um\core\Shortcodes' ) ) {
);
if ( ! is_user_logged_in() ) {
+ // Hide content for not logged-in users. Maybe display locked content notice.
if ( 'no' === $args['show_lock'] ) {
- echo '';
- } else {
- $args['lock_text'] = $this->convert_locker_tags( $args['lock_text'] );
- UM()->get_template( 'login-to-view.php', '', $args, true );
- }
- } else {
- if ( version_compare( get_bloginfo('version'),'5.4', '<' ) ) {
- echo do_shortcode( $this->convert_locker_tags( wpautop( $content ) ) );
- } else {
- echo apply_shortcodes( $this->convert_locker_tags( wpautop( $content ) ) );
+ return '';
}
+
+ $args['lock_text'] = $this->convert_locker_tags( $args['lock_text'] );
+ return UM()->get_template( 'login-to-view.php', '', $args );
}
- $output = ob_get_clean();
+ $prepared_content = wp_kses( apply_shortcodes( $this->convert_locker_tags( wpautop( $content ) ) ), UM()->get_allowed_html( 'templates' ) );
- return htmlspecialchars_decode( $output, ENT_NOQUOTES );
+ /**
+ * Filters prepared inner content via Ultimate Member handlers in [um_loggedin] shortcode.
+ *
+ * @since 2.8.7
+ * @hook um_loggedin_inner_content
+ *
+ * @param {string} $prepared_content Prepared inner content via Ultimate Member handlers.
+ * @param {string} $content Original inner content.
+ *
+ * @return {string} Prepared inner content.
+ *
+ * @example Change inner content with own handlers.
+ * function my_um_loggedin_inner_content( $prepared_content, $content ) {
+ * $prepared_content = esc_html( $content );
+ * return $prepared_content;
+ * }
+ * add_filter( 'um_loggedin_inner_content', 'my_um_loggedin_inner_content', 10, 2 );
+ */
+ return apply_filters( 'um_loggedin_inner_content', $prepared_content, $content );
}
-
/**
* Logged-out only content
*
- * @param array $args
+ * @param array $args
* @param string $content
*
* @return string
*/
- function um_loggedout( $args = array(), $content = '' ) {
- ob_start();
-
- // Hide for logged in users
+ public function um_loggedout( $args = array(), $content = '' ) {
if ( is_user_logged_in() ) {
- echo '';
- } else {
- if ( version_compare( get_bloginfo('version'),'5.4', '<' ) ) {
- echo do_shortcode( wpautop( $content ) );
- } else {
- echo apply_shortcodes( wpautop( $content ) );
- }
+ // Hide for logged-in users
+ return '';
}
-
- $output = ob_get_clean();
- return $output;
+ return apply_shortcodes( $this->convert_locker_tags( wpautop( $content ) ) );
}
/**
@@ -673,6 +672,22 @@ if ( ! class_exists( 'um\core\Shortcodes' ) ) {
$args['form_id'] = ! empty( $args['form_id'] ) ? absint( $args['form_id'] ) : '';
$args['is_block'] = (bool) $args['is_block'];
+ $form_post = get_post( $args['form_id'] );
+ // Invalid post ID. Maybe post doesn't exist.
+ if ( empty( $form_post ) ) {
+ return '';
+ }
+
+ // Invalid post type. It can be only `um_form` or `um_directory`
+ $post_types = array( 'um_form' );
+ if ( UM()->options()->get( 'members_page' ) ) {
+ $post_types[] = 'um_directory';
+ }
+
+ if ( ! in_array( $form_post->post_type, $post_types, true ) ) {
+ return '';
+ }
+
/**
* 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.
@@ -1192,9 +1207,9 @@ if ( ! class_exists( 'um\core\Shortcodes' ) ) {
*
* @return mixed|string
*/
- function convert_locker_tags( $str ) {
- add_filter( 'um_template_tags_patterns_hook', array( &$this, 'add_placeholder' ), 10, 1 );
- add_filter( 'um_template_tags_replaces_hook', array( &$this, 'add_replace_placeholder' ), 10, 1 );
+ public function convert_locker_tags( $str ) {
+ add_filter( 'um_template_tags_patterns_hook', array( &$this, 'add_placeholder' ) );
+ add_filter( 'um_template_tags_replaces_hook', array( &$this, 'add_replace_placeholder' ) );
return um_convert_tags( $str, array(), false );
}
@@ -1319,18 +1334,22 @@ if ( ! class_exists( 'um\core\Shortcodes' ) ) {
* @param string $content
* @return string
*/
- function um_shortcode_show_content_for_role( $atts = array() , $content = '' ) {
+ public function um_shortcode_show_content_for_role( $atts = array(), $content = '' ) {
global $user_ID;
if ( ! is_user_logged_in() ) {
- return;
+ return '';
}
- $a = shortcode_atts( array(
- 'roles' => '',
- 'not' => '',
- 'is_profile' => false,
- ), $atts );
+ $a = shortcode_atts(
+ array(
+ 'roles' => '',
+ 'not' => '',
+ 'is_profile' => false,
+ ),
+ $atts,
+ 'um_show_content'
+ );
if ( $a['is_profile'] ) {
um_fetch_user( um_profile_id() );
@@ -1341,39 +1360,26 @@ if ( ! class_exists( 'um\core\Shortcodes' ) ) {
$current_user_roles = um_user( 'roles' );
if ( ! empty( $a['not'] ) && ! empty( $a['roles'] ) ) {
- if ( version_compare( get_bloginfo('version'),'5.4', '<' ) ) {
- return do_shortcode( $this->convert_locker_tags( $content ) );
- } else {
- return apply_shortcodes( $this->convert_locker_tags( $content ) );
- }
+ return apply_shortcodes( $this->convert_locker_tags( $content ) );
}
if ( ! empty( $a['not'] ) ) {
- $not_in_roles = explode( ",", $a['not'] );
+ $not_in_roles = explode( ',', $a['not'] );
if ( is_array( $not_in_roles ) && ( empty( $current_user_roles ) || count( array_intersect( $current_user_roles, $not_in_roles ) ) <= 0 ) ) {
- if ( version_compare( get_bloginfo('version'),'5.4', '<' ) ) {
- return do_shortcode( $this->convert_locker_tags( $content ) );
- } else {
- return apply_shortcodes( $this->convert_locker_tags( $content ) );
- }
+ return apply_shortcodes( $this->convert_locker_tags( $content ) );
}
} else {
- $roles = explode( ",", $a['roles'] );
+ $roles = explode( ',', $a['roles'] );
if ( ! empty( $current_user_roles ) && is_array( $roles ) && count( array_intersect( $current_user_roles, $roles ) ) > 0 ) {
- if ( version_compare( get_bloginfo('version'),'5.4', '<' ) ) {
- return do_shortcode( $this->convert_locker_tags( $content ) );
- } else {
- return apply_shortcodes( $this->convert_locker_tags( $content ) );
- }
+ return apply_shortcodes( $this->convert_locker_tags( $content ) );
}
}
return '';
}
-
/**
* @param array $args
* @param string $content
@@ -1426,36 +1432,36 @@ if ( ! class_exists( 'um\core\Shortcodes' ) ) {
$search_value = array_values( $query );
- $template = UM()->get_template( 'searchform.php', '', array( 'query' => $query, 'search_value' => $search_value[0], 'members_page' => um_get_core_page( 'members' ) ) );
-
- return $template;
+ $t_args = array(
+ 'query' => $query,
+ 'search_value' => $search_value[0],
+ 'members_page' => um_get_core_page( 'members' ),
+ );
+ return UM()->get_template( 'searchform.php', '', $t_args );
}
-
/**
* UM Placeholders for login referrer
*
- * @param $placeholders
+ * @param array $placeholders
*
* @return array
*/
- function add_placeholder( $placeholders ) {
+ public function add_placeholder( $placeholders ) {
$placeholders[] = '{login_referrer}';
return $placeholders;
}
-
/**
* UM Replace Placeholders for login referrer
*
- * @param $replace_placeholders
+ * @param array $replace_placeholders
*
* @return array
*/
- function add_replace_placeholder( $replace_placeholders ) {
+ public function add_replace_placeholder( $replace_placeholders ) {
$replace_placeholders[] = um_dynamic_login_page_redirect();
return $replace_placeholders;
}
-
}
}
diff --git a/includes/core/class-user.php b/includes/core/class-user.php
index 9522d165..c4ae9c10 100644
--- a/includes/core/class-user.php
+++ b/includes/core/class-user.php
@@ -130,7 +130,6 @@ if ( ! class_exists( 'um\core\User' ) ) {
add_action( 'personal_options_update', array( &$this, 'remove_cache' ) );
//add_action('edit_user_profile_update', array(&$this, 'remove_cache') );
add_action( 'um_when_role_is_set', array( &$this, 'remove_cache' ) );
- add_action( 'um_when_status_is_set', array( &$this, 'remove_cache' ) );
add_action( 'show_user_profile', array( $this, 'profile_form_additional_section' ), 10 );
add_action( 'user_new_form', array( $this, 'profile_form_additional_section' ), 10 );
@@ -418,7 +417,6 @@ if ( ! class_exists( 'um\core\User' ) ) {
}
}
-
/**
* When you delete usermeta connected with member directory - reset it to default value
*
@@ -427,18 +425,19 @@ if ( ! class_exists( 'um\core\User' ) ) {
* @param string $meta_key
* @param mixed $_meta_value
*/
- function on_delete_usermeta( $meta_ids, $object_id, $meta_key, $_meta_value ) {
+ public function on_delete_usermeta( $meta_ids, $object_id, $meta_key, $_meta_value ) {
if ( $this->deleted_user_id ) {
return;
}
$metakeys = array( 'account_status', 'hide_in_members', 'synced_gravatar_hashed_id', 'synced_profile_photo', 'profile_photo', 'cover_photo', '_um_verified' );
- if ( ! in_array( $meta_key, $metakeys ) ) {
+ if ( ! in_array( $meta_key, $metakeys, true ) ) {
return;
}
+ // Set default if empty or has a wrong format.
$md_data = get_user_meta( $object_id, 'um_member_directory_data', true );
- if ( empty( $md_data ) ) {
+ if ( empty( $md_data ) || ! is_array( $md_data ) ) {
$md_data = array(
'account_status' => 'approved',
'hide_in_members' => UM()->member_directory()->get_hide_in_members_default(),
@@ -495,7 +494,6 @@ if ( ! class_exists( 'um\core\User' ) ) {
update_user_meta( $object_id, 'um_member_directory_data', $md_data );
}
-
/**
* When you add/update usermeta connected with member directories - set this data to member directory metakey
*
@@ -504,15 +502,15 @@ if ( ! class_exists( 'um\core\User' ) ) {
* @param string $meta_key
* @param mixed $_meta_value
*/
- function on_update_usermeta( $meta_id, $object_id, $meta_key, $_meta_value ) {
-
+ public function on_update_usermeta( $meta_id, $object_id, $meta_key, $_meta_value ) {
$metakeys = array( 'account_status', 'hide_in_members', 'synced_gravatar_hashed_id', 'synced_profile_photo', 'profile_photo', 'cover_photo', '_um_verified' );
- if ( ! in_array( $meta_key, $metakeys ) ) {
+ if ( ! in_array( $meta_key, $metakeys, true ) ) {
return;
}
+ // Set default if empty or has a wrong format.
$md_data = get_user_meta( $object_id, 'um_member_directory_data', true );
- if ( empty( $md_data ) ) {
+ if ( empty( $md_data ) || ! is_array( $md_data ) ) {
$md_data = array(
'account_status' => 'approved',
'hide_in_members' => UM()->member_directory()->get_hide_in_members_default(),
@@ -529,7 +527,7 @@ if ( ! class_exists( 'um\core\User' ) ) {
case 'hide_in_members':
$hide_in_members = UM()->member_directory()->get_hide_in_members_default();
if ( ! empty( $_meta_value ) ) {
- if ( $_meta_value == 'Yes' || $_meta_value == __( 'Yes', 'ultimate-member' ) ||
+ if ( 'Yes' === $_meta_value || __( 'Yes', 'ultimate-member' ) === $_meta_value ||
array_intersect( array( 'Yes', __( 'Yes', 'ultimate-member' ) ), $_meta_value ) ) {
$hide_in_members = true;
} else {
@@ -558,14 +556,13 @@ if ( ! class_exists( 'um\core\User' ) ) {
$md_data['cover_photo'] = ! empty( $_meta_value );
break;
case '_um_verified':
- $md_data['verified'] = $_meta_value == 'verified' ? true : false;
+ $md_data['verified'] = 'verified' === $_meta_value;
break;
}
update_user_meta( $object_id, 'um_member_directory_data', $md_data );
}
-
/**
* @param $user_id
*/
@@ -646,28 +643,22 @@ if ( ! class_exists( 'um\core\User' ) ) {
delete_transient( 'um_count_users_pending_dot' );
}
-
/**
*
*/
- function check_membership() {
+ public function check_membership() {
if ( ! is_user_logged_in() ) {
return;
}
- um_fetch_user( get_current_user_id() );
- $status = um_user( 'account_status' );
-
- if ( 'rejected' == $status ) {
+ if ( UM()->common()->users()->has_status( get_current_user_id(), 'rejected' ) ) {
wp_logout();
session_unset();
- exit( wp_redirect( um_get_core_page( 'login' ) ) );
+ um_safe_redirect( um_get_core_page( 'login' ) );
+ exit;
}
-
- um_reset_user();
}
-
/**
* Multisite add existing user
*
@@ -1299,29 +1290,11 @@ if ( ! class_exists( 'um\core\User' ) ) {
$this->usermeta['account_status'][0] = 'approved';
}
- if ( $this->usermeta['account_status'][0] == 'approved' ) {
- $this->usermeta['account_status_name'][0] = __( 'Approved', 'ultimate-member' );
- }
-
- if ( $this->usermeta['account_status'][0] == 'awaiting_email_confirmation' ) {
- $this->usermeta['account_status_name'][0] = __( 'Awaiting Email Confirmation', 'ultimate-member' );
- }
-
- if ( $this->usermeta['account_status'][0] == 'awaiting_admin_review' ) {
- $this->usermeta['account_status_name'][0] = __( 'Pending Review', 'ultimate-member' );
- }
-
- if ( $this->usermeta['account_status'][0] == 'rejected' ) {
- $this->usermeta['account_status_name'][0] = __( 'Membership Rejected', 'ultimate-member' );
- }
-
- if ( $this->usermeta['account_status'][0] == 'inactive' ) {
- $this->usermeta['account_status_name'][0] = __( 'Membership Inactive', 'ultimate-member' );
- }
+ $this->usermeta['account_status_name'][0] = UM()->common()->users()->get_status( $this->id, 'formatted' );
// add user meta
foreach ( $this->usermeta as $k => $v ) {
- if ( $k == 'display_name' ) {
+ if ( 'display_name' === $k ) {
continue;
}
$this->profile[ $k ] = $v[0];
@@ -1390,7 +1363,7 @@ if ( ! class_exists( 'um\core\User' ) ) {
user()->auto_login( 10, true ); ?>
*
*/
- function auto_login( $user_id, $rememberme = 0 ) {
+ public function auto_login( $user_id, $rememberme = 0 ) {
wp_set_current_user( $user_id );
@@ -1507,134 +1480,25 @@ if ( ! class_exists( 'um\core\User' ) ) {
/**
* Set user's account status
*
- * @param $status
+ * @deprecated 2.8.7
+ *
+ * @param string $status
*/
- function set_status( $status ) {
-
- /**
- * UM hook
- *
- * @type action
- * @title um_when_status_is_set
- * @description Action on user status changed
- * @input_vars
- * [{"var":"$user_id","type":"int","desc":"User ID"}]
- * @change_log
- * ["Since: 2.0"]
- * @usage add_action( 'um_when_status_is_set', 'function_name', 10, 1 );
- * @example
- *
- */
- do_action( 'um_when_status_is_set', um_user( 'ID' ) );
-
- $this->profile['account_status'] = $status;
-
- $this->update_usermeta_info( 'account_status' );
-
- /**
- * UM hook
- *
- * @type action
- * @title um_after_user_status_is_changed_hook
- * @description Action after user status changed
- * @input_vars
- * [{"var":"$user_id","type":"int","desc":"User ID"}]
- * @change_log
- * ["Since: 2.0"]
- * @usage add_action( 'um_after_user_status_is_changed_hook', 'function_name', 10 );
- * @example
- *
- */
- do_action( 'um_after_user_status_is_changed_hook', um_user( 'ID' ) );
-
- /**
- * UM hook
- *
- * @type action
- * @title um_after_user_status_is_changed
- * @description Action after user status changed
- * @input_vars
- * [{"var":"$status","type":"string","desc":"User Status"},
- * {"var":"$user_id","type":"integer","desc":"User ID"}]
- * @change_log
- * ["Since: 2.0"]
- * @usage add_action( 'um_after_user_status_is_changed', 'function_name', 10, 1 );
- * @example
- *
- */
- do_action( 'um_after_user_status_is_changed', $status, um_user( 'ID' ) );
-
+ public function set_status( $status ) {
+ _deprecated_function( __METHOD__, '2.8.7', 'UM()->common()->users()->set_status()' );
+ UM()->common()->users()->set_status( $status, um_user( 'ID' ) );
}
-
/**
* Set user's hash
+ *
+ * @deprecated 2.8.7
*/
- function assign_secretkey() {
- /**
- * UM hook
- *
- * @type action
- * @title um_before_user_hash_is_changed
- * @description Action before user hash is changed
- * @change_log
- * ["Since: 2.0"]
- * @usage add_action( 'um_before_user_hash_is_changed', 'function_name', 10 );
- * @example
- *
- */
- do_action( 'um_before_user_hash_is_changed' );
-
- $this->profile['account_secret_hash'] = UM()->validation()->generate();
- $this->update_usermeta_info( 'account_secret_hash' );
-
- $expiry_time = UM()->options()->get( 'activation_link_expiry_time' );
- if ( ! empty( $expiry_time ) && is_numeric( $expiry_time ) ) {
- $this->profile['account_secret_hash_expiry'] = time() + $expiry_time * DAY_IN_SECONDS;
- $this->update_usermeta_info( 'account_secret_hash_expiry' );
- }
-
- /**
- * UM hook
- *
- * @type action
- * @title um_after_user_hash_is_changed
- * @description Action after user hash is changed
- * @change_log
- * ["Since: 2.0"]
- * @usage add_action( 'um_after_user_hash_is_changed', 'function_name', 10 );
- * @example
- *
- */
- do_action( 'um_after_user_hash_is_changed' );
+ public function assign_secretkey() {
+ _deprecated_function( __METHOD__, '2.8.7', 'UM()->common()->users()->assign_secretkey()' );
+ UM()->common()->users()->assign_secretkey( um_user( 'ID' ) );
}
-
/**
* @param \WP_User $userdata
*
@@ -1680,223 +1544,81 @@ if ( ! class_exists( 'um\core\User' ) ) {
/**
* This method approves a user membership and sends them an optional welcome/approval email.
- *
- * @usage user()->approve(); ?>
- *
- * @example Approve a pending user and allow him to sign-in to your site.
-
- user()->approve();
-
- ?>
- *
+ * @param bool $repeat @deprecated
+ * @deprecated 2.8.7
*/
- public function approve( $repeat = true ) {
- $user_id = um_user( 'ID' );
-
- if ( ! $repeat ) {
- $status = get_user_meta( $user_id, 'account_status', true );
- if ( 'approved' === $status ) {
- return;
- }
- }
-
- delete_option( "um_cache_userdata_{$user_id}" );
-
- $user_email = um_user( 'user_email' );
-
- if ( 'awaiting_admin_review' === um_user( 'account_status' ) ) {
- $userdata = get_userdata( $user_id );
-
- $this->maybe_generate_password_reset_key( $userdata );
-
- UM()->maybe_action_scheduler()->enqueue_async_action( 'um_dispatch_email', array( $user_email, 'approved_email' ) );
-
- } else {
- //$userdata = get_userdata( $user_id );
- //get_password_reset_key( $userdata );
- UM()->maybe_action_scheduler()->enqueue_async_action( 'um_dispatch_email', array( $user_email, 'welcome_email' ) );
- }
-
- $this->set_status( 'approved' );
- $this->delete_meta( 'account_secret_hash' );
- $this->delete_meta( 'account_secret_hash_expiry' );
-
- /**
- * UM hook
- *
- * @type action
- * @title um_after_user_is_approved
- * @description Action after user was approved
- * @input_vars
- * [{"var":"$user_id","type":"int","desc":"User ID"}]
- * @change_log
- * ["Since: 2.0"]
- * @usage add_action( 'um_after_user_is_approved', 'function_name', 10, 1 );
- * @example
- *
- */
- do_action( 'um_after_user_is_approved', um_user( 'ID' ) );
+ public function approve( $repeat = true ) { // phpcs:ignore Generic.CodeAnalysis.UnusedFunctionParameter.Found -- deprecated function
+ _deprecated_function( __METHOD__, '2.8.7', 'UM()->common()->users()->approve()' );
+ UM()->common()->users()->approve( um_user( 'ID' ), $repeat );
}
-
/**
* Pending email
+ * @deprecated 2.8.7
*/
- function email_pending() {
- $this->assign_secretkey();
- $this->set_status( 'awaiting_email_confirmation' );
-
- //clear all sessions for email confirmation pending users
- $user = \WP_Session_Tokens::get_instance( um_user( 'ID' ) );
- $user->destroy_all();
-
- UM()->maybe_action_scheduler()->enqueue_async_action( 'um_dispatch_email', array( um_user( 'user_email' ), 'checkmail_email' ) );
+ public function email_pending() {
+ _deprecated_function( __METHOD__, '2.8.7', 'UM()->common()->users()->send_activation()' );
+ UM()->common()->users()->send_activation( um_user( 'ID' ) );
}
-
/**
* This method puts a user under manual review by administrator and sends them an optional email.
- *
- * @usage user()->pending(); ?>
- *
- * @example An example of putting a user pending manual review
-
- user()->pending();
-
- ?>
- *
+ * @deprecated 2.8.7
+ * @return void
*/
- function pending() {
- $this->set_status( 'awaiting_admin_review' );
-
- //clear all sessions for awaiting admin confirmation users
- $user = \WP_Session_Tokens::get_instance( um_user( 'ID' ) );
- $user->destroy_all();
-
- UM()->maybe_action_scheduler()->enqueue_async_action( 'um_dispatch_email', array( um_user( 'user_email' ), 'pending_email' ) );
+ public function pending() {
+ _deprecated_function( __METHOD__, '2.8.7', 'UM()->common()->users()->set_as_pending()' );
+ UM()->common()->users()->set_as_pending( um_user( 'ID' ) );
}
-
/**
* This method rejects a user membership and sends them an optional email.
- *
- * @usage user()->reject(); ?>
- *
- * @example Reject a user membership example
-
- user()->reject();
-
- ?>
-
- *
+ * @deprecated 2.8.7
+ * @return void
*/
- function reject() {
- $this->set_status( 'rejected' );
-
- //clear all sessions for rejected users
- $user = \WP_Session_Tokens::get_instance( um_user( 'ID' ) );
- $user->destroy_all();
-
- UM()->maybe_action_scheduler()->enqueue_async_action( 'um_dispatch_email', array( um_user( 'user_email' ), 'rejected_email' ) );
+ public function reject() {
+ _deprecated_function( __METHOD__, '2.8.7', 'UM()->common()->users()->reject()' );
+ UM()->common()->users()->reject( um_user( 'ID' ) );
}
-
/**
* This method deactivates a user membership and sends them an optional email.
- *
- * @usage user()->deactivate(); ?>
- *
- * @example Deactivate a user membership with the following example
-
- user->deactivate();
-
- ?>
- *
+ * @deprecated 2.8.7
+ * @return void
*/
- function deactivate() {
- $this->set_status( 'inactive' );
-
- //clear all sessions for inactive users
- $user = \WP_Session_Tokens::get_instance( um_user( 'ID' ) );
- $user->destroy_all();
-
- /**
- * UM hook
- *
- * @type action
- * @title um_after_user_is_inactive
- * @description Action after user was inactive
- * @input_vars
- * [{"var":"$user_id","type":"int","desc":"User ID"}]
- * @change_log
- * ["Since: 2.0"]
- * @usage add_action( 'um_after_user_is_inactive', 'function_name', 10, 1 );
- * @example
- *
- */
- do_action( 'um_after_user_is_inactive', um_user( 'ID' ) );
-
- UM()->maybe_action_scheduler()->enqueue_async_action( 'um_dispatch_email', array( um_user( 'user_email' ), 'inactive_email' ) );
+ public function deactivate() {
+ _deprecated_function( __METHOD__, '2.8.7', 'UM()->common()->users()->deactivate()' );
+ UM()->common()->users()->deactivate( um_user( 'ID' ) );
}
-
/**
* Delete user
*
* @param bool $send_mail
*/
- function delete( $send_mail = true ) {
-
+ public function delete( $send_mail = true ) {
$this->send_mail_on_delete = $send_mail;
- //don't send email notification to not approved user
- if ( 'approved' != um_user( 'account_status' ) ) {
+ // Don't send email notification to not approved user
+ if ( ! UM()->common()->users()->has_status( $this->id, 'approved' ) ) {
$this->send_mail_on_delete = false;
}
// remove user
if ( is_multisite() ) {
-
if ( ! function_exists( 'wpmu_delete_user' ) ) {
require_once ABSPATH . 'wp-admin/includes/ms.php';
}
wpmu_delete_user( $this->id );
-
} else {
-
if ( ! function_exists( 'wp_delete_user' ) ) {
require_once ABSPATH . 'wp-admin/includes/user.php';
}
wp_delete_user( $this->id );
-
}
-
}
-
/**
* This method gets a user role in slug format. e.g. member
*
@@ -1975,28 +1697,7 @@ if ( ! class_exists( 'um\core\User' ) ) {
function get_admin_actions() {
$items = array();
- /**
- * UM hook
- *
- * @type filter
- * @title um_admin_user_actions_hook
- * @description Extend admin actions for each user
- * @input_vars
- * [{"var":"$actions","type":"array","desc":"Actions for user"}]
- * @change_log
- * ["Since: 2.0"]
- * @usage
- *
- * @example
- *
- */
- $actions = apply_filters( 'um_admin_user_actions_hook', array(), um_profile_id() );
+ $actions = UM()->frontend()->users()->get_actions_list( um_profile_id() );
if ( empty( $actions ) ) {
return $items;
}
@@ -2006,10 +1707,9 @@ if ( ! class_exists( 'um\core\User' ) ) {
array(
'um_action' => $id,
'uid' => um_profile_id(),
+ 'nonce' => wp_create_nonce( $id . um_profile_id() ),
)
);
- /*$url = add_query_arg( 'um_action', $id );
- $url = add_query_arg( 'uid', um_profile_id(), $url );*/
$items[] = '' . esc_html( $arr['label'] ) . '';
}
return $items;
@@ -2361,32 +2061,15 @@ if ( ! class_exists( 'um\core\User' ) ) {
/**
* This method checks if a user exists or not in your site based on the user ID.
*
- * @usage user()->user_exists_by_id( $user_id ); ?>
+ * @deprecated 2.8.7
*
* @param int $user_id A user ID must be passed to check if the user exists
*
* @return bool|int
- *
- * @example Basic Usage
-
- user()->user_exists_by_id( 15 );
- if ( $boolean ) {
- // That user exists
- }
-
- ?>
-
- *
*/
public function user_exists_by_id( $user_id ) {
- $aux = get_userdata( absint( $user_id ) );
- if ( $aux == false ) {
- return false;
- } else {
- return $user_id;
- }
+ _deprecated_function( __METHOD__, '2.8.7', 'UM()->common()->users()::user_exists' );
+ return UM()->common()->users()::user_exists( $user_id ) ? $user_id : false;
}
/**
@@ -2527,7 +2210,6 @@ if ( ! class_exists( 'um\core\User' ) ) {
return $hash_email_address;
}
-
/**
* UM Placeholders for activation link in email
*
@@ -2535,12 +2217,11 @@ if ( ! class_exists( 'um\core\User' ) ) {
*
* @return array
*/
- function add_activation_placeholder( $placeholders ) {
+ public function add_activation_placeholder( $placeholders ) {
$placeholders[] = '{account_activation_link}';
return $placeholders;
}
-
/**
* UM Replace Placeholders for activation link in email
*
@@ -2548,31 +2229,9 @@ if ( ! class_exists( 'um\core\User' ) ) {
*
* @return array
*/
- function add_activation_replace_placeholder( $replace_placeholders ) {
+ public function add_activation_replace_placeholder( $replace_placeholders ) {
$replace_placeholders[] = um_user( 'account_activation_link' );
return $replace_placeholders;
}
-
-
- /**
- * Get pending users (in queue)
- *
- * @deprecated 2.4.2
- */
- function get_pending_users_count() {
- _deprecated_function( __METHOD__, '2.4.2', 'UM()->query()->get_pending_users_count()' );
- return UM()->query()->get_pending_users_count();
- }
-
-
- /**
- * Remove cached queue from Users backend
- *
- * @deprecated 2.4.2
- */
- function remove_cached_queue() {
- _deprecated_function( __METHOD__, '2.4.2', '' );
- delete_option( 'um_cached_users_queue' );
- }
}
}
diff --git a/includes/core/rest/class-api-v1.php b/includes/core/rest/class-api-v1.php
index a3aee5c2..e80a59ea 100644
--- a/includes/core/rest/class-api-v1.php
+++ b/includes/core/rest/class-api-v1.php
@@ -174,7 +174,7 @@ if ( ! class_exists( 'um\core\rest\API_v1' ) ) {
$val->roles = $user->roles;
$val->first_name = um_user( 'first_name' );
$val->last_name = um_user( 'last_name' );
- $val->account_status = um_user( 'account_status' );
+ $val->account_status = UM()->common()->users()->get_status( $user->ID );
$val->profile_pic_original = um_get_user_avatar_url( '', 'original' );
$val->profile_pic_normal = um_get_user_avatar_url( '', 200 );
$val->profile_pic_small = um_get_user_avatar_url( '', 40 );
@@ -239,7 +239,8 @@ if ( ! class_exists( 'um\core\rest\API_v1' ) ) {
switch ( $data ) {
case 'status':
- UM()->user()->set_status( $value );
+ // Force update of the user status without email notifications.
+ UM()->common()->users()->set_status( $id, $value );
$response['success'] = __( 'User status has been changed.', 'ultimate-member' );
break;
case 'role':
@@ -361,7 +362,7 @@ if ( ! class_exists( 'um\core\rest\API_v1' ) ) {
$response['profile_pic_small'] = um_get_user_avatar_url( '', 40 );
break;
case 'status':
- $response['status'] = um_user( 'account_status' );
+ $response['status'] = UM()->common()->users()->get_status( $user->ID );
break;
case 'role':
//get priority role here
@@ -382,7 +383,7 @@ if ( ! class_exists( 'um\core\rest\API_v1' ) ) {
$val->roles = $user->roles;
$val->first_name = um_user( 'first_name' );
$val->last_name = um_user( 'last_name' );
- $val->account_status = um_user( 'account_status' );
+ $val->account_status = UM()->common()->users()->get_status( $user->ID );
$val->profile_pic_original = um_get_user_avatar_url( '', 'original' );
$val->profile_pic_normal = um_get_user_avatar_url( '', 200 );
$val->profile_pic_small = um_get_user_avatar_url( '', 40 );
diff --git a/includes/core/rest/class-api-v2.php b/includes/core/rest/class-api-v2.php
index 3874b827..8f72fd83 100644
--- a/includes/core/rest/class-api-v2.php
+++ b/includes/core/rest/class-api-v2.php
@@ -173,7 +173,7 @@ if ( ! class_exists( 'um\core\rest\API_v2' ) ) {
$val->roles = $user->roles;
$val->first_name = um_user( 'first_name' );
$val->last_name = um_user( 'last_name' );
- $val->account_status = um_user( 'account_status' );
+ $val->account_status = UM()->common()->users()->get_status( $user->ID );
$val->profile_pic_original = um_get_user_avatar_url( '', 'original' );
$val->profile_pic_normal = um_get_user_avatar_url( '', 200 );
$val->profile_pic_small = um_get_user_avatar_url( '', 40 );
@@ -221,7 +221,8 @@ if ( ! class_exists( 'um\core\rest\API_v2' ) ) {
switch ( $data ) {
case 'status':
- UM()->user()->set_status( $value );
+ // Force update of the user status without email notifications.
+ UM()->common()->users()->set_status( $id, $value );
$response['success'] = __( 'User status has been changed.', 'ultimate-member' );
break;
case 'role':
@@ -325,7 +326,7 @@ if ( ! class_exists( 'um\core\rest\API_v2' ) ) {
$response['profile_pic_small'] = um_get_user_avatar_url( '', 40 );
break;
case 'status':
- $response['status'] = um_user( 'account_status' );
+ $response['status'] = UM()->common()->users()->get_status( $user->ID );
break;
case 'role':
//get priority role here
@@ -346,7 +347,7 @@ if ( ! class_exists( 'um\core\rest\API_v2' ) ) {
$val->roles = $user->roles;
$val->first_name = um_user( 'first_name' );
$val->last_name = um_user( 'last_name' );
- $val->account_status = um_user( 'account_status' );
+ $val->account_status = UM()->common()->users()->get_status( $user->ID );
$val->profile_pic_original = um_get_user_avatar_url( '', 'original' );
$val->profile_pic_normal = um_get_user_avatar_url( '', 200 );
$val->profile_pic_small = um_get_user_avatar_url( '', 40 );
diff --git a/includes/core/um-actions-access.php b/includes/core/um-actions-access.php
index c8e53613..a56d66bb 100644
--- a/includes/core/um-actions-access.php
+++ b/includes/core/um-actions-access.php
@@ -1,5 +1,7 @@
-common()->users()->get_status( $user_id );
+ if ( 'approved' !== $account_status ) {
um_redirect_home();
}
-
- um_reset_user();
-
}
}
-add_action( 'um_access_profile', 'um_access_profile' );
\ No newline at end of file
+add_action( 'um_access_profile', 'um_access_profile' );
diff --git a/includes/core/um-actions-account.php b/includes/core/um-actions-account.php
index 06adae3b..8d442810 100644
--- a/includes/core/um-actions-account.php
+++ b/includes/core/um-actions-account.php
@@ -326,7 +326,9 @@ function um_submit_account_details( $args ) {
if ( 'single_user_password' === $k || 'user_login' === $k ) {
continue;
- } elseif ( 'first_name' === $k || 'last_name' === $k || 'user_password' === $k ) {
+ }
+
+ if ( 'first_name' === $k || 'last_name' === $k || 'user_password' === $k ) {
$v = sanitize_text_field( $v );
} elseif ( 'user_email' === $k ) {
$v = sanitize_email( $v );
@@ -403,7 +405,7 @@ function um_submit_account_details( $args ) {
*/
do_action( 'um_account_pre_update_profile', $changes, $user_id );
- if ( isset( $changes['first_name'] ) || isset( $changes['last_name'] ) || isset( $changes['nickname'] ) ) {
+ if ( isset( $changes['first_name'] ) || isset( $changes['last_name'] ) || isset( $changes['nickname'] ) || isset( $changes['user_email'] ) ) {
$user = get_userdata( $user_id );
if ( ! empty( $user ) && ! is_wp_error( $user ) ) {
UM()->user()->previous_data['display_name'] = $user->display_name;
@@ -417,6 +419,9 @@ function um_submit_account_details( $args ) {
if ( isset( $changes['nickname'] ) ) {
UM()->user()->previous_data['nickname'] = $user->nickname;
}
+ if ( isset( $changes['user_email'] ) ) {
+ UM()->user()->previous_data['user_email'] = $user->user_email;
+ }
}
}
@@ -474,7 +479,7 @@ function um_submit_account_details( $args ) {
$url = add_query_arg( 'updated', 'account', $url );
if ( function_exists( 'icl_get_current_language' ) ) {
- if ( icl_get_current_language() != icl_get_default_language() ) {
+ if ( icl_get_current_language() !== icl_get_default_language() ) {
$url = UM()->permalinks()->get_current_url( true );
$url = add_query_arg( 'updated', 'account', $url );
@@ -487,6 +492,31 @@ function um_submit_account_details( $args ) {
}
add_action( 'um_submit_account_details', 'um_submit_account_details' );
+/**
+ * Maybe clear all sessions except current after changing email. Because email can be used for login.
+ * Using a proper hook that triggers on email changed action in WordPress native handlers.
+ * It starts to work sitewide in UM Account and there wp_update_user with new user_email attribute is used.
+ *
+ * @since 2.8.7
+ *
+ * @param bool $send Whether to send the email.
+ * @param array $user The original user array.
+ * @param array $userdata The updated user array.
+ * @return bool
+ */
+function um_maybe_flush_users_session_update_user( $send, $user, $userdata ) {
+ // Clear all sessions except current after changing email. Because email can be used for login.
+ if ( get_current_user_id() === $userdata['ID'] ) {
+ wp_destroy_other_sessions();
+ } else {
+ $sessions_manager = WP_Session_Tokens::get_instance( $userdata['ID'] );
+ // Remove all the session data for all users.
+ $sessions_manager->destroy_all();
+ }
+
+ return $send;
+}
+add_filter( 'send_email_change_email', 'um_maybe_flush_users_session_update_user', 20, 3 );
/**
* Hidden inputs for account form
diff --git a/includes/core/um-actions-core.php b/includes/core/um-actions-core.php
deleted file mode 100644
index 8779fafc..00000000
--- a/includes/core/um-actions-core.php
+++ /dev/null
@@ -1,157 +0,0 @@
-user()->user_exists_by_id( $uid ) ) {
- return;
- }
-
- if ( ! empty( $uid ) && is_super_admin( $uid ) ) {
- wp_die( esc_html__( 'Super administrators can not be modified.', 'ultimate-member' ) );
- }
-
- $role = get_role( UM()->roles()->get_priority_user_role( get_current_user_id() ) );
- $can_edit_users = current_user_can( 'edit_users' ) && $role->has_cap( 'edit_users' );
-
- switch ( $action ) {
- default:
- /**
- * UM hook
- *
- * @type action
- * @title um_action_user_request_hook
- * @description Integration for user actions
- * @input_vars
- * [{"var":"$action","type":"string","desc":"Action for user"},
- * {"var":"$user_id","type":"int","desc":"User ID"}]
- * @change_log
- * ["Since: 2.0"]
- * @usage add_action( 'um_action_user_request_hook', 'function_name', 10, 2 );
- * @example
- *
- */
- do_action( 'um_action_user_request_hook', $action, $uid );
- break;
-
- case 'edit':
- UM()->fields()->editing = true;
- if ( ! um_is_myprofile() ) {
- if ( ! UM()->roles()->um_current_user_can( 'edit', um_profile_id() ) ) {
- exit( wp_redirect( UM()->permalinks()->get_current_url( true ) ) );
- }
- } else {
- if ( ! um_can_edit_my_profile() ) {
- $url = um_edit_my_profile_cancel_uri();
- exit( wp_redirect( $url ) );
- }
- }
- break;
-
- case 'um_switch_user':
- if ( ! current_user_can( 'manage_options' ) ) {
- return;
- }
- UM()->user()->auto_login( $uid );
- exit( wp_redirect( UM()->permalinks()->get_current_url( true ) ) );
- break;
-
- case 'um_reject_membership':
- if ( ! $can_edit_users ) {
- wp_die( esc_html__( 'You do not have permission to make this action.', 'ultimate-member' ) );
- }
-
- um_fetch_user( $uid );
- UM()->user()->reject();
- exit( wp_redirect( UM()->permalinks()->get_current_url( true ) ) );
- break;
-
- case 'um_approve_membership':
- case 'um_reenable':
- if ( ! $can_edit_users ) {
- wp_die( esc_html__( 'You do not have permission to make this action.', 'ultimate-member' ) );
- }
-
- um_fetch_user( $uid );
-
- add_filter( 'um_template_tags_patterns_hook', array( UM()->password(), 'add_placeholder' ), 10, 1 );
- add_filter( 'um_template_tags_replaces_hook', array( UM()->password(), 'add_replace_placeholder' ), 10, 1 );
-
- UM()->user()->approve();
- exit( wp_redirect( UM()->permalinks()->get_current_url( true ) ) );
- break;
-
- case 'um_put_as_pending':
- if ( ! $can_edit_users ) {
- wp_die( esc_html__( 'You do not have permission to make this action.', 'ultimate-member' ) );
- }
-
- um_fetch_user( $uid );
- UM()->user()->pending();
- exit( wp_redirect( UM()->permalinks()->get_current_url( true ) ) );
- break;
-
- case 'um_resend_activation':
- if ( ! $can_edit_users ) {
- wp_die( esc_html__( 'You do not have permission to make this action.', 'ultimate-member' ) );
- }
-
- add_filter( 'um_template_tags_patterns_hook', array( UM()->user(), 'add_activation_placeholder' ), 10, 1 );
- add_filter( 'um_template_tags_replaces_hook', array( UM()->user(), 'add_activation_replace_placeholder' ), 10, 1 );
-
- um_fetch_user( $uid );
- UM()->user()->email_pending();
- exit( wp_redirect( UM()->permalinks()->get_current_url( true ) ) );
- break;
-
- case 'um_deactivate':
- if ( ! $can_edit_users ) {
- wp_die( esc_html__( 'You do not have permission to make this action.', 'ultimate-member' ) );
- }
-
- um_fetch_user( $uid );
- UM()->user()->deactivate();
- exit( wp_redirect( UM()->permalinks()->get_current_url( true ) ) );
- break;
-
- case 'um_delete':
- if ( ! UM()->roles()->um_current_user_can( 'delete', $uid ) ) {
- wp_die( esc_html__( 'You do not have permission to delete this user.', 'ultimate-member' ) );
- }
-
- um_fetch_user( $uid );
- UM()->user()->delete();
- exit( wp_redirect( UM()->permalinks()->get_current_url( true ) ) );
- break;
-
- }
-}
-add_action( 'template_redirect', 'um_action_request_process', 10000 );
diff --git a/includes/core/um-actions-form.php b/includes/core/um-actions-form.php
index d3f60a98..bf3560be 100644
--- a/includes/core/um-actions-form.php
+++ b/includes/core/um-actions-form.php
@@ -417,13 +417,15 @@ function um_submit_form_errors_hook_( $submitted_data, $form_data ) {
um_reset_user();
}
+ $restricted_fields = array();
+ if ( 'profile' === $mode ) {
+ $restricted_fields = UM()->fields()->get_restricted_fields_for_edit();
+ }
+
foreach ( $fields as $key => $array ) {
- if ( 'profile' === $mode ) {
- $restricted_fields = UM()->fields()->get_restricted_fields_for_edit();
- if ( is_array( $restricted_fields ) && in_array( $key, $restricted_fields, true ) ) {
- continue;
- }
+ if ( 'profile' === $mode && is_array( $restricted_fields ) && in_array( $key, $restricted_fields, true ) ) {
+ continue;
}
$can_view = true;
diff --git a/includes/core/um-actions-login.php b/includes/core/um-actions-login.php
index a47065fe..42cac3e0 100644
--- a/includes/core/um-actions-login.php
+++ b/includes/core/um-actions-login.php
@@ -129,17 +129,15 @@ function um_submit_form_errors_hook_logincheck( $submitted_data, $form_data ) {
wp_logout();
}
- $user_id = ( isset( UM()->login()->auth_id ) ) ? UM()->login()->auth_id : '';
- um_fetch_user( $user_id );
+ $user_id = isset( UM()->login()->auth_id ) ? UM()->login()->auth_id : '';
- $status = um_user( 'account_status' ); // account status
+ $status = UM()->common()->users()->get_status( $user_id ); // account status
switch ( $status ) {
// If user can't log in to site...
case 'inactive':
case 'awaiting_admin_review':
case 'awaiting_email_confirmation':
case 'rejected':
- um_reset_user();
// Not `um_safe_redirect()` because UM()->permalinks()->get_current_url() is situated on the same host.
wp_safe_redirect( add_query_arg( 'err', esc_attr( $status ), UM()->permalinks()->get_current_url() ) );
exit;
@@ -150,7 +148,6 @@ function um_submit_form_errors_hook_logincheck( $submitted_data, $form_data ) {
wp_safe_redirect( um_get_core_page( 'login' ) );
exit;
}
-
}
add_action( 'um_submit_form_errors_hook_logincheck', 'um_submit_form_errors_hook_logincheck', 9999, 2 );
@@ -194,6 +191,16 @@ function um_user_login( $submitted_data ) {
// phpcs:disable WordPress.Security.NonceVerification -- already verified here
$rememberme = ( isset( $_REQUEST['rememberme'], $submitted_data['rememberme'] ) && 1 === (int) $submitted_data['rememberme'] ) ? 1 : 0;
+ $user_id = isset( UM()->login()->auth_id ) ? UM()->login()->auth_id : '';
+ if ( empty( $user_id ) ) {
+ // refresh page if the user_id is empty
+ // Not `um_safe_redirect()` because UM()->permalinks()->get_current_url() is situated on the same host.
+ wp_safe_redirect( UM()->permalinks()->get_current_url() );
+ exit;
+ }
+
+ um_fetch_user( $user_id );
+
// @todo check using the 'deny_admin_frontend_login' option
if ( false !== strrpos( um_user( 'wp_roles' ), 'administrator' ) && ( ! isset( $_GET['provider'] ) && UM()->options()->get( 'deny_admin_frontend_login' ) ) ) {
wp_die( esc_html__( 'This action has been prevented for security measures.', 'ultimate-member' ) );
diff --git a/includes/core/um-actions-misc.php b/includes/core/um-actions-misc.php
index 9525b5a1..4c49617c 100644
--- a/includes/core/um-actions-misc.php
+++ b/includes/core/um-actions-misc.php
@@ -176,6 +176,12 @@ function um_add_update_notice( $args ) {
case 'invalid_nonce':
$err = __( 'An error has been encountered. Probably page was cached. Please try again.', 'ultimate-member' );
break;
+ case 'activation_link_used':
+ $err = __( 'This activation link is expired or have already been used.', 'ultimate-member' );
+ break;
+ case 'activation_link_expired':
+ $err = __( 'This activation link is expired.', 'ultimate-member' );
+ break;
}
}
// phpcs:enable WordPress.Security.NonceVerification -- used for echo and already verified here.
diff --git a/includes/core/um-actions-profile.php b/includes/core/um-actions-profile.php
index 0347a85a..3810847a 100644
--- a/includes/core/um-actions-profile.php
+++ b/includes/core/um-actions-profile.php
@@ -226,6 +226,8 @@ function um_user_edit_profile( $args, $form_data ) {
// loop through fields
if ( ! empty( $fields ) ) {
+ $arr_restricted_fields = UM()->fields()->get_restricted_fields_for_edit( $user_id );
+
foreach ( $fields as $key => $array ) {
if ( ! isset( $array['type'] ) ) {
continue;
@@ -253,8 +255,7 @@ function um_user_edit_profile( $args, $form_data ) {
}
// fields that need to be disabled in edit mode (profile) (email, username, etc.)
- $arr_restricted_fields = UM()->fields()->get_restricted_fields_for_edit( $user_id );
- if ( in_array( $key, $arr_restricted_fields, true ) ) {
+ if ( is_array( $arr_restricted_fields ) && in_array( $key, $arr_restricted_fields, true ) ) {
continue;
}
@@ -306,7 +307,7 @@ function um_user_edit_profile( $args, $form_data ) {
//validation of correct values from options in wp-admin
$stripslashes = '';
if ( isset( $args['submitted'][ $key ] ) && is_string( $args['submitted'][ $key ] ) ) {
- $stripslashes = stripslashes( $args['submitted'][ $key ] );
+ $stripslashes = wp_unslash( $args['submitted'][ $key ] );
}
if ( 'select' === $array['type'] ) {
@@ -361,7 +362,7 @@ function um_user_edit_profile( $args, $form_data ) {
// translators: %s: title.
$args['submitted'][ $key ] = sprintf( __( 'Your choosed %s', 'ultimate-member' ), $array['title'] );
} else {
- if ( isset( $userinfo[ $key ] ) && $args['submitted'][ $key ] != $userinfo[ $key ] ) {
+ if ( isset( $userinfo[ $key ] ) && $args['submitted'][ $key ] !== $userinfo[ $key ] ) {
$to_update[ $key ] = $args['submitted'][ $key ];
} elseif ( '' !== $args['submitted'][ $key ] ) {
$to_update[ $key ] = $args['submitted'][ $key ];
@@ -631,7 +632,6 @@ if ( ! function_exists( 'um_profile_remove_wpseo' ) ) {
}
add_action( 'get_header', 'um_profile_remove_wpseo', 8 );
-
/**
* The profile page SEO tags
*
@@ -641,10 +641,9 @@ add_action( 'get_header', 'um_profile_remove_wpseo', 8 );
*/
function um_profile_dynamic_meta_desc() {
if ( um_is_core_page( 'user' ) && um_get_requested_user() ) {
-
$user_id = um_get_requested_user();
- if ( $user_id !== um_user('ID') ) {
+ if ( um_user( 'ID' ) !== $user_id ) {
um_fetch_user( $user_id );
}
@@ -674,48 +673,39 @@ function um_profile_dynamic_meta_desc() {
$url = um_user_profile_url( $user_id );
/**
- * UM hook
+ * Filters the profile SEO image size. Default 190. Available 'original'.
*
- * @type filter
- * @title um_profile_dynamic_meta_image_size
- * @description Change the profile SEO image size. Default 190. Available 'original'.
- * @input_vars
- * [{"var":"$image_size","type":"int|string","desc":"Image size"},
- * {"var":"$user_id","type":"int","desc":"User ID"}]
- * @change_log
- * ["Since: 2.5.5"]
- * @usage add_filter( 'um_profile_dynamic_meta_image_size', 'function_name', 10, 2 );
- * @example
- * Change meta image to cover photo `cover_photo`.
+ * function my_um_profile_dynamic_meta_image_size( $image_size, $user_id ) {
+ * return 'original';
* }
- * ?>
+ * add_filter( 'um_profile_dynamic_meta_image_size', 'my_um_profile_dynamic_meta_image_size', 10, 2 );
*/
$image_size = apply_filters( 'um_profile_dynamic_meta_image_size', 190, $user_id );
-
/**
- * UM hook
+ * Filters the profile SEO image type. Default 'profile_photo'. Available 'cover_photo', 'profile_photo'.
*
- * @type filter
- * @title um_profile_dynamic_meta_image_type
- * @description Change the profile SEO image type. Default 'profile_photo'. Available 'cover_photo', 'profile_photo', .
- * @input_vars
- * [{"var":"$image_type","type":"string","desc":"Image type - cover_photo or profile_photo"},
- * {"var":"$user_id","type":"int","desc":"User ID"}]
- * @change_log
- * ["Since: 2.5.5"]
- * @usage add_filter( 'um_profile_dynamic_meta_image_type', 'function_name', 10, 2 );
- * @example
- * Change meta image to cover photo `cover_photo`.
+ * function my_um_profile_dynamic_meta_image_type( $image_type, $user_id ) {
+ * return 'cover_photo';
* }
- * ?>
+ * add_filter( 'um_profile_dynamic_meta_image_type', 'my_um_profile_dynamic_meta_image_type', 10, 2 );
*/
$image_type = apply_filters( 'um_profile_dynamic_meta_image_type', 'profile_photo', $user_id );
@@ -729,26 +719,56 @@ function um_profile_dynamic_meta_desc() {
} else {
$image = um_get_cover_uri( um_profile( 'cover_photo' ), null );
}
- } else {
- if ( is_numeric( $image_size ) ) {
- $sizes = UM()->options()->get( 'photo_thumb_sizes' );
- if ( is_array( $sizes ) ) {
- $image_size = um_closest_num( $sizes, $image_size );
- }
- $image = um_get_user_avatar_url( $user_id, $image_size );
- } else {
- $image = um_get_user_avatar_url( $user_id, 'original' );
+ } elseif ( is_numeric( $image_size ) ) {
+ $sizes = UM()->options()->get( 'photo_thumb_sizes' );
+ if ( is_array( $sizes ) ) {
+ $image_size = um_closest_num( $sizes, $image_size );
}
+ $image = um_get_user_avatar_url( $user_id, $image_size );
+ } else {
+ $image = um_get_user_avatar_url( $user_id, 'original' );
}
+ $image = current( explode( '?', $image ) ); // strip $_GET attributes from photo URL.
+ $image_url = wp_parse_url( $image );
+ $image_name = explode( '/', $image_url['path'] );
+ $image_name = end( $image_name );
+ $image_info = wp_check_filetype( $image_name );
+
$person = array(
- "@context" => "http://schema.org",
- "@type" => "Person",
- "name" => esc_attr( $title ),
- "description" => esc_attr( stripslashes( $description ) ),
- "image" => esc_url( $image ),
- "url" => esc_url( $url ),
+ '@context' => 'https://schema.org',
+ '@type' => 'ProfilePage',
+ 'dateCreated' => um_user( 'user_registered' ),
+ 'dateModified' => gmdate( 'Y-m-d H:i:s', um_user( 'last_update' ) ),
+ 'mainEntity' => array(
+ '@type' => 'Person',
+ 'name' => esc_attr( $title ),
+ 'alternateName' => um_user( 'user_login' ),
+ 'description' => esc_attr( stripslashes( $description ) ),
+ 'image' => esc_url( $image ),
+ 'sameAs' => array(
+ $url,
+ ),
+ ),
);
+ /**
+ * Filters changing the schema.org of profile's person.
+ *
+ * @param {array} $person Data of the profile person.
+ * @param {int} $user_id User ID.
+ *
+ * @return {array} Changed person's data.
+ *
+ * @since 2.8.7
+ * @hook um_profile_dynamic_meta_profile_schema
+ *
+ * @example Change name of person.
+ * function my_um_profile_dynamic_meta_profile_schema( $core_search_fields ) {
+ * $person['mainEntity']['name'] = 'John Doe';
+ * }
+ * add_filter( 'um_profile_dynamic_meta_profile_schema', 'my_um_profile_dynamic_meta_profile_schema' );
+ */
+ $person = apply_filters( 'um_profile_dynamic_meta_profile_schema', $person, $user_id );
um_reset_user();
?>
@@ -766,14 +786,20 @@ function um_profile_dynamic_meta_desc() {
-
-
+
+
+
+
+
+
+
+
-
+
@@ -781,7 +807,7 @@ function um_profile_dynamic_meta_desc() {
-
+
-
+
common()->users()->get_status( um_user( 'ID' ), 'formatted' ) ) );
?>
diff --git a/includes/core/um-actions-register.php b/includes/core/um-actions-register.php
index ed7f72a2..65a931ab 100644
--- a/includes/core/um-actions-register.php
+++ b/includes/core/um-actions-register.php
@@ -11,7 +11,7 @@ if ( ! defined( 'ABSPATH' ) ) {
function um_post_registration_approved_hook( $user_id ) {
um_fetch_user( $user_id );
- UM()->user()->approve();
+ UM()->common()->users()->approve( $user_id, true );
}
add_action( 'um_post_registration_approved_hook', 'um_post_registration_approved_hook' );
@@ -23,7 +23,7 @@ add_action( 'um_post_registration_approved_hook', 'um_post_registration_approved
function um_post_registration_checkmail_hook( $user_id ) {
um_fetch_user( $user_id );
- UM()->user()->email_pending();
+ UM()->common()->users()->send_activation( $user_id, true );
}
add_action( 'um_post_registration_checkmail_hook', 'um_post_registration_checkmail_hook' );
@@ -35,7 +35,7 @@ add_action( 'um_post_registration_checkmail_hook', 'um_post_registration_checkma
function um_post_registration_pending_hook( $user_id ) {
um_fetch_user( $user_id );
- UM()->user()->pending();
+ UM()->common()->users()->set_as_pending( $user_id, true );
}
add_action( 'um_post_registration_pending_hook', 'um_post_registration_pending_hook' );
@@ -58,14 +58,6 @@ function um_after_insert_user( $user_id, $args, $form_data = null ) {
UM()->user()->set_registration_details( $args['submitted'], $args, $form_data );
}
- // Set user status.
- $status = um_user( 'status' );
- if ( empty( $status ) ) {
- um_fetch_user( $user_id );
- $status = um_user( 'status' );
- }
- UM()->user()->set_status( $status );
-
// Create user uploads directory.
UM()->uploader()->get_upload_user_base_dir( $user_id, true );
@@ -122,11 +114,12 @@ add_action( 'um_user_register', 'um_after_insert_user', 1, 3 );
*/
function um_send_registration_notification( $user_id ) {
um_fetch_user( $user_id );
+ $registration_status = um_user( 'status' );
$emails = um_multi_admin_email();
if ( ! empty( $emails ) ) {
foreach ( $emails as $email ) {
- if ( 'pending' !== um_user( 'account_status' ) ) {
+ if ( 'pending' !== $registration_status ) {
UM()->maybe_action_scheduler()->enqueue_async_action( 'um_dispatch_email', array( $email, 'notification_new_user', array( 'admin' => true ) ) );
} else {
UM()->maybe_action_scheduler()->enqueue_async_action( 'um_dispatch_email', array( $email, 'notification_review', array( 'admin' => true ) ) );
@@ -144,7 +137,7 @@ add_action( 'um_registration_complete', 'um_send_registration_notification' );
* @param null|array $form_data
*/
function um_check_user_status( $user_id, $args, $form_data = null ) {
- $status = um_user( 'account_status' );
+ $registration_status = um_user( 'status' );
/**
* Fires after complete UM user registration.
* Where $status can be equal to 'approved', 'checkmail' or 'pending'.
@@ -174,7 +167,7 @@ function um_check_user_status( $user_id, $args, $form_data = null ) {
* }
* add_action( 'um_post_registration_pending_hook', 'my_um_post_registration', 10, 3 );
*/
- do_action( "um_post_registration_{$status}_hook", $user_id, $args, $form_data );
+ do_action( "um_post_registration_{$registration_status}_hook", $user_id, $args, $form_data );
if ( is_null( $form_data ) || is_admin() ) {
return;
@@ -209,9 +202,9 @@ function um_check_user_status( $user_id, $args, $form_data = null ) {
* }
* add_action( 'track_pending_user_registration', 'my_um_post_registration', 10, 3 );
*/
- do_action( "track_{$status}_user_registration", $user_id, $args, $form_data );
+ do_action( "track_{$registration_status}_user_registration", $user_id, $args, $form_data );
- if ( 'approved' === $status ) {
+ if ( 'approved' === $registration_status ) {
// Check if user is logged in because there can be the customized way when through 'um_registration_for_loggedin_users' hook the registration is enabled for the logged-in users (e.g. Administrator).
if ( ! is_user_logged_in() ) {
// Custom way if 'um_registration_for_loggedin_users' hook after custom callbacks returns true. Then don't make auto-login because user is already logged-in.
@@ -252,7 +245,9 @@ function um_check_user_status( $user_id, $args, $form_data = null ) {
exit;
}
} else {
- if ( 'redirect_url' === um_user( $status . '_action' ) && '' !== um_user( $status . '_url' ) ) {
+ um_fetch_user( $user_id ); // required because there can be empty um_user.
+
+ if ( 'redirect_url' === um_user( $registration_status . '_action' ) && '' !== um_user( $registration_status . '_url' ) ) {
/**
* Filters the redirect URL for pending user after registration.
*
@@ -272,13 +267,13 @@ function um_check_user_status( $user_id, $args, $form_data = null ) {
* }
* add_filter( 'um_registration_pending_user_redirect', 'my_registration_pending_user_redirect', 10, 3 );
*/
- $redirect_url = apply_filters( 'um_registration_pending_user_redirect', um_user( $status . '_url' ), $status, um_user( 'ID' ) );
+ $redirect_url = apply_filters( 'um_registration_pending_user_redirect', um_user( $registration_status . '_url' ), $registration_status, $user_id );
um_safe_redirect( $redirect_url );
}
- if ( 'show_message' === um_user( $status . '_action' ) && '' !== um_user( $status . '_message' ) ) {
+ if ( 'show_message' === um_user( $registration_status . '_action' ) && '' !== um_user( $registration_status . '_message' ) ) {
$url = UM()->permalinks()->get_current_url();
- $url = add_query_arg( 'message', esc_attr( $status ), $url );
+ $url = add_query_arg( 'message', esc_attr( $registration_status ), $url );
// 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 );
@@ -302,7 +297,7 @@ function um_check_user_status( $user_id, $args, $form_data = null ) {
* }
* 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 );
+ $url = apply_filters( 'um_registration_show_message_redirect_url', $url, $registration_status, $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;
diff --git a/includes/core/um-actions-save-profile.php b/includes/core/um-actions-save-profile.php
index fb2775d6..07d53b55 100644
--- a/includes/core/um-actions-save-profile.php
+++ b/includes/core/um-actions-save-profile.php
@@ -1,5 +1,7 @@
-' . esc_html( $value ) . '';
- return $value;
+ $maybe_empty_phone = trim( str_replace( '+', '', $value ) );
+ if ( empty( $maybe_empty_phone ) ) {
+ return '';
+ }
+
+ $value = trim( $value );
+ return '
' . esc_html( $value ) . '';
}
add_filter( 'um_profile_field_filter_hook__tel', 'um_profile_field_filter_hook__phone', 99, 2 );
@@ -255,8 +259,9 @@ function um_profile_field_filter_hook__textarea( $value, $data ) {
if ( ! $value ) {
return '';
}
+
if ( ! empty( $data['html'] ) ) {
- return $value;
+ return wp_kses_post( $value );
}
$description_key = UM()->profile()->get_show_bio_key( UM()->fields()->global_args );
diff --git a/includes/core/um-filters-login.php b/includes/core/um-filters-login.php
index a5369469..7d7ba07f 100644
--- a/includes/core/um-filters-login.php
+++ b/includes/core/um-filters-login.php
@@ -66,8 +66,7 @@ function um_wp_form_errors_hook_logincheck( $user ) {
}
if ( isset( $user->ID ) ) {
- um_fetch_user( $user->ID );
- $status = um_user( 'account_status' );
+ $status = UM()->common()->users()->get_status( $user->ID );
$error = null;
switch ( $status ) {
diff --git a/includes/core/um-filters-profile.php b/includes/core/um-filters-profile.php
index 95515724..3e994bf1 100644
--- a/includes/core/um-filters-profile.php
+++ b/includes/core/um-filters-profile.php
@@ -127,7 +127,7 @@ add_filter( 'get_canonical_url', 'um_get_canonical_url', 20, 2 );
* @return array
*/
function um_change_profile_cover_photo_label( $fields ) {
- $max_size = UM()->files()->format_bytes( $fields['cover_photo']['max_size'] );
+ $max_size = UM()->common()->filesystem()::format_bytes( $fields['cover_photo']['max_size'] );
if ( ! empty( $max_size ) ) {
list( $file_size, $unit ) = explode( ' ', $max_size );
@@ -148,7 +148,7 @@ add_filter( 'um_predefined_fields_hook', 'um_change_profile_cover_photo_label',
* @return array
*/
function um_change_profile_photo_label( $fields ) {
- $max_size = UM()->files()->format_bytes( $fields['profile_photo']['max_size'] );
+ $max_size = UM()->common()->filesystem()::format_bytes( $fields['profile_photo']['max_size'] );
if ( ! empty( $max_size ) ) {
list( $file_size, $unit ) = explode( ' ', $max_size );
diff --git a/includes/core/um-filters-user.php b/includes/core/um-filters-user.php
index 2ff9e293..4d0eb375 100644
--- a/includes/core/um-filters-user.php
+++ b/includes/core/um-filters-user.php
@@ -3,61 +3,6 @@ if ( ! defined( 'ABSPATH' ) ) {
exit;
}
-/**
- * Main admin user actions.
- *
- * @param array $actions
- * @param int $user_id
- *
- * @return array
- */
-function um_admin_user_actions_hook( $actions, $user_id ) {
- um_fetch_user( $user_id );
-
- $role = get_role( UM()->roles()->get_priority_user_role( get_current_user_id() ) );
-
- $can_edit_users = null !== $role && current_user_can( 'edit_users' ) && $role->has_cap( 'edit_users' );
- if ( $can_edit_users ) {
- $account_status = um_user( 'account_status' );
-
- if ( 'awaiting_admin_review' === $account_status ) {
- $actions['um_approve_membership'] = array( 'label' => __( 'Approve Membership', 'ultimate-member' ) );
- $actions['um_reject_membership'] = array( 'label' => __( 'Reject Membership', 'ultimate-member' ) );
- }
-
- if ( 'rejected' === $account_status ) {
- $actions['um_approve_membership'] = array( 'label' => __( 'Approve Membership', 'ultimate-member' ) );
- }
-
- if ( 'approved' === $account_status ) {
- $actions['um_put_as_pending'] = array( 'label' => __( 'Put as Pending Review', 'ultimate-member' ) );
- }
-
- if ( 'awaiting_email_confirmation' === $account_status ) {
- $actions['um_resend_activation'] = array( 'label' => __( 'Resend Activation Email', 'ultimate-member' ) );
- }
-
- if ( 'inactive' !== $account_status ) {
- $actions['um_deactivate'] = array( 'label' => __( 'Deactivate this account', 'ultimate-member' ) );
- }
-
- if ( 'inactive' === $account_status ) {
- $actions['um_reenable'] = array( 'label' => __( 'Reactivate this account', 'ultimate-member' ) );
- }
- }
-
- if ( UM()->roles()->um_current_user_can( 'delete', $user_id ) ) {
- $actions['um_delete'] = array( 'label' => __( 'Delete this user', 'ultimate-member' ) );
- }
-
- if ( current_user_can( 'manage_options' ) && ! is_super_admin( $user_id ) ) {
- $actions['um_switch_user'] = array( 'label' => __( 'Login as this user', 'ultimate-member' ) );
- }
-
- return $actions;
-}
-add_filter( 'um_admin_user_actions_hook', 'um_admin_user_actions_hook', 10, 2 );
-
/**
* Filter user basename.
*
diff --git a/includes/frontend/class-actions-listener.php b/includes/frontend/class-actions-listener.php
new file mode 100644
index 00000000..3094259f
--- /dev/null
+++ b/includes/frontend/class-actions-listener.php
@@ -0,0 +1,206 @@
+common()->users()::user_exists( $user_id ) ) {
+ return;
+ }
+
+ if ( get_current_user_id() === $user_id ) {
+ return;
+ }
+
+ if ( ! empty( $user_id ) && is_super_admin( $user_id ) ) {
+ wp_die( esc_html__( 'Super administrators can not be modified.', 'ultimate-member' ) );
+ }
+
+ $action = sanitize_key( $_REQUEST['um_action'] );
+ // phpcs:enable WordPress.Security.NonceVerification -- there is nonce verification below for each case
+ switch ( $action ) {
+ case 'approve_user':
+ if ( ! wp_verify_nonce( $_REQUEST['nonce'], "approve_user{$user_id}" ) ) {
+ wp_die( esc_html__( 'The link you followed has expired.', 'ultimate-member' ) );
+ }
+
+ if ( ! UM()->common()->users()->can_current_user_edit_user( $user_id ) ) {
+ wp_die( esc_html__( 'You do not have permission to edit this user.', 'ultimate-member' ) );
+ }
+
+ $result = UM()->common()->users()->approve( $user_id );
+ if ( ! $result ) {
+ wp_die( esc_html__( 'Something went wrong.', 'ultimate-member' ) );
+ }
+
+ um_safe_redirect( UM()->permalinks()->get_current_url( true ) );
+ exit;
+ case 'reactivate_user':
+ if ( ! wp_verify_nonce( $_REQUEST['nonce'], "reactivate_user{$user_id}" ) ) {
+ wp_die( esc_html__( 'The link you followed has expired.', 'ultimate-member' ) );
+ }
+
+ if ( ! UM()->common()->users()->can_current_user_edit_user( $user_id ) ) {
+ wp_die( esc_html__( 'You do not have permission to edit this user.', 'ultimate-member' ) );
+ }
+
+ $result = UM()->common()->users()->reactivate( $user_id );
+ if ( ! $result ) {
+ wp_die( esc_html__( 'Something went wrong.', 'ultimate-member' ) );
+ }
+
+ um_safe_redirect( UM()->permalinks()->get_current_url( true ) );
+ exit;
+ case 'put_user_as_pending':
+ if ( ! wp_verify_nonce( $_REQUEST['nonce'], "put_user_as_pending{$user_id}" ) ) {
+ wp_die( esc_html__( 'The link you followed has expired.', 'ultimate-member' ) );
+ }
+
+ if ( ! UM()->common()->users()->can_current_user_edit_user( $user_id ) ) {
+ wp_die( esc_html__( 'You do not have permission to edit this user.', 'ultimate-member' ) );
+ }
+
+ $result = UM()->common()->users()->set_as_pending( $user_id );
+ if ( ! $result ) {
+ wp_die( esc_html__( 'Something went wrong.', 'ultimate-member' ) );
+ }
+
+ um_safe_redirect( UM()->permalinks()->get_current_url( true ) );
+ exit;
+ case 'resend_user_activation':
+ if ( ! wp_verify_nonce( $_REQUEST['nonce'], "resend_user_activation{$user_id}" ) ) {
+ wp_die( esc_html__( 'The link you followed has expired.', 'ultimate-member' ) );
+ }
+
+ if ( ! UM()->common()->users()->can_current_user_edit_user( $user_id ) ) {
+ wp_die( esc_html__( 'You do not have permission to edit this user.', 'ultimate-member' ) );
+ }
+
+ $result = UM()->common()->users()->send_activation( $user_id, true );
+ if ( ! $result ) {
+ wp_die( esc_html__( 'Something went wrong.', 'ultimate-member' ) );
+ }
+
+ um_safe_redirect( UM()->permalinks()->get_current_url( true ) );
+ exit;
+ case 'reject_user':
+ if ( ! wp_verify_nonce( $_REQUEST['nonce'], "reject_user{$user_id}" ) ) {
+ wp_die( esc_html__( 'The link you followed has expired.', 'ultimate-member' ) );
+ }
+
+ if ( ! UM()->common()->users()->can_current_user_edit_user( $user_id ) ) {
+ wp_die( esc_html__( 'You do not have permission to edit this user.', 'ultimate-member' ) );
+ }
+
+ $result = UM()->common()->users()->reject( $user_id );
+ if ( ! $result ) {
+ wp_die( esc_html__( 'Something went wrong.', 'ultimate-member' ) );
+ }
+
+ um_safe_redirect( UM()->permalinks()->get_current_url( true ) );
+ exit;
+ case 'deactivate_user':
+ if ( ! wp_verify_nonce( $_REQUEST['nonce'], "deactivate_user{$user_id}" ) ) {
+ wp_die( esc_html__( 'The link you followed has expired.', 'ultimate-member' ) );
+ }
+
+ if ( ! UM()->common()->users()->can_current_user_edit_user( $user_id ) ) {
+ wp_die( esc_html__( 'You do not have permission to edit this user.', 'ultimate-member' ) );
+ }
+
+ $result = UM()->common()->users()->deactivate( $user_id );
+ if ( ! $result ) {
+ wp_die( esc_html__( 'Something went wrong.', 'ultimate-member' ) );
+ }
+
+ um_safe_redirect( UM()->permalinks()->get_current_url( true ) );
+ exit;
+ case 'switch_user':
+ if ( ! current_user_can( 'manage_options' ) ) {
+ return;
+ }
+
+ if ( ! wp_verify_nonce( $_REQUEST['nonce'], "switch_user{$user_id}" ) ) {
+ wp_die( esc_html__( 'The link you followed has expired.', 'ultimate-member' ) );
+ }
+
+ UM()->user()->auto_login( $user_id );
+
+ um_safe_redirect( UM()->permalinks()->get_current_url( true ) );
+ exit;
+ case 'delete':
+ if ( ! wp_verify_nonce( $_REQUEST['nonce'], "delete{$user_id}" ) ) {
+ wp_die( esc_html__( 'The link you followed has expired.', 'ultimate-member' ) );
+ }
+
+ if ( ! UM()->roles()->um_current_user_can( 'delete', $user_id ) ) {
+ wp_die( esc_html__( 'You do not have permission to delete this user.', 'ultimate-member' ) );
+ }
+
+ um_fetch_user( $user_id );
+ UM()->user()->delete();
+
+ um_safe_redirect( UM()->permalinks()->get_current_url( true ) );
+ exit;
+ default:
+ /**
+ * Fires to handle 3rd-party user actions from User Profile.
+ *
+ * Note: Please verify nonce and redirect after action individually in 3rd-party handler.
+ *
+ * @since 1.3.x
+ * @hook um_action_user_request_hook
+ *
+ * @param {string} $action User action key.
+ * @param {int} $user_id User ID.
+ *
+ * @example
Update `some_custom_meta` user meta on `my_custom_action`.
+ * function um_action_user_request_hook( $action, $user_id ) {
+ * if ( 'my_custom_action' === $action ) {
+ * update_user_meta( $user_id, 'some_custom_meta', true );
+ * }
+ * }
+ * add_action( 'um_action_user_request_hook', 'um_action_user_request_hook', 10, 2 );
+ */
+ do_action( 'um_action_user_request_hook', $action, $user_id );
+ break;
+ }
+ }
+ }
+}
diff --git a/includes/frontend/class-init.php b/includes/frontend/class-init.php
index b34cd983..1d3d460f 100644
--- a/includes/frontend/class-init.php
+++ b/includes/frontend/class-init.php
@@ -20,9 +20,25 @@ if ( ! class_exists( 'um\frontend\Init' ) ) {
* @used-by \UM::includes()
*/
public function includes() {
+ $this->actions_listener();
$this->enqueue();
$this->modal();
$this->secure();
+ $this->user_profile();
+ $this->users();
+ }
+
+ /**
+ * @since 2.8.7
+ *
+ * @return Actions_Listener
+ */
+ public function actions_listener() {
+ if ( empty( UM()->classes['um\frontend\actions_listener'] ) ) {
+ UM()->classes['um\frontend\actions_listener'] = new Actions_Listener();
+ }
+
+ return UM()->classes['um\frontend\actions_listener'];
}
/**
@@ -62,5 +78,29 @@ if ( ! class_exists( 'um\frontend\Init' ) ) {
}
return UM()->classes['um\frontend\secure'];
}
+
+ /**
+ * @since 2.8.7
+ *
+ * @return User_Profile
+ */
+ public function user_profile() {
+ if ( empty( UM()->classes['um\frontend\user_profile'] ) ) {
+ UM()->classes['um\frontend\user_profile'] = new User_Profile();
+ }
+ return UM()->classes['um\frontend\user_profile'];
+ }
+
+ /**
+ * @since 2.8.7
+ *
+ * @return Users
+ */
+ public function users() {
+ if ( empty( UM()->classes['um\frontend\users'] ) ) {
+ UM()->classes['um\frontend\users'] = new Users();
+ }
+ return UM()->classes['um\frontend\users'];
+ }
}
}
diff --git a/includes/frontend/class-secure.php b/includes/frontend/class-secure.php
index c3e05218..65304b1e 100644
--- a/includes/frontend/class-secure.php
+++ b/includes/frontend/class-secure.php
@@ -142,7 +142,12 @@ if ( ! class_exists( 'um\frontend\Secure' ) ) {
*/
public function login_validate_expired_pass() {
if ( UM()->options()->get( 'display_login_form_notice' ) ) {
- $expired_password_reset = get_user_meta( um_user( 'ID' ), 'um_secure_has_reset_password', true );
+ $user_id = isset( UM()->login()->auth_id ) ? UM()->login()->auth_id : '';
+ if ( empty( $user_id ) ) {
+ return;
+ }
+
+ $expired_password_reset = get_user_meta( $user_id, 'um_secure_has_reset_password', true );
if ( ! $expired_password_reset ) {
$login_url = add_query_arg( 'notice', 'expired_password', um_get_core_page( 'login' ) );
// Not `um_safe_redirect()` because predefined login page is situated on the same host.
diff --git a/includes/frontend/class-user-profile.php b/includes/frontend/class-user-profile.php
new file mode 100644
index 00000000..a2fb176e
--- /dev/null
+++ b/includes/frontend/class-user-profile.php
@@ -0,0 +1,69 @@
+common()->users()::user_exists( $uid ) ) {
+ return;
+ }
+
+ if ( ! empty( $uid ) && is_super_admin( $uid ) ) {
+ wp_die( esc_html__( 'Super administrators can not be modified.', 'ultimate-member' ) );
+ }
+
+ UM()->fields()->editing = true;
+
+ if ( ! um_is_myprofile() && ! UM()->roles()->um_current_user_can( 'edit', um_profile_id() ) ) {
+ um_safe_redirect( UM()->permalinks()->get_current_url( true ) );
+ exit;
+ }
+
+ if ( um_is_myprofile() && ! um_can_edit_my_profile() ) {
+ um_safe_redirect( um_edit_my_profile_cancel_uri() );
+ exit;
+ }
+ }
+ }
+}
diff --git a/includes/frontend/class-users.php b/includes/frontend/class-users.php
new file mode 100644
index 00000000..6047cbd7
--- /dev/null
+++ b/includes/frontend/class-users.php
@@ -0,0 +1,85 @@
+roles()->get_priority_user_role( get_current_user_id() );
+ $role = get_role( $priority_role );
+
+ $can_edit_users = null !== $role && current_user_can( 'edit_users' ) && $role->has_cap( 'edit_users' );
+ if ( $can_edit_users ) {
+ if ( UM()->common()->users()->can_be_approved( $user_id ) ) {
+ $actions['approve_user'] = array( 'label' => __( 'Approve Membership', 'ultimate-member' ) );
+ }
+ if ( UM()->common()->users()->can_be_rejected( $user_id ) ) {
+ $actions['reject_user'] = array( 'label' => __( 'Reject Membership', 'ultimate-member' ) );
+ }
+ if ( UM()->common()->users()->can_be_reactivated( $user_id ) ) {
+ $actions['reactivate_user'] = array( 'label' => __( 'Reactivate this account', 'ultimate-member' ) );
+ }
+ if ( UM()->common()->users()->can_be_set_as_pending( $user_id ) ) {
+ $actions['put_user_as_pending'] = array( 'label' => __( 'Put as Pending Review', 'ultimate-member' ) );
+ }
+ if ( UM()->common()->users()->can_activation_send( $user_id ) ) {
+ $title = __( 'Send activation email', 'ultimate-member' );
+ if ( UM()->common()->users()->has_status( $user_id, 'awaiting_email_confirmation' ) ) {
+ $title = __( 'Resend activation email', 'ultimate-member' );
+ }
+ $actions['resend_user_activation'] = array( 'label' => $title );
+ }
+ if ( UM()->common()->users()->can_be_deactivated( $user_id ) ) {
+ $actions['deactivate_user'] = array( 'label' => __( 'Deactivate this account', 'ultimate-member' ) );
+ }
+ }
+
+ if ( UM()->roles()->um_current_user_can( 'delete', $user_id ) ) {
+ $actions['delete'] = array( 'label' => __( 'Delete this user', 'ultimate-member' ) );
+ }
+
+ if ( current_user_can( 'manage_options' ) && ! is_super_admin( $user_id ) ) {
+ $actions['switch_user'] = array( 'label' => __( 'Login as this user', 'ultimate-member' ) );
+ }
+
+ /**
+ * Filters users actions list in Ultimate Member frontend.
+ *
+ * @since 1.3.x
+ * @hook um_admin_user_actions_hook
+ *
+ * @param {array} $actions CPT keys.
+ * @param {int} $user_id User ID.
+ *
+ * @return {array} CPT keys.
+ *
+ * @example
Add `um_custom_action` action to the users actions list on frontend.
+ * function um_custom_admin_user_actions_hook( $actions, $user_id ) {
+ * $actions['um_custom_action'] = array( 'label' => 'um_custom_action_label' );
+ * return $actions;
+ * }
+ * add_filter( 'um_admin_user_actions_hook', 'um_custom_admin_user_actions_hook', 10, 2 );
+ */
+ return apply_filters( 'um_admin_user_actions_hook', $actions, $user_id );
+ }
+}
diff --git a/includes/um-deprecated-hooks.php b/includes/um-deprecated-hooks.php
index 86a01327..a41bd2f1 100644
--- a/includes/um-deprecated-hooks.php
+++ b/includes/um-deprecated-hooks.php
@@ -45,3 +45,67 @@ if ( ! defined( 'ABSPATH' ) ) {
* }
* add_filter( 'um_language_file', 'my_um_language_file' );
*/
+
+/**
+ * Fires after user status changed.
+ *
+ * @param {int} $user_id User ID.
+ *
+ * @since 1.3.x
+ * @depecated 2.8.7 use action hook `um_after_user_status_is_changed` instead.
+ * @hook um_after_user_status_is_changed_hook
+ */
+
+/**
+ * Fires just before User status is changed.
+ *
+ * @since 1.3.x
+ * @depecated 2.8.7 use action hook `um_before_user_status_is_set` instead.
+ * @hook um_when_status_is_set
+ *
+ * @param {int} $user_id User ID. Since 2.0
+ */
+
+/**
+ * Fires for handle admin user_action scripts.
+ *
+ * @since 1.3.x
+ * @depecated 2.8.7 WordPress native `handle_bulk_actions-users` hook is used. Use action hook `um_handle_bulk_actions-users-{$current_action}` for custom user bulk actions instead.
+ * @hook um_admin_user_action_hook
+ *
+ * @param {string} $bulk_action Bulk action key
+ */
+
+/**
+ * Fires for handle admin user_action scripts.
+ * Where $bulk_action is a bulk action key
+ *
+ * @since 1.3.x
+ * @depecated 2.8.7 WordPress native `handle_bulk_actions-users` hook is used. Use action hook `um_handle_bulk_actions-users-{$current_action}` for custom user bulk actions instead.
+ * @hook um_admin_user_action_{$bulk_action}_hook
+ */
+
+/**
+ * Fires for handle custom admin user_action scripts.
+ * Where $action is a bulk action key
+ *
+ * @since 1.3.x
+ * @depecated 2.8.7 WordPress native `handle_bulk_actions-users` hook is used. Use action hook `um_handle_bulk_actions-users-{$current_action}` for custom user bulk actions instead.
+ * @hook um_admin_custom_hook_{$action}
+ *
+ * @param {int} $user_id User ID.
+ */
+
+/**
+ * Filters the WP Users list table views.
+ *
+ * Fully deprecated. Please use filter 'um_user_statuses_admin_filter_options' hook instead since 2.8.7.
+ *
+ * @param {array} $views List table filter views.
+ *
+ * @return {array} List table filter views.
+ *
+ * @since 1.3.x
+ * @depecated 2.8.7 Fully deprecated because there is used dropdown with statuses instead of list table views.
+ * @hook um_admin_views_users
+ */
diff --git a/includes/um-short-functions.php b/includes/um-short-functions.php
index b4179d30..51e1e287 100644
--- a/includes/um-short-functions.php
+++ b/includes/um-short-functions.php
@@ -120,7 +120,6 @@ function um_replace_placeholders() {
'{user_account_link}',
);
-
/**
* UM hook
*
@@ -1448,7 +1447,7 @@ function um_set_requested_user( $user_id ) {
*/
function um_get_requested_user() {
if ( ! empty( UM()->user()->target_id ) ) {
- return UM()->user()->target_id;
+ return absint( UM()->user()->target_id );
}
return false;
@@ -1579,7 +1578,7 @@ function um_can_view_field( $data ) {
/**
* Checks if user can view profile
- *
+ * @todo make the function review. Maybe rewrite it.
* @param int $user_id
*
* @return bool
diff --git a/languages/ultimate-member.pot b/languages/ultimate-member.pot
index 69bf5c6c..de2c854b 100644
--- a/languages/ultimate-member.pot
+++ b/languages/ultimate-member.pot
@@ -2,24 +2,25 @@
# This file is distributed under the same license as the Ultimate Member plugin.
msgid ""
msgstr ""
-"Project-Id-Version: Ultimate Member 2.8.6\n"
+"Project-Id-Version: Ultimate Member 2.8.8\n"
"Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/ultimate-member\n"
"Last-Translator: FULL NAME
\n"
"Language-Team: LANGUAGE \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"POT-Creation-Date: 2024-05-20T11:04:53+00:00\n"
+"POT-Creation-Date: 2024-10-04T09:06:28+00:00\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
-"X-Generator: WP-CLI 2.10.0\n"
+"X-Generator: WP-CLI 2.11.0\n"
"X-Domain: ultimate-member\n"
#. Plugin Name of the plugin
#. Author of the plugin
#: ultimate-member.php
#: includes/admin/class-site-health.php:292
+#: includes/admin/class-users-columns.php:322
#: includes/admin/core/class-admin-menu.php:183
-#: includes/core/class-user.php:1061
+#: includes/core/class-user.php:1060
msgid "Ultimate Member"
msgstr ""
@@ -34,83 +35,92 @@ msgstr ""
msgid "The easiest way to create powerful online communities and beautiful user profiles with WordPress"
msgstr ""
+#: includes/admin/class-actions-listener.php:39
+#: includes/admin/class-actions-listener.php:64
+#: includes/admin/class-actions-listener.php:88
+#: includes/admin/class-actions-listener.php:112
+#: includes/admin/class-actions-listener.php:136
+#: includes/admin/class-actions-listener.php:160
+msgid "Invalid user ID"
+msgstr ""
+
#: includes/admin/class-admin-functions.php:26
#: includes/class-functions.php:55
msgid "Wrong Nonce"
msgstr ""
-#: includes/admin/class-admin.php:843
+#: includes/admin/class-admin.php:844
#: includes/admin/class-site-health.php:2003
#: includes/admin/templates/directory/sorting.php:68
#: includes/core/class-member-directory.php:426
msgid "Other (Custom Field)"
msgstr ""
-#: includes/admin/class-admin.php:1797
+#: includes/admin/class-admin.php:1800
#: includes/admin/class-secure.php:96
#: includes/admin/class-secure.php:133
msgid "Security check"
msgstr ""
-#: includes/admin/class-admin.php:1801
+#: includes/admin/class-admin.php:1804
msgid "Wrong ID"
msgstr ""
#. translators: %s - Form title
-#: includes/admin/class-admin.php:1809
+#: includes/admin/class-admin.php:1812
msgid "Duplicate of %s"
msgstr ""
-#: includes/admin/class-admin.php:1932
+#: includes/admin/class-admin.php:1872
msgid "Docs"
msgstr ""
-#: includes/admin/class-admin.php:1933
+#: includes/admin/class-admin.php:1873
#: includes/admin/core/class-admin-menu.php:195
msgid "Settings"
msgstr ""
-#: includes/admin/class-admin.php:1957
-#: includes/admin/core/class-admin-notices.php:1033
+#: includes/admin/class-admin.php:1896
+#: includes/admin/core/class-admin-notices.php:1060
#: includes/admin/core/class-admin-settings.php:2520
#: includes/ajax/class-secure.php:34
msgid "Security Check"
msgstr ""
-#: includes/admin/class-admin.php:2019
-#: includes/admin/class-admin.php:2022
+#: includes/admin/class-admin.php:1958
+#: includes/admin/class-admin.php:1961
msgid "Form updated."
msgstr ""
-#: includes/admin/class-admin.php:2020
+#: includes/admin/class-admin.php:1959
msgid "Custom field updated."
msgstr ""
-#: includes/admin/class-admin.php:2021
+#: includes/admin/class-admin.php:1960
msgid "Custom field deleted."
msgstr ""
-#: includes/admin/class-admin.php:2023
+#: includes/admin/class-admin.php:1962
msgid "Form restored to revision."
msgstr ""
-#: includes/admin/class-admin.php:2024
+#: includes/admin/class-admin.php:1963
msgid "Form created."
msgstr ""
-#: includes/admin/class-admin.php:2025
+#: includes/admin/class-admin.php:1964
msgid "Form saved."
msgstr ""
-#: includes/admin/class-admin.php:2026
+#: includes/admin/class-admin.php:1965
msgid "Form submitted."
msgstr ""
-#: includes/admin/class-admin.php:2027
+#: includes/admin/class-admin.php:1966
msgid "Form scheduled."
msgstr ""
-#: includes/admin/class-admin.php:2028
+#: includes/admin/class-admin.php:1967
msgid "Form draft updated."
msgstr ""
@@ -128,12 +138,12 @@ msgstr ""
#: includes/class-config.php:394
#: includes/core/class-builtin.php:796
#: includes/core/class-builtin.php:799
-#: includes/core/class-builtin.php:1380
-#: includes/core/class-builtin.php:1383
-#: includes/core/um-actions-account.php:660
-#: includes/core/um-actions-account.php:664
-#: includes/core/um-actions-account.php:748
-#: includes/core/um-actions-account.php:752
+#: includes/core/class-builtin.php:1384
+#: includes/core/class-builtin.php:1387
+#: includes/core/um-actions-account.php:690
+#: includes/core/um-actions-account.php:694
+#: includes/core/um-actions-account.php:778
+#: includes/core/um-actions-account.php:782
msgid "Password"
msgstr ""
@@ -163,160 +173,160 @@ msgstr ""
msgid "Invalid user."
msgstr ""
-#: includes/admin/class-secure.php:196
+#: includes/admin/class-secure.php:195
msgid "Scan Now"
msgstr ""
-#: includes/admin/class-secure.php:198
+#: includes/admin/class-secure.php:197
msgid "Last scan:"
msgstr ""
-#: includes/admin/class-secure.php:202
-#: includes/admin/class-secure.php:336
+#: includes/admin/class-secure.php:201
+#: includes/admin/class-secure.php:338
msgid "ago"
msgstr ""
-#: includes/admin/class-secure.php:204
+#: includes/admin/class-secure.php:203
msgid "Not Completed."
msgstr ""
-#: includes/admin/class-secure.php:207
+#: includes/admin/class-secure.php:206
msgid "Not Scanned yet."
msgstr ""
-#: includes/admin/class-secure.php:221
+#: includes/admin/class-secure.php:220
#: includes/admin/class-site-health.php:1112
msgid "Banned Administrative Capabilities"
msgstr ""
#. translators: %s are disabled default capabilities that are enabled by default.
-#: includes/admin/class-secure.php:223
+#: includes/admin/class-secure.php:222
msgid "All the above are default Administrator & Super Admin capabilities. When someone tries to inject capabilities to the Account, Profile & Register forms submission, it will be flagged with this option. The %s capabilities are locked to ensure no users will be created with these capabilities."
msgstr ""
-#: includes/admin/class-secure.php:228
+#: includes/admin/class-secure.php:227
msgid "Scanner"
msgstr ""
-#: includes/admin/class-secure.php:230
+#: includes/admin/class-secure.php:229
msgid "Scan your site to check for vulnerabilities prior to Ultimate Member version 2.6.7 and get recommendations to secure your site."
msgstr ""
-#: includes/admin/class-secure.php:235
+#: includes/admin/class-secure.php:234
#: includes/admin/class-site-health.php:1116
msgid "Lock All Register Forms"
msgstr ""
-#: includes/admin/class-secure.php:236
+#: includes/admin/class-secure.php:235
msgid "Lock Forms"
msgstr ""
-#: includes/admin/class-secure.php:237
+#: includes/admin/class-secure.php:236
msgid "This prevents all users from registering with Ultimate Member on your site."
msgstr ""
-#: includes/admin/class-secure.php:242
+#: includes/admin/class-secure.php:241
#: includes/admin/class-site-health.php:1120
msgid "Display Login form notice to reset passwords"
msgstr ""
-#: includes/admin/class-secure.php:243
+#: includes/admin/class-secure.php:242
msgid "Enable Login form notice"
msgstr ""
-#: includes/admin/class-secure.php:244
+#: includes/admin/class-secure.php:243
msgid "Enforces users to reset their passwords (one-time) and prevent from entering old password."
msgstr ""
-#: includes/admin/class-secure.php:253
+#: includes/admin/class-secure.php:255
msgid "Expire All Users Sessions"
msgstr ""
#. translators: %d is the users count.
-#: includes/admin/class-secure.php:255
+#: includes/admin/class-secure.php:257
msgid "Are you sure that you want to make all users sessions expired?"
msgstr ""
#. translators: %d is the users count.
-#: includes/admin/class-secure.php:255
+#: includes/admin/class-secure.php:257
msgid "Logout Users (%d)"
msgstr ""
-#: includes/admin/class-secure.php:256
+#: includes/admin/class-secure.php:258
msgid "This will log out all users on your site and forces them to reset passwords
when \"Display Login form notice to reset passwords\" is enabled/checked."
msgstr ""
-#: includes/admin/class-secure.php:266
+#: includes/admin/class-secure.php:268
msgid "Administrative capabilities ban"
msgstr ""
-#: includes/admin/class-secure.php:267
+#: includes/admin/class-secure.php:269
#: includes/admin/class-site-health.php:1124
msgid "Enable ban for administrative capabilities"
msgstr ""
-#: includes/admin/class-secure.php:268
+#: includes/admin/class-secure.php:270
msgid " When someone tries to inject capabilities to the Account, Profile & Register forms submission, it will be banned."
msgstr ""
-#: includes/admin/class-secure.php:273
+#: includes/admin/class-secure.php:275
#: includes/admin/class-site-health.php:1132
msgid "Notify Administrators"
msgstr ""
-#: includes/admin/class-secure.php:274
+#: includes/admin/class-secure.php:276
msgid "Enable notification"
msgstr ""
-#: includes/admin/class-secure.php:275
+#: includes/admin/class-secure.php:277
msgid "When enabled, All administrators will be notified when someone has suspicious activities in the Account, Profile & Register forms."
msgstr ""
-#: includes/admin/class-secure.php:282
+#: includes/admin/class-secure.php:284
#: includes/admin/class-site-health.php:1137
msgid "Send Immediately"
msgstr ""
-#: includes/admin/class-secure.php:283
+#: includes/admin/class-secure.php:285
#: includes/admin/class-site-health.php:1138
msgid "Hourly"
msgstr ""
-#: includes/admin/class-secure.php:284
+#: includes/admin/class-secure.php:286
#: includes/admin/class-site-health.php:1139
msgid "Daily"
msgstr ""
-#: includes/admin/class-secure.php:286
+#: includes/admin/class-secure.php:288
#: includes/admin/class-site-health.php:1143
msgid "Notification Schedule"
msgstr ""
-#: includes/admin/class-secure.php:292
+#: includes/admin/class-secure.php:294
msgid "Allowed hosts for safe redirect (one host per line)"
msgstr ""
-#: includes/admin/class-secure.php:293
+#: includes/admin/class-secure.php:295
msgid "Extend allowed hosts for frontend pages redirects."
msgstr ""
-#: includes/admin/class-secure.php:303
+#: includes/admin/class-secure.php:305
msgid "Security"
msgstr ""
-#: includes/admin/class-secure.php:304
+#: includes/admin/class-secure.php:306
msgid "This feature scans for suspicious registered accounts, bans the usage of administrative capabilities to site subscribers/members, allows the website administrators to force all users to reset their passwords, preventing users from logging-in using their old passwords that may have been exposed."
msgstr ""
-#: includes/admin/class-secure.php:331
+#: includes/admin/class-secure.php:333
msgid "Blocked Due to Suspicious Activity"
msgstr ""
-#: includes/admin/class-secure.php:334
+#: includes/admin/class-secure.php:336
msgid "Are you sure that you want to restore this account after getting flagged for suspicious activity?"
msgstr ""
-#: includes/admin/class-secure.php:334
+#: includes/admin/class-secure.php:336
msgid "Restore Account"
msgstr ""
@@ -385,8 +395,8 @@ msgid "Field: "
msgstr ""
#: includes/admin/class-site-health.php:284
-#: includes/admin/core/class-admin-columns.php:197
-#: includes/admin/core/class-admin-columns.php:230
+#: includes/admin/core/class-admin-columns.php:161
+#: includes/admin/core/class-admin-columns.php:194
#: includes/admin/core/class-admin-settings.php:1239
#: includes/admin/core/class-admin-settings.php:1347
#: includes/admin/core/list-tables/roles-list-table.php:435
@@ -408,20 +418,20 @@ msgstr ""
#: includes/admin/templates/form/register_customize.php:34
#: includes/admin/templates/form/register_customize.php:90
#: includes/admin/templates/form/register_gdpr.php:32
-#: includes/admin/templates/role/profile.php:54
-#: includes/core/class-builtin.php:1320
-#: includes/core/class-builtin.php:1339
-#: includes/core/class-builtin.php:1357
-#: includes/core/class-builtin.php:1373
+#: includes/admin/templates/role/profile.php:57
+#: includes/core/class-builtin.php:1324
+#: includes/core/class-builtin.php:1343
+#: includes/core/class-builtin.php:1361
+#: includes/core/class-builtin.php:1377
+#: includes/core/class-user.php:531
#: includes/core/class-user.php:532
-#: includes/core/class-user.php:533
-#: includes/core/um-actions-account.php:342
+#: includes/core/um-actions-account.php:344
msgid "Yes"
msgstr ""
#: includes/admin/class-site-health.php:285
-#: includes/admin/core/class-admin-columns.php:197
-#: includes/admin/core/class-admin-columns.php:230
+#: includes/admin/core/class-admin-columns.php:161
+#: includes/admin/core/class-admin-columns.php:194
#: includes/admin/core/class-admin-settings.php:1238
#: includes/admin/core/class-admin-settings.php:1346
#: includes/admin/core/list-tables/roles-list-table.php:435
@@ -441,19 +451,17 @@ msgstr ""
#: includes/admin/templates/form/register_customize.php:33
#: includes/admin/templates/form/register_customize.php:89
#: includes/admin/templates/form/register_gdpr.php:31
-#: includes/admin/templates/role/profile.php:53
-#: includes/core/class-builtin.php:1319
-#: includes/core/class-builtin.php:1338
-#: includes/core/class-builtin.php:1356
-#: includes/core/class-builtin.php:1371
-#: includes/core/class-builtin.php:1374
-#: includes/core/um-actions-account.php:347
+#: includes/admin/templates/role/profile.php:56
+#: includes/core/class-builtin.php:1323
+#: includes/core/class-builtin.php:1342
+#: includes/core/class-builtin.php:1360
+#: includes/core/class-builtin.php:1375
+#: includes/core/class-builtin.php:1378
+#: includes/core/um-actions-account.php:349
msgid "No"
msgstr ""
#: includes/admin/class-site-health.php:286
-#: includes/admin/core/class-admin-users.php:402
-#: includes/admin/core/class-admin-users.php:404
#: includes/blocks/um-account/build/index.js:1
#: includes/blocks/um-account/src/index.js:14
msgid "All"
@@ -464,14 +472,14 @@ msgstr ""
#: includes/admin/class-site-health.php:1004
#: includes/admin/class-site-health.php:1388
#: includes/admin/class-site-health.php:1822
-#: includes/admin/core/class-admin-columns.php:145
-#: includes/admin/core/class-admin-columns.php:164
+#: includes/admin/core/class-admin-columns.php:109
+#: includes/admin/core/class-admin-columns.php:128
#: includes/admin/core/class-admin-settings.php:1090
#: includes/admin/core/class-admin-settings.php:1155
#: includes/admin/templates/form/login_settings.php:19
#: includes/admin/templates/form/register_customize.php:9
#: includes/admin/templates/form/register_customize.php:42
-#: includes/admin/templates/role/profile.php:52
+#: includes/admin/templates/role/profile.php:55
msgid "Default"
msgstr ""
@@ -527,7 +535,7 @@ msgstr ""
#: includes/admin/class-site-health.php:364
#: includes/admin/class-site-health.php:1424
#: includes/admin/core/class-admin-settings.php:1235
-#: includes/admin/templates/role/profile.php:49
+#: includes/admin/templates/role/profile.php:52
msgid "Avoid indexing profile by search engines"
msgstr ""
@@ -1227,32 +1235,32 @@ msgid "This debug information about user role."
msgstr ""
#: includes/admin/class-site-health.php:1240
-#: includes/admin/templates/role/admin-permissions.php:14
+#: includes/admin/templates/role/admin-permissions.php:17
msgid "Can access wp-admin?"
msgstr ""
#: includes/admin/class-site-health.php:1252
-#: includes/admin/templates/role/admin-permissions.php:21
+#: includes/admin/templates/role/admin-permissions.php:24
msgid "Force hiding adminbar in frontend?"
msgstr ""
#: includes/admin/class-site-health.php:1264
-#: includes/admin/templates/role/admin-permissions.php:28
+#: includes/admin/templates/role/admin-permissions.php:31
msgid "Can edit other member accounts?"
msgstr ""
#: includes/admin/class-site-health.php:1286
-#: includes/admin/templates/role/admin-permissions.php:35
+#: includes/admin/templates/role/admin-permissions.php:38
msgid "Can edit these user roles only"
msgstr ""
#: includes/admin/class-site-health.php:1298
-#: includes/admin/templates/role/admin-permissions.php:45
+#: includes/admin/templates/role/admin-permissions.php:48
msgid "Can delete other member accounts?"
msgstr ""
#: includes/admin/class-site-health.php:1320
-#: includes/admin/templates/role/admin-permissions.php:52
+#: includes/admin/templates/role/admin-permissions.php:55
msgid "Can delete these user roles only"
msgstr ""
@@ -1267,12 +1275,12 @@ msgid "Can delete their account?"
msgstr ""
#: includes/admin/class-site-health.php:1356
-#: includes/admin/templates/role/profile.php:14
+#: includes/admin/templates/role/profile.php:17
msgid "Can view other member profiles?"
msgstr ""
#: includes/admin/class-site-health.php:1378
-#: includes/admin/templates/role/profile.php:21
+#: includes/admin/templates/role/profile.php:24
msgid "Can view these user roles only"
msgstr ""
@@ -1281,12 +1289,12 @@ msgid "No such option"
msgstr ""
#: includes/admin/class-site-health.php:1401
-#: includes/admin/templates/role/profile.php:32
+#: includes/admin/templates/role/profile.php:35
msgid "Can make their profile private?"
msgstr ""
#: includes/admin/class-site-health.php:1413
-#: includes/admin/templates/role/profile.php:40
+#: includes/admin/templates/role/profile.php:43
msgid "Can view/access private profiles?"
msgstr ""
@@ -1461,15 +1469,15 @@ msgstr ""
#: includes/admin/class-site-health.php:1744
#: includes/admin/class-site-health.php:2032
-#: includes/admin/core/class-admin-columns.php:146
-#: includes/admin/core/class-admin-columns.php:165
+#: includes/admin/core/class-admin-columns.php:110
+#: includes/admin/core/class-admin-columns.php:129
#: includes/admin/core/class-admin-metabox.php:864
#: includes/admin/core/class-admin-metabox.php:1031
msgid "Shortcode"
msgstr ""
#: includes/admin/class-site-health.php:1748
-#: includes/admin/core/class-admin-columns.php:144
+#: includes/admin/core/class-admin-columns.php:108
msgid "Type"
msgstr ""
@@ -1595,7 +1603,7 @@ msgid "Gender"
msgstr ""
#: includes/admin/class-site-health.php:1974
-#: includes/core/class-builtin.php:1213
+#: includes/core/class-builtin.php:1217
#: includes/core/class-member-directory.php:435
msgid "Languages"
msgstr ""
@@ -1610,8 +1618,8 @@ msgstr ""
#: includes/admin/class-site-health.php:1976
#: includes/core/class-member-directory.php:437
-#: includes/core/um-filters-fields.php:1001
-#: includes/core/um-filters-fields.php:1018
+#: includes/core/um-filters-fields.php:1006
+#: includes/core/um-filters-fields.php:1023
msgid "Age"
msgstr ""
@@ -1669,27 +1677,27 @@ msgid "Biography"
msgstr ""
#: includes/admin/class-site-health.php:1984
-#: includes/core/class-builtin.php:1225
-#: includes/core/class-builtin.php:1228
-#: includes/core/class-builtin.php:1584
+#: includes/core/class-builtin.php:1229
+#: includes/core/class-builtin.php:1232
+#: includes/core/class-builtin.php:1588
#: includes/core/class-member-directory.php:445
msgid "Phone Number"
msgstr ""
#: includes/admin/class-site-health.php:1985
-#: includes/core/class-builtin.php:1237
-#: includes/core/class-builtin.php:1240
+#: includes/core/class-builtin.php:1241
+#: includes/core/class-builtin.php:1244
#: includes/core/class-member-directory.php:446
msgid "Mobile Number"
msgstr ""
#: includes/admin/class-site-health.php:1986
-#: includes/core/class-builtin.php:1190
+#: includes/core/class-builtin.php:1194
msgid "Roles (Dropdown)"
msgstr ""
#: includes/admin/class-site-health.php:1987
-#: includes/core/class-builtin.php:1202
+#: includes/core/class-builtin.php:1206
msgid "Roles (Radio)"
msgstr ""
@@ -1719,7 +1727,7 @@ msgstr ""
#: includes/admin/class-site-health.php:1992
#: includes/core/class-builtin.php:1022
#: includes/core/class-builtin.php:1025
-#: includes/core/class-builtin.php:1585
+#: includes/core/class-builtin.php:1589
msgid "Skype ID"
msgstr ""
@@ -1730,8 +1738,8 @@ msgid "Telegram"
msgstr ""
#: includes/admin/class-site-health.php:1994
-#: includes/core/class-builtin.php:1081
-#: includes/core/class-builtin.php:1090
+#: includes/core/class-builtin.php:1083
+#: includes/core/class-builtin.php:1092
msgid "Discord"
msgstr ""
@@ -1740,8 +1748,8 @@ msgid "Youtube"
msgstr ""
#: includes/admin/class-site-health.php:1996
-#: includes/core/class-builtin.php:1172
-#: includes/core/class-builtin.php:1175
+#: includes/core/class-builtin.php:1176
+#: includes/core/class-builtin.php:1179
msgid "SoundCloud"
msgstr ""
@@ -1982,6 +1990,93 @@ msgstr ""
msgid "Custom text if no users were found"
msgstr ""
+#: includes/admin/class-users-columns.php:49
+#: includes/admin/core/list-tables/version-template-list-table.php:212
+msgid "Status"
+msgstr ""
+
+#: includes/admin/class-users-columns.php:88
+msgid "Approve"
+msgstr ""
+
+#: includes/admin/class-users-columns.php:100
+msgid "Are you sure you want to reject this user membership?"
+msgstr ""
+
+#: includes/admin/class-users-columns.php:100
+msgid "Reject"
+msgstr ""
+
+#: includes/admin/class-users-columns.php:112
+#: includes/admin/class-users-columns.php:281
+msgid "Reactivate"
+msgstr ""
+
+#: includes/admin/class-users-columns.php:124
+msgid "Put as pending"
+msgstr ""
+
+#: includes/admin/class-users-columns.php:136
+#: includes/frontend/class-users.php:46
+msgid "Send activation email"
+msgstr ""
+
+#: includes/admin/class-users-columns.php:138
+#: includes/frontend/class-users.php:48
+msgid "Resend activation email"
+msgstr ""
+
+#: includes/admin/class-users-columns.php:153
+msgid "Are you sure you want to deactivate this user?"
+msgstr ""
+
+#: includes/admin/class-users-columns.php:153
+#: includes/admin/class-users-columns.php:280
+msgid "Deactivate"
+msgstr ""
+
+#: includes/admin/class-users-columns.php:237
+#: templates/account.php:61
+#: templates/account.php:102
+msgid "View profile"
+msgstr ""
+
+#: includes/admin/class-users-columns.php:243
+msgid "Info"
+msgstr ""
+
+#: includes/admin/class-users-columns.php:276
+#: includes/frontend/class-users.php:34
+msgid "Approve Membership"
+msgstr ""
+
+#: includes/admin/class-users-columns.php:277
+#: includes/frontend/class-users.php:37
+msgid "Reject Membership"
+msgstr ""
+
+#: includes/admin/class-users-columns.php:278
+#: includes/frontend/class-users.php:43
+msgid "Put as Pending Review"
+msgstr ""
+
+#: includes/admin/class-users-columns.php:279
+msgid "Resend Activation E-mail"
+msgstr ""
+
+#: includes/admin/class-users-columns.php:364
+#: includes/admin/class-users-columns.php:366
+msgid "All Statuses"
+msgstr ""
+
+#: includes/admin/class-users-columns.php:376
+msgid "Filter"
+msgstr ""
+
+#: includes/admin/class-users-columns.php:409
+msgid "You do not have enough permissions to do that."
+msgstr ""
+
#: includes/admin/core/class-admin-builder.php:238
#: includes/admin/core/class-admin-builder.php:240
msgid "Here you can setup conditional logic to show/hide this field based on specific fields value or conditions"
@@ -2049,7 +2144,7 @@ msgid "Edit"
msgstr ""
#: includes/admin/core/class-admin-builder.php:553
-#: includes/admin/core/class-admin-columns.php:107
+#: includes/admin/core/class-admin-columns.php:71
msgid "Duplicate"
msgstr ""
@@ -2075,7 +2170,7 @@ msgid "Predefined Fields"
msgstr ""
#: includes/admin/core/class-admin-builder.php:871
-#: includes/core/class-builtin.php:1575
+#: includes/core/class-builtin.php:1579
msgid "None"
msgstr ""
@@ -2106,9 +2201,9 @@ msgstr ""
#: includes/core/class-form.php:154
#: includes/core/class-form.php:161
#: includes/core/class-form.php:243
-#: includes/core/class-form.php:608
+#: includes/core/class-form.php:613
#: includes/core/class-password.php:480
-#: includes/core/um-actions-profile.php:550
+#: includes/core/um-actions-profile.php:551
msgid "This is not possible for security reasons."
msgstr ""
@@ -2116,26 +2211,21 @@ msgstr ""
msgid "This is not possible for security reasons. Don't use internal PHP functions."
msgstr ""
-#: includes/admin/core/class-admin-columns.php:50
-#: includes/admin/core/list-tables/version-template-list-table.php:212
-msgid "Status"
-msgstr ""
-
-#: includes/admin/core/class-admin-columns.php:142
-#: includes/admin/core/class-admin-columns.php:162
+#: includes/admin/core/class-admin-columns.php:106
+#: includes/admin/core/class-admin-columns.php:126
#: includes/admin/core/class-admin-metabox.php:2260
#: includes/admin/templates/role/role-edit.php:246
#: includes/widgets/class-um-search-widget.php:94
msgid "Title"
msgstr ""
-#: includes/admin/core/class-admin-columns.php:143
-#: includes/admin/core/class-admin-columns.php:163
+#: includes/admin/core/class-admin-columns.php:107
+#: includes/admin/core/class-admin-columns.php:127
msgid "ID"
msgstr ""
-#: includes/admin/core/class-admin-columns.php:147
-#: includes/admin/core/class-admin-columns.php:166
+#: includes/admin/core/class-admin-columns.php:111
+#: includes/admin/core/class-admin-columns.php:130
msgid "Date"
msgstr ""
@@ -2184,7 +2274,7 @@ msgstr ""
#: includes/admin/core/class-admin-forms.php:1673
#: includes/admin/core/class-admin-forms.php:1789
#: includes/admin/core/class-admin-forms.php:1818
-#: includes/core/um-actions-profile.php:846
+#: includes/core/um-actions-profile.php:871
#: assets/js/admin/forms.js:353
#: assets/js/admin/forms.js:427
#: assets/js/admin/forms.js:716
@@ -3188,10 +3278,10 @@ msgid "The text that appears on the button. e.g. Upload"
msgstr ""
#: includes/admin/core/class-admin-metabox.php:2104
-#: includes/core/class-fields.php:1957
-#: includes/core/class-fields.php:1998
-#: includes/core/class-fields.php:2949
-#: includes/core/class-fields.php:3052
+#: includes/core/class-fields.php:1955
+#: includes/core/class-fields.php:1996
+#: includes/core/class-fields.php:2957
+#: includes/core/class-fields.php:3060
msgid "Upload"
msgstr ""
@@ -3586,127 +3676,159 @@ msgid "Settings have been saved successfully."
msgstr ""
#: includes/admin/core/class-admin-notices.php:494
-msgid "User has been updated."
-msgstr ""
-
-#: includes/admin/core/class-admin-notices.php:497
msgid "Users have been updated."
msgstr ""
-#: includes/admin/core/class-admin-notices.php:500
+#: includes/admin/core/class-admin-notices.php:497
msgid "All users sessions have been successfully destroyed."
msgstr ""
-#: includes/admin/core/class-admin-notices.php:503
+#: includes/admin/core/class-admin-notices.php:500
msgid "Account has been successfully restored."
msgstr ""
+#: includes/admin/core/class-admin-notices.php:505
+msgid "%s user has been approved."
+msgid_plural "%s users have been approved."
+msgstr[0] ""
+msgstr[1] ""
+
+#: includes/admin/core/class-admin-notices.php:510
+msgid "%s user has been reactivated."
+msgid_plural "%s users have been reactivated."
+msgstr[0] ""
+msgstr[1] ""
+
+#: includes/admin/core/class-admin-notices.php:515
+msgid "%s user has been rejected."
+msgid_plural "%s users have been rejected."
+msgstr[0] ""
+msgstr[1] ""
+
+#: includes/admin/core/class-admin-notices.php:520
+msgid "%s user has been deactivated."
+msgid_plural "%s users have been deactivated."
+msgstr[0] ""
+msgstr[1] ""
+
+#: includes/admin/core/class-admin-notices.php:525
+msgid "%s user has been set as pending admin review."
+msgid_plural "%s users have been set as pending admin review."
+msgstr[0] ""
+msgstr[1] ""
+
+#: includes/admin/core/class-admin-notices.php:530
+msgid "Activation email for %s user has been sent."
+msgid_plural "Activation emails for %s users have been sent."
+msgstr[0] ""
+msgstr[1] ""
+
#. translators: %s: Plugin name.
-#: includes/admin/core/class-admin-notices.php:572
+#: includes/admin/core/class-admin-notices.php:599
msgid "You have installed %s with wrong folder name. Correct folder name is \"ultimate-member\"."
msgstr ""
#. translators: %1$s is an inactive license number; %2$s is a plugin name; %3$s is a store link.
-#: includes/admin/core/class-admin-notices.php:607
+#: includes/admin/core/class-admin-notices.php:634
msgid "There are %1$s inactive %2$s license keys for this site. This site is not authorized to get plugin updates. You can active this site on www.ultimatemember.com."
msgstr ""
#. translators: %1$s is an invalid license; %2$s is a plugin name; %3$s is a license link.
-#: includes/admin/core/class-admin-notices.php:627
+#: includes/admin/core/class-admin-notices.php:654
msgid "You have %1$s invalid or expired license keys for %2$s. Please go to the Licenses page to correct this issue."
msgstr ""
-#: includes/admin/core/class-admin-notices.php:644
+#: includes/admin/core/class-admin-notices.php:671
msgid "version needs to be updated to work correctly."
msgstr ""
-#: includes/admin/core/class-admin-notices.php:646
+#: includes/admin/core/class-admin-notices.php:673
msgid "It is necessary to update the structure of the database and options that are associated with current version"
msgstr ""
-#: includes/admin/core/class-admin-notices.php:648
+#: includes/admin/core/class-admin-notices.php:675
msgid "Please run the upgrade process on this "
msgstr ""
-#: includes/admin/core/class-admin-notices.php:648
+#: includes/admin/core/class-admin-notices.php:675
msgid "page"
msgstr ""
-#: includes/admin/core/class-admin-notices.php:652
+#: includes/admin/core/class-admin-notices.php:679
msgid "Visit Upgrade Page"
msgstr ""
-#: includes/admin/core/class-admin-notices.php:667
+#: includes/admin/core/class-admin-notices.php:694
msgid "Settings successfully upgraded"
msgstr ""
#. translators: %1$s is a plugin name title; %2$s is a plugin version.
-#: includes/admin/core/class-admin-notices.php:675
+#: includes/admin/core/class-admin-notices.php:702
msgid "%1$s %2$s Successfully Upgraded"
msgstr ""
#. translators: %s: plugin name.
-#: includes/admin/core/class-admin-notices.php:706
+#: includes/admin/core/class-admin-notices.php:733
msgid "Hey there! It's been one month since you installed %s. How have you found the plugin so far?"
msgstr ""
-#: includes/admin/core/class-admin-notices.php:710
+#: includes/admin/core/class-admin-notices.php:737
msgid "I love it!"
msgstr ""
-#: includes/admin/core/class-admin-notices.php:711
+#: includes/admin/core/class-admin-notices.php:738
msgid "It's good but could be better"
msgstr ""
-#: includes/admin/core/class-admin-notices.php:712
+#: includes/admin/core/class-admin-notices.php:739
msgid "I don't like the plugin"
msgstr ""
-#: includes/admin/core/class-admin-notices.php:721
+#: includes/admin/core/class-admin-notices.php:748
msgid "Leave Review"
msgstr ""
-#: includes/admin/core/class-admin-notices.php:730
-#: includes/admin/core/class-admin-notices.php:739
+#: includes/admin/core/class-admin-notices.php:757
+#: includes/admin/core/class-admin-notices.php:766
msgid "Provide Feedback"
msgstr ""
#. translators: %1$s is a plugin name; %2$s is a #.
-#: includes/admin/core/class-admin-notices.php:763
+#: includes/admin/core/class-admin-notices.php:790
msgid "%1$s future plans! Detailed future list is here"
msgstr ""
#. translators: %s child-theme article link.
-#: includes/admin/core/class-admin-notices.php:790
+#: includes/admin/core/class-admin-notices.php:817
msgid "We recommend using a child-theme for Ultimate Member customization. Unlike official theme repositories, child themes don't have dependencies that could lead to your custom files being overwritten during a theme upgrade.
Without a child theme, your customization files may be deleted after every theme update."
msgstr ""
-#: includes/admin/core/class-admin-notices.php:813
+#: includes/admin/core/class-admin-notices.php:840
msgid "Your Register forms are now locked. You can unlock them in Ultimate Member > Settings > Advanced > Security > Lock All Register Forms."
msgstr ""
-#: includes/admin/core/class-admin-notices.php:832
+#: includes/admin/core/class-admin-notices.php:859
msgid "Mandatory password changes has been enabled. You can disable them in Ultimate Member > Settings > Advanced > Security > Display Login form notice to reset passwords."
msgstr ""
-#: includes/admin/core/class-admin-notices.php:851
+#: includes/admin/core/class-admin-notices.php:878
msgid "Ban for administrative capabilities is enabled. You can disable them in Ultimate Member > Settings > Advanced > Security > Enable ban for administrative capabilities."
msgstr ""
-#: includes/admin/core/class-admin-notices.php:884
+#: includes/admin/core/class-admin-notices.php:911
msgid "The role selected in WordPress native \"Settings > New User Default Role\" setting has Administrative capabilities."
msgstr ""
-#: includes/admin/core/class-admin-notices.php:910
+#: includes/admin/core/class-admin-notices.php:937
msgid "The role selected in \"Ultimate Member > Settings > Appearance > Registration Form > Registration Default Role\" setting has Administrative capabilities."
msgstr ""
#. translators: %s are link(s) to the forms.
-#: includes/admin/core/class-admin-notices.php:978
+#: includes/admin/core/class-admin-notices.php:1005
msgid "Register forms have Administrative roles, we recommend that you assign a non-admin roles to secure the forms. %s"
msgstr ""
-#: includes/admin/core/class-admin-notices.php:997
+#: includes/admin/core/class-admin-notices.php:1024
msgid "Wrong Data"
msgstr ""
@@ -3915,7 +4037,7 @@ msgstr ""
#: includes/admin/core/class-admin-settings.php:1078
#: includes/admin/core/class-admin-settings.php:1081
-#: includes/admin/templates/dashboard/users.php:15
+#: includes/admin/templates/dashboard/users.php:14
msgid "Users"
msgstr ""
@@ -4257,8 +4379,8 @@ msgstr ""
#: includes/admin/core/class-admin-settings.php:1431
#: includes/admin/core/class-admin-settings.php:1629
-#: includes/core/um-actions-profile.php:767
-#: includes/core/um-actions-profile.php:781
+#: includes/core/um-actions-profile.php:787
+#: includes/core/um-actions-profile.php:807
msgid "Profile photo"
msgstr ""
@@ -4422,7 +4544,7 @@ msgid "Appearance"
msgstr ""
#: includes/admin/core/class-admin-settings.php:1595
-#: includes/core/class-form.php:992
+#: includes/core/class-form.php:1004
msgid "Profile"
msgstr ""
@@ -5045,87 +5167,6 @@ msgstr ""
msgid "Upgrade Log"
msgstr ""
-#: includes/admin/core/class-admin-users.php:177
-msgid "This action is not allowed in backend."
-msgstr ""
-
-#: includes/admin/core/class-admin-users.php:192
-#: includes/admin/core/class-admin-users.php:195
-msgid "UM Action"
-msgstr ""
-
-#: includes/admin/core/class-admin-users.php:199
-#: includes/core/class-fields.php:3033
-msgid "Apply"
-msgstr ""
-
-#: includes/admin/core/class-admin-users.php:241
-#: includes/core/um-filters-user.php:24
-#: includes/core/um-filters-user.php:29
-msgid "Approve Membership"
-msgstr ""
-
-#: includes/admin/core/class-admin-users.php:244
-#: includes/core/um-filters-user.php:25
-msgid "Reject Membership"
-msgstr ""
-
-#: includes/admin/core/class-admin-users.php:247
-#: includes/core/um-filters-user.php:33
-msgid "Put as Pending Review"
-msgstr ""
-
-#: includes/admin/core/class-admin-users.php:250
-#: includes/core/um-filters-user.php:37
-msgid "Resend Activation Email"
-msgstr ""
-
-#: includes/admin/core/class-admin-users.php:253
-msgid "Deactivate"
-msgstr ""
-
-#: includes/admin/core/class-admin-users.php:256
-msgid "Reactivate"
-msgstr ""
-
-#: includes/admin/core/class-admin-users.php:277
-#: templates/account.php:61
-#: templates/account.php:102
-msgid "View profile"
-msgstr ""
-
-#: includes/admin/core/class-admin-users.php:282
-msgid "Info"
-msgstr ""
-
-#: includes/admin/core/class-admin-users.php:408
-#: includes/admin/templates/dashboard/users.php:37
-#: includes/core/class-user.php:1300
-msgid "Approved"
-msgstr ""
-
-#: includes/admin/core/class-admin-users.php:409
-msgid "Pending review"
-msgstr ""
-
-#: includes/admin/core/class-admin-users.php:410
-msgid "Waiting email confirmation"
-msgstr ""
-
-#: includes/admin/core/class-admin-users.php:411
-#: includes/admin/templates/dashboard/users.php:68
-msgid "Inactive"
-msgstr ""
-
-#: includes/admin/core/class-admin-users.php:412
-#: includes/admin/templates/dashboard/users.php:59
-msgid "Rejected"
-msgstr ""
-
-#: includes/admin/core/class-admin-users.php:488
-msgid "You do not have enough permissions to do that."
-msgstr ""
-
#: includes/admin/core/list-tables/emails-list-table.php:70
#: includes/admin/core/list-tables/roles-list-table.php:221
#: includes/admin/core/list-tables/version-template-list-table.php:30
@@ -5700,16 +5741,30 @@ msgstr ""
msgid "Get latest versions"
msgstr ""
-#: includes/admin/templates/dashboard/users.php:25
-#: includes/core/class-user.php:1308
+#: includes/admin/templates/dashboard/users.php:24
+#: includes/core/class-user.php:1307
msgid "Pending Review"
msgstr ""
-#: includes/admin/templates/dashboard/users.php:47
-#: includes/core/class-user.php:1304
+#: includes/admin/templates/dashboard/users.php:36
+#: includes/common/class-users.php:105
+#: includes/core/class-user.php:1299
+msgid "Approved"
+msgstr ""
+
+#: includes/admin/templates/dashboard/users.php:46
+#: includes/core/class-user.php:1303
msgid "Awaiting Email Confirmation"
msgstr ""
+#: includes/admin/templates/dashboard/users.php:58
+msgid "Rejected"
+msgstr ""
+
+#: includes/admin/templates/dashboard/users.php:68
+msgid "Inactive"
+msgstr ""
+
#: includes/admin/templates/directory/general.php:47
msgid "View type(s)"
msgstr ""
@@ -6131,14 +6186,14 @@ msgstr ""
#: includes/admin/templates/modal/forms/fonticons.php:26
#: includes/admin/templates/role/publish.php:33
#: includes/class-config.php:231
-#: includes/core/class-fields.php:3034
-#: includes/core/class-fields.php:3159
-#: includes/core/um-actions-profile.php:847
-#: includes/core/um-actions-profile.php:859
-#: includes/core/um-actions-profile.php:1047
-#: includes/core/um-actions-profile.php:1080
-#: includes/core/um-actions-profile.php:1472
-#: includes/core/um-actions-profile.php:1479
+#: includes/core/class-fields.php:3042
+#: includes/core/class-fields.php:3167
+#: includes/core/um-actions-profile.php:872
+#: includes/core/um-actions-profile.php:884
+#: includes/core/um-actions-profile.php:1072
+#: includes/core/um-actions-profile.php:1105
+#: includes/core/um-actions-profile.php:1497
+#: includes/core/um-actions-profile.php:1504
msgid "Cancel"
msgstr ""
@@ -6185,27 +6240,30 @@ msgstr ""
msgid "Finish"
msgstr ""
-#: includes/admin/templates/role/admin-permissions.php:15
+#: includes/admin/templates/role/admin-permissions.php:18
msgid "The core admin role must always have access to wp-admin / WordPress backend"
msgstr ""
-#: includes/admin/templates/role/admin-permissions.php:22
+#: includes/admin/templates/role/admin-permissions.php:25
msgid "Mark this option if you need to hide the adminbar on frontend for this role"
msgstr ""
-#: includes/admin/templates/role/admin-permissions.php:29
+#: includes/admin/templates/role/admin-permissions.php:32
msgid "Allow this role to edit accounts of other members"
msgstr ""
-#: includes/admin/templates/role/admin-permissions.php:36
-#: includes/admin/templates/role/admin-permissions.php:53
-msgid "Which roles that role can edit, choose none to allow role to edit all member roles"
+#: includes/admin/templates/role/admin-permissions.php:39
+msgid "Multiple selections of which roles this role can edit, none selected to allow this role to edit all member roles."
msgstr ""
-#: includes/admin/templates/role/admin-permissions.php:46
+#: includes/admin/templates/role/admin-permissions.php:49
msgid "Allow this role to delete other user accounts."
msgstr ""
+#: includes/admin/templates/role/admin-permissions.php:56
+msgid "Multiple selections of which roles this role can delete, none selected to allow this role to delete all member roles"
+msgstr ""
+
#: includes/admin/templates/role/delete.php:16
msgid "Select what happens when a user with this role deletes their own account"
msgstr ""
@@ -6246,23 +6304,23 @@ msgstr ""
msgid "Set a url to redirect this user role to after they logout from site"
msgstr ""
-#: includes/admin/templates/role/profile.php:15
+#: includes/admin/templates/role/profile.php:18
msgid "Can this role view all member profiles?"
msgstr ""
-#: includes/admin/templates/role/profile.php:22
-msgid "Which roles that role can view, choose none to allow role to view all member roles"
+#: includes/admin/templates/role/profile.php:25
+msgid "Multiple selections of which roles this role can view, none selected to allow this role to view all member roles."
msgstr ""
-#: includes/admin/templates/role/profile.php:33
+#: includes/admin/templates/role/profile.php:36
msgid "Can this role make their profile private?"
msgstr ""
-#: includes/admin/templates/role/profile.php:41
+#: includes/admin/templates/role/profile.php:44
msgid "Can this role view private profiles?"
msgstr ""
-#: includes/admin/templates/role/profile.php:50
+#: includes/admin/templates/role/profile.php:53
msgid "Hides the profile page for robots. The default value depends on the General > Users setting."
msgstr ""
@@ -6709,7 +6767,7 @@ msgstr ""
#: includes/class-config.php:249
#: includes/class-config.php:932
#: includes/class-config.php:993
-#: includes/core/class-form.php:989
+#: includes/core/class-form.php:1001
msgid "Login"
msgstr ""
@@ -6718,15 +6776,15 @@ msgstr ""
#: includes/class-config.php:253
#: includes/class-config.php:935
#: includes/class-config.php:997
-#: includes/core/class-form.php:995
+#: includes/core/class-form.php:1007
msgid "Register"
msgstr ""
#: includes/class-config.php:134
#: includes/class-config.php:941
#: includes/class-config.php:1005
-#: includes/core/class-member-directory.php:2664
-#: includes/core/um-actions-profile.php:1478
+#: includes/core/class-member-directory.php:2645
+#: includes/core/um-actions-profile.php:1503
#: includes/core/um-actions-user.php:19
msgid "Logout"
msgstr ""
@@ -6986,8 +7044,8 @@ msgid "Cheatin’ huh?"
msgstr ""
#: includes/common/class-cpt.php:33
-#: includes/um-short-functions.php:691
-#: includes/um-short-functions.php:706
+#: includes/um-short-functions.php:690
+#: includes/um-short-functions.php:705
msgid "Form"
msgstr ""
@@ -7036,29 +7094,36 @@ msgstr ""
msgid "Ultimate Member Scanner"
msgstr ""
-#: includes/common/class-theme.php:212
+#: includes/common/class-theme.php:214
msgid "Theme version up to date"
msgstr ""
-#: includes/common/class-theme.php:216
+#: includes/common/class-theme.php:218
msgid "Theme version is empty"
msgstr ""
-#: includes/common/class-theme.php:219
+#: includes/common/class-theme.php:221
msgid "Theme version is out of date"
msgstr ""
-#. translators: %s: Restricted post message.
-#. translators: %s: The message after registration process based on a role data and user status after registration
-#. translators: %s: Restricted blog page message.
-#. translators: %s: Restricted taxonomy message.
-#: includes/core/class-access.php:774
-#: includes/core/class-fields.php:1561
-#: includes/core/um-actions-account.php:517
-#: templates/message.php:23
-#: templates/restricted-blog.php:41
-#: templates/restricted-taxonomy.php:59
-msgid "%s"
+#: includes/common/class-users.php:106
+msgid "Pending administrator review"
+msgstr ""
+
+#: includes/common/class-users.php:107
+msgid "Waiting email confirmation"
+msgstr ""
+
+#: includes/common/class-users.php:108
+msgid "Membership inactive"
+msgstr ""
+
+#: includes/common/class-users.php:109
+msgid "Membership rejected"
+msgstr ""
+
+#: includes/common/class-users.php:198
+msgid "Undefined"
msgstr ""
#: includes/core/class-account.php:90
@@ -7083,8 +7148,8 @@ msgstr ""
#: includes/core/class-account.php:118
#: includes/core/class-account.php:119
-#: includes/core/class-builtin.php:1363
-#: includes/core/class-builtin.php:1366
+#: includes/core/class-builtin.php:1367
+#: includes/core/class-builtin.php:1370
msgid "Delete Account"
msgstr ""
@@ -7194,7 +7259,7 @@ msgid "You must add a shortcode to the content area"
msgstr ""
#: includes/core/class-builtin.php:654
-#: includes/core/class-builtin.php:1596
+#: includes/core/class-builtin.php:1600
msgid "Spotify URL"
msgstr ""
@@ -7203,13 +7268,13 @@ msgid "oEmbed"
msgstr ""
#: includes/core/class-builtin.php:761
-#: includes/core/class-user.php:2084
+#: includes/core/class-user.php:1819
msgid "Only me"
msgstr ""
#: includes/core/class-builtin.php:785
#: includes/core/class-builtin.php:788
-#: includes/core/class-builtin.php:1280
+#: includes/core/class-builtin.php:1284
msgid "Username or Email"
msgstr ""
@@ -7219,7 +7284,7 @@ msgstr ""
#: includes/core/class-builtin.php:841
#: includes/core/class-builtin.php:844
-#: includes/core/class-builtin.php:1593
+#: includes/core/class-builtin.php:1597
msgid "Website URL"
msgstr ""
@@ -7272,1921 +7337,1921 @@ msgstr ""
msgid "Join chat"
msgstr ""
-#: includes/core/class-builtin.php:1084
-#: includes/core/class-builtin.php:1598
+#: includes/core/class-builtin.php:1086
+#: includes/core/class-builtin.php:1602
msgid "Discord ID"
msgstr ""
-#: includes/core/class-builtin.php:1097
-#: includes/core/class-builtin.php:1100
+#: includes/core/class-builtin.php:1101
+#: includes/core/class-builtin.php:1104
msgid "TikTok"
msgstr ""
-#: includes/core/class-builtin.php:1115
-#: includes/core/class-builtin.php:1118
+#: includes/core/class-builtin.php:1119
+#: includes/core/class-builtin.php:1122
msgid "Twitch"
msgstr ""
-#: includes/core/class-builtin.php:1133
-#: includes/core/class-builtin.php:1136
+#: includes/core/class-builtin.php:1137
+#: includes/core/class-builtin.php:1140
msgid "Reddit"
msgstr ""
-#: includes/core/class-builtin.php:1151
-#: includes/core/class-builtin.php:1154
-#: includes/core/class-builtin.php:1162
+#: includes/core/class-builtin.php:1155
+#: includes/core/class-builtin.php:1158
+#: includes/core/class-builtin.php:1166
msgid "YouTube"
msgstr ""
-#: includes/core/class-builtin.php:1193
-#: includes/core/class-builtin.php:1205
+#: includes/core/class-builtin.php:1197
+#: includes/core/class-builtin.php:1209
msgid "Account Type"
msgstr ""
-#: includes/core/class-builtin.php:1194
+#: includes/core/class-builtin.php:1198
msgid "Choose account type"
msgstr ""
-#: includes/core/class-builtin.php:1216
+#: includes/core/class-builtin.php:1220
msgid "Languages Spoken"
msgstr ""
-#: includes/core/class-builtin.php:1217
+#: includes/core/class-builtin.php:1221
msgid "Select languages"
msgstr ""
-#: includes/core/class-builtin.php:1251
+#: includes/core/class-builtin.php:1255
msgid "Profile Photo"
msgstr ""
-#: includes/core/class-builtin.php:1254
+#: includes/core/class-builtin.php:1258
msgid "Change your profile photo"
msgstr ""
-#: includes/core/class-builtin.php:1255
+#: includes/core/class-builtin.php:1259
msgid "Upload your photo here"
msgstr ""
-#: includes/core/class-builtin.php:1265
+#: includes/core/class-builtin.php:1269
msgid "Cover Photo"
msgstr ""
-#: includes/core/class-builtin.php:1268
-#: includes/core/um-actions-profile.php:807
+#: includes/core/class-builtin.php:1272
+#: includes/core/um-actions-profile.php:832
msgid "Change your cover photo"
msgstr ""
-#: includes/core/class-builtin.php:1269
+#: includes/core/class-builtin.php:1273
msgid "Upload profile cover here"
msgstr ""
-#: includes/core/class-builtin.php:1283
+#: includes/core/class-builtin.php:1287
msgid "Enter your username or email"
msgstr ""
-#: includes/core/class-builtin.php:1293
-#: includes/core/class-builtin.php:1296
+#: includes/core/class-builtin.php:1297
+#: includes/core/class-builtin.php:1300
msgid "Profile Privacy"
msgstr ""
-#: includes/core/class-builtin.php:1297
+#: includes/core/class-builtin.php:1301
msgid "Who can see your public profile?"
msgstr ""
-#: includes/core/class-builtin.php:1309
-#: includes/core/class-builtin.php:1312
+#: includes/core/class-builtin.php:1313
+#: includes/core/class-builtin.php:1316
msgid "Avoid indexing my profile by search engines"
msgstr ""
-#: includes/core/class-builtin.php:1313
+#: includes/core/class-builtin.php:1317
msgid "Hide my profile for robots?"
msgstr ""
-#: includes/core/class-builtin.php:1328
-#: includes/core/class-builtin.php:1331
+#: includes/core/class-builtin.php:1332
+#: includes/core/class-builtin.php:1335
msgid "Hide my profile from directory"
msgstr ""
-#: includes/core/class-builtin.php:1332
+#: includes/core/class-builtin.php:1336
msgid "Here you can hide yourself from appearing in public directory"
msgstr ""
-#: includes/core/class-builtin.php:1346
-#: includes/core/class-builtin.php:1349
+#: includes/core/class-builtin.php:1350
+#: includes/core/class-builtin.php:1353
msgid "Show my last login?"
msgstr ""
-#: includes/core/class-builtin.php:1350
+#: includes/core/class-builtin.php:1354
msgid "Here you can hide last login field on profile page and card in member directory"
msgstr ""
-#: includes/core/class-builtin.php:1367
+#: includes/core/class-builtin.php:1371
msgid "If you confirm, everything related to your profile will be deleted permanently from the site"
msgstr ""
-#: includes/core/class-builtin.php:1576
+#: includes/core/class-builtin.php:1580
msgid "Alphabetic value only"
msgstr ""
-#: includes/core/class-builtin.php:1577
+#: includes/core/class-builtin.php:1581
msgid "Alpha-numeric value"
msgstr ""
-#: includes/core/class-builtin.php:1578
+#: includes/core/class-builtin.php:1582
msgid "English letters only"
msgstr ""
-#: includes/core/class-builtin.php:1579
+#: includes/core/class-builtin.php:1583
msgid "Facebook URL"
msgstr ""
-#: includes/core/class-builtin.php:1580
+#: includes/core/class-builtin.php:1584
msgid "Instagram URL"
msgstr ""
-#: includes/core/class-builtin.php:1581
+#: includes/core/class-builtin.php:1585
msgid "LinkedIn URL"
msgstr ""
-#: includes/core/class-builtin.php:1582
+#: includes/core/class-builtin.php:1586
msgid "Lowercase only"
msgstr ""
-#: includes/core/class-builtin.php:1583
+#: includes/core/class-builtin.php:1587
msgid "Numeric value only"
msgstr ""
-#: includes/core/class-builtin.php:1586
+#: includes/core/class-builtin.php:1590
msgid "SoundCloud Profile"
msgstr ""
-#: includes/core/class-builtin.php:1587
+#: includes/core/class-builtin.php:1591
msgid "X (formerly Twitter) URL"
msgstr ""
-#: includes/core/class-builtin.php:1588
+#: includes/core/class-builtin.php:1592
msgid "Email( Not Unique )"
msgstr ""
-#: includes/core/class-builtin.php:1589
+#: includes/core/class-builtin.php:1593
msgid "Unique Email"
msgstr ""
-#: includes/core/class-builtin.php:1590
+#: includes/core/class-builtin.php:1594
msgid "Unique Metakey value"
msgstr ""
-#: includes/core/class-builtin.php:1591
+#: includes/core/class-builtin.php:1595
msgid "Unique Username"
msgstr ""
-#: includes/core/class-builtin.php:1592
+#: includes/core/class-builtin.php:1596
msgid "Unique Username/Email"
msgstr ""
-#: includes/core/class-builtin.php:1594
+#: includes/core/class-builtin.php:1598
msgid "YouTube Profile"
msgstr ""
-#: includes/core/class-builtin.php:1595
+#: includes/core/class-builtin.php:1599
msgid "YouTube Video"
msgstr ""
-#: includes/core/class-builtin.php:1597
+#: includes/core/class-builtin.php:1601
msgid "Telegram URL"
msgstr ""
-#: includes/core/class-builtin.php:1599
+#: includes/core/class-builtin.php:1603
msgid "TikTok URL"
msgstr ""
-#: includes/core/class-builtin.php:1600
+#: includes/core/class-builtin.php:1604
msgid "Twitch URL"
msgstr ""
-#: includes/core/class-builtin.php:1601
+#: includes/core/class-builtin.php:1605
msgid "Reddit URL"
msgstr ""
-#: includes/core/class-builtin.php:1602
+#: includes/core/class-builtin.php:1606
msgid "Custom Validation"
msgstr ""
-#: includes/core/class-builtin.php:1641
+#: includes/core/class-builtin.php:1645
msgid "Afar"
msgstr ""
-#: includes/core/class-builtin.php:1642
+#: includes/core/class-builtin.php:1646
msgid "Abkhazian"
msgstr ""
-#: includes/core/class-builtin.php:1643
+#: includes/core/class-builtin.php:1647
msgid "Avestan"
msgstr ""
-#: includes/core/class-builtin.php:1644
+#: includes/core/class-builtin.php:1648
msgid "Afrikaans"
msgstr ""
-#: includes/core/class-builtin.php:1645
+#: includes/core/class-builtin.php:1649
msgid "Akan"
msgstr ""
-#: includes/core/class-builtin.php:1646
+#: includes/core/class-builtin.php:1650
msgid "Amharic"
msgstr ""
-#: includes/core/class-builtin.php:1647
+#: includes/core/class-builtin.php:1651
msgid "Aragonese"
msgstr ""
-#: includes/core/class-builtin.php:1648
+#: includes/core/class-builtin.php:1652
msgid "Arabic"
msgstr ""
-#: includes/core/class-builtin.php:1649
+#: includes/core/class-builtin.php:1653
msgid "Assamese"
msgstr ""
-#: includes/core/class-builtin.php:1650
+#: includes/core/class-builtin.php:1654
msgid "Avaric"
msgstr ""
-#: includes/core/class-builtin.php:1651
+#: includes/core/class-builtin.php:1655
msgid "Aymara"
msgstr ""
-#: includes/core/class-builtin.php:1652
+#: includes/core/class-builtin.php:1656
msgid "Azerbaijani"
msgstr ""
-#: includes/core/class-builtin.php:1653
+#: includes/core/class-builtin.php:1657
msgid "Bashkir"
msgstr ""
-#: includes/core/class-builtin.php:1654
+#: includes/core/class-builtin.php:1658
msgid "Belarusian"
msgstr ""
-#: includes/core/class-builtin.php:1655
+#: includes/core/class-builtin.php:1659
msgid "Bulgarian"
msgstr ""
-#: includes/core/class-builtin.php:1656
+#: includes/core/class-builtin.php:1660
msgid "Bihari"
msgstr ""
-#: includes/core/class-builtin.php:1657
+#: includes/core/class-builtin.php:1661
msgid "Bislama"
msgstr ""
-#: includes/core/class-builtin.php:1658
+#: includes/core/class-builtin.php:1662
msgid "Bambara"
msgstr ""
-#: includes/core/class-builtin.php:1659
+#: includes/core/class-builtin.php:1663
msgid "Bengali"
msgstr ""
-#: includes/core/class-builtin.php:1660
+#: includes/core/class-builtin.php:1664
msgid "Tibetan"
msgstr ""
-#: includes/core/class-builtin.php:1661
+#: includes/core/class-builtin.php:1665
msgid "Breton"
msgstr ""
-#: includes/core/class-builtin.php:1662
+#: includes/core/class-builtin.php:1666
msgid "Bosnian"
msgstr ""
-#: includes/core/class-builtin.php:1663
+#: includes/core/class-builtin.php:1667
msgid "Catalan"
msgstr ""
-#: includes/core/class-builtin.php:1664
+#: includes/core/class-builtin.php:1668
msgid "Chechen"
msgstr ""
-#: includes/core/class-builtin.php:1665
+#: includes/core/class-builtin.php:1669
msgid "Chamorro"
msgstr ""
-#: includes/core/class-builtin.php:1666
+#: includes/core/class-builtin.php:1670
msgid "Corsican"
msgstr ""
-#: includes/core/class-builtin.php:1667
+#: includes/core/class-builtin.php:1671
msgid "Cree"
msgstr ""
-#: includes/core/class-builtin.php:1668
+#: includes/core/class-builtin.php:1672
msgid "Czech"
msgstr ""
-#: includes/core/class-builtin.php:1669
+#: includes/core/class-builtin.php:1673
msgid "Church Slavic"
msgstr ""
-#: includes/core/class-builtin.php:1670
+#: includes/core/class-builtin.php:1674
msgid "Chuvash"
msgstr ""
-#: includes/core/class-builtin.php:1671
+#: includes/core/class-builtin.php:1675
msgid "Welsh"
msgstr ""
-#: includes/core/class-builtin.php:1672
+#: includes/core/class-builtin.php:1676
msgid "Danish"
msgstr ""
-#: includes/core/class-builtin.php:1673
+#: includes/core/class-builtin.php:1677
msgid "German"
msgstr ""
-#: includes/core/class-builtin.php:1674
+#: includes/core/class-builtin.php:1678
msgid "Divehi"
msgstr ""
-#: includes/core/class-builtin.php:1675
+#: includes/core/class-builtin.php:1679
msgid "Dzongkha"
msgstr ""
-#: includes/core/class-builtin.php:1676
+#: includes/core/class-builtin.php:1680
msgid "Ewe"
msgstr ""
-#: includes/core/class-builtin.php:1677
+#: includes/core/class-builtin.php:1681
msgid "Greek"
msgstr ""
-#: includes/core/class-builtin.php:1678
+#: includes/core/class-builtin.php:1682
msgid "English"
msgstr ""
-#: includes/core/class-builtin.php:1679
+#: includes/core/class-builtin.php:1683
msgid "Esperanto"
msgstr ""
-#: includes/core/class-builtin.php:1680
+#: includes/core/class-builtin.php:1684
msgid "Spanish"
msgstr ""
-#: includes/core/class-builtin.php:1681
+#: includes/core/class-builtin.php:1685
msgid "Estonian"
msgstr ""
-#: includes/core/class-builtin.php:1682
+#: includes/core/class-builtin.php:1686
msgid "Basque"
msgstr ""
-#: includes/core/class-builtin.php:1683
+#: includes/core/class-builtin.php:1687
msgid "Persian"
msgstr ""
-#: includes/core/class-builtin.php:1684
+#: includes/core/class-builtin.php:1688
msgid "Fulah"
msgstr ""
-#: includes/core/class-builtin.php:1685
+#: includes/core/class-builtin.php:1689
msgid "Finnish"
msgstr ""
-#: includes/core/class-builtin.php:1686
+#: includes/core/class-builtin.php:1690
msgid "Fijian"
msgstr ""
-#: includes/core/class-builtin.php:1687
+#: includes/core/class-builtin.php:1691
msgid "Faroese"
msgstr ""
-#: includes/core/class-builtin.php:1688
+#: includes/core/class-builtin.php:1692
msgid "French"
msgstr ""
-#: includes/core/class-builtin.php:1689
+#: includes/core/class-builtin.php:1693
msgid "Western Frisian"
msgstr ""
-#: includes/core/class-builtin.php:1690
+#: includes/core/class-builtin.php:1694
msgid "Irish"
msgstr ""
-#: includes/core/class-builtin.php:1691
+#: includes/core/class-builtin.php:1695
msgid "Scottish Gaelic"
msgstr ""
-#: includes/core/class-builtin.php:1692
+#: includes/core/class-builtin.php:1696
msgid "Galician"
msgstr ""
-#: includes/core/class-builtin.php:1693
+#: includes/core/class-builtin.php:1697
msgid "Guarani"
msgstr ""
-#: includes/core/class-builtin.php:1694
+#: includes/core/class-builtin.php:1698
msgid "Gujarati"
msgstr ""
-#: includes/core/class-builtin.php:1695
+#: includes/core/class-builtin.php:1699
msgid "Manx"
msgstr ""
-#: includes/core/class-builtin.php:1696
+#: includes/core/class-builtin.php:1700
msgid "Hausa"
msgstr ""
-#: includes/core/class-builtin.php:1697
+#: includes/core/class-builtin.php:1701
msgid "Hebrew"
msgstr ""
-#: includes/core/class-builtin.php:1698
+#: includes/core/class-builtin.php:1702
msgid "Hindi"
msgstr ""
-#: includes/core/class-builtin.php:1699
+#: includes/core/class-builtin.php:1703
msgid "Hiri Motu"
msgstr ""
-#: includes/core/class-builtin.php:1700
+#: includes/core/class-builtin.php:1704
msgid "Croatian"
msgstr ""
-#: includes/core/class-builtin.php:1701
+#: includes/core/class-builtin.php:1705
msgid "Haitian"
msgstr ""
-#: includes/core/class-builtin.php:1702
+#: includes/core/class-builtin.php:1706
msgid "Hungarian"
msgstr ""
-#: includes/core/class-builtin.php:1703
+#: includes/core/class-builtin.php:1707
msgid "Armenian"
msgstr ""
-#: includes/core/class-builtin.php:1704
+#: includes/core/class-builtin.php:1708
msgid "Herero"
msgstr ""
-#: includes/core/class-builtin.php:1705
+#: includes/core/class-builtin.php:1709
msgid "Interlingua (International Auxiliary Language Association)"
msgstr ""
-#: includes/core/class-builtin.php:1706
+#: includes/core/class-builtin.php:1710
msgid "Indonesian"
msgstr ""
-#: includes/core/class-builtin.php:1707
+#: includes/core/class-builtin.php:1711
msgid "Interlingue"
msgstr ""
-#: includes/core/class-builtin.php:1708
+#: includes/core/class-builtin.php:1712
msgid "Igbo"
msgstr ""
-#: includes/core/class-builtin.php:1709
+#: includes/core/class-builtin.php:1713
msgid "Sichuan Yi"
msgstr ""
-#: includes/core/class-builtin.php:1710
+#: includes/core/class-builtin.php:1714
msgid "Inupiaq"
msgstr ""
-#: includes/core/class-builtin.php:1711
+#: includes/core/class-builtin.php:1715
msgid "Ido"
msgstr ""
-#: includes/core/class-builtin.php:1712
+#: includes/core/class-builtin.php:1716
msgid "Icelandic"
msgstr ""
-#: includes/core/class-builtin.php:1713
+#: includes/core/class-builtin.php:1717
msgid "Italian"
msgstr ""
-#: includes/core/class-builtin.php:1714
+#: includes/core/class-builtin.php:1718
msgid "Inuktitut"
msgstr ""
-#: includes/core/class-builtin.php:1715
+#: includes/core/class-builtin.php:1719
msgid "Japanese"
msgstr ""
-#: includes/core/class-builtin.php:1716
+#: includes/core/class-builtin.php:1720
msgid "Javanese"
msgstr ""
-#: includes/core/class-builtin.php:1717
+#: includes/core/class-builtin.php:1721
msgid "Kartuli"
msgstr ""
-#: includes/core/class-builtin.php:1718
+#: includes/core/class-builtin.php:1722
msgid "Kongo"
msgstr ""
-#: includes/core/class-builtin.php:1719
+#: includes/core/class-builtin.php:1723
msgid "Kikuyu"
msgstr ""
-#: includes/core/class-builtin.php:1720
+#: includes/core/class-builtin.php:1724
msgid "Kwanyama"
msgstr ""
-#: includes/core/class-builtin.php:1721
+#: includes/core/class-builtin.php:1725
msgid "Kazakh"
msgstr ""
-#: includes/core/class-builtin.php:1722
+#: includes/core/class-builtin.php:1726
msgid "Kalaallisut"
msgstr ""
-#: includes/core/class-builtin.php:1723
+#: includes/core/class-builtin.php:1727
msgid "Khmer"
msgstr ""
-#: includes/core/class-builtin.php:1724
+#: includes/core/class-builtin.php:1728
msgid "Kannada"
msgstr ""
-#: includes/core/class-builtin.php:1725
+#: includes/core/class-builtin.php:1729
msgid "Korean"
msgstr ""
-#: includes/core/class-builtin.php:1726
+#: includes/core/class-builtin.php:1730
msgid "Kanuri"
msgstr ""
-#: includes/core/class-builtin.php:1727
+#: includes/core/class-builtin.php:1731
msgid "Kashmiri"
msgstr ""
-#: includes/core/class-builtin.php:1728
+#: includes/core/class-builtin.php:1732
msgid "Kurdish"
msgstr ""
-#: includes/core/class-builtin.php:1729
+#: includes/core/class-builtin.php:1733
msgid "Komi"
msgstr ""
-#: includes/core/class-builtin.php:1730
+#: includes/core/class-builtin.php:1734
msgid "Cornish"
msgstr ""
-#: includes/core/class-builtin.php:1731
+#: includes/core/class-builtin.php:1735
msgid "Kirghiz"
msgstr ""
-#: includes/core/class-builtin.php:1732
+#: includes/core/class-builtin.php:1736
msgid "Latin"
msgstr ""
-#: includes/core/class-builtin.php:1733
+#: includes/core/class-builtin.php:1737
msgid "Luxembourgish"
msgstr ""
-#: includes/core/class-builtin.php:1734
+#: includes/core/class-builtin.php:1738
msgid "Ganda"
msgstr ""
-#: includes/core/class-builtin.php:1735
+#: includes/core/class-builtin.php:1739
msgid "Limburgish"
msgstr ""
-#: includes/core/class-builtin.php:1736
+#: includes/core/class-builtin.php:1740
msgid "Lingala"
msgstr ""
-#: includes/core/class-builtin.php:1737
+#: includes/core/class-builtin.php:1741
msgid "Lao"
msgstr ""
-#: includes/core/class-builtin.php:1738
+#: includes/core/class-builtin.php:1742
msgid "Lithuanian"
msgstr ""
-#: includes/core/class-builtin.php:1739
+#: includes/core/class-builtin.php:1743
msgid "Luba-Katanga"
msgstr ""
-#: includes/core/class-builtin.php:1740
+#: includes/core/class-builtin.php:1744
msgid "Latvian"
msgstr ""
-#: includes/core/class-builtin.php:1741
+#: includes/core/class-builtin.php:1745
msgid "Malagasy"
msgstr ""
-#: includes/core/class-builtin.php:1742
+#: includes/core/class-builtin.php:1746
msgid "Marshallese"
msgstr ""
-#: includes/core/class-builtin.php:1743
+#: includes/core/class-builtin.php:1747
msgid "Maori"
msgstr ""
-#: includes/core/class-builtin.php:1744
+#: includes/core/class-builtin.php:1748
msgid "Macedonian"
msgstr ""
-#: includes/core/class-builtin.php:1745
+#: includes/core/class-builtin.php:1749
msgid "Malayalam"
msgstr ""
-#: includes/core/class-builtin.php:1746
+#: includes/core/class-builtin.php:1750
msgid "Mongolian"
msgstr ""
-#: includes/core/class-builtin.php:1747
+#: includes/core/class-builtin.php:1751
msgid "Marathi"
msgstr ""
-#: includes/core/class-builtin.php:1748
+#: includes/core/class-builtin.php:1752
msgid "Malay"
msgstr ""
-#: includes/core/class-builtin.php:1749
+#: includes/core/class-builtin.php:1753
msgid "Maltese"
msgstr ""
-#: includes/core/class-builtin.php:1750
+#: includes/core/class-builtin.php:1754
msgid "Burmese"
msgstr ""
-#: includes/core/class-builtin.php:1751
-#: includes/core/class-builtin.php:1982
+#: includes/core/class-builtin.php:1755
+#: includes/core/class-builtin.php:1986
msgid "Nauru"
msgstr ""
-#: includes/core/class-builtin.php:1752
+#: includes/core/class-builtin.php:1756
msgid "Norwegian Bokmal"
msgstr ""
-#: includes/core/class-builtin.php:1753
+#: includes/core/class-builtin.php:1757
msgid "North Ndebele"
msgstr ""
-#: includes/core/class-builtin.php:1754
+#: includes/core/class-builtin.php:1758
msgid "Nepali"
msgstr ""
-#: includes/core/class-builtin.php:1755
+#: includes/core/class-builtin.php:1759
msgid "Ndonga"
msgstr ""
-#: includes/core/class-builtin.php:1756
+#: includes/core/class-builtin.php:1760
msgid "Dutch"
msgstr ""
-#: includes/core/class-builtin.php:1757
+#: includes/core/class-builtin.php:1761
msgid "Norwegian Nynorsk"
msgstr ""
-#: includes/core/class-builtin.php:1758
+#: includes/core/class-builtin.php:1762
msgid "Norwegian"
msgstr ""
-#: includes/core/class-builtin.php:1759
+#: includes/core/class-builtin.php:1763
msgid "South Ndebele"
msgstr ""
-#: includes/core/class-builtin.php:1760
+#: includes/core/class-builtin.php:1764
msgid "Navajo"
msgstr ""
-#: includes/core/class-builtin.php:1761
+#: includes/core/class-builtin.php:1765
msgid "Chichewa"
msgstr ""
-#: includes/core/class-builtin.php:1762
+#: includes/core/class-builtin.php:1766
msgid "Occitan"
msgstr ""
-#: includes/core/class-builtin.php:1763
+#: includes/core/class-builtin.php:1767
msgid "Ojibwa"
msgstr ""
-#: includes/core/class-builtin.php:1764
+#: includes/core/class-builtin.php:1768
msgid "Oromo"
msgstr ""
-#: includes/core/class-builtin.php:1765
+#: includes/core/class-builtin.php:1769
msgid "Oriya"
msgstr ""
-#: includes/core/class-builtin.php:1766
+#: includes/core/class-builtin.php:1770
msgid "Ossetian"
msgstr ""
-#: includes/core/class-builtin.php:1767
+#: includes/core/class-builtin.php:1771
msgid "Panjabi"
msgstr ""
-#: includes/core/class-builtin.php:1768
+#: includes/core/class-builtin.php:1772
msgid "Pali"
msgstr ""
-#: includes/core/class-builtin.php:1769
+#: includes/core/class-builtin.php:1773
msgid "Polish"
msgstr ""
-#: includes/core/class-builtin.php:1770
+#: includes/core/class-builtin.php:1774
msgid "Pashto"
msgstr ""
-#: includes/core/class-builtin.php:1771
+#: includes/core/class-builtin.php:1775
msgid "Portuguese"
msgstr ""
-#: includes/core/class-builtin.php:1772
+#: includes/core/class-builtin.php:1776
msgid "Quechua"
msgstr ""
-#: includes/core/class-builtin.php:1773
+#: includes/core/class-builtin.php:1777
msgid "Raeto-Romance"
msgstr ""
-#: includes/core/class-builtin.php:1774
+#: includes/core/class-builtin.php:1778
msgid "Kirundi"
msgstr ""
-#: includes/core/class-builtin.php:1775
+#: includes/core/class-builtin.php:1779
msgid "Romanian"
msgstr ""
-#: includes/core/class-builtin.php:1776
+#: includes/core/class-builtin.php:1780
msgid "Russian"
msgstr ""
-#: includes/core/class-builtin.php:1777
+#: includes/core/class-builtin.php:1781
msgid "Kinyarwanda"
msgstr ""
-#: includes/core/class-builtin.php:1778
+#: includes/core/class-builtin.php:1782
msgid "Sanskrit"
msgstr ""
-#: includes/core/class-builtin.php:1779
+#: includes/core/class-builtin.php:1783
msgid "Sardinian"
msgstr ""
-#: includes/core/class-builtin.php:1780
+#: includes/core/class-builtin.php:1784
msgid "Sindhi"
msgstr ""
-#: includes/core/class-builtin.php:1781
+#: includes/core/class-builtin.php:1785
msgid "Northern Sami"
msgstr ""
-#: includes/core/class-builtin.php:1782
+#: includes/core/class-builtin.php:1786
msgid "Sango"
msgstr ""
-#: includes/core/class-builtin.php:1783
+#: includes/core/class-builtin.php:1787
msgid "Sinhala"
msgstr ""
-#: includes/core/class-builtin.php:1784
+#: includes/core/class-builtin.php:1788
msgid "Slovak"
msgstr ""
-#: includes/core/class-builtin.php:1785
+#: includes/core/class-builtin.php:1789
msgid "Slovenian"
msgstr ""
-#: includes/core/class-builtin.php:1786
+#: includes/core/class-builtin.php:1790
msgid "Samoan"
msgstr ""
-#: includes/core/class-builtin.php:1787
+#: includes/core/class-builtin.php:1791
msgid "Shona"
msgstr ""
-#: includes/core/class-builtin.php:1788
+#: includes/core/class-builtin.php:1792
msgid "Somali"
msgstr ""
-#: includes/core/class-builtin.php:1789
+#: includes/core/class-builtin.php:1793
msgid "Albanian"
msgstr ""
-#: includes/core/class-builtin.php:1790
+#: includes/core/class-builtin.php:1794
msgid "Serbian"
msgstr ""
-#: includes/core/class-builtin.php:1791
+#: includes/core/class-builtin.php:1795
msgid "Swati"
msgstr ""
-#: includes/core/class-builtin.php:1792
+#: includes/core/class-builtin.php:1796
msgid "Southern Sotho"
msgstr ""
-#: includes/core/class-builtin.php:1793
+#: includes/core/class-builtin.php:1797
msgid "Sundanese"
msgstr ""
-#: includes/core/class-builtin.php:1794
+#: includes/core/class-builtin.php:1798
msgid "Swedish"
msgstr ""
-#: includes/core/class-builtin.php:1795
+#: includes/core/class-builtin.php:1799
msgid "Swahili"
msgstr ""
-#: includes/core/class-builtin.php:1796
+#: includes/core/class-builtin.php:1800
msgid "Tamil"
msgstr ""
-#: includes/core/class-builtin.php:1797
+#: includes/core/class-builtin.php:1801
msgid "Telugu"
msgstr ""
-#: includes/core/class-builtin.php:1798
+#: includes/core/class-builtin.php:1802
msgid "Tajik"
msgstr ""
-#: includes/core/class-builtin.php:1799
+#: includes/core/class-builtin.php:1803
msgid "Thai"
msgstr ""
-#: includes/core/class-builtin.php:1800
+#: includes/core/class-builtin.php:1804
msgid "Tigrinya"
msgstr ""
-#: includes/core/class-builtin.php:1801
+#: includes/core/class-builtin.php:1805
msgid "Turkmen"
msgstr ""
-#: includes/core/class-builtin.php:1802
+#: includes/core/class-builtin.php:1806
msgid "Tagalog"
msgstr ""
-#: includes/core/class-builtin.php:1803
+#: includes/core/class-builtin.php:1807
msgid "Tswana"
msgstr ""
-#: includes/core/class-builtin.php:1804
-#: includes/core/class-builtin.php:2052
+#: includes/core/class-builtin.php:1808
+#: includes/core/class-builtin.php:2056
msgid "Tonga"
msgstr ""
-#: includes/core/class-builtin.php:1805
+#: includes/core/class-builtin.php:1809
msgid "Turkish"
msgstr ""
-#: includes/core/class-builtin.php:1806
+#: includes/core/class-builtin.php:1810
msgid "Tsonga"
msgstr ""
-#: includes/core/class-builtin.php:1807
+#: includes/core/class-builtin.php:1811
msgid "Tatar"
msgstr ""
-#: includes/core/class-builtin.php:1808
+#: includes/core/class-builtin.php:1812
msgid "Twi"
msgstr ""
-#: includes/core/class-builtin.php:1809
+#: includes/core/class-builtin.php:1813
msgid "Tahitian"
msgstr ""
-#: includes/core/class-builtin.php:1810
+#: includes/core/class-builtin.php:1814
msgid "Uighur"
msgstr ""
-#: includes/core/class-builtin.php:1811
+#: includes/core/class-builtin.php:1815
msgid "Ukrainian"
msgstr ""
-#: includes/core/class-builtin.php:1812
+#: includes/core/class-builtin.php:1816
msgid "Urdu"
msgstr ""
-#: includes/core/class-builtin.php:1813
+#: includes/core/class-builtin.php:1817
msgid "Uzbek"
msgstr ""
-#: includes/core/class-builtin.php:1814
+#: includes/core/class-builtin.php:1818
msgid "Venda"
msgstr ""
-#: includes/core/class-builtin.php:1815
+#: includes/core/class-builtin.php:1819
msgid "Vietnamese"
msgstr ""
-#: includes/core/class-builtin.php:1816
+#: includes/core/class-builtin.php:1820
msgid "Volapuk"
msgstr ""
-#: includes/core/class-builtin.php:1817
+#: includes/core/class-builtin.php:1821
msgid "Walloon"
msgstr ""
-#: includes/core/class-builtin.php:1818
+#: includes/core/class-builtin.php:1822
msgid "Wolof"
msgstr ""
-#: includes/core/class-builtin.php:1819
+#: includes/core/class-builtin.php:1823
msgid "Xhosa"
msgstr ""
-#: includes/core/class-builtin.php:1820
+#: includes/core/class-builtin.php:1824
msgid "Yiddish"
msgstr ""
-#: includes/core/class-builtin.php:1821
+#: includes/core/class-builtin.php:1825
msgid "Yoruba"
msgstr ""
-#: includes/core/class-builtin.php:1822
+#: includes/core/class-builtin.php:1826
msgid "Zhuang"
msgstr ""
-#: includes/core/class-builtin.php:1823
+#: includes/core/class-builtin.php:1827
msgid "Chinese"
msgstr ""
-#: includes/core/class-builtin.php:1824
+#: includes/core/class-builtin.php:1828
msgid "Zulu"
msgstr ""
-#: includes/core/class-builtin.php:1830
+#: includes/core/class-builtin.php:1834
msgid "Afghanistan"
msgstr ""
-#: includes/core/class-builtin.php:1831
+#: includes/core/class-builtin.php:1835
msgid "Ã…land Islands"
msgstr ""
-#: includes/core/class-builtin.php:1832
+#: includes/core/class-builtin.php:1836
msgid "Albania"
msgstr ""
-#: includes/core/class-builtin.php:1833
+#: includes/core/class-builtin.php:1837
msgid "Algeria"
msgstr ""
-#: includes/core/class-builtin.php:1834
+#: includes/core/class-builtin.php:1838
msgid "American Samoa"
msgstr ""
-#: includes/core/class-builtin.php:1835
+#: includes/core/class-builtin.php:1839
msgid "Andorra"
msgstr ""
-#: includes/core/class-builtin.php:1836
+#: includes/core/class-builtin.php:1840
msgid "Angola"
msgstr ""
-#: includes/core/class-builtin.php:1837
+#: includes/core/class-builtin.php:1841
msgid "Anguilla"
msgstr ""
-#: includes/core/class-builtin.php:1838
+#: includes/core/class-builtin.php:1842
msgid "Antarctica"
msgstr ""
-#: includes/core/class-builtin.php:1839
+#: includes/core/class-builtin.php:1843
msgid "Antigua and Barbuda"
msgstr ""
-#: includes/core/class-builtin.php:1840
+#: includes/core/class-builtin.php:1844
msgid "Argentina"
msgstr ""
-#: includes/core/class-builtin.php:1841
+#: includes/core/class-builtin.php:1845
msgid "Armenia"
msgstr ""
-#: includes/core/class-builtin.php:1842
+#: includes/core/class-builtin.php:1846
msgid "Aruba"
msgstr ""
-#: includes/core/class-builtin.php:1843
+#: includes/core/class-builtin.php:1847
msgid "Australia"
msgstr ""
-#: includes/core/class-builtin.php:1844
+#: includes/core/class-builtin.php:1848
msgid "Austria"
msgstr ""
-#: includes/core/class-builtin.php:1845
+#: includes/core/class-builtin.php:1849
msgid "Azerbaijan"
msgstr ""
-#: includes/core/class-builtin.php:1846
+#: includes/core/class-builtin.php:1850
msgid "Bahamas"
msgstr ""
-#: includes/core/class-builtin.php:1847
+#: includes/core/class-builtin.php:1851
msgid "Bahrain"
msgstr ""
-#: includes/core/class-builtin.php:1848
+#: includes/core/class-builtin.php:1852
msgid "Bangladesh"
msgstr ""
-#: includes/core/class-builtin.php:1849
+#: includes/core/class-builtin.php:1853
msgid "Barbados"
msgstr ""
-#: includes/core/class-builtin.php:1850
+#: includes/core/class-builtin.php:1854
msgid "Belarus"
msgstr ""
-#: includes/core/class-builtin.php:1851
+#: includes/core/class-builtin.php:1855
msgid "Belgium"
msgstr ""
-#: includes/core/class-builtin.php:1852
+#: includes/core/class-builtin.php:1856
msgid "Belize"
msgstr ""
-#: includes/core/class-builtin.php:1853
+#: includes/core/class-builtin.php:1857
msgid "Benin"
msgstr ""
-#: includes/core/class-builtin.php:1854
+#: includes/core/class-builtin.php:1858
msgid "Bermuda"
msgstr ""
-#: includes/core/class-builtin.php:1855
+#: includes/core/class-builtin.php:1859
msgid "Bhutan"
msgstr ""
-#: includes/core/class-builtin.php:1856
+#: includes/core/class-builtin.php:1860
msgid "Bolivia, Plurinational State of"
msgstr ""
-#: includes/core/class-builtin.php:1857
+#: includes/core/class-builtin.php:1861
msgid "Bosnia and Herzegovina"
msgstr ""
-#: includes/core/class-builtin.php:1858
+#: includes/core/class-builtin.php:1862
msgid "Botswana"
msgstr ""
-#: includes/core/class-builtin.php:1859
+#: includes/core/class-builtin.php:1863
msgid "Bouvet Island"
msgstr ""
-#: includes/core/class-builtin.php:1860
+#: includes/core/class-builtin.php:1864
msgid "Brazil"
msgstr ""
-#: includes/core/class-builtin.php:1861
+#: includes/core/class-builtin.php:1865
msgid "British Indian Ocean Territory"
msgstr ""
-#: includes/core/class-builtin.php:1862
+#: includes/core/class-builtin.php:1866
msgid "Brunei Darussalam"
msgstr ""
-#: includes/core/class-builtin.php:1863
+#: includes/core/class-builtin.php:1867
msgid "Bulgaria"
msgstr ""
-#: includes/core/class-builtin.php:1864
+#: includes/core/class-builtin.php:1868
msgid "Burkina Faso"
msgstr ""
-#: includes/core/class-builtin.php:1865
+#: includes/core/class-builtin.php:1869
msgid "Burundi"
msgstr ""
-#: includes/core/class-builtin.php:1866
+#: includes/core/class-builtin.php:1870
msgid "Cambodia"
msgstr ""
-#: includes/core/class-builtin.php:1867
+#: includes/core/class-builtin.php:1871
msgid "Cameroon"
msgstr ""
-#: includes/core/class-builtin.php:1868
+#: includes/core/class-builtin.php:1872
msgid "Canada"
msgstr ""
-#: includes/core/class-builtin.php:1869
+#: includes/core/class-builtin.php:1873
msgid "Cape Verde"
msgstr ""
-#: includes/core/class-builtin.php:1870
+#: includes/core/class-builtin.php:1874
msgid "Cayman Islands"
msgstr ""
-#: includes/core/class-builtin.php:1871
+#: includes/core/class-builtin.php:1875
msgid "Central African Republic"
msgstr ""
-#: includes/core/class-builtin.php:1872
+#: includes/core/class-builtin.php:1876
msgid "Chad"
msgstr ""
-#: includes/core/class-builtin.php:1873
+#: includes/core/class-builtin.php:1877
msgid "Chile"
msgstr ""
-#: includes/core/class-builtin.php:1874
+#: includes/core/class-builtin.php:1878
msgid "China"
msgstr ""
-#: includes/core/class-builtin.php:1875
+#: includes/core/class-builtin.php:1879
msgid "Christmas Island"
msgstr ""
-#: includes/core/class-builtin.php:1876
+#: includes/core/class-builtin.php:1880
msgid "Cocos (Keeling) Islands"
msgstr ""
-#: includes/core/class-builtin.php:1877
+#: includes/core/class-builtin.php:1881
msgid "Colombia"
msgstr ""
-#: includes/core/class-builtin.php:1878
+#: includes/core/class-builtin.php:1882
msgid "Comoros"
msgstr ""
-#: includes/core/class-builtin.php:1879
+#: includes/core/class-builtin.php:1883
msgid "Congo"
msgstr ""
-#: includes/core/class-builtin.php:1880
+#: includes/core/class-builtin.php:1884
msgid "Congo, the Democratic Republic of the"
msgstr ""
-#: includes/core/class-builtin.php:1881
+#: includes/core/class-builtin.php:1885
msgid "Cook Islands"
msgstr ""
-#: includes/core/class-builtin.php:1882
+#: includes/core/class-builtin.php:1886
msgid "Costa Rica"
msgstr ""
-#: includes/core/class-builtin.php:1883
+#: includes/core/class-builtin.php:1887
msgid "Côte d'Ivoire"
msgstr ""
-#: includes/core/class-builtin.php:1884
+#: includes/core/class-builtin.php:1888
msgid "Croatia"
msgstr ""
-#: includes/core/class-builtin.php:1885
+#: includes/core/class-builtin.php:1889
msgid "Cuba"
msgstr ""
-#: includes/core/class-builtin.php:1886
+#: includes/core/class-builtin.php:1890
msgid "Cyprus"
msgstr ""
-#: includes/core/class-builtin.php:1887
+#: includes/core/class-builtin.php:1891
msgid "Czech Republic"
msgstr ""
-#: includes/core/class-builtin.php:1888
+#: includes/core/class-builtin.php:1892
msgid "Denmark"
msgstr ""
-#: includes/core/class-builtin.php:1889
+#: includes/core/class-builtin.php:1893
msgid "Djibouti"
msgstr ""
-#: includes/core/class-builtin.php:1890
+#: includes/core/class-builtin.php:1894
msgid "Dominica"
msgstr ""
-#: includes/core/class-builtin.php:1891
+#: includes/core/class-builtin.php:1895
msgid "Dominican Republic"
msgstr ""
-#: includes/core/class-builtin.php:1892
+#: includes/core/class-builtin.php:1896
msgid "Ecuador"
msgstr ""
-#: includes/core/class-builtin.php:1893
+#: includes/core/class-builtin.php:1897
msgid "Egypt"
msgstr ""
-#: includes/core/class-builtin.php:1894
+#: includes/core/class-builtin.php:1898
msgid "El Salvador"
msgstr ""
-#: includes/core/class-builtin.php:1895
+#: includes/core/class-builtin.php:1899
msgid "Equatorial Guinea"
msgstr ""
-#: includes/core/class-builtin.php:1896
+#: includes/core/class-builtin.php:1900
msgid "Eritrea"
msgstr ""
-#: includes/core/class-builtin.php:1897
+#: includes/core/class-builtin.php:1901
msgid "Estonia"
msgstr ""
-#: includes/core/class-builtin.php:1898
+#: includes/core/class-builtin.php:1902
msgid "Ethiopia"
msgstr ""
-#: includes/core/class-builtin.php:1899
+#: includes/core/class-builtin.php:1903
msgid "Falkland Islands (Malvinas)"
msgstr ""
-#: includes/core/class-builtin.php:1900
+#: includes/core/class-builtin.php:1904
msgid "Faroe Islands"
msgstr ""
-#: includes/core/class-builtin.php:1901
+#: includes/core/class-builtin.php:1905
msgid "Fiji"
msgstr ""
-#: includes/core/class-builtin.php:1902
+#: includes/core/class-builtin.php:1906
msgid "Finland"
msgstr ""
-#: includes/core/class-builtin.php:1903
+#: includes/core/class-builtin.php:1907
msgid "France"
msgstr ""
-#: includes/core/class-builtin.php:1904
+#: includes/core/class-builtin.php:1908
msgid "French Guiana"
msgstr ""
-#: includes/core/class-builtin.php:1905
+#: includes/core/class-builtin.php:1909
msgid "French Polynesia"
msgstr ""
-#: includes/core/class-builtin.php:1906
+#: includes/core/class-builtin.php:1910
msgid "French Southern Territories"
msgstr ""
-#: includes/core/class-builtin.php:1907
+#: includes/core/class-builtin.php:1911
msgid "Gabon"
msgstr ""
-#: includes/core/class-builtin.php:1908
+#: includes/core/class-builtin.php:1912
msgid "Gambia"
msgstr ""
-#: includes/core/class-builtin.php:1909
+#: includes/core/class-builtin.php:1913
msgid "Sakartvelo"
msgstr ""
-#: includes/core/class-builtin.php:1910
+#: includes/core/class-builtin.php:1914
msgid "Germany"
msgstr ""
-#: includes/core/class-builtin.php:1911
+#: includes/core/class-builtin.php:1915
msgid "Ghana"
msgstr ""
-#: includes/core/class-builtin.php:1912
+#: includes/core/class-builtin.php:1916
msgid "Gibraltar"
msgstr ""
-#: includes/core/class-builtin.php:1913
+#: includes/core/class-builtin.php:1917
msgid "Greece"
msgstr ""
-#: includes/core/class-builtin.php:1914
+#: includes/core/class-builtin.php:1918
msgid "Greenland"
msgstr ""
-#: includes/core/class-builtin.php:1915
+#: includes/core/class-builtin.php:1919
msgid "Grenada"
msgstr ""
-#: includes/core/class-builtin.php:1916
+#: includes/core/class-builtin.php:1920
msgid "Guadeloupe"
msgstr ""
-#: includes/core/class-builtin.php:1917
+#: includes/core/class-builtin.php:1921
msgid "Guam"
msgstr ""
-#: includes/core/class-builtin.php:1918
+#: includes/core/class-builtin.php:1922
msgid "Guatemala"
msgstr ""
-#: includes/core/class-builtin.php:1919
+#: includes/core/class-builtin.php:1923
msgid "Guernsey"
msgstr ""
-#: includes/core/class-builtin.php:1920
+#: includes/core/class-builtin.php:1924
msgid "Guinea"
msgstr ""
-#: includes/core/class-builtin.php:1921
+#: includes/core/class-builtin.php:1925
msgid "Guinea-Bissau"
msgstr ""
-#: includes/core/class-builtin.php:1922
+#: includes/core/class-builtin.php:1926
msgid "Guyana"
msgstr ""
-#: includes/core/class-builtin.php:1923
+#: includes/core/class-builtin.php:1927
msgid "Haiti"
msgstr ""
-#: includes/core/class-builtin.php:1924
+#: includes/core/class-builtin.php:1928
msgid "Heard Island and McDonald Islands"
msgstr ""
-#: includes/core/class-builtin.php:1925
+#: includes/core/class-builtin.php:1929
msgid "Holy See (Vatican City State)"
msgstr ""
-#: includes/core/class-builtin.php:1926
+#: includes/core/class-builtin.php:1930
msgid "Honduras"
msgstr ""
-#: includes/core/class-builtin.php:1927
+#: includes/core/class-builtin.php:1931
msgid "Hong Kong"
msgstr ""
-#: includes/core/class-builtin.php:1928
+#: includes/core/class-builtin.php:1932
msgid "Hungary"
msgstr ""
-#: includes/core/class-builtin.php:1929
+#: includes/core/class-builtin.php:1933
msgid "Iceland"
msgstr ""
-#: includes/core/class-builtin.php:1930
+#: includes/core/class-builtin.php:1934
msgid "India"
msgstr ""
-#: includes/core/class-builtin.php:1931
+#: includes/core/class-builtin.php:1935
msgid "Indonesia"
msgstr ""
-#: includes/core/class-builtin.php:1932
+#: includes/core/class-builtin.php:1936
msgid "Iran, Islamic Republic of"
msgstr ""
-#: includes/core/class-builtin.php:1933
+#: includes/core/class-builtin.php:1937
msgid "Iraq"
msgstr ""
-#: includes/core/class-builtin.php:1934
+#: includes/core/class-builtin.php:1938
msgid "Ireland"
msgstr ""
-#: includes/core/class-builtin.php:1935
+#: includes/core/class-builtin.php:1939
msgid "Isle of Man"
msgstr ""
-#: includes/core/class-builtin.php:1936
+#: includes/core/class-builtin.php:1940
msgid "Israel"
msgstr ""
-#: includes/core/class-builtin.php:1937
+#: includes/core/class-builtin.php:1941
msgid "Italy"
msgstr ""
-#: includes/core/class-builtin.php:1938
+#: includes/core/class-builtin.php:1942
msgid "Jamaica"
msgstr ""
-#: includes/core/class-builtin.php:1939
+#: includes/core/class-builtin.php:1943
msgid "Japan"
msgstr ""
-#: includes/core/class-builtin.php:1940
+#: includes/core/class-builtin.php:1944
msgid "Jersey"
msgstr ""
-#: includes/core/class-builtin.php:1941
+#: includes/core/class-builtin.php:1945
msgid "Jordan"
msgstr ""
-#: includes/core/class-builtin.php:1942
+#: includes/core/class-builtin.php:1946
msgid "Kazakhstan"
msgstr ""
-#: includes/core/class-builtin.php:1943
+#: includes/core/class-builtin.php:1947
msgid "Kenya"
msgstr ""
-#: includes/core/class-builtin.php:1944
+#: includes/core/class-builtin.php:1948
msgid "Kiribati"
msgstr ""
-#: includes/core/class-builtin.php:1945
+#: includes/core/class-builtin.php:1949
msgid "Korea, Democratic People's Republic of"
msgstr ""
-#: includes/core/class-builtin.php:1946
+#: includes/core/class-builtin.php:1950
msgid "Korea, Republic of"
msgstr ""
-#: includes/core/class-builtin.php:1947
+#: includes/core/class-builtin.php:1951
msgid "Kuwait"
msgstr ""
-#: includes/core/class-builtin.php:1948
+#: includes/core/class-builtin.php:1952
msgid "Kyrgyzstan"
msgstr ""
-#: includes/core/class-builtin.php:1949
+#: includes/core/class-builtin.php:1953
msgid "Lao People's Democratic Republic"
msgstr ""
-#: includes/core/class-builtin.php:1950
+#: includes/core/class-builtin.php:1954
msgid "Latvia"
msgstr ""
-#: includes/core/class-builtin.php:1951
+#: includes/core/class-builtin.php:1955
msgid "Lebanon"
msgstr ""
-#: includes/core/class-builtin.php:1952
+#: includes/core/class-builtin.php:1956
msgid "Lesotho"
msgstr ""
-#: includes/core/class-builtin.php:1953
+#: includes/core/class-builtin.php:1957
msgid "Liberia"
msgstr ""
-#: includes/core/class-builtin.php:1954
+#: includes/core/class-builtin.php:1958
msgid "Libyan Arab Jamahiriya"
msgstr ""
-#: includes/core/class-builtin.php:1955
+#: includes/core/class-builtin.php:1959
msgid "Liechtenstein"
msgstr ""
-#: includes/core/class-builtin.php:1956
+#: includes/core/class-builtin.php:1960
msgid "Lithuania"
msgstr ""
-#: includes/core/class-builtin.php:1957
+#: includes/core/class-builtin.php:1961
msgid "Luxembourg"
msgstr ""
-#: includes/core/class-builtin.php:1958
+#: includes/core/class-builtin.php:1962
msgid "Macao"
msgstr ""
-#: includes/core/class-builtin.php:1959
+#: includes/core/class-builtin.php:1963
msgid "Macedonia, the former Yugoslav Republic of"
msgstr ""
-#: includes/core/class-builtin.php:1960
+#: includes/core/class-builtin.php:1964
msgid "Madagascar"
msgstr ""
-#: includes/core/class-builtin.php:1961
+#: includes/core/class-builtin.php:1965
msgid "Malawi"
msgstr ""
-#: includes/core/class-builtin.php:1962
+#: includes/core/class-builtin.php:1966
msgid "Malaysia"
msgstr ""
-#: includes/core/class-builtin.php:1963
+#: includes/core/class-builtin.php:1967
msgid "Maldives"
msgstr ""
-#: includes/core/class-builtin.php:1964
+#: includes/core/class-builtin.php:1968
msgid "Mali"
msgstr ""
-#: includes/core/class-builtin.php:1965
+#: includes/core/class-builtin.php:1969
msgid "Malta"
msgstr ""
-#: includes/core/class-builtin.php:1966
+#: includes/core/class-builtin.php:1970
msgid "Marshall Islands"
msgstr ""
-#: includes/core/class-builtin.php:1967
+#: includes/core/class-builtin.php:1971
msgid "Martinique"
msgstr ""
-#: includes/core/class-builtin.php:1968
+#: includes/core/class-builtin.php:1972
msgid "Mauritania"
msgstr ""
-#: includes/core/class-builtin.php:1969
+#: includes/core/class-builtin.php:1973
msgid "Mauritius"
msgstr ""
-#: includes/core/class-builtin.php:1970
+#: includes/core/class-builtin.php:1974
msgid "Mayotte"
msgstr ""
-#: includes/core/class-builtin.php:1971
+#: includes/core/class-builtin.php:1975
msgid "Mexico"
msgstr ""
-#: includes/core/class-builtin.php:1972
+#: includes/core/class-builtin.php:1976
msgid "Micronesia, Federated States of"
msgstr ""
-#: includes/core/class-builtin.php:1973
+#: includes/core/class-builtin.php:1977
msgid "Moldova, Republic of"
msgstr ""
-#: includes/core/class-builtin.php:1974
+#: includes/core/class-builtin.php:1978
msgid "Monaco"
msgstr ""
-#: includes/core/class-builtin.php:1975
+#: includes/core/class-builtin.php:1979
msgid "Mongolia"
msgstr ""
-#: includes/core/class-builtin.php:1976
+#: includes/core/class-builtin.php:1980
msgid "Montenegro"
msgstr ""
-#: includes/core/class-builtin.php:1977
+#: includes/core/class-builtin.php:1981
msgid "Montserrat"
msgstr ""
-#: includes/core/class-builtin.php:1978
+#: includes/core/class-builtin.php:1982
msgid "Morocco"
msgstr ""
-#: includes/core/class-builtin.php:1979
+#: includes/core/class-builtin.php:1983
msgid "Mozambique"
msgstr ""
-#: includes/core/class-builtin.php:1980
+#: includes/core/class-builtin.php:1984
msgid "Myanmar"
msgstr ""
-#: includes/core/class-builtin.php:1981
+#: includes/core/class-builtin.php:1985
msgid "Namibia"
msgstr ""
-#: includes/core/class-builtin.php:1983
+#: includes/core/class-builtin.php:1987
msgid "Nepal"
msgstr ""
-#: includes/core/class-builtin.php:1984
+#: includes/core/class-builtin.php:1988
msgid "Netherlands"
msgstr ""
-#: includes/core/class-builtin.php:1985
+#: includes/core/class-builtin.php:1989
msgid "Netherlands Antilles"
msgstr ""
-#: includes/core/class-builtin.php:1986
+#: includes/core/class-builtin.php:1990
msgid "New Caledonia"
msgstr ""
-#: includes/core/class-builtin.php:1987
+#: includes/core/class-builtin.php:1991
msgid "New Zealand"
msgstr ""
-#: includes/core/class-builtin.php:1988
+#: includes/core/class-builtin.php:1992
msgid "Nicaragua"
msgstr ""
-#: includes/core/class-builtin.php:1989
+#: includes/core/class-builtin.php:1993
msgid "Niger"
msgstr ""
-#: includes/core/class-builtin.php:1990
+#: includes/core/class-builtin.php:1994
msgid "Nigeria"
msgstr ""
-#: includes/core/class-builtin.php:1991
+#: includes/core/class-builtin.php:1995
msgid "Niue"
msgstr ""
-#: includes/core/class-builtin.php:1992
+#: includes/core/class-builtin.php:1996
msgid "Norfolk Island"
msgstr ""
-#: includes/core/class-builtin.php:1993
+#: includes/core/class-builtin.php:1997
msgid "Northern Mariana Islands"
msgstr ""
-#: includes/core/class-builtin.php:1994
+#: includes/core/class-builtin.php:1998
msgid "Norway"
msgstr ""
-#: includes/core/class-builtin.php:1995
+#: includes/core/class-builtin.php:1999
msgid "Oman"
msgstr ""
-#: includes/core/class-builtin.php:1996
+#: includes/core/class-builtin.php:2000
msgid "Pakistan"
msgstr ""
-#: includes/core/class-builtin.php:1997
+#: includes/core/class-builtin.php:2001
msgid "Palau"
msgstr ""
-#: includes/core/class-builtin.php:1998
+#: includes/core/class-builtin.php:2002
msgid "Palestine"
msgstr ""
-#: includes/core/class-builtin.php:1999
+#: includes/core/class-builtin.php:2003
msgid "Panama"
msgstr ""
-#: includes/core/class-builtin.php:2000
+#: includes/core/class-builtin.php:2004
msgid "Papua New Guinea"
msgstr ""
-#: includes/core/class-builtin.php:2001
+#: includes/core/class-builtin.php:2005
msgid "Paraguay"
msgstr ""
-#: includes/core/class-builtin.php:2002
+#: includes/core/class-builtin.php:2006
msgid "Peru"
msgstr ""
-#: includes/core/class-builtin.php:2003
+#: includes/core/class-builtin.php:2007
msgid "Philippines"
msgstr ""
-#: includes/core/class-builtin.php:2004
+#: includes/core/class-builtin.php:2008
msgid "Pitcairn"
msgstr ""
-#: includes/core/class-builtin.php:2005
+#: includes/core/class-builtin.php:2009
msgid "Poland"
msgstr ""
-#: includes/core/class-builtin.php:2006
+#: includes/core/class-builtin.php:2010
msgid "Portugal"
msgstr ""
-#: includes/core/class-builtin.php:2007
+#: includes/core/class-builtin.php:2011
msgid "Puerto Rico"
msgstr ""
-#: includes/core/class-builtin.php:2008
+#: includes/core/class-builtin.php:2012
msgid "Qatar"
msgstr ""
-#: includes/core/class-builtin.php:2009
+#: includes/core/class-builtin.php:2013
msgid "Réunion"
msgstr ""
-#: includes/core/class-builtin.php:2010
+#: includes/core/class-builtin.php:2014
msgid "Romania"
msgstr ""
-#: includes/core/class-builtin.php:2011
+#: includes/core/class-builtin.php:2015
msgid "Russian Federation"
msgstr ""
-#: includes/core/class-builtin.php:2012
+#: includes/core/class-builtin.php:2016
msgid "Rwanda"
msgstr ""
-#: includes/core/class-builtin.php:2013
+#: includes/core/class-builtin.php:2017
msgid "Saint Barthélemy"
msgstr ""
-#: includes/core/class-builtin.php:2014
+#: includes/core/class-builtin.php:2018
msgid "Saint Helena"
msgstr ""
-#: includes/core/class-builtin.php:2015
+#: includes/core/class-builtin.php:2019
msgid "Saint Kitts and Nevis"
msgstr ""
-#: includes/core/class-builtin.php:2016
+#: includes/core/class-builtin.php:2020
msgid "Saint Lucia"
msgstr ""
-#: includes/core/class-builtin.php:2017
+#: includes/core/class-builtin.php:2021
msgid "Saint Martin (French part)"
msgstr ""
-#: includes/core/class-builtin.php:2018
+#: includes/core/class-builtin.php:2022
msgid "Saint Pierre and Miquelon"
msgstr ""
-#: includes/core/class-builtin.php:2019
+#: includes/core/class-builtin.php:2023
msgid "Saint Vincent and the Grenadines"
msgstr ""
-#: includes/core/class-builtin.php:2020
+#: includes/core/class-builtin.php:2024
msgid "Samoa"
msgstr ""
-#: includes/core/class-builtin.php:2021
+#: includes/core/class-builtin.php:2025
msgid "San Marino"
msgstr ""
-#: includes/core/class-builtin.php:2022
+#: includes/core/class-builtin.php:2026
msgid "Sao Tome and Principe"
msgstr ""
-#: includes/core/class-builtin.php:2023
+#: includes/core/class-builtin.php:2027
msgid "Saudi Arabia"
msgstr ""
-#: includes/core/class-builtin.php:2024
+#: includes/core/class-builtin.php:2028
msgid "Senegal"
msgstr ""
-#: includes/core/class-builtin.php:2025
+#: includes/core/class-builtin.php:2029
msgid "Serbia"
msgstr ""
-#: includes/core/class-builtin.php:2026
+#: includes/core/class-builtin.php:2030
msgid "Seychelles"
msgstr ""
-#: includes/core/class-builtin.php:2027
+#: includes/core/class-builtin.php:2031
msgid "Sierra Leone"
msgstr ""
-#: includes/core/class-builtin.php:2028
+#: includes/core/class-builtin.php:2032
msgid "Singapore"
msgstr ""
-#: includes/core/class-builtin.php:2029
+#: includes/core/class-builtin.php:2033
msgid "Slovakia"
msgstr ""
-#: includes/core/class-builtin.php:2030
+#: includes/core/class-builtin.php:2034
msgid "Slovenia"
msgstr ""
-#: includes/core/class-builtin.php:2031
+#: includes/core/class-builtin.php:2035
msgid "Solomon Islands"
msgstr ""
-#: includes/core/class-builtin.php:2032
+#: includes/core/class-builtin.php:2036
msgid "Somalia"
msgstr ""
-#: includes/core/class-builtin.php:2033
+#: includes/core/class-builtin.php:2037
msgid "South Africa"
msgstr ""
-#: includes/core/class-builtin.php:2034
+#: includes/core/class-builtin.php:2038
msgid "South Georgia and the South Sandwich Islands"
msgstr ""
-#: includes/core/class-builtin.php:2035
+#: includes/core/class-builtin.php:2039
msgid "South Sudan"
msgstr ""
-#: includes/core/class-builtin.php:2036
+#: includes/core/class-builtin.php:2040
msgid "Spain"
msgstr ""
-#: includes/core/class-builtin.php:2037
+#: includes/core/class-builtin.php:2041
msgid "Sri Lanka"
msgstr ""
-#: includes/core/class-builtin.php:2038
+#: includes/core/class-builtin.php:2042
msgid "Sudan"
msgstr ""
-#: includes/core/class-builtin.php:2039
+#: includes/core/class-builtin.php:2043
msgid "Suriname"
msgstr ""
-#: includes/core/class-builtin.php:2040
+#: includes/core/class-builtin.php:2044
msgid "Svalbard and Jan Mayen"
msgstr ""
-#: includes/core/class-builtin.php:2041
+#: includes/core/class-builtin.php:2045
msgid "Eswatini"
msgstr ""
-#: includes/core/class-builtin.php:2042
+#: includes/core/class-builtin.php:2046
msgid "Sweden"
msgstr ""
-#: includes/core/class-builtin.php:2043
+#: includes/core/class-builtin.php:2047
msgid "Switzerland"
msgstr ""
-#: includes/core/class-builtin.php:2044
+#: includes/core/class-builtin.php:2048
msgid "Syrian Arab Republic"
msgstr ""
-#: includes/core/class-builtin.php:2045
+#: includes/core/class-builtin.php:2049
msgid "Taiwan, Province of China"
msgstr ""
-#: includes/core/class-builtin.php:2046
+#: includes/core/class-builtin.php:2050
msgid "Tajikistan"
msgstr ""
-#: includes/core/class-builtin.php:2047
+#: includes/core/class-builtin.php:2051
msgid "Tanzania, United Republic of"
msgstr ""
-#: includes/core/class-builtin.php:2048
+#: includes/core/class-builtin.php:2052
msgid "Thailand"
msgstr ""
-#: includes/core/class-builtin.php:2049
+#: includes/core/class-builtin.php:2053
msgid "Timor-Leste"
msgstr ""
-#: includes/core/class-builtin.php:2050
+#: includes/core/class-builtin.php:2054
msgid "Togo"
msgstr ""
-#: includes/core/class-builtin.php:2051
+#: includes/core/class-builtin.php:2055
msgid "Tokelau"
msgstr ""
-#: includes/core/class-builtin.php:2053
+#: includes/core/class-builtin.php:2057
msgid "Trinidad and Tobago"
msgstr ""
-#: includes/core/class-builtin.php:2054
+#: includes/core/class-builtin.php:2058
msgid "Tunisia"
msgstr ""
-#: includes/core/class-builtin.php:2055
+#: includes/core/class-builtin.php:2059
msgid "Turkey"
msgstr ""
-#: includes/core/class-builtin.php:2056
+#: includes/core/class-builtin.php:2060
msgid "Turkmenistan"
msgstr ""
-#: includes/core/class-builtin.php:2057
+#: includes/core/class-builtin.php:2061
msgid "Turks and Caicos Islands"
msgstr ""
-#: includes/core/class-builtin.php:2058
+#: includes/core/class-builtin.php:2062
msgid "Tuvalu"
msgstr ""
-#: includes/core/class-builtin.php:2059
+#: includes/core/class-builtin.php:2063
msgid "Uganda"
msgstr ""
-#: includes/core/class-builtin.php:2060
+#: includes/core/class-builtin.php:2064
msgid "Ukraine"
msgstr ""
-#: includes/core/class-builtin.php:2061
+#: includes/core/class-builtin.php:2065
msgid "United Arab Emirates"
msgstr ""
-#: includes/core/class-builtin.php:2062
+#: includes/core/class-builtin.php:2066
msgid "United Kingdom"
msgstr ""
-#: includes/core/class-builtin.php:2063
+#: includes/core/class-builtin.php:2067
msgid "United States"
msgstr ""
-#: includes/core/class-builtin.php:2064
+#: includes/core/class-builtin.php:2068
msgid "United States Minor Outlying Islands"
msgstr ""
-#: includes/core/class-builtin.php:2065
+#: includes/core/class-builtin.php:2069
msgid "Uruguay"
msgstr ""
-#: includes/core/class-builtin.php:2066
+#: includes/core/class-builtin.php:2070
msgid "Uzbekistan"
msgstr ""
-#: includes/core/class-builtin.php:2067
+#: includes/core/class-builtin.php:2071
msgid "Vanuatu"
msgstr ""
-#: includes/core/class-builtin.php:2068
+#: includes/core/class-builtin.php:2072
msgid "Venezuela, Bolivarian Republic of"
msgstr ""
-#: includes/core/class-builtin.php:2069
+#: includes/core/class-builtin.php:2073
msgid "Viet Nam"
msgstr ""
-#: includes/core/class-builtin.php:2070
+#: includes/core/class-builtin.php:2074
msgid "Virgin Islands, British"
msgstr ""
-#: includes/core/class-builtin.php:2071
+#: includes/core/class-builtin.php:2075
msgid "Virgin Islands, U.S."
msgstr ""
-#: includes/core/class-builtin.php:2072
+#: includes/core/class-builtin.php:2076
msgid "Wallis and Futuna"
msgstr ""
-#: includes/core/class-builtin.php:2073
+#: includes/core/class-builtin.php:2077
msgid "Western Sahara"
msgstr ""
-#: includes/core/class-builtin.php:2074
+#: includes/core/class-builtin.php:2078
msgid "Yemen"
msgstr ""
-#: includes/core/class-builtin.php:2075
+#: includes/core/class-builtin.php:2079
msgid "Zambia"
msgstr ""
-#: includes/core/class-builtin.php:2076
+#: includes/core/class-builtin.php:2080
msgid "Zimbabwe"
msgstr ""
@@ -9236,152 +9301,167 @@ msgid_plural "%s years old"
msgstr[0] ""
msgstr[1] ""
-#: includes/core/class-fields.php:1582
+#. translators: %s: The message after registration process based on a role data and user status after registration
+#. translators: %s: Restricted blog page message.
+#. translators: %s: Restricted taxonomy message.
+#: includes/core/class-fields.php:1561
+#: includes/core/um-actions-account.php:547
+#: templates/message.php:23
+#: templates/restricted-blog.php:41
+#: templates/restricted-taxonomy.php:59
+msgid "%s"
+msgstr ""
+
+#: includes/core/class-fields.php:1580
msgid "Custom Field"
msgstr ""
-#: includes/core/class-fields.php:1946
+#: includes/core/class-fields.php:1944
msgid "Please upload a valid image!"
msgstr ""
-#: includes/core/class-fields.php:1960
+#: includes/core/class-fields.php:1958
msgid "Sorry this is not a valid image."
msgstr ""
-#: includes/core/class-fields.php:1963
+#: includes/core/class-fields.php:1961
msgid "This image is too large!"
msgstr ""
-#: includes/core/class-fields.php:1966
+#: includes/core/class-fields.php:1964
msgid "This image is too small!"
msgstr ""
-#: includes/core/class-fields.php:1969
+#: includes/core/class-fields.php:1967
msgid "You can only upload one image"
msgstr ""
-#: includes/core/class-fields.php:2001
+#: includes/core/class-fields.php:1999
msgid "Sorry this is not a valid file."
msgstr ""
-#: includes/core/class-fields.php:2004
+#: includes/core/class-fields.php:2002
msgid "This file is too large!"
msgstr ""
-#: includes/core/class-fields.php:2007
+#: includes/core/class-fields.php:2005
msgid "This file is too small!"
msgstr ""
-#: includes/core/class-fields.php:2010
+#: includes/core/class-fields.php:2008
msgid "You can only upload one file"
msgstr ""
-#: includes/core/class-fields.php:2539
+#: includes/core/class-fields.php:2545
msgid "Current Password"
msgstr ""
-#: includes/core/class-fields.php:2579
+#: includes/core/class-fields.php:2585
msgid "New Password"
msgstr ""
#. translators: %s: label.
#. translators: %s: placeholder.
-#: includes/core/class-fields.php:2630
-#: includes/core/class-fields.php:2648
-#: includes/core/class-fields.php:2651
+#: includes/core/class-fields.php:2636
+#: includes/core/class-fields.php:2654
+#: includes/core/class-fields.php:2657
msgid "Confirm %s"
msgstr ""
-#: includes/core/class-fields.php:2962
+#: includes/core/class-fields.php:2970
msgid "Upload Photo"
msgstr ""
-#: includes/core/class-fields.php:2989
-#: includes/core/class-fields.php:3033
-#: includes/core/um-actions-profile.php:1078
+#: includes/core/class-fields.php:2997
+#: includes/core/class-fields.php:3041
+#: includes/core/um-actions-profile.php:1103
msgid "Change photo"
msgstr ""
-#: includes/core/class-fields.php:3033
-#: includes/core/class-fields.php:3158
+#: includes/core/class-fields.php:3041
+#: includes/core/class-fields.php:3166
msgid "Processing..."
msgstr ""
-#: includes/core/class-fields.php:3061
+#: includes/core/class-fields.php:3041
+msgid "Apply"
+msgstr ""
+
+#: includes/core/class-fields.php:3069
msgid "Upload File"
msgstr ""
-#: includes/core/class-fields.php:3106
-#: includes/core/um-filters-fields.php:368
+#: includes/core/class-fields.php:3114
+#: includes/core/um-filters-fields.php:373
msgid "This file has been removed."
msgstr ""
-#: includes/core/class-fields.php:3110
-#: includes/core/class-fields.php:3158
+#: includes/core/class-fields.php:3118
+#: includes/core/class-fields.php:3166
msgid "Change file"
msgstr ""
-#: includes/core/class-fields.php:3158
+#: includes/core/class-fields.php:3166
msgid "Save"
msgstr ""
#. translators: %s: edit user link.
-#: includes/core/class-fields.php:4678
+#: includes/core/class-fields.php:4691
msgid "Your profile is looking a little empty. Why not add some information!"
msgstr ""
-#: includes/core/class-fields.php:4680
+#: includes/core/class-fields.php:4693
msgid "This user has not added any information to their profile yet."
msgstr ""
-#: includes/core/class-fields.php:4946
+#: includes/core/class-fields.php:4959
msgid "Please login as administrator."
msgstr ""
-#: includes/core/class-fields.php:4950
+#: includes/core/class-fields.php:4963
msgid "Invalid action."
msgstr ""
-#: includes/core/class-files.php:269
+#: includes/core/class-files.php:268
msgid "Wrong path"
msgstr ""
-#: includes/core/class-files.php:273
+#: includes/core/class-files.php:272
msgid "Wrong mode"
msgstr ""
-#: includes/core/class-files.php:293
-#: includes/core/class-files.php:334
-#: includes/core/class-files.php:373
+#: includes/core/class-files.php:292
+#: includes/core/class-files.php:333
+#: includes/core/class-files.php:372
msgid "You have no permission to edit this user"
msgstr ""
-#: includes/core/class-files.php:307
+#: includes/core/class-files.php:306
msgid "You have no permission to delete this file"
msgstr ""
-#: includes/core/class-files.php:318
+#: includes/core/class-files.php:317
msgid "Invalid parameters"
msgstr ""
-#: includes/core/class-files.php:323
+#: includes/core/class-files.php:322
msgid "Invalid coordinates"
msgstr ""
-#: includes/core/class-files.php:341
+#: includes/core/class-files.php:340
msgid "Invalid file ownership"
msgstr ""
-#: includes/core/class-files.php:403
+#: includes/core/class-files.php:402
msgid "Invalid nonce"
msgstr ""
-#: includes/core/class-files.php:424
-#: includes/core/class-files.php:510
+#: includes/core/class-files.php:423
+#: includes/core/class-files.php:509
msgid "A theme or plugin compatibility issue"
msgstr ""
-#: includes/core/class-files.php:1294
+#: includes/core/class-files.php:1284
msgid "Original size"
msgstr ""
@@ -9398,7 +9478,7 @@ msgstr ""
msgid "Wrong callback."
msgstr ""
-#: includes/core/class-form.php:577
+#: includes/core/class-form.php:582
#: includes/core/class-password.php:396
#: includes/core/class-password.php:474
msgid "Hello, spam bot!"
@@ -9409,7 +9489,7 @@ msgid "Please agree privacy policy."
msgstr ""
#: includes/core/class-gdpr.php:90
-#: includes/um-short-functions.php:694
+#: includes/um-short-functions.php:693
msgid "GDPR Applied"
msgstr ""
@@ -9429,8 +9509,8 @@ msgstr ""
#: includes/core/class-member-directory-meta.php:603
#: includes/core/class-member-directory-meta.php:608
-#: includes/core/class-member-directory.php:2859
-#: includes/core/class-member-directory.php:2865
+#: includes/core/class-member-directory.php:2838
+#: includes/core/class-member-directory.php:2844
msgid "Wrong member directory data"
msgstr ""
@@ -9528,15 +9608,15 @@ msgstr ""
msgid "Age: {min_range} - {max_range} years old"
msgstr ""
-#: includes/core/class-member-directory.php:2609
-#: includes/core/class-member-directory.php:2653
-#: includes/core/um-actions-profile.php:1445
-#: includes/core/um-actions-profile.php:1476
+#: includes/core/class-member-directory.php:2606
+#: includes/core/class-member-directory.php:2634
+#: includes/core/um-actions-profile.php:1470
+#: includes/core/um-actions-profile.php:1501
msgid "Edit Profile"
msgstr ""
-#: includes/core/class-member-directory.php:2659
-#: includes/core/um-actions-profile.php:1477
+#: includes/core/class-member-directory.php:2640
+#: includes/core/um-actions-profile.php:1502
msgid "My Account"
msgstr ""
@@ -9558,7 +9638,7 @@ msgstr ""
#: includes/core/class-password.php:511
#: includes/core/um-actions-account.php:67
-#: includes/core/um-actions-register.php:322
+#: includes/core/um-actions-register.php:325
msgid "Passwords may not contain the character \"\\\"."
msgstr ""
@@ -9576,19 +9656,19 @@ msgstr ""
#: includes/core/class-password.php:545
#: includes/core/um-actions-account.php:112
-#: includes/core/um-actions-form.php:636
+#: includes/core/um-actions-form.php:638
msgid "Your password cannot contain the part of your username"
msgstr ""
#: includes/core/class-password.php:549
#: includes/core/um-actions-account.php:116
-#: includes/core/um-actions-form.php:640
+#: includes/core/um-actions-form.php:642
msgid "Your password cannot contain the part of your email address"
msgstr ""
#: includes/core/class-password.php:553
#: includes/core/um-actions-account.php:120
-#: includes/core/um-actions-form.php:644
+#: includes/core/um-actions-form.php:646
msgid "Your password must contain at least one lowercase letter, one capital letter and one number"
msgstr ""
@@ -9597,7 +9677,7 @@ msgid "You must confirm your new password"
msgstr ""
#: includes/core/class-password.php:562
-#: includes/core/um-actions-form.php:656
+#: includes/core/um-actions-form.php:658
msgid "Your passwords do not match"
msgstr ""
@@ -9651,20 +9731,20 @@ msgstr ""
msgid "The \"unassigned\" $status has been removed. Use `UM()->setup()->set_default_user_status()` for setting up default user account status."
msgstr ""
-#: includes/core/class-shortcodes.php:409
-msgid "This content has been restricted to logged in users only. Please login to view this content."
+#: includes/core/class-shortcodes.php:406
+msgid "This content has been restricted to logged-in users only. Please login to view this content."
msgstr ""
-#: includes/core/class-shortcodes.php:494
-#: includes/core/class-shortcodes.php:515
+#: includes/core/class-shortcodes.php:493
+#: includes/core/class-shortcodes.php:514
msgid "Go to profile"
msgstr ""
-#: includes/core/class-shortcodes.php:837
+#: includes/core/class-shortcodes.php:852
msgid "You are already registered."
msgstr ""
-#: includes/core/class-shortcodes.php:1096
+#: includes/core/class-shortcodes.php:1111
msgid "Default Template"
msgstr ""
@@ -9702,19 +9782,19 @@ msgstr ""
msgid "Unable to crop image file: %s"
msgstr ""
-#: includes/core/class-user.php:1123
+#: includes/core/class-user.php:1122
msgid "Ultimate Member Role"
msgstr ""
-#: includes/core/class-user.php:1126
+#: includes/core/class-user.php:1125
msgid "— No role for Ultimate Member —"
msgstr ""
-#: includes/core/class-user.php:1312
+#: includes/core/class-user.php:1311
msgid "Membership Rejected"
msgstr ""
-#: includes/core/class-user.php:1316
+#: includes/core/class-user.php:1315
msgid "Membership Inactive"
msgstr ""
@@ -9817,7 +9897,7 @@ msgid "You must provide your last name"
msgstr ""
#: includes/core/um-actions-account.php:160
-#: includes/core/um-actions-form.php:924
+#: includes/core/um-actions-form.php:926
msgid "You must provide your email"
msgstr ""
@@ -9826,119 +9906,103 @@ msgstr ""
msgid "Please provide a valid email"
msgstr ""
-#: includes/core/um-actions-account.php:532
+#: includes/core/um-actions-account.php:562
msgid "Select what email notifications you want to receive"
msgstr ""
-#: includes/core/um-actions-account.php:599
+#: includes/core/um-actions-account.php:629
msgid "Download your data"
msgstr ""
-#: includes/core/um-actions-account.php:601
+#: includes/core/um-actions-account.php:631
msgid "You can request a file with the information that we believe is most relevant and useful to you."
msgstr ""
-#: includes/core/um-actions-account.php:626
+#: includes/core/um-actions-account.php:656
msgid "You could download your previous data:"
msgstr ""
-#: includes/core/um-actions-account.php:627
+#: includes/core/um-actions-account.php:657
msgid "Download Personal Data"
msgstr ""
-#: includes/core/um-actions-account.php:628
+#: includes/core/um-actions-account.php:658
msgid "You could send a new request for an export of personal your data."
msgstr ""
-#: includes/core/um-actions-account.php:648
-#: includes/core/um-actions-account.php:824
+#: includes/core/um-actions-account.php:678
+#: includes/core/um-actions-account.php:854
msgid "A confirmation email has been sent to your email. Click the link within the email to confirm your export request."
msgstr ""
-#: includes/core/um-actions-account.php:650
+#: includes/core/um-actions-account.php:680
msgid "The administrator has not yet approved downloading the data. Please expect an email with a link to your data."
msgstr ""
-#: includes/core/um-actions-account.php:655
+#: includes/core/um-actions-account.php:685
msgid "Enter your current password to confirm a new export of your personal data."
msgstr ""
-#: includes/core/um-actions-account.php:667
-#: includes/core/um-actions-account.php:755
+#: includes/core/um-actions-account.php:697
+#: includes/core/um-actions-account.php:785
msgid "You must enter a password"
msgstr ""
-#: includes/core/um-actions-account.php:675
+#: includes/core/um-actions-account.php:705
msgid "To export of your personal data, click the button below."
msgstr ""
-#: includes/core/um-actions-account.php:682
+#: includes/core/um-actions-account.php:712
msgid "Request data"
msgstr ""
-#: includes/core/um-actions-account.php:691
+#: includes/core/um-actions-account.php:721
msgid "Erase of your data"
msgstr ""
-#: includes/core/um-actions-account.php:693
+#: includes/core/um-actions-account.php:723
msgid "You can request erasing of the data that we have about you."
msgstr ""
-#: includes/core/um-actions-account.php:717
+#: includes/core/um-actions-account.php:747
msgid "Your personal data has been deleted."
msgstr ""
-#: includes/core/um-actions-account.php:718
+#: includes/core/um-actions-account.php:748
msgid "You could send a new request for deleting your personal data."
msgstr ""
-#: includes/core/um-actions-account.php:738
-#: includes/core/um-actions-account.php:826
+#: includes/core/um-actions-account.php:768
+#: includes/core/um-actions-account.php:856
msgid "A confirmation email has been sent to your email. Click the link within the email to confirm your deletion request."
msgstr ""
-#: includes/core/um-actions-account.php:740
+#: includes/core/um-actions-account.php:770
msgid "The administrator has not yet approved deleting your data. Please expect an email with a link to your data."
msgstr ""
-#: includes/core/um-actions-account.php:745
+#: includes/core/um-actions-account.php:775
msgid "Enter your current password to confirm the erasure of your personal data."
msgstr ""
-#: includes/core/um-actions-account.php:763
+#: includes/core/um-actions-account.php:793
msgid "Require erasure of your personal data, click on the button below."
msgstr ""
-#: includes/core/um-actions-account.php:770
+#: includes/core/um-actions-account.php:800
msgid "Request data erase"
msgstr ""
-#: includes/core/um-actions-account.php:784
-#: includes/core/um-actions-account.php:816
+#: includes/core/um-actions-account.php:814
+#: includes/core/um-actions-account.php:846
msgid "Wrong request."
msgstr ""
-#: includes/core/um-actions-account.php:796
-#: includes/core/um-actions-account.php:803
+#: includes/core/um-actions-account.php:826
+#: includes/core/um-actions-account.php:833
msgid "The password you entered is incorrect."
msgstr ""
-#: includes/core/um-actions-core.php:34
-msgid "Super administrators can not be modified."
-msgstr ""
-
-#: includes/core/um-actions-core.php:89
-#: includes/core/um-actions-core.php:100
-#: includes/core/um-actions-core.php:114
-#: includes/core/um-actions-core.php:124
-#: includes/core/um-actions-core.php:137
-msgid "You do not have permission to make this action."
-msgstr ""
-
-#: includes/core/um-actions-core.php:147
-msgid "You do not have permission to delete this user."
-msgstr ""
-
#: includes/core/um-actions-form.php:98
msgid "You are not allowed to use this word as your username."
msgstr ""
@@ -9948,189 +10012,189 @@ msgid "Profile Photo is required."
msgstr ""
#. translators: %s: title.
-#: includes/core/um-actions-form.php:507
#: includes/core/um-actions-form.php:509
+#: includes/core/um-actions-form.php:511
msgid "%s - wrong conditions."
msgstr ""
#. translators: %s: title.
-#: includes/core/um-actions-form.php:519
-#: includes/core/um-actions-form.php:524
-#: includes/core/um-actions-form.php:529
-#: includes/core/um-actions-form.php:534
+#: includes/core/um-actions-form.php:521
+#: includes/core/um-actions-form.php:526
+#: includes/core/um-actions-form.php:531
+#: includes/core/um-actions-form.php:536
msgid "%s is required."
msgstr ""
-#: includes/core/um-actions-form.php:539
+#: includes/core/um-actions-form.php:541
msgid "Please specify account type."
msgstr ""
-#: includes/core/um-actions-form.php:569
+#: includes/core/um-actions-form.php:571
msgid "This field is required"
msgstr ""
#. translators: %s: title.
-#: includes/core/um-actions-form.php:572
+#: includes/core/um-actions-form.php:574
msgid "%s is required"
msgstr ""
#. translators: %s: max words.
-#: includes/core/um-actions-form.php:591
+#: includes/core/um-actions-form.php:593
msgid "You are only allowed to enter a maximum of %s words"
msgstr ""
#. translators: %s: min chars.
-#: includes/core/um-actions-form.php:599
+#: includes/core/um-actions-form.php:601
msgid "This field must contain at least %s characters"
msgstr ""
#. translators: %1$s is a label; %2$s is a min chars.
-#: includes/core/um-actions-form.php:602
+#: includes/core/um-actions-form.php:604
msgid "Your %1$s must contain at least %2$s characters"
msgstr ""
#. translators: %s: max chars.
-#: includes/core/um-actions-form.php:618
+#: includes/core/um-actions-form.php:620
msgid "This field must contain less than %s characters"
msgstr ""
#. translators: %1$s is a label; %2$s is a max chars.
-#: includes/core/um-actions-form.php:621
+#: includes/core/um-actions-form.php:623
msgid "Your %1$s must contain less than %2$s characters"
msgstr ""
-#: includes/core/um-actions-form.php:629
+#: includes/core/um-actions-form.php:631
msgid "You can not use HTML tags here"
msgstr ""
-#: includes/core/um-actions-form.php:650
-#: includes/core/um-actions-form.php:653
+#: includes/core/um-actions-form.php:652
+#: includes/core/um-actions-form.php:655
msgid "Please confirm your password"
msgstr ""
#. translators: %s: min selections.
-#: includes/core/um-actions-form.php:664
+#: includes/core/um-actions-form.php:666
msgid "Please select at least %s choices"
msgstr ""
#. translators: %s: max selections.
-#: includes/core/um-actions-form.php:671
+#: includes/core/um-actions-form.php:673
msgid "You can only select up to %s choices"
msgstr ""
#. translators: %s: min limit.
-#: includes/core/um-actions-form.php:678
+#: includes/core/um-actions-form.php:680
msgid "Minimum number limit is %s"
msgstr ""
#. translators: %s: max limit.
-#: includes/core/um-actions-form.php:685
+#: includes/core/um-actions-form.php:687
msgid "Maximum number limit is %s"
msgstr ""
#. translators: %s: max chars.
-#: includes/core/um-actions-form.php:745
-#: includes/core/um-actions-form.php:1059
+#: includes/core/um-actions-form.php:747
+#: includes/core/um-actions-form.php:1061
msgid "Your user description must contain less than %s characters"
msgstr ""
-#: includes/core/um-actions-form.php:783
+#: includes/core/um-actions-form.php:785
msgid "Please enter numbers only in this field"
msgstr ""
-#: includes/core/um-actions-form.php:789
+#: includes/core/um-actions-form.php:791
msgid "Please enter a valid phone number"
msgstr ""
#. translators: %s: label.
-#: includes/core/um-actions-form.php:796
-#: includes/core/um-actions-form.php:817
-#: includes/core/um-actions-form.php:824
-#: includes/core/um-actions-form.php:831
-#: includes/core/um-actions-form.php:838
-#: includes/core/um-actions-form.php:852
+#: includes/core/um-actions-form.php:798
+#: includes/core/um-actions-form.php:819
+#: includes/core/um-actions-form.php:826
+#: includes/core/um-actions-form.php:833
+#: includes/core/um-actions-form.php:840
+#: includes/core/um-actions-form.php:854
msgid "Please enter a valid %s username or profile URL"
msgstr ""
#. translators: %s: label.
-#: includes/core/um-actions-form.php:803
-#: includes/core/um-actions-form.php:810
+#: includes/core/um-actions-form.php:805
+#: includes/core/um-actions-form.php:812
msgid "Please enter a valid %s URL"
msgstr ""
#. translators: %s: label.
-#: includes/core/um-actions-form.php:845
-#: includes/core/um-actions-form.php:865
-#: includes/core/um-actions-form.php:872
-#: includes/core/um-actions-form.php:879
+#: includes/core/um-actions-form.php:847
+#: includes/core/um-actions-form.php:867
+#: includes/core/um-actions-form.php:874
+#: includes/core/um-actions-form.php:881
msgid "Please enter a valid %s profile URL"
msgstr ""
-#: includes/core/um-actions-form.php:858
+#: includes/core/um-actions-form.php:860
msgid "Please enter a valid Discord ID"
msgstr ""
-#: includes/core/um-actions-form.php:885
+#: includes/core/um-actions-form.php:887
msgid "Please enter a valid URL"
msgstr ""
-#: includes/core/um-actions-form.php:891
+#: includes/core/um-actions-form.php:893
msgid "You must provide a username"
msgstr ""
-#: includes/core/um-actions-form.php:893
-#: includes/core/um-actions-form.php:905
+#: includes/core/um-actions-form.php:895
+#: includes/core/um-actions-form.php:907
msgid "The username you entered is incorrect"
msgstr ""
-#: includes/core/um-actions-form.php:895
+#: includes/core/um-actions-form.php:897
msgid "Username cannot be an email"
msgstr ""
-#: includes/core/um-actions-form.php:897
-#: includes/core/um-actions-form.php:909
+#: includes/core/um-actions-form.php:899
+#: includes/core/um-actions-form.php:911
msgid "Your username contains invalid characters"
msgstr ""
-#: includes/core/um-actions-form.php:903
+#: includes/core/um-actions-form.php:905
msgid "You must provide a username or email"
msgstr ""
-#: includes/core/um-actions-form.php:907
-#: includes/core/um-actions-form.php:926
+#: includes/core/um-actions-form.php:909
#: includes/core/um-actions-form.php:928
#: includes/core/um-actions-form.php:930
-#: includes/core/um-actions-form.php:937
+#: includes/core/um-actions-form.php:932
#: includes/core/um-actions-form.php:939
-#: includes/core/um-actions-form.php:946
+#: includes/core/um-actions-form.php:941
+#: includes/core/um-actions-form.php:948
msgid "The email you entered is incorrect"
msgstr ""
-#: includes/core/um-actions-form.php:932
+#: includes/core/um-actions-form.php:934
msgid "Your email contains invalid characters"
msgstr ""
-#: includes/core/um-actions-form.php:956
+#: includes/core/um-actions-form.php:958
msgid "This is not a valid email"
msgstr ""
-#: includes/core/um-actions-form.php:977
+#: includes/core/um-actions-form.php:979
msgid "You must provide a unique value"
msgstr ""
-#: includes/core/um-actions-form.php:985
+#: includes/core/um-actions-form.php:987
msgid "You must provide alphabetic letters"
msgstr ""
-#: includes/core/um-actions-form.php:993
+#: includes/core/um-actions-form.php:995
msgid "You must provide alphabetic letters or numbers"
msgstr ""
-#: includes/core/um-actions-form.php:1001
+#: includes/core/um-actions-form.php:1003
msgid "You must provide lowercase letters."
msgstr ""
-#: includes/core/um-actions-form.php:1009
+#: includes/core/um-actions-form.php:1011
msgid "You must provide English letters."
msgstr ""
@@ -10231,34 +10295,34 @@ msgid "You are not allowed to edit this user."
msgstr ""
#. translators: %s: title.
-#: includes/core/um-actions-profile.php:362
+#: includes/core/um-actions-profile.php:363
msgid "Your choosed %s"
msgstr ""
-#: includes/core/um-actions-profile.php:842
-#: includes/core/um-actions-profile.php:858
-#: includes/core/um-actions-profile.php:929
+#: includes/core/um-actions-profile.php:867
+#: includes/core/um-actions-profile.php:883
+#: includes/core/um-actions-profile.php:954
msgid "Upload a cover photo"
msgstr ""
-#: includes/core/um-actions-profile.php:842
+#: includes/core/um-actions-profile.php:867
msgid "Change cover photo"
msgstr ""
-#: includes/core/um-actions-profile.php:1046
+#: includes/core/um-actions-profile.php:1071
msgid "Upload photo"
msgstr ""
-#: includes/core/um-actions-profile.php:1079
+#: includes/core/um-actions-profile.php:1104
msgid "Remove photo"
msgstr ""
-#: includes/core/um-actions-profile.php:1280
+#: includes/core/um-actions-profile.php:1305
msgid "Tell us a bit about yourself..."
msgstr ""
#. translators: %s: profile status.
-#: includes/core/um-actions-profile.php:1300
+#: includes/core/um-actions-profile.php:1325
msgid "This user account status is %s"
msgstr ""
@@ -10275,16 +10339,16 @@ msgid "Invalid Spotify URL"
msgstr ""
#. translators: %s: date.
-#: includes/core/um-filters-fields.php:221
+#: includes/core/um-filters-fields.php:225
msgid "Joined %s"
msgstr ""
-#: includes/core/um-filters-fields.php:402
+#: includes/core/um-filters-fields.php:407
msgid "Untitled photo"
msgstr ""
#. translators: %s: link.
-#: includes/core/um-filters-fields.php:521
+#: includes/core/um-filters-fields.php:526
msgid "This link leads to a 3rd-party website. Make sure the link is safe and you really want to go to this website: '%s'"
msgstr ""
@@ -10293,20 +10357,42 @@ msgstr ""
msgid "max"
msgstr ""
-#: includes/core/um-filters-user.php:41
-msgid "Deactivate this account"
+#: includes/frontend/class-actions-listener.php:52
+#: includes/frontend/class-user-profile.php:53
+msgid "Super administrators can not be modified."
msgstr ""
-#: includes/core/um-filters-user.php:45
-msgid "Reactivate this account"
+#: includes/frontend/class-actions-listener.php:60
+#: includes/frontend/class-actions-listener.php:76
+#: includes/frontend/class-actions-listener.php:92
+#: includes/frontend/class-actions-listener.php:108
+#: includes/frontend/class-actions-listener.php:124
+#: includes/frontend/class-actions-listener.php:140
+#: includes/frontend/class-actions-listener.php:160
+#: includes/frontend/class-actions-listener.php:169
+msgid "The link you followed has expired."
msgstr ""
-#: includes/core/um-filters-user.php:50
-msgid "Delete this user"
+#: includes/frontend/class-actions-listener.php:64
+#: includes/frontend/class-actions-listener.php:80
+#: includes/frontend/class-actions-listener.php:96
+#: includes/frontend/class-actions-listener.php:112
+#: includes/frontend/class-actions-listener.php:128
+#: includes/frontend/class-actions-listener.php:144
+msgid "You do not have permission to edit this user."
msgstr ""
-#: includes/core/um-filters-user.php:54
-msgid "Login as this user"
+#: includes/frontend/class-actions-listener.php:69
+#: includes/frontend/class-actions-listener.php:85
+#: includes/frontend/class-actions-listener.php:101
+#: includes/frontend/class-actions-listener.php:117
+#: includes/frontend/class-actions-listener.php:133
+#: includes/frontend/class-actions-listener.php:149
+msgid "Something went wrong."
+msgstr ""
+
+#: includes/frontend/class-actions-listener.php:173
+msgid "You do not have permission to delete this user."
msgstr ""
#. translators: One-time change requires you to reset your password
@@ -10323,22 +10409,38 @@ msgstr ""
msgid "Your new password cannot be same as old password."
msgstr ""
+#: includes/frontend/class-users.php:40
+msgid "Reactivate this account"
+msgstr ""
+
+#: includes/frontend/class-users.php:53
+msgid "Deactivate this account"
+msgstr ""
+
+#: includes/frontend/class-users.php:58
+msgid "Delete this user"
+msgstr ""
+
+#: includes/frontend/class-users.php:62
+msgid "Login as this user"
+msgstr ""
+
#: includes/um-deprecated-functions.php:667
msgid "date submitted"
msgstr ""
#: includes/um-deprecated-functions.php:673
-#: includes/um-short-functions.php:854
-#: includes/um-short-functions.php:915
+#: includes/um-short-functions.php:853
+#: includes/um-short-functions.php:914
msgid "(empty)"
msgstr ""
-#: includes/um-short-functions.php:689
+#: includes/um-short-functions.php:688
msgid "User registered date"
msgstr ""
#. translators: %1$s is a form title; %2$s is a form ID.
-#: includes/um-short-functions.php:837
+#: includes/um-short-functions.php:836
msgid "%1$s - Form ID#: %2$s"
msgstr ""
diff --git a/readme.txt b/readme.txt
index dce9b041..bfef8a5f 100644
--- a/readme.txt
+++ b/readme.txt
@@ -5,8 +5,8 @@ Contributors: ultimatemember, champsupertramp, nsinelnikov
Tags: community, member, membership, user-profile, user-registration
Requires PHP: 5.6
Requires at least: 5.5
-Tested up to: 6.5
-Stable tag: 2.8.6
+Tested up to: 6.6
+Stable tag: 2.8.9
License: GPLv3
License URI: http://www.gnu.org/licenses/gpl-3.0.txt
@@ -166,9 +166,102 @@ 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.8.7 2024-06-xx =
+= 2.9.0 2024-xx-xx =
+**Bugfixes**
+* Fixed: User status filter on wp-admin > Users on mobile devices
+
+= 2.8.9 2024-10-14 =
+
+**Enhancements**
+
+* Added: Using PHP tidy extension (if it's active) to make HTML textarea value clear
+* Added: `um_tidy_config` filter hook for setting PHP tidy config
+* Tweak: Avoid using force `set_status()` function.
+* Tweak: Properly using `UM()->common()->users()->get_status( $user_id )` instead of `um_user( 'account_status' )`
+* Tweak: Properly using `UM()->common()->users()->get_status( $user_id, 'formatted' )` instead of `um_user( 'account_status_name' )`
+* Tweak: Properly using `um_user( 'status' )` for getting user role setting while registration
+
+**Bugfixes**
+
+* Fixed: UM tipsy removing inside .um-page selector (e.g. tipsy init from um-modal)
+* Fixed: Rollback using `