Passed
Push — dev/6.0.0 ( f2d62a...b411c2 )
by Sudar
02:48
created

DeleteUsersByUserRoleModule::do_delete()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 8
Code Lines 4

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 4
CRAP Score 2

Importance

Changes 0
Metric Value
cc 2
eloc 4
nc 2
nop 1
dl 0
loc 8
ccs 4
cts 4
cp 1
crap 2
rs 10
c 0
b 0
f 0
1
<?php
2
3
namespace BulkWP\BulkDelete\Core\Users\Modules;
4
5
use BulkWP\BulkDelete\Core\Users\UsersModule;
6
7 1
defined( 'ABSPATH' ) || exit; // Exit if accessed directly.
8
9
/**
10
 * Bulk Delete Users by User Role Module.
11
 *
12
 * @since 5.5
13
 * @since 6.0.0 Renamed to DeleteUsersByUserRoleModule
14
 */
15
class DeleteUsersByUserRoleModule extends UsersModule {
16
	/**
17
	 * Initialize and setup variables.
18
	 *
19
	 * @since 5.5
20
	 */
21 13
	protected function initialize() {
22 13
		$this->item_type     = 'users';
23 13
		$this->field_slug    = 'u_role';
24 13
		$this->meta_box_slug = 'bd_users_by_role';
25 13
		$this->action        = 'delete_users_by_role';
26 13
		$this->cron_hook     = 'do-bulk-delete-users-by-role';
27 13
		$this->scheduler_url = 'https://bulkwp.com/addons/scheduler-for-deleting-users-by-role/?utm_source=wpadmin&utm_campaign=BulkDelete&utm_medium=buynow&utm_content=bd-u-ur';
28 13
		$this->messages      = array(
29 13
			'box_label'  => __( 'By User Role', 'bulk-delete' ),
30 13
			'scheduled'  => __( 'Users from the selected user role are scheduled for deletion.', 'bulk-delete' ),
31 13
			'cron_label' => __( 'Delete Users by User Role', 'bulk-delete' ),
32
		);
33 13
	}
34
35
	/**
36
	 * Render delete users box.
37
	 *
38
	 * @since 5.5
39
	 */
40
	public function render() {
41
		?>
42
		<h4><?php _e( 'Select the user roles from which you want to delete users', 'bulk-delete' ); ?></h4>
43
44
		<fieldset class="options">
45
			<table class="optiontable">
46
				<?php $this->render_user_role_dropdown( true ); ?>
47
			</table>
48
49
			<table class="optiontable">
50
				<?php
51
					$this->render_filtering_table_header();
52
					$this->render_user_login_restrict_settings();
53
					$this->render_user_with_no_posts_settings();
54
					$this->render_limit_settings();
55
					$this->render_cron_settings();
56
				?>
57
			</table>
58
		</fieldset>
59
		<?php
60
		$this->render_submit_button();
61
	}
62
63
	protected function convert_user_input_to_options( $request, $options ) {
64
		$selected_roles = bd_array_get( $request, 'smbd_' . $this->field_slug . '_roles', array() );
65
66
		$key = array_search( 'none', $selected_roles, true );
67
		if ( false !== $key ) {
68
			unset( $selected_roles[ $key ] );
69
			$options['delete_users_with_no_role'] = true;
70
		}
71
72
		$options['selected_roles'] = $selected_roles;
73
74
		return $options;
75
	}
76
77
	/**
78
	 * Handle both users with roles and without roles.
79
	 *
80 13
	 * {@inheritdoc}
81
	 *
82 13
	 * @param array $options Array of Delete options.
83 1
	 *
84
	 * @return int Number of items that were deleted.
85
	 */
86
	protected function do_delete( $options ) {
87 12
		$users_with_roles_deleted = parent::do_delete( $options );
88 12
89
		if ( ! isset( $options['delete_users_with_no_role'] ) ) {
90
			return $users_with_roles_deleted;
91 12
		}
92
93 12
		return $users_with_roles_deleted + $this->delete_users_with_no_roles( $options );
94 5
	}
95
96
	/**
97 12
	 * Delete users with no roles.
98
	 *
99
	 * @since 6.0.0
100
	 *
101
	 * @param array $options User options.
102
	 *
103
	 * @return int Number of users that were deleted.
104
	 */
105
	protected function delete_users_with_no_roles( $options ) {
106
		$query = $this->build_query_for_deleting_users_with_no_roles( $options );
107
108
		if ( empty( $query ) ) {
109
			// Short circuit deletion, if nothing needs to be deleted.
110
			return 0;
111
		}
112
113
		$query = $this->exclude_users_from_deletion( $query );
114
		$query = $this->exclude_current_user( $query );
115
116
		return $this->delete_users_from_query( $query, $options );
117
	}
118
119
	/**
120
	 * Build query params for WP_User_Query by using delete options for deleting users with no roles.
121
	 *
122
	 * Return an empty query array to short-circuit deletion.
123
	 *
124
	 * @since 6.0.0
125
	 *
126
	 * @param array $options Delete options.
127
	 *
128
	 * @return array Query.
129
	 */
130
	protected function build_query_for_deleting_users_with_no_roles( $options ) {
131
		// Users with no role is not selected.
132
		if ( ! isset( $options['delete_users_with_no_role'] ) || ! $options['delete_users_with_no_role'] ) {
133
			return array();
134
		}
135
136
		$roles      = get_editable_roles();
137
		$role_names = array_keys( $roles );
138
139
		$query = array(
140
			'role__not_in' => $role_names,
141
			'number'       => $options['limit_to'],
142
		);
143
144
		$date_query = $this->get_date_query( $options );
145
146
		if ( ! empty( $date_query ) ) {
147
			$query['date_query'] = $date_query;
148
		}
149
150
		return $query;
151
	}
152
153
	/**
154
	 * Build query params for WP_User_Query by using delete options.
155
	 *
156
	 * Return an empty query array to short-circuit deletion.
157
	 *
158
	 * @since 6.0.0
159
	 *
160
	 * @param array $options Delete options.
161
	 *
162
	 * @return array Query.
163
	 */
164
	protected function build_query( $options ) {
165
		// No role is selected.
166
		if ( empty( $options['selected_roles'] ) ) {
167
			return array();
168
		}
169
170
		$query = array(
171
			'role__in' => $options['selected_roles'],
172
			'number'   => $options['limit_to'],
173
		);
174
175
		$date_query = $this->get_date_query( $options );
176
177
		if ( ! empty( $date_query ) ) {
178
			$query['date_query'] = $date_query;
179
		}
180
181
		return $query;
182
	}
183
184
	protected function append_to_js_array( $js_array ) {
185
		$js_array['validators'][ $this->action ] = 'validateUserRole';
186
187
		$js_array['pre_action_msg'][ $this->action ] = 'deleteUsersWarning';
188
		$js_array['msg']['deleteUsersWarning']       = __( 'Are you sure you want to delete all the users from the selected user role?', 'bulk-delete' );
189
190
		$js_array['error_msg'][ $this->action ] = 'selectOneUserRole';
191
		$js_array['msg']['selectOneUserRole']   = __( 'Select at least one user role from which users should be deleted', 'bulk-delete' );
192
193
		return $js_array;
194
	}
195
196
	protected function get_success_message( $items_deleted ) {
197
		/* translators: 1 Number of users deleted */
198
		return _n( 'Deleted %d user from the selected roles', 'Deleted %d users from the selected roles', $items_deleted, 'bulk-delete' );
199
	}
200
}
201