* Admin Users bulk-actions

* Admin single user actions
* Frontend single user action
This commit is contained in:
Mykyta Synelnikov
2024-09-24 13:18:48 +03:00
parent 512dc53a18
commit 33bc484629
26 changed files with 858 additions and 563 deletions
+33
View File
@@ -1,3 +1,36 @@
.um-admin.users-php .um_account_status {
display: flex;
flex-direction: column;
justify-content: flex-start;
align-items: stretch;
flex-wrap: nowrap;
}
.um-admin.users-php .um_account_status span {
margin: 0 0 2px 0;
padding: 0;
}
.um-admin.users-php .um_account_status ul {
display: flex;
flex-direction: row;
justify-content: flex-start;
align-items: baseline;
flex-wrap: wrap;
column-gap: 4px;
row-gap: 0;
margin: 0 0 4px 0;
padding: 0;
}
.um-admin.users-php .um_account_status ul li {
margin: 0;
padding: 0;
}
.um-admin.users-php .um_account_status ul li a.um-set-status-rejected, .um-admin.users-php .um_account_status ul li a.um-deactivate-user {
color: #b32d2e;
}
.um-admin.users-php .um_account_status ul li a.um-set-status-rejected:active, .um-admin.users-php .um_account_status ul li a.um-set-status-rejected:hover, .um-admin.users-php .um_account_status ul li a.um-deactivate-user:active, .um-admin.users-php .um_account_status ul li a.um-deactivate-user:hover {
color: #b32d2e;
}
.um-admin.users-php .subsubsub li.subsep {
display: block;
visibility: hidden;
+1 -1
View File
@@ -1 +1 @@
.um-admin.users-php .subsubsub li.subsep{display:block;visibility:hidden;height:0}.um-admin-modal .um-admin-infobox label{font-weight:700;display:block;color:#333;cursor:default}.um-admin-modal .um-admin-infobox p{color:#666;padding-top:15px}.um-admin-modal .um-admin-infobox>p:not(:first-child){border-top:1px solid #e5e5e5}.um-admin-modal .um-admin-infobox>p:first-child{margin-top:0;padding-top:0}.um-admin-modal .um-admin-infobox>.um-row>p{border-top:1px solid #e5e5e5}.um-admin-modal .um-admin-infobox>.um-row>p:last-child{margin-bottom:0}#UM_preview_registration .um-admin-modal-foot{display:none}
.um-admin.users-php .um_account_status{display:flex;flex-direction:column;justify-content:flex-start;align-items:stretch;flex-wrap:nowrap}.um-admin.users-php .um_account_status span{margin:0 0 2px 0;padding:0}.um-admin.users-php .um_account_status ul{display:flex;flex-direction:row;justify-content:flex-start;align-items:baseline;flex-wrap:wrap;column-gap:4px;row-gap:0;margin:0 0 4px 0;padding:0}.um-admin.users-php .um_account_status ul li{margin:0;padding:0}.um-admin.users-php .um_account_status ul li a.um-deactivate-user,.um-admin.users-php .um_account_status ul li a.um-set-status-rejected{color:#b32d2e}.um-admin.users-php .um_account_status ul li a.um-deactivate-user:active,.um-admin.users-php .um_account_status ul li a.um-deactivate-user:hover,.um-admin.users-php .um_account_status ul li a.um-set-status-rejected:active,.um-admin.users-php .um_account_status ul li a.um-set-status-rejected:hover{color:#b32d2e}.um-admin.users-php .subsubsub li.subsep{display:block;visibility:hidden;height:0}.um-admin-modal .um-admin-infobox label{font-weight:700;display:block;color:#333;cursor:default}.um-admin-modal .um-admin-infobox p{color:#666;padding-top:15px}.um-admin-modal .um-admin-infobox>p:not(:first-child){border-top:1px solid #e5e5e5}.um-admin-modal .um-admin-infobox>p:first-child{margin-top:0;padding-top:0}.um-admin-modal .um-admin-infobox>.um-row>p{border-top:1px solid #e5e5e5}.um-admin-modal .um-admin-infobox>.um-row>p:last-child{margin-bottom:0}#UM_preview_registration .um-admin-modal-foot{display:none}
+23
View File
@@ -1,5 +1,28 @@
@import "selectors"
@import "mixins"
.#{$prefix}admin.users-php
.um_account_status
+flex( column, flex-start, stretch, nowrap )
span
margin: 0 0 2px 0
padding: 0
ul
+flex( row, flex-start, baseline, wrap )
column-gap: 4px
row-gap: 0
margin: 0 0 4px 0
padding: 0
li
margin: 0
padding: 0
a
&.um-set-status-rejected,
&.um-deactivate-user
color: #b32d2e
&:active,
&:hover
color: #b32d2e
.#{$prefix}admin.users-php
.subsubsub
li.subsep
+1 -1
View File
@@ -1 +1 @@
"use strict";var um_components=wp.components,umSelectControl=um_components.SelectControl,umTextareaControl=um_components.TextareaControl;function um_admin_blocks_custom_fields(e,t){return wp.hooks.applyFilters("um_admin_blocks_custom_fields",[],e,t)}var um_block_restriction=wp.compose.createHigherOrderComponent(function(s){var _={um_who_access:"um_block_settings_hide",um_roles_access:"um_block_settings_hide",um_message_type:"um_block_settings_hide",um_message_content:"um_block_settings_hide"},_=wp.hooks.applyFilters("um_admin_blocks_condition_fields_default",_);return function(t){var e=void 0!==t.attributes.um_is_restrict&&t.attributes.um_is_restrict;return!0!==t.attributes.um_is_restrict?(_.um_who_access="um_block_settings_hide",_.um_roles_access="um_block_settings_hide",_.um_message_type="um_block_settings_hide",_.um_message_content="um_block_settings_hide"):(_.um_who_access="",0===parseInt(t.attributes.um_who_access)||void 0===t.attributes.um_who_access?(_.um_roles_access="um_block_settings_hide",_.um_message_type="um_block_settings_hide",_.um_message_content="um_block_settings_hide"):(1===parseInt(t.attributes.um_who_access)&&(_.um_roles_access=""),_.um_message_type="",2===parseInt(t.attributes.um_message_type)?_.um_message_content="":_.um_message_content="um_block_settings_hide")),_=wp.hooks.applyFilters("um_admin_blocks_condition_fields",_,t),wp.element.createElement(wp.element.Fragment,{},wp.element.createElement(s,t),wp.element.createElement(wp.blockEditor.InspectorControls,{},wp.element.createElement(wp.components.PanelBody,{title:wp.i18n.__("Ultimate Member: Content Restriction","ultimate-member"),className:"um_block_settings"},wp.element.createElement(wp.components.ToggleControl,{label:wp.i18n.__("Restrict access?","ultimate-member"),checked:e,onChange:function(e){t.setAttributes({um_is_restrict:e}),!1===e?(_.um_who_access="um_block_settings_hide",_.um_roles_access="um_block_settings_hide",_.um_message_type="um_block_settings_hide",_.um_message_content="um_block_settings_hide"):_.um_who_access="",_=wp.hooks.applyFilters("um_admin_blocks_condition_fields_on_change",_,"um_is_restrict",e)}}),wp.element.createElement(umSelectControl,{type:"number",className:_.um_who_access,label:wp.i18n.__("Who can access this block?","ultimate-member"),value:t.attributes.um_who_access,options:[{label:wp.i18n.__("Everyone","ultimate-member"),value:0},{label:wp.i18n.__("Logged in users","ultimate-member"),value:1},{label:wp.i18n.__("Logged out users","ultimate-member"),value:2}],onChange:function(e){t.setAttributes({um_who_access:e}),0===parseInt(e)?(_.um_message_type="um_block_settings_hide",_.um_message_content="um_block_settings_hide",_.um_roles_access="um_block_settings_hide"):1===parseInt(e)?(_.um_message_type="",_.um_roles_access=""):(_.um_message_type="",_.um_roles_access="um_block_settings_hide"),_=wp.hooks.applyFilters("um_admin_blocks_condition_fields_on_change",_,"um_who_access",e)}}),wp.element.createElement(umSelectControl,{multiple:!0,className:_.um_roles_access,label:wp.i18n.__("What roles can access this block?","ultimate-member"),value:t.attributes.um_roles_access,options:um_restrict_roles,onChange:function(e){t.setAttributes({um_roles_access:e})}}),wp.element.createElement(umSelectControl,{type:"number",className:_.um_message_type,label:wp.i18n.__("Restriction action","ultimate-member"),value:t.attributes.um_message_type,options:[{label:wp.i18n.__("Hide block","ultimate-member"),value:0},{label:wp.i18n.__("Show global default message","ultimate-member"),value:1},{label:wp.i18n.__("Show custom message","ultimate-member"),value:2}],onChange:function(e){t.setAttributes({um_message_type:e}),2===parseInt(e)?_.um_message_content="":_.um_message_content="um_block_settings_hide"}}),wp.element.createElement(umTextareaControl,{type:"number",className:_.um_message_content,label:wp.i18n.__("Custom restricted access message","ultimate-member"),value:t.attributes.um_message_content,onChange:function(e){t.setAttributes({um_message_content:e})}}),um_admin_blocks_custom_fields(_,t))))}},"um_block_restriction");wp.hooks.addFilter("editor.BlockEdit","um-block/um_block_restriction",um_block_restriction);
var um_components=wp.components,umSelectControl=um_components.SelectControl,umTextareaControl=um_components.TextareaControl;function um_admin_blocks_custom_fields(e,t){return wp.hooks.applyFilters("um_admin_blocks_custom_fields",[],e,t)}var um_block_restriction=wp.compose.createHigherOrderComponent(function(s){var _={um_who_access:"um_block_settings_hide",um_roles_access:"um_block_settings_hide",um_message_type:"um_block_settings_hide",um_message_content:"um_block_settings_hide"},_=wp.hooks.applyFilters("um_admin_blocks_condition_fields_default",_);return function(t){var e=void 0!==t.attributes.um_is_restrict&&t.attributes.um_is_restrict;return!0!==t.attributes.um_is_restrict?(_.um_who_access="um_block_settings_hide",_.um_roles_access="um_block_settings_hide",_.um_message_type="um_block_settings_hide",_.um_message_content="um_block_settings_hide"):(_.um_who_access="",0===parseInt(t.attributes.um_who_access)||void 0===t.attributes.um_who_access?(_.um_roles_access="um_block_settings_hide",_.um_message_type="um_block_settings_hide",_.um_message_content="um_block_settings_hide"):(1===parseInt(t.attributes.um_who_access)&&(_.um_roles_access=""),_.um_message_type="",2===parseInt(t.attributes.um_message_type)?_.um_message_content="":_.um_message_content="um_block_settings_hide")),_=wp.hooks.applyFilters("um_admin_blocks_condition_fields",_,t),wp.element.createElement(wp.element.Fragment,{},wp.element.createElement(s,t),wp.element.createElement(wp.blockEditor.InspectorControls,{},wp.element.createElement(wp.components.PanelBody,{title:wp.i18n.__("Ultimate Member: Content Restriction","ultimate-member"),className:"um_block_settings"},wp.element.createElement(wp.components.ToggleControl,{label:wp.i18n.__("Restrict access?","ultimate-member"),checked:e,onChange:function(e){t.setAttributes({um_is_restrict:e}),!1===e?(_.um_who_access="um_block_settings_hide",_.um_roles_access="um_block_settings_hide",_.um_message_type="um_block_settings_hide",_.um_message_content="um_block_settings_hide"):_.um_who_access="",_=wp.hooks.applyFilters("um_admin_blocks_condition_fields_on_change",_,"um_is_restrict",e)}}),wp.element.createElement(umSelectControl,{type:"number",className:_.um_who_access,label:wp.i18n.__("Who can access this block?","ultimate-member"),value:t.attributes.um_who_access,options:[{label:wp.i18n.__("Everyone","ultimate-member"),value:0},{label:wp.i18n.__("Logged in users","ultimate-member"),value:1},{label:wp.i18n.__("Logged out users","ultimate-member"),value:2}],onChange:function(e){t.setAttributes({um_who_access:e}),0===parseInt(e)?(_.um_message_type="um_block_settings_hide",_.um_message_content="um_block_settings_hide",_.um_roles_access="um_block_settings_hide"):1===parseInt(e)?(_.um_message_type="",_.um_roles_access=""):(_.um_message_type="",_.um_roles_access="um_block_settings_hide"),_=wp.hooks.applyFilters("um_admin_blocks_condition_fields_on_change",_,"um_who_access",e)}}),wp.element.createElement(umSelectControl,{multiple:!0,className:_.um_roles_access,label:wp.i18n.__("What roles can access this block?","ultimate-member"),value:t.attributes.um_roles_access,options:um_restrict_roles,onChange:function(e){t.setAttributes({um_roles_access:e})}}),wp.element.createElement(umSelectControl,{type:"number",className:_.um_message_type,label:wp.i18n.__("Restriction action","ultimate-member"),value:t.attributes.um_message_type,options:[{label:wp.i18n.__("Hide block","ultimate-member"),value:0},{label:wp.i18n.__("Show global default message","ultimate-member"),value:1},{label:wp.i18n.__("Show custom message","ultimate-member"),value:2}],onChange:function(e){t.setAttributes({um_message_type:e}),2===parseInt(e)?_.um_message_content="":_.um_message_content="um_block_settings_hide"}}),wp.element.createElement(umTextareaControl,{type:"number",className:_.um_message_content,label:wp.i18n.__("Custom restricted access message","ultimate-member"),value:t.attributes.um_message_content,onChange:function(e){t.setAttributes({um_message_content:e})}}),um_admin_blocks_custom_fields(_,t))))}},"um_block_restriction");wp.hooks.addFilter("editor.BlockEdit","um-block/um_block_restriction",um_block_restriction);
+1 -1
View File
@@ -1 +1 @@
jQuery(document).ready(function(){const n=jQuery(".um-secure-scan-results"),t=jQuery(".um-secure-scan-content"),e=jQuery("input[data-field_id^='banned_capabilities']");var c={init:function(){n.css({"margin-top":"10px",padding:"10px","padding-bottom":"10px","background-color":"#fff",display:"block","max-height":"200px",height:"500px","overflow-y":"scroll"}),t.on("click",function(e){c.effect(),e.preventDefault(),jQuery(this).prop("disabled",!0),n.empty(),c.log(wp.i18n.__("Scanning site..","ultimate-member")),c.ajax("")}),e.on("change",function(){t.after(' <small style="color: red;">'+wp.i18n.__("You can start the scan now but you must save the settings to apply the selected capabilities after the scan is complete.","ultimate-member")+"</small>"),e.off("change")})},ajax:function(e){let a=[];n.parents(".um-form-table").find('input[type="checkbox"][data-field_id^="banned_capabilities_"]:checked').each(function(){a.push(jQuery(this).data("field_id").replace("banned_capabilities_",""))});e={nonce:um_admin_scripts.nonce,capabilities:a,last_scanned_capability:e};wp.ajax.send("um_secure_scan_affected_users",{data:e,success:function(e){e.completed?e.completed&&(n.empty(),c.log(e.recommendations),n.find(".current").removeClass("current"),t.prop("disabled",!1)):(c.ajax(e.last_scanned_capability),c.log(e.message))}})},log:function(e){n.find(".current").removeClass("current"),n.append('<span class="current">'+e+"</span><br/>")},effect:function(){setInterval(function(){n.find(".current").fadeTo(100,.1).fadeTo(200,1)},1e3)}};c.init()});
jQuery(document).ready(function(){let t=jQuery(".um-secure-scan-results"),n=jQuery(".um-secure-scan-content"),e=jQuery("input[data-field_id^='banned_capabilities']");var c={init:function(){t.css({"margin-top":"10px",padding:"10px","padding-bottom":"10px","background-color":"#fff",display:"block","max-height":"200px",height:"500px","overflow-y":"scroll"}),n.on("click",function(e){c.effect(),e.preventDefault(),jQuery(this).prop("disabled",!0),t.empty(),c.log(wp.i18n.__("Scanning site..","ultimate-member")),c.ajax("")}),e.on("change",function(){n.after(' <small style="color: red;">'+wp.i18n.__("You can start the scan now but you must save the settings to apply the selected capabilities after the scan is complete.","ultimate-member")+"</small>"),e.off("change")})},ajax:function(e){let a=[];t.parents(".um-form-table").find('input[type="checkbox"][data-field_id^="banned_capabilities_"]:checked').each(function(){a.push(jQuery(this).data("field_id").replace("banned_capabilities_",""))});e={nonce:um_admin_scripts.nonce,capabilities:a,last_scanned_capability:e};wp.ajax.send("um_secure_scan_affected_users",{data:e,success:function(e){e.completed?e.completed&&(t.empty(),c.log(e.recommendations),t.find(".current").removeClass("current"),n.prop("disabled",!1)):(c.ajax(e.last_scanned_capability),c.log(e.message))}})},log:function(e){t.find(".current").removeClass("current"),t.append('<span class="current">'+e+"</span><br/>")},effect:function(){setInterval(function(){t.find(".current").fadeTo(100,.1).fadeTo(200,1)},1e3)}};c.init()});
+1 -1
View File
@@ -1 +1 @@
!function(){"use strict";jQuery(document).on("click","a.um-toggle-gdpr",function(e){var e=jQuery(e.currentTarget),t=e.closest(".um-field-area"),g=t.find(".um-gdpr-content");g.is(":visible")?(t.find("a.um-toggle-gdpr").text(e.data("toggle-show")),g.hide().find("a.um-toggle-gdpr").remove(),e.length&&e.get(0).scrollIntoView()):(t.find("a.um-toggle-gdpr").text(e.data("toggle-hide")),g.show().prepend(e.clone()))})}();
jQuery(document).on("click","a.um-toggle-gdpr",function(e){var e=jQuery(e.currentTarget),t=e.closest(".um-field-area"),g=t.find(".um-gdpr-content");g.is(":visible")?(t.find("a.um-toggle-gdpr").text(e.data("toggle-show")),g.hide().find("a.um-toggle-gdpr").remove(),e.length&&e.get(0).scrollIntoView()):(t.find("a.um-toggle-gdpr").text(e.data("toggle-hide")),g.show().prepend(e.clone()))});
+2 -2
View File
@@ -417,7 +417,7 @@ jQuery(document).ready(function() {
e.preventDefault();
var hook = jQuery(this).data('hook');
var user_id = jQuery(this).data('user_id');
var arguments = jQuery(this).data('arguments');
var args = jQuery(this).data('args');
if ( jQuery(this).data('js-remove') ){
jQuery(this).parents('.'+jQuery(this).data('js-remove')).fadeOut('fast');
@@ -430,7 +430,7 @@ jQuery(document).ready(function() {
action: 'um_muted_action',
hook: hook,
user_id: user_id,
arguments: arguments,
arguments: args,
nonce: um_scripts.nonce
},
success: function(data){
+1 -1
View File
File diff suppressed because one or more lines are too long
+1 -1
View File
File diff suppressed because one or more lines are too long
+160
View File
@@ -0,0 +1,160 @@
<?php
namespace um\admin;
if ( ! defined( 'ABSPATH' ) ) {
exit;
}
if ( ! class_exists( 'um\admin\Actions_Listener' ) ) {
/**
* Class Actions_Listener
*
* @package um\admin
*/
class Actions_Listener {
/**
* Actions_Listener constructor.
*/
public function __construct() {
add_action( 'admin_init', array( $this, 'actions_listener' ) );
add_filter( 'um_adm_action_individual_nonce_actions', array( $this, 'extends_individual_nonce_actions' ) ); // @todo remove soon after UM core update
}
/**
* Handle wp-admin actions
*
* @since 2.8.7
*/
public function actions_listener() {
if ( ! current_user_can( 'manage_options' ) ) {
return;
}
if ( ! empty( $_REQUEST['um_adm_action'] ) ) {
switch ( sanitize_key( $_REQUEST['um_adm_action'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification -- there is nonce verification below for each case
case 'approve_user':
if ( empty( $_REQUEST['uid'] ) || ! is_numeric( $_REQUEST['uid'] ) ) {
die( esc_html__( 'Invalid user ID', 'ultimate-member' ) );
}
$user_id = absint( $_REQUEST['uid'] );
check_admin_referer( "approve_user{$user_id}" );
$redirect = wp_get_referer();
if ( UM()->common()->users()->can_current_user_edit_user( $user_id ) ) {
$result = UM()->common()->users()->approve( $user_id );
if ( $result ) {
$redirect = add_query_arg( array( 'update' => 'um_approved', 'approved_count' => 1 ), $redirect );
}
}
wp_safe_redirect( $redirect );
exit;
case 'reactivate_user':
if ( empty( $_REQUEST['uid'] ) || ! is_numeric( $_REQUEST['uid'] ) ) {
die( esc_html__( 'Invalid user ID', 'ultimate-member' ) );
}
$user_id = absint( $_REQUEST['uid'] );
check_admin_referer( "reactivate_user{$user_id}" );
$redirect = wp_get_referer();
if ( UM()->common()->users()->can_current_user_edit_user( $user_id ) ) {
$result = UM()->common()->users()->reactivate( $user_id );
if ( $result ) {
$redirect = add_query_arg( array( 'update' => 'um_reactivated', 'reactivated_count' => 1 ), $redirect );
}
}
wp_safe_redirect( $redirect );
exit;
case 'put_user_as_pending':
if ( empty( $_REQUEST['uid'] ) || ! is_numeric( $_REQUEST['uid'] ) ) {
die( esc_html__( 'Invalid user ID', 'ultimate-member' ) );
}
$user_id = absint( $_REQUEST['uid'] );
check_admin_referer( "put_user_as_pending{$user_id}" );
$redirect = wp_get_referer();
if ( UM()->common()->users()->can_current_user_edit_user( $user_id ) ) {
$result = UM()->common()->users()->set_as_pending( $user_id );
if ( $result ) {
$redirect = add_query_arg( array( 'update' => 'um_pending', 'pending_count' => 1 ), $redirect );
}
}
wp_safe_redirect( $redirect );
exit;
case 'resend_user_activation':
if ( empty( $_REQUEST['uid'] ) || ! is_numeric( $_REQUEST['uid'] ) ) {
die( esc_html__( 'Invalid user ID', 'ultimate-member' ) );
}
$user_id = absint( $_REQUEST['uid'] );
check_admin_referer( "resend_user_activation{$user_id}" );
$redirect = wp_get_referer();
if ( UM()->common()->users()->can_current_user_edit_user( $user_id ) ) {
$result = UM()->common()->users()->send_activation( $user_id );
if ( $result ) {
$redirect = add_query_arg( array( 'update' => 'um_resend_activation', 'resend_activation_count' => 1 ), $redirect );
}
}
wp_safe_redirect( $redirect );
exit;
case 'reject_user':
if ( empty( $_REQUEST['uid'] ) || ! is_numeric( $_REQUEST['uid'] ) ) {
die( esc_html__( 'Invalid user ID', 'ultimate-member' ) );
}
$user_id = absint( $_REQUEST['uid'] );
check_admin_referer( "reject_user{$user_id}" );
$redirect = wp_get_referer();
if ( UM()->common()->users()->can_current_user_edit_user( $user_id ) ) {
$result = UM()->common()->users()->reject( $user_id );
if ( $result ) {
$redirect = add_query_arg( array( 'update' => 'um_rejected', 'rejected_count' => 1 ), $redirect );
}
}
wp_safe_redirect( $redirect );
exit;
case 'deactivate_user':
if ( empty( $_REQUEST['uid'] ) || ! is_numeric( $_REQUEST['uid'] ) ) {
die( esc_html__( 'Invalid user ID', 'ultimate-member' ) );
}
$user_id = absint( $_REQUEST['uid'] );
check_admin_referer( "deactivate_user{$user_id}" );
$redirect = wp_get_referer();
if ( UM()->common()->users()->can_current_user_edit_user( $user_id ) ) {
$result = UM()->common()->users()->deactivate( $user_id );
if ( $result ) {
$redirect = add_query_arg( array( 'update' => 'um_deactivate', 'deactivated_count' => 1 ), $redirect );
}
}
wp_safe_redirect( $redirect );
exit;
}
}
}
public function extends_individual_nonce_actions( $actions ) {
$actions[] = 'approve_user';
$actions[] = 'reactivate_user';
$actions[] = 'put_user_as_pending';
$actions[] = 'resend_user_activation';
$actions[] = 'reject_user';
$actions[] = 'deactivate_user';
return $actions;
}
}
}
+13 -65
View File
@@ -67,7 +67,6 @@ if ( ! class_exists( 'um\admin\Admin' ) ) {
add_action( 'um_admin_do_action__purge_temp', array( &$this, 'purge_temp' ) );
add_action( 'um_admin_do_action__manual_upgrades_request', array( &$this, 'manual_upgrades_request' ) );
add_action( 'um_admin_do_action__duplicate_form', array( &$this, 'duplicate_form' ) );
add_action( 'um_admin_do_action__user_action', array( &$this, 'user_action' ) );
add_action( 'um_admin_do_action__check_templates_version', array( &$this, 'check_templates_version' ) );
add_action( 'um_admin_do_action__install_core_pages', array( &$this, 'install_core_pages' ) );
@@ -79,6 +78,7 @@ if ( ! class_exists( 'um\admin\Admin' ) ) {
}
public function includes() {
$this->actions_listener();
$this->enqueue();
$this->notices();
$this->secure();
@@ -1841,69 +1841,6 @@ if ( ! class_exists( 'um\admin\Admin' ) ) {
exit;
}
/**
* Various user actions.
*/
public function user_action() {
if ( ! current_user_can( 'edit_users' ) ) {
die();
}
if ( ! isset( $_REQUEST['sub'] ) ) {
die();
}
if ( ! isset( $_REQUEST['user_id'] ) ) {
die();
}
um_fetch_user( absint( $_REQUEST['user_id'] ) );
$subaction = sanitize_key( $_REQUEST['sub'] );
/**
* UM hook
*
* @type action
* @title um_admin_user_action_hook
* @description Action on bulk user subaction
* @input_vars
* [{"var":"$subaction","type":"string","desc":"Bulk Subaction"}]
* @change_log
* ["Since: 2.0"]
* @usage add_action( 'um_admin_user_action_hook', 'function_name', 10, 1 );
* @example
* <?php
* add_action( 'um_admin_user_action_hook', 'my_admin_user_action', 10, 1 );
* function my_admin_user_action( $subaction ) {
* // your code here
* }
* ?>
*/
do_action( 'um_admin_user_action_hook', $subaction );
/**
* UM hook
*
* @type action
* @title um_admin_user_action_{$subaction}_hook
* @description Action on bulk user subaction
* @change_log
* ["Since: 2.0"]
* @usage add_action( 'um_admin_user_action_{$subaction}_hook', 'function_name', 10 );
* @example
* <?php
* add_action( 'um_admin_user_action_{$subaction}_hook', 'my_admin_user_action', 10 );
* function my_admin_user_action() {
* // your code here
* }
* ?>
*/
do_action( "um_admin_user_action_{$subaction}_hook" );
um_reset_user();
wp_safe_redirect( add_query_arg( 'update', 'um_user_updated', admin_url( '?page=ultimatemember' ) ) );
exit;
}
/**
* Manual check templates versions.
*/
@@ -1947,7 +1884,6 @@ if ( ! class_exists( 'um\admin\Admin' ) ) {
$action = sanitize_key( $_REQUEST['um_adm_action'] );
$individual_nonce_actions = array(
'user_action',
'duplicate_form',
);
$individual_nonce_actions = apply_filters( 'um_adm_action_individual_nonce_actions', $individual_nonce_actions );
@@ -2072,6 +2008,18 @@ if ( ! class_exists( 'um\admin\Admin' ) ) {
return $parent_file;
}
/**
* @since 2.8.7
*
* @return Actions_Listener
*/
public function actions_listener() {
if ( empty( UM()->classes['um\admin\actions_listener'] ) ) {
UM()->classes['um\admin\actions_listener'] = new Actions_Listener();
}
return UM()->classes['um\admin\actions_listener'];
}
/**
* @since 2.7.0
*
+105 -8
View File
@@ -46,7 +46,7 @@ if ( ! class_exists( 'um\admin\Users_Columns' ) ) {
* @return array
*/
public function manage_users_columns( $columns ) {
$columns['account_status'] = __( 'Status', 'ultimate-member' );
$columns['um_account_status'] = __( 'Status', 'ultimate-member' );
return $columns;
}
@@ -60,10 +60,91 @@ if ( ! class_exists( 'um\admin\Users_Columns' ) ) {
* @return string
*/
public function manage_users_custom_column( $value, $column_name, $user_id ) {
if ( 'account_status' === $column_name ) {
um_fetch_user( $user_id );
$value = um_user( 'account_status_name' );
um_reset_user();
if ( 'um_account_status' !== $column_name ) {
return $value;
}
$status = UM()->common()->users()->get_status( $user_id, 'formatted' );
$status = apply_filters( 'um_users_column_account_status', $status, $user_id );
$value = '<span class="um-user-status">' . esc_html( $status ) . '</span>';
if ( get_current_user_id() === $user_id ) {
return $value;
}
$row_actions = array();
if ( UM()->common()->users()->can_be_approved( $user_id ) ) {
$url = add_query_arg(
array(
'um_adm_action' => 'approve_user',
'uid' => $user_id,
'_wpnonce' => wp_create_nonce( 'approve_user' . $user_id ),
),
admin_url( 'users.php' )
);
$row_actions[] = '<a href="' . esc_url( $url ) . '" class="um-set-status-approved">' . esc_html__( 'Approve', 'ultimate-member' ) . '</a>';
}
if ( UM()->common()->users()->can_be_reactivated( $user_id ) ) {
$url = add_query_arg(
array(
'um_adm_action' => 'reactivate_user',
'uid' => $user_id,
'_wpnonce' => wp_create_nonce( 'reactivate_user' . $user_id ),
),
admin_url( 'users.php' )
);
$row_actions[] = '<a href="' . esc_url( $url ) . '" class="um-reactivate-user">' . esc_html__( 'Reactivate', 'ultimate-member' ) . '</a>';
}
if ( UM()->common()->users()->can_be_set_as_pending( $user_id ) ) {
$url = add_query_arg(
array(
'um_adm_action' => 'put_user_as_pending',
'uid' => $user_id,
'_wpnonce' => wp_create_nonce( 'put_user_as_pending' . $user_id ),
),
admin_url( 'users.php' )
);
$row_actions[] = '<a href="' . esc_url( $url ) . '" class="um-set-status-pending">' . esc_html__( 'Put as pending', 'ultimate-member' ) . '</a>';
}
if ( UM()->common()->users()->can_activation_send( $user_id ) ) {
$url = add_query_arg(
array(
'um_adm_action' => 'resend_user_activation',
'uid' => $user_id,
'_wpnonce' => wp_create_nonce( 'resend_user_activation' . $user_id ),
),
admin_url( 'users.php' )
);
$row_actions[] = '<a href="' . esc_url( $url ) . '" class="um-resend-activation-email">' . esc_html__( 'Resend activation email', 'ultimate-member' ) . '</a>';
}
if ( UM()->common()->users()->can_be_rejected( $user_id ) ) {
$url = add_query_arg(
array(
'um_adm_action' => 'reject_user',
'uid' => $user_id,
'_wpnonce' => wp_create_nonce( 'reject_user' . $user_id ),
),
admin_url( 'users.php' )
);
$row_actions[] = '<a href="' . esc_url( $url ) . '" class="um-set-status-rejected" onclick="return confirm( \'' . esc_js( __( 'Are you sure you want to reject this user membership?', 'ultimate-member' ) ) . '\' );">' . esc_html__( 'Reject', 'ultimate-member' ) . '</a>';
}
if ( UM()->common()->users()->can_be_deactivated( $user_id ) ) {
$url = add_query_arg(
array(
'um_adm_action' => 'deactivate_user',
'uid' => $user_id,
'_wpnonce' => wp_create_nonce( 'deactivate_user' . $user_id ),
),
admin_url( 'users.php' )
);
$row_actions[] = '<a href="' . esc_url( $url ) . '" class="um-deactivate-user" onclick="return confirm( \'' . esc_js( __( 'Are you sure you want to deactivate this user?', 'ultimate-member' ) ) . '\' );">' . esc_html__( 'Deactivate', 'ultimate-member' ) . '</a>';
}
$row_actions = apply_filters( 'um_users_column_account_status_row_actions', $row_actions, $user_id );
if ( ! empty( $row_actions ) ) {
$value .= '<div class="row-actions"><ul class="um-user-status-row-actions"><li>' . implode( '</li><li> | </li><li>', $row_actions ) . '</li></ul></div>';
}
return $value;
}
@@ -180,7 +261,6 @@ if ( ! class_exists( 'um\admin\Users_Columns' ) ) {
* @return array
*/
private function get_user_bulk_actions() {
// @todo check verified users module for the proper integration. remove old integration way
$um_actions = array(
'um_approve_membership' => __( 'Approve Membership', 'ultimate-member' ),
'um_reject_membership' => __( 'Reject Membership', 'ultimate-member' ),
@@ -232,6 +312,23 @@ if ( ! class_exists( 'um\admin\Users_Columns' ) ) {
return $actions;
}
private function get_statuses_filter_options() {
$statuses = UM()->common()->users()->statuses_list();
/**
* Filters the user statuses added via Ultimate Member plugin.
*
* Note: Statuses format is 'key' => 'title'
*
* @since 2.8.7
* @hook um_user_statuses_admin_filter_options
*
* @param {array} $statuses User statuses in Ultimate Member environment.
*
* @return {array} User statuses.
*/
return apply_filters( 'um_user_statuses_admin_filter_options', $statuses );
}
/**
* Adds HTML with the filter by the Ultimate Member status.
*
@@ -250,7 +347,7 @@ if ( ! class_exists( 'um\admin\Users_Columns' ) ) {
// need to add there additional nonce field because WordPress native _wpnonce field isn't visible on the users.php screen then custom actions
wp_nonce_field( 'um-bulk-users', '_um_wpnonce', false );
$statuses = UM()->common()->users()->statuses_list();
$statuses = $this->get_statuses_filter_options();
?>
<div class="alignleft actions um-filter-by-status">
<label class="screen-reader-text" for="<?php echo esc_attr( $id ); ?>"><?php esc_html_e( 'All Statuses', 'ultimate-member' ); ?></label>
@@ -503,7 +600,7 @@ if ( ! class_exists( 'um\admin\Users_Columns' ) ) {
* @param string $uri
* @return string
*/
private function set_redirect_uri( $uri ) {
public function set_redirect_uri( $uri ) {
if ( ! empty( $_REQUEST['s'] ) ) {
$uri = add_query_arg( 's', sanitize_text_field( $_REQUEST['s'] ), $uri );
}
@@ -490,9 +490,6 @@ if ( ! class_exists( 'um\admin\core\Admin_Notices' ) ) {
case 'um_settings_updated':
$messages[0]['content'] = __( 'Settings have been saved successfully.', 'ultimate-member' );
break;
case 'um_user_updated':
$messages[0]['content'] = __( 'User has been updated.', 'ultimate-member' );
break;
case 'um_users_updated':
$messages[0]['content'] = __( 'Users have been updated.', 'ultimate-member' );
break;
-170
View File
@@ -1,170 +0,0 @@
<?php
namespace um\admin\core;
if ( ! defined( 'ABSPATH' ) ) {
exit;
}
if ( ! class_exists( 'um\admin\core\Admin_Users' ) ) {
/**
* Class Admin_Users
* @package um\admin\core
*/
class Admin_Users {
/**
* Admin_Users constructor.
*/
public function __construct() {
//add_action( 'admin_init', array( &$this, 'um_bulk_users_edit' ), 9 );
//add_action( 'um_admin_user_action_hook', array( &$this, 'user_action_hook' ), 10, 1 );
}
/**
* Does an action to user asap
*
* @param string $action
*/
public function user_action_hook( $action ) {
switch ( $action ) {
default:
/**
* UM hook
*
* @type action
* @title um_admin_custom_hook_{$action}
* @description Integration hook on user action
* @input_vars
* [{"var":"$user_id","type":"int","desc":"User ID"}]
* @change_log
* ["Since: 2.0"]
* @usage add_action( 'um_admin_custom_hook_{$action}', 'function_name', 10, 1 );
* @example
* <?php
* add_action( 'um_admin_custom_hook_{$action}', 'my_admin_custom_hook', 10, 1 );
* function my_admin_after_main_notices( $user_id ) {
* // your code here
* }
* ?>
*/
do_action( "um_admin_custom_hook_{$action}", UM()->user()->id );
break;
case 'um_delete':
if ( is_admin() ) {
wp_die( esc_html__( 'This action is not allowed in backend.', 'ultimate-member' ) );
}
UM()->user()->delete();
break;
}
}
/**
* Add UM Bulk actions to Users List Table
* @deprecated 2.8.7
*/
public function restrict_manage_users() {
?>
<div style="float:right;margin:0 4px">
<label class="screen-reader-text" for="um_bulk_action"><?php _e( 'UM Action', 'ultimate-member' ); ?></label>
<select name="um_bulk_action[]" id="um_bulk_action" class="" style="width: 200px">
<option value="0"><?php _e( 'UM Action', 'ultimate-member' ); ?></option>
<?php echo $this->get_bulk_admin_actions(); ?>
</select>
<input name="um_bulkedit" id="um_bulkedit" class="button" value="<?php esc_attr_e( 'Apply', 'ultimate-member' ); ?>" type="submit" />
</div>
<?php if ( ! empty( $_REQUEST['um_status'] ) ) { ?>
<input type="hidden" name="um_status" id="um_status" value="<?php echo esc_attr( sanitize_key( $_REQUEST['um_status'] ) );?>"/>
<?php
}
}
/**
* Bulk user editing actions
*/
public function um_bulk_users_edit() {
// bulk edit users
if ( ! empty( $_REQUEST['users'] ) && ! empty( $_REQUEST['um_bulkedit'] ) && ! empty( $_REQUEST['um_bulk_action'] ) ) {
$rolename = UM()->roles()->get_priority_user_role( get_current_user_id() );
$role = get_role( $rolename );
if ( empty( $role ) ) {
wp_die( esc_html__( 'You do not have enough permissions to do that.', 'ultimate-member' ) );
}
if ( ! current_user_can( 'edit_users' ) && ! $role->has_cap( 'edit_users' ) ) {
wp_die( esc_html__( 'You do not have enough permissions to do that.', 'ultimate-member' ) );
}
check_admin_referer( 'bulk-users' );
$users = array_map( 'absint', (array) $_REQUEST['users'] );
$bulk_action = current( array_filter( $_REQUEST['um_bulk_action'] ) );
foreach ( $users as $user_id ) {
UM()->user()->set( $user_id );
/**
* UM hook
*
* @type action
* @title um_admin_user_action_hook
* @description Action on bulk user action
* @input_vars
* [{"var":"$bulk_action","type":"string","desc":"Bulk Action"}]
* @change_log
* ["Since: 2.0"]
* @usage add_action( 'um_admin_user_action_hook{$action}', 'function_name', 10, 1 );
* @example
* <?php
* add_action( 'um_admin_user_action_hook', 'my_admin_user_action', 10, 1 );
* function my_admin_user_action( $bulk_action ) {
* // your code here
* }
* ?>
*/
do_action( 'um_admin_user_action_hook', $bulk_action );
/**
* UM hook
*
* @type action
* @title um_admin_user_action_{$bulk_action}_hook
* @description Action on bulk user action
* @change_log
* ["Since: 2.0"]
* @usage add_action( 'um_admin_user_action_{$bulk_action}_hook', 'function_name', 10 );
* @example
* <?php
* add_action( 'um_admin_user_action_{$bulk_action}_hook', 'my_admin_user_action', 10 );
* function my_admin_user_action() {
* // your code here
* }
* ?>
*/
do_action( "um_admin_user_action_{$bulk_action}_hook" );
}
$uri = $this->set_redirect_uri( admin_url( 'users.php' ) );
$uri = add_query_arg( 'update', 'um_users_updated', $uri );
wp_safe_redirect( $uri );
exit;
}
if ( ! empty( $_REQUEST['um_bulkedit'] ) ) {
$uri = $this->set_redirect_uri( admin_url( 'users.php' ) );
wp_safe_redirect( $uri );
exit;
}
}
}
}
+1 -1
View File
@@ -1451,7 +1451,7 @@ 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-core.php';
require_once 'core/um-actions-ajax.php';
require_once 'core/um-actions-login.php';
require_once 'core/um-actions-register.php';
+69 -13
View File
@@ -103,10 +103,10 @@ class Users {
public function statuses_list() {
$statuses = array(
'approved' => __( 'Approved', 'ultimate-member' ),
'awaiting_admin_review' => __( 'Pending review', 'ultimate-member' ),
'awaiting_admin_review' => __( 'Pending administrator review', 'ultimate-member' ),
'awaiting_email_confirmation' => __( 'Waiting email confirmation', 'ultimate-member' ),
'inactive' => __( 'Inactive', 'ultimate-member' ),
'rejected' => __( 'Rejected', 'ultimate-member' ),
'inactive' => __( 'Membership inactive', 'ultimate-member' ),
'rejected' => __( 'Membership rejected', 'ultimate-member' ),
);
/**
* Filters the user statuses added via Ultimate Member plugin.
@@ -114,13 +114,13 @@ class Users {
* Note: Statuses format is 'key' => 'title'
*
* @since 2.8.7
* @hook um_admin_get_user_statuses
* @hook um_user_statuses
*
* @param {array} $statuses User statuses in Ultimate Member environment.
*
* @return {array} User statuses.
*/
return apply_filters( 'um_admin_get_user_statuses', $statuses );
return apply_filters( 'um_user_statuses', $statuses );
}
/**
@@ -184,8 +184,18 @@ class Users {
*
* @return string
*/
public function get_status( $user_id ) {
return get_user_meta( $user_id, 'account_status', true );
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' );
}
/**
@@ -280,9 +290,34 @@ class Users {
return get_password_reset_key( $userdata );
}
public function can_activation_send( $user_id ) {
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;
}
public function can_activation_send( $user_id ) {
$current_user_id = get_current_user_id();
if ( $current_user_id === $user_id || ! self::user_exists( $user_id ) ) {
return false;
}
@@ -357,7 +392,7 @@ class Users {
*/
public function can_be_deactivated( $user_id ) {
$current_user_id = get_current_user_id();
if ( $current_user_id === $user_id ) {
if ( $current_user_id === $user_id || ! self::user_exists( $user_id ) ) {
return false;
}
@@ -440,7 +475,7 @@ class Users {
*/
public function can_be_rejected( $user_id ) {
$current_user_id = get_current_user_id();
if ( $current_user_id === $user_id ) {
if ( $current_user_id === $user_id || ! self::user_exists( $user_id ) ) {
return false;
}
@@ -523,7 +558,7 @@ class Users {
*/
public function can_be_set_as_pending( $user_id ) {
$current_user_id = get_current_user_id();
if ( $current_user_id === $user_id ) {
if ( $current_user_id === $user_id || ! self::user_exists( $user_id ) ) {
return false;
}
@@ -598,7 +633,7 @@ class Users {
*/
public function can_be_approved( $user_id ) {
$current_user_id = get_current_user_id();
if ( $current_user_id === $user_id ) {
if ( $current_user_id === $user_id || ! self::user_exists( $user_id ) ) {
return false;
}
@@ -618,6 +653,27 @@ class Users {
return 'approved' !== $status;
}
/**
* @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 ];
}
/**
* Approve user.
*
@@ -684,7 +740,7 @@ class Users {
*/
public function can_be_reactivated( $user_id ) {
$current_user_id = get_current_user_id();
if ( $current_user_id === $user_id ) {
if ( $current_user_id === $user_id || ! self::user_exists( $user_id ) ) {
return false;
}
+12 -33
View File
@@ -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
* <?php add_filter( 'um_admin_user_actions_hook', 'function_name', 10, 1 ); ?>
* @example
* <?php
* add_filter( 'um_admin_user_actions_hook', 'my_admin_user_actions', 10, 1 );
* function my_admin_user_actions( $actions ) {
* // your code here
* return $actions;
* }
* ?>
*/
$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 );
+2 -2
View File
@@ -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 ) {
+5 -44
View File
@@ -1725,28 +1725,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
* <?php add_filter( 'um_admin_user_actions_hook', 'function_name', 10, 1 ); ?>
* @example
* <?php
* add_filter( 'um_admin_user_actions_hook', 'my_admin_user_actions', 10, 1 );
* function my_admin_user_actions( $actions ) {
* // your code here
* return $actions;
* }
* ?>
*/
$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;
}
@@ -1756,10 +1735,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[] = '<a href="' . esc_url( $url ) . '" class="real_url ' . esc_attr( $id ) . '-item">' . esc_html( $arr['label'] ) . '</a>';
}
return $items;
@@ -2111,32 +2089,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 <?php UM()->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
<?php
$boolean = UM()->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;
}
/**
-161
View File
@@ -1,161 +0,0 @@
<?php if ( ! defined( 'ABSPATH' ) ) {
exit;
}
/**
* Processes the requests of UM actions
*
*/
function um_action_request_process() {
if ( is_admin() ) {
return;
}
if ( ! is_user_logged_in() ) {
return;
}
if ( ! isset( $_REQUEST['um_action'] ) ) {
return;
}
$action = sanitize_key( $_REQUEST['um_action'] );
$uid = 0;
if ( isset( $_REQUEST['uid'] ) ) {
$uid = absint( $_REQUEST['uid'] );
}
if ( ! empty( $uid ) && ! UM()->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
* <?php
* add_action( 'um_action_user_request_hook', 'my_action_user_request', 10, 2 );
* function my_action_user_request( $action, $user_id ) {
* // your code here
* }
* ?>
*/
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()->common()->users()->reject( $uid );
exit( wp_redirect( UM()->permalinks()->get_current_url( true ) ) );
break;
case 'um_approve_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()->common()->users()->approve( $uid );
exit( wp_redirect( UM()->permalinks()->get_current_url( true ) ) );
break;
case 'um_reactivate':
if ( ! $can_edit_users ) {
wp_die( esc_html__( 'You do not have permission to make this action.', 'ultimate-member' ) );
}
um_fetch_user( $uid );
UM()->common()->users()->reactivate( $uid );
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()->common()->users()->set_as_pending( $uid );
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' ) );
}
um_fetch_user( $uid );
UM()->common()->users()->send_activation( $uid );
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()->common()->users()->deactivate( $uid );
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 );
-55
View File
@@ -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_reactivate'] = 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.
*
@@ -0,0 +1,207 @@
<?php
namespace um\frontend;
if ( ! defined( 'ABSPATH' ) ) {
exit;
}
if ( ! class_exists( 'um\frontend\Actions_Listener' ) ) {
/**
* Class Actions_Listener
*
* @package um\frontend
*/
class Actions_Listener {
/**
* Actions_Listener constructor.
*/
public function __construct() {
add_action( 'wp_loaded', array( $this, 'actions_listener' ) );
}
/**
* Handle frontend actions
*
* @since 2.8.7
*/
public function actions_listener() {
if ( ! is_user_logged_in() ) {
return;
}
// phpcs:disable WordPress.Security.NonceVerification -- there is nonce verification below for each case
if ( empty( $_REQUEST['um_action'] ) || empty( $_REQUEST['nonce'] ) ) {
return;
}
$user_id = 0;
if ( isset( $_REQUEST['uid'] ) ) {
$user_id = absint( $_REQUEST['uid'] );
}
if ( ! empty( $user_id ) && ! UM()->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 );
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:
/**
* 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
* <?php
* add_action( 'um_action_user_request_hook', 'my_action_user_request', 10, 2 );
* function my_action_user_request( $action, $user_id ) {
* // your code here
* }
* ?>
*/
do_action( 'um_action_user_request_hook', $action, $user_id );
break;
}
}
}
}
+40
View File
@@ -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'];
}
}
}
+69
View File
@@ -0,0 +1,69 @@
<?php
namespace um\frontend;
if ( ! defined( 'ABSPATH' ) ) {
exit;
}
if ( ! class_exists( 'um\frontend\User_Profile' ) ) {
/**
* Class User_Profile
*
* @package um\frontend
*/
class User_Profile {
/**
* User_Profile constructor.
*/
public function __construct() {
add_action( 'template_redirect', array( $this, 'handle_edit_screen' ), 10000 );
}
/**
* Check edit profile action and set edit mode or redirect if there aren't capabilities to edit.
* @return void
*/
public function handle_edit_screen() {
if ( ! is_user_logged_in() ) {
return;
}
if ( ! isset( $_REQUEST['um_action'] ) ) {
return;
}
$action = sanitize_key( $_REQUEST['um_action'] );
if ( 'edit' !== $action ) {
return;
}
$uid = 0;
if ( isset( $_REQUEST['uid'] ) ) {
$uid = absint( $_REQUEST['uid'] );
}
if ( ! empty( $uid ) && ! UM()->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_can_edit_my_profile() ) {
um_safe_redirect( um_edit_my_profile_cancel_uri() );
exit;
}
}
}
}
+81
View File
@@ -0,0 +1,81 @@
<?php
namespace um\frontend;
if ( ! defined( 'ABSPATH' ) ) {
exit;
}
/**
* Class Users
*
* @package um\frontend
*/
class Users {
public function hooks() {
}
/**
* @param int $user_id
*
* @return array
*/
public function get_actions_list( $user_id ) {
$actions = array();
um_fetch_user( $user_id );
$priority_role = UM()->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_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 ) ) {
$actions['resend_user_activation'] = array( 'label' => __( 'Resend Activation Email', '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_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 <caption>Add `um_custom_action` action to the users actions list on frontend.</caption>
* 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 );
}
}
+30
View File
@@ -65,3 +65,33 @@ if ( ! defined( 'ABSPATH' ) ) {
*
* @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.
*/