Completed
Push — 247-fix/delete-term-meta ( d5f818...2a1fe3 )
by Sudar
67:09 queued 61:16
created

DeleteUsersByUserRoleModule::build_query()   A

Complexity

Conditions 3
Paths 3

Size

Total Lines 18
Code Lines 9

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 9
CRAP Score 3

Importance

Changes 0
Metric Value
cc 3
eloc 9
nc 3
nop 1
dl 0
loc 18
ccs 9
cts 9
cp 1
crap 3
rs 9.9666
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 17
	protected function initialize() {
22 17
		$this->item_type     = 'users';
23 17
		$this->field_slug    = 'u_role';
24 17
		$this->meta_box_slug = 'bd_users_by_role';
25 17
		$this->action        = 'delete_users_by_role';
26 17
		$this->cron_hook     = 'do-bulk-delete-users-by-role';
27 17
		$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 17
		$this->messages      = array(
29 17
			'box_label'  => __( 'By User Role', 'bulk-delete' ),
30 17
			'scheduled'  => __( 'Users from the selected user role are scheduled for deletion.', 'bulk-delete' ),
31 17
			'cron_label' => __( 'Delete Users by User Role', 'bulk-delete' ),
32
		);
33 17
	}
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_post_reassign_settings();
56
					$this->render_cron_settings();
57
				?>
58
			</table>
59
		</fieldset>
60
		<?php
61
		$this->render_submit_button();
62
	}
63
64
	protected function convert_user_input_to_options( $request, $options ) {
65
		$selected_roles = bd_array_get( $request, 'smbd_' . $this->field_slug . '_roles', array() );
66
67
		$key = array_search( 'none', $selected_roles, true );
68
		if ( false !== $key ) {
69
			unset( $selected_roles[ $key ] );
70
			$options['delete_users_with_no_role'] = true;
71
		}
72
73
		$options['selected_roles'] = $selected_roles;
74
75
		return $options;
76
	}
77
78
	/**
79
	 * Handle both users with roles and without roles.
80
	 *
81
	 * {@inheritdoc}
82
	 *
83
	 * @param array $options Array of Delete options.
84
	 *
85
	 * @return int Number of items that were deleted.
86
	 */
87 17
	protected function do_delete( $options ) {
88 17
		$users_with_roles_deleted = parent::do_delete( $options );
89
90 17
		if ( ! isset( $options['delete_users_with_no_role'] ) ) {
91 15
			return $users_with_roles_deleted;
92
		}
93
94 2
		return $users_with_roles_deleted + $this->delete_users_with_no_roles( $options );
95
	}
96
97
	/**
98
	 * Delete users with no roles.
99
	 *
100
	 * @since 6.0.0
101
	 *
102
	 * @param array $options User options.
103
	 *
104
	 * @return int Number of users that were deleted.
105
	 */
106 2
	protected function delete_users_with_no_roles( $options ) {
107 2
		$query = $this->build_query_for_deleting_users_with_no_roles( $options );
108
109 2
		if ( empty( $query ) ) {
110
			// Short circuit deletion, if nothing needs to be deleted.
111
			return 0;
112
		}
113
114 2
		$query = $this->exclude_users_from_deletion( $query );
115 2
		$query = $this->exclude_current_user( $query );
116
117 2
		return $this->delete_users_from_query( $query, $options );
118
	}
119
120
	/**
121
	 * Build query params for WP_User_Query by using delete options for deleting users with no roles.
122
	 *
123
	 * Return an empty query array to short-circuit deletion.
124
	 *
125
	 * @since 6.0.0
126
	 *
127
	 * @param array $options Delete options.
128
	 *
129
	 * @return array Query.
130
	 */
131 2
	protected function build_query_for_deleting_users_with_no_roles( $options ) {
132
		// Users with no role is not selected.
133 2
		if ( ! isset( $options['delete_users_with_no_role'] ) || ! $options['delete_users_with_no_role'] ) {
134
			return array();
135
		}
136
137 2
		$roles      = get_editable_roles();
138 2
		$role_names = array_keys( $roles );
139
140
		$query = array(
141 2
			'role__not_in' => $role_names,
142 2
			'number'       => $options['limit_to'],
143
		);
144
145 2
		$date_query = $this->get_date_query( $options );
146
147 2
		if ( ! empty( $date_query ) ) {
148
			$query['date_query'] = $date_query;
149
		}
150
151 2
		return $query;
152
	}
153
154
	/**
155
	 * Build query params for WP_User_Query by using delete options.
156
	 *
157
	 * Return an empty query array to short-circuit deletion.
158
	 *
159
	 * @since 6.0.0
160
	 *
161
	 * @param array $options Delete options.
162
	 *
163
	 * @return array Query.
164
	 */
165 17
	protected function build_query( $options ) {
166
		// No role is selected.
167 17
		if ( empty( $options['selected_roles'] ) ) {
168 2
			return array();
169
		}
170
171
		$query = array(
172 15
			'role__in' => $options['selected_roles'],
173 15
			'number'   => $options['limit_to'],
174
		);
175
176 15
		$date_query = $this->get_date_query( $options );
177
178 15
		if ( ! empty( $date_query ) ) {
179 5
			$query['date_query'] = $date_query;
180
		}
181
182 15
		return $query;
183
	}
184
185
	protected function append_to_js_array( $js_array ) {
186
		$js_array['validators'][ $this->action ] = 'validateUserRole';
187
188
		$js_array['pre_action_msg'][ $this->action ] = 'deleteUsersWarning';
189
		$js_array['msg']['deleteUsersWarning']       = __( 'Are you sure you want to delete all the users from the selected user role?', 'bulk-delete' );
190
191
		$js_array['error_msg'][ $this->action ] = 'selectOneUserRole';
192
		$js_array['msg']['selectOneUserRole']   = __( 'Select at least one user role from which users should be deleted', 'bulk-delete' );
193
194
		return $js_array;
195
	}
196
197
	protected function get_success_message( $items_deleted ) {
198
		/* translators: 1 Number of users deleted */
199
		return _n( 'Deleted %d user from the selected roles', 'Deleted %d users from the selected roles', $items_deleted, 'bulk-delete' );
200
	}
201
}
202