Completed
Pull Request — dev/6.0.0 (#332)
by Rajan
13:59 queued 10:56
created

TermsModule   A

Complexity

Total Complexity 22

Size/Duplication

Total Lines 148
Duplicated Lines 0 %

Test Coverage

Coverage 0%

Importance

Changes 0
Metric Value
dl 0
loc 148
ccs 0
cts 87
cp 0
rs 10
c 0
b 0
f 0
wmc 22

11 Methods

Rating   Name   Duplication   Size   Complexity  
A delete_terms_by_id() 0 16 4
A filter_js_array() 0 2 1
A parse_common_filters() 0 11 1
A delete_terms_from_query() 0 4 1
A do_delete() 0 9 2
A render_private_post_settings() 0 2 1
A bd_ends_with() 0 5 2
A bd_starts_with() 0 3 1
A bd_term_ends() 0 12 3
A bd_term_contains() 0 12 3
A bd_term_starts() 0 12 3
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'] );
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
	     return (substr($haystack, 0, $length) === $needle);
112
	}
113
114
	protected function bd_ends_with($haystack, $needle){
115
	    $length = strlen($needle);
116
117
	    return $length === 0 || 
118
	    (substr($haystack, -$length) === $needle);
119
	}
120
121
	protected function bd_term_starts( $term_text , $options ){
122
		$term_ids = array();
123
		$terms = get_terms( $options['taxonomy'], array(
124
		    'hide_empty' => false,
125
		) );
126
127
		foreach( $terms as $term ){
128
			if( $this->bd_starts_with( $term->name, $term_text ) ){
129
				$term_ids[] = $term->term_id;
130
			}
131
		}
132
		return $term_ids;
133
	}
134
135
	protected function bd_term_ends( $term_text , $options ){
136
		$term_ids = array();
137
		$terms = get_terms( $options['taxonomy'], array(
138
		    'hide_empty' => false,
139
		) );
140
141
		foreach( $terms as $term ){
142
			if( $this->bd_ends_with( $term->name, $term_text ) ){
143
				$term_ids[] = $term->term_id;
144
			}
145
		}
146
		return $term_ids;
147
	}
148
149
	protected function bd_term_contains( $term_text , $options ){
150
		$term_ids = array();
151
		$terms = get_terms( $options['taxonomy'], array(
152
		    'hide_empty' => false,
153
		) );
154
155
		foreach( $terms as $term ){
156
			if ( strpos( $term->name, $term_text ) !== false ) {
157
				$term_ids[] = $term->term_id;
158
			}
159
		}
160
		return $term_ids;
161
	}
162
}
163