* 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
+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;
}
}
}
}