Completed
Push — 552-feature/reassign-contnet-o... ( ff18e1 )
by
unknown
05:02
created

PostsModule   A

Complexity

Total Complexity 14

Size/Duplication

Total Lines 175
Duplicated Lines 0 %

Test Coverage

Coverage 37.5%

Importance

Changes 0
Metric Value
eloc 48
dl 0
loc 175
ccs 21
cts 56
cp 0.375
rs 10
c 0
b 0
f 0
wmc 14

9 Methods

Rating   Name   Duplication   Size   Complexity  
A do_delete() 0 9 2
A query() 0 2 1
A build_query_options() 0 2 1
A filter_js_array() 0 21 1
A delete_posts_by_id() 0 12 3
A parse_common_filters() 0 12 1
A delete_posts_from_query() 0 27 1
A render_private_post_settings() 0 3 2
A delete_sticky_posts() 0 8 2
1
<?php
2
namespace BulkWP\BulkDelete\Core\Posts;
3
4
use BulkWP\BulkDelete\Core\Base\BaseModule;
5
6 1
defined( 'ABSPATH' ) || exit; // Exit if accessed directly.
7
8
/**
9
 * Module for deleting posts.
10
 *
11
 * @since 6.0.0
12
 */
13
abstract class PostsModule 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 = 'posts';
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['exclude_sticky'] = bd_array_get_bool( $request, 'smbd_' . $this->field_slug . '_exclude_sticky', false );
40
		$options['force_delete']   = bd_array_get_bool( $request, 'smbd_' . $this->field_slug . '_force_delete', false );
41
42
		$options['date_op'] = bd_array_get( $request, 'smbd_' . $this->field_slug . '_op' );
43
		$options['days']    = absint( bd_array_get( $request, 'smbd_' . $this->field_slug . '_days' ) );
44
45
		return $options;
46
	}
47
48
	public function filter_js_array( $js_array ) {
49
		$js_array['msg']['deletePostsWarning'] = __( 'Are you sure you want to delete all the posts based on the selected option?', 'bulk-delete' );
50
		$js_array['msg']['selectPostOption']   = __( 'Please select posts from at least one option', 'bulk-delete' );
51
52
		$js_array['validators']['delete_posts_by_category'] = 'validateSelect2';
53
		$js_array['error_msg']['delete_posts_by_category']  = 'selectCategory';
54
		$js_array['msg']['selectCategory']                  = __( 'Please select at least one category', 'bulk-delete' );
55
56
		$js_array['validators']['delete_posts_by_tag'] = 'validateSelect2';
57
		$js_array['error_msg']['delete_posts_by_tag']  = 'selectTag';
58
		$js_array['msg']['selectTag']                  = __( 'Please select at least one tag', 'bulk-delete' );
59
60
		$js_array['validators']['delete_posts_by_url'] = 'validateUrl';
61
		$js_array['error_msg']['delete_posts_by_url']  = 'enterUrl';
62
		$js_array['msg']['enterUrl']                   = __( 'Please enter at least one post url', 'bulk-delete' );
63
64
		$js_array['dt_iterators'][] = '_cats';
65
		$js_array['dt_iterators'][] = '_tags';
66
		$js_array['dt_iterators'][] = '_taxs';
67
68
		return $js_array;
69
	}
70
71
	/**
72
	 * Helper function to build the query params.
73
	 *
74
	 * @param array $options Delete Options.
75
	 * @param array $query   Params for WP Query.
76
	 *
77
	 * @return array Delete options array
78
	 */
79 168
	protected function build_query_options( $options, $query ) {
80 168
		return bd_build_query_options( $options, $query );
81
	}
82
83
	/**
84
	 * Helper function for bd_query which runs query.
85
	 *
86
	 * @param array $query Params for WP Query.
87
	 *
88
	 * @return array Deleted Post IDs array
89
	 */
90 168
	protected function query( $query ) {
91 168
		return bd_query( $query );
92
	}
93
94 155
	protected function do_delete( $options ) {
95 155
		$query = $this->build_query( $options );
96
97 155
		if ( empty( $query ) ) {
98
			// Short circuit deletion, if nothing needs to be deleted.
99
			return 0;
100
		}
101
102 155
		return $this->delete_posts_from_query( $query, $options );
103
	}
104
105
	/**
106
	 * Build the query using query params and then Delete posts.
107
	 *
108
	 * @param array $query   Params for WP Query.
109
	 * @param array $options Delete Options.
110
	 *
111
	 * @return int Number of posts deleted.
112
	 */
113 168
	protected function delete_posts_from_query( $query, $options ) {
114 168
		$query          = $this->build_query_options( $options, $query );
115 168
		$post_ids       = $this->query( $query );
116
117
		/**
118
		 * Triggered before the posts deletion, to get IDs of attachments associated with
119
		 * posts that are going to be deleted.
120
		 *
121
		 * @since 6.0.0
122
		 *
123
		 * @param array $post_ids List of post ids that are going to be deleted.
124
		 * @param array $options  List of Delete Options.
125
		 */
126 168
		do_action( 'bd_before_deleting_posts', $post_ids, $options );
127
128 168
		$delete_post_count = $this->delete_posts_by_id( $post_ids, $options['force_delete'] );
129
130
		/**
131
		 * Triggered after the posts are deleted.
132
		 *
133
		 * @since 6.0.0
134
		 *
135
		 * @param array $options Delete Options.
136
		 */
137 168
		do_action( 'bd_after_deleting_posts', $options );
138
139 168
		return $delete_post_count;
140
	}
141
142
	/**
143
	 * Render the "private post" setting fields.
144
	 */
145
	protected function render_private_post_settings() {
146
		if( $this->are_private_posts_present() ){
147
			bd_render_private_post_settings( $this->field_slug );
148
		}
149
	}
150
151
	/**
152
	 * Delete sticky posts.
153
	 *
154
	 * @param bool $force_delete Whether to bypass trash and force deletion.
155
	 *
156
	 * @return int Number of posts deleted.
157
	 */
158
	protected function delete_sticky_posts( $force_delete ) {
159
		$sticky_post_ids = get_option( 'sticky_posts' );
160
161
		if ( ! is_array( $sticky_post_ids ) ) {
162
			return 0;
163
		}
164
165
		return $this->delete_posts_by_id( $sticky_post_ids, $force_delete );
166
	}
167
168
	/**
169
	 * Delete posts by ids.
170
	 *
171
	 * @param int[] $post_ids     List of post ids to delete.
172
	 * @param bool  $force_delete True to force delete posts, False otherwise.
173
	 *
174
	 * @return int Number of posts deleted.
175
	 */
176 177
	protected function delete_posts_by_id( $post_ids, $force_delete ) {
177 177
		foreach ( $post_ids as $post_id ) {
178
			// `$force_delete` parameter to `wp_delete_post` won't work for custom post types.
179
			// See https://core.trac.wordpress.org/ticket/43672
180 127
			if ( $force_delete ) {
181 52
				wp_delete_post( $post_id, true );
182
			} else {
183 127
				wp_trash_post( $post_id );
184
			}
185
		}
186
187 177
		return count( $post_ids );
188
	}
189
}
190