Passed
Push — 178-feature/delete-terms--by-p... ( 473746...d0fdef )
by Rajan
11:03
created

TermsModule::term_starts()   A

Complexity

Conditions 3
Paths 3

Size

Total Lines 13

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 12

Importance

Changes 0
Metric Value
cc 3
nc 3
nop 2
dl 0
loc 13
ccs 0
cts 11
cp 0
crap 12
rs 9.8333
c 0
b 0
f 0
1
<?php
2
namespace BulkWP\BulkDelete\Core\Terms;
3
4
use BulkWP\BulkDelete\Core\Base\BaseModule;
5
6
defined( 'ABSPATH' ) || exit; // Exit if accessed directly.
7
8
/**
9
 * Module for deleting terms.
10
 *
11
 * @since 6.0.0
12
 */
13
abstract class TermsModule extends BaseModule {
14
	/**
15
	 * Build query params for WP_Query by using delete options.
16
	 *
17
	 * Return an empty query array to short-circuit deletion.
18
	 *
19
	 * @param array $options Delete options.
20
	 *
21
	 * @return array Query.
22
	 */
23
	abstract protected function build_query( $options );
24
25
	protected $item_type = 'terms';
26
27
	/**
28
	 * Handle common filters.
29
	 *
30
	 * @param array $request Request array.
31
	 *
32
	 * @return array User options.
33
	 */
34
	protected function parse_common_filters( $request ) {
35
		$options = array();
36
37
		$options['restrict']     = bd_array_get_bool( $request, 'smbd_' . $this->field_slug . '_restrict', false );
38
		$options['limit_to']     = absint( bd_array_get( $request, 'smbd_' . $this->field_slug . '_limit_to', 0 ) );
39
		$options['force_delete'] = bd_array_get_bool( $request, 'smbd_' . $this->field_slug . '_force_delete', false );
40
41
		$options['date_op'] = bd_array_get( $request, 'smbd_' . $this->field_slug . '_op' );
42
		$options['days']    = absint( bd_array_get( $request, 'smbd_' . $this->field_slug . '_days' ) );
43
44
		return $options;
45
	}
46
47
	public function filter_js_array( $js_array ) {
48
		return $js_array;
49
	}
50
51
	protected function do_delete( $options ) {
52
		$query = $this->build_query( $options );
53
54
		if ( empty( $query ) ) {
55
			// Short circuit deletion, if nothing needs to be deleted.
56
			return 0;
57
		}
58
59
		return $this->delete_terms_from_query( $query, $options );
60
	}
61
62
	/**
63
	 * Build the query using query params and then Delete posts.
64
	 *
65
	 * @param array $query   Params for WP Query.
66
	 * @param array $options Delete Options.
67
	 *
68
	 * @return int Number of posts deleted.
69
	 */
70
	protected function delete_terms_from_query( $query, $options ) {
71
		$term_ids = bd_term_query( $query, $options['taxonomy'] );
0 ignored issues
show
Bug introduced by
The function bd_term_query was not found. Maybe you did not declare it correctly or list all dependencies? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

71
		$term_ids = /** @scrutinizer ignore-call */ bd_term_query( $query, $options['taxonomy'] );
Loading history...
72
73
		return $this->delete_terms_by_id( $term_ids, $options );
74
	}
75
76
	/**
77
	 * Render the "private post" setting fields.
78
	 */
79
	protected function render_private_post_settings() {
80
		bd_render_private_post_settings( $this->field_slug );
81
	}
82
83
	/**
84
	 * Delete terms by ids.
85
	 *
86
	 * @param int[] $term_ids List of term ids to delete.
87
	 * @param mixed $options
88
	 *
89
	 * @return int Number of posts deleted.
90
	 */
91
	protected function delete_terms_by_id( $term_ids, $options ) {
92
		$count = 0;
93
		foreach ( $term_ids as $term_id ) {
94
			$term = get_term( $term_id, $options['taxonomy'] );
95
			if( isset( $options['no_posts'] ) ){
96
				if( $term->count == 0 ){
0 ignored issues
show
Bug introduced by
The property count does not seem to exist on WP_Error.
Loading history...
97
					wp_delete_term( $term_id, $options['taxonomy'] );
98
					$count++;
99
				}
100
			}else{
101
				wp_delete_term( $term_id, $options['taxonomy'] );
102
				$count++;
103
			}
104
		}
105
106
		return $count;
107
	}
108
109
	protected function bd_starts_with($haystack, $needle){
110
	     $length = strlen($needle);
111
112
	     return (substr($haystack, 0, $length) === $needle);
113
	}
114
115
	protected function bd_ends_with($haystack, $needle){
116
	    $length = strlen($needle);
117
118
	    return $length === 0 ||
119
	    (substr($haystack, -$length) === $needle);
120
	}
121
122
	protected function term_starts( $term_text , $options ){
123
		$term_ids = array();
124
		$terms    = get_terms( $options['taxonomy'], array(
125
		    'hide_empty' => false,
126
		) );
127
128
		foreach( $terms as $term ){
129
			if( $this->bd_starts_with( $term->name, $term_text ) ){
130
				$term_ids[] = $term->term_id;
131
			}
132
		}
133
134
		return $term_ids;
135
	}
136
137
	protected function term_ends( $term_text , $options ){
138
		$term_ids = array();
139
		$terms    = get_terms( $options['taxonomy'], array(
140
		    'hide_empty' => false,
141
		) );
142
143
		foreach( $terms as $term ){
144
			if( $this->bd_ends_with( $term->name, $term_text ) ){
145
				$term_ids[] = $term->term_id;
146
			}
147
		}
148
149
		return $term_ids;
150
	}
151
152
	protected function term_contains( $term_text , $options ){
153
		$term_ids = array();
154
		$terms    = get_terms( $options['taxonomy'], array(
155
		    'hide_empty' => false,
156
		) );
157
158
		foreach( $terms as $term ){
159
			if ( strpos( $term->name, $term_text ) !== false ) {
160
				$term_ids[] = $term->term_id;
161
			}
162
		}
163
164
		return $term_ids;
165
	}
166
	protected function term_count_query( $options ){
167
		$term_ids = array();
168
		$terms    = get_terms( $options['taxonomy'], array(
169
		    'hide_empty' => false,
170
		) );
171
172
		foreach( $terms as $term ){
173
			$args = array(
174
				'post_type' => 'post',
175
				'tax_query' => array(
176
					array(
177
						'taxonomy' => $options['taxonomy'],
178
						'field'    => 'slug',
179
						'terms'    => $term->slug,
180
					),
181
				),
182
			);
183
184
			$posts = get_posts($args);
185
186
			if( count($posts) == $options['term_text'] && $options['term_opt'] == 'equal_to' ){
187
				$term_ids[] = $term->term_id;
188
			}elseif( count($posts) != $options['term_text'] && $options['term_opt'] == 'not_equal_to' ){
189
				$term_ids[] = $term->term_id;
190
			}elseif( count($posts) < $options['term_text'] && $options['term_opt'] == 'less_than' ){
191
				$term_ids[] = $term->term_id;
192
			}elseif( count($posts) > $options['term_text'] && $options['term_opt'] == 'greater_than' ){
193
				$term_ids[] = $term->term_id;
194
			}
195
		}
196
197
		return $term_ids;
198
	}
199
200
	/**
201
	 * Wrapper for WP_Term.
202
	 *
203
	 * Adds some performance enhancing defaults.
204
	 *
205
	 * @since  6.0
206
	 *
207
	 * @param array $options  List of options
208
	 * @param mixed $taxonomy
209
	 *
210
	 * @return array Result array
211
	 */
212
	function term_query( $options, $taxonomy ) {
0 ignored issues
show
Best Practice introduced by
It is generally recommended to explicitly declare the visibility for methods.

Adding explicit visibility (private, protected, or public) is generally recommend to communicate to other developers how, and from where this method is intended to be used.

Loading history...
213
		$defaults = array(
214
			'fields'                 => 'ids', // retrieve only ids
215
			'taxonomy'				           => $taxonomy,
216
			'hide_empty'			          => 0,
217
			'count'					             => true,
218
		);
219
		$options = wp_parse_args( $options, $defaults );
220
221
		$term_query = new WP_Term_Query();
0 ignored issues
show
Bug introduced by
The type BulkWP\BulkDelete\Core\Terms\WP_Term_Query was not found. Did you mean WP_Term_Query? If so, make sure to prefix the type with \.
Loading history...
222
223
		/**
224
		 * This action runs before the query happens.
225
		 *
226
		 * @since 5.5
227
		 * @since 5.6 added $term_query param.
228
		 *
229
		 * @param \WP_Query $term_query Query object.
230
		 */
231
		do_action( 'bd_before_term_query', $term_query );
232
233
		$terms = $term_query->query( $options );
234
235
		/**
236
		 * This action runs after the query happens.
237
		 *
238
		 * @since 5.5
239
		 * @since 5.6 added $term_query param.
240
		 *
241
		 * @param \WP_Query $term_query Query object.
242
		 */
243
		do_action( 'bd_after_term_query', $term_query );
244
245
		return $terms;
246
	}
247
}
248