PluginProbe
AutomatorWP – No-Code Workflow Automation, Integration & Webhooks Plugin, now with AI / 6.0.2
AutomatorWP – No-Code Workflow Automation, Integration & Webhooks Plugin, now with AI v6.0.2
6.0.2 6.0.1 6.0.0 5.8.6 5.8.5 5.8.4 5.8.3 5.8.2 5.8.1 5.8.0 5.7.9.2 5.7.9.1 5.7.8 5.7.9 5.7.6 5.7.7 5.7.5 5.7.4 5.7.3 5.7.2 5.7.1 trunk 5.6.0 5.6.1 5.6.2 All 33 releases
automatorwp / integrations / wordpress / actions / delete-multiple-posts.php

delete-multiple-posts.php in AutomatorWP – No-Code Workflow Automation, Integration & Webhooks Plugin, now with AI 6.0.2, at integrations/wordpress/actions/delete-multiple-posts.php

365 lines 13.3 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 /**
3 * Delete Multiple Posts
4 *
5 * @package AutomatorWP\Integrations\WordPress\Actions\Delete_Multiple_Posts
6 * @author AutomatorWP <contact@automatorwp.com>, Ruben Garcia <rubengcdev@gmail.com>
7 * @since 1.0.0
8 */
9 // Exit if accessed directly
10 if( !defined( 'ABSPATH' ) ) exit;
11
12 class AutomatorWP_WordPress_Delete_Multiple_Posts extends AutomatorWP_Integration_Action {
13
14 /**
15 * Initialize the trigger
16 *
17 * @since 1.0.0
18 */
19 public function __construct( $integration ) {
20
21 $this->integration = $integration;
22 $this->action = $integration . '_delete_multiple_posts';
23
24 parent::__construct();
25
26 }
27
28 /**
29 * The post field conditions
30 *
31 * @since 1.0.0
32 *
33 * @var array $field_conditions
34 */
35 public $field_conditions = array();
36
37 /**
38 * The post meta conditions
39 *
40 * @since 1.0.0
41 *
42 * @var array $meta_conditions
43 */
44 public $meta_conditions = array();
45
46 /**
47 * The post meta
48 *
49 * @since 1.0.0
50 *
51 * @var array $post_meta
52 */
53 public $post_meta = array();
54
55 /**
56 * Store the action result
57 *
58 * @since 1.0.0
59 *
60 * @var string $result
61 */
62 public $result = '';
63
64 /**
65 * Register the trigger
66 *
67 * @since 1.0.0
68 */
69 public function register() {
70
71 $post_type_options = array();
72
73 foreach( get_post_types( array(), 'objects' ) as $post_type ) {
74 /* translators: %1$s: Post type key (post, page). %2$s: Post type name (Post, Page). */
75 $post_type_options[] = sprintf( __( '<code>%1$s</code> for %2$s', 'automatorwp' ), $post_type->name, $post_type->labels->name );
76 }
77
78 $post_status_options = array();
79
80 foreach( get_post_statuses() as $post_status => $post_status_label ) {
81 /* translators: %1$s: Post status key (draft, pending). %2$s: Post status label (Draft, Pending Review). */
82 $post_status_options[] = sprintf( __( '<code>%1$s</code> for %2$s', 'automatorwp' ), $post_status, $post_status_label );
83 }
84
85 automatorwp_register_action( $this->action, array(
86 'integration' => $this->integration,
87 'label' => __( 'Delete multiple posts', 'automatorwp' ),
88 'select_option' => __( 'Delete <strong>multiple posts</strong>', 'automatorwp' ),
89 /* translators: %1$s: Multiple Posts. */
90 'edit_label' => sprintf( __( 'Delete %1$s', 'automatorwp' ), '{conditions}' ),
91 /* translators: %1$s: Multiple Posts. */
92 'log_label' => sprintf( __( 'Delete %1$s', 'automatorwp' ), '{conditions}' ),
93 'options' => array(
94 'conditions' => array(
95 'default' => __( 'multiple posts', 'automatorwp' ),
96 'fields' => array(
97 'post_field_conditions' => array(
98 'name' => __( 'Field Conditions:', 'automatorwp' ),
99 'desc' => __( 'Set conditions to filter posts to update by post fields.', 'automatorwp' ),
100 'type' => 'group',
101 'classes' => 'automatorwp-fields-table',
102 'options' => array(
103 'add_button' => __( 'Add condition', 'automatorwp' ),
104 'remove_button' => '<span class="dashicons dashicons-no-alt"></span>',
105 ),
106 'fields' => array(
107 'field' => array(
108 'name' => __( 'Field:', 'automatorwp' ),
109 'type' => 'select',
110 'options_cb' => 'automatorwp_options_cb_post_fields',
111 'option_none' => true,
112 'option_none_value' => '',
113 'option_none_label' => __( 'Choose a field', 'automatorwp' ),
114 'default' => ''
115 ),
116 'condition' => automatorwp_utilities_condition_field(),
117 'value' => array(
118 'name' => __( 'Value:', 'automatorwp' ),
119 'type' => 'text',
120 'default' => ''
121 ),
122 ),
123 ),
124 'post_meta_conditions' => array(
125 'name' => __( 'Meta Conditions:', 'automatorwp' ),
126 'desc' => __( 'Set conditions to filter posts to update by post metas.', 'automatorwp' ),
127 'type' => 'group',
128 'classes' => 'automatorwp-fields-table',
129 'options' => array(
130 'add_button' => __( 'Add condition', 'automatorwp' ),
131 'remove_button' => '<span class="dashicons dashicons-no-alt"></span>',
132 ),
133 'fields' => array(
134 'meta_key' => array(
135 'name' => __( 'Meta Key:', 'automatorwp' ),
136 'type' => 'text',
137 'default' => ''
138 ),
139 'condition' => automatorwp_utilities_condition_field(),
140 'meta_value' => array(
141 'name' => __( 'Meta Value:', 'automatorwp' ),
142 'type' => 'text',
143 'default' => ''
144 ),
145 ),
146 ),
147 )
148 ),
149 ),
150 ) );
151
152 }
153
154 /**
155 * Action execution function
156 *
157 * @since 1.0.0
158 *
159 * @param stdClass $action The action object
160 * @param int $user_id The user ID
161 * @param array $action_options The action's stored options (with tags already passed)
162 * @param stdClass $automation The action's automation object
163 */
164 public function execute( $action, $user_id, $action_options, $automation ) {
165
166 $this->result = '';
167 $this->field_conditions = array();
168 $this->meta_conditions = array();
169 $this->post_meta = array();
170
171 global $wpdb;
172
173 // Filter the posts
174 $field_conditions = $action_options['post_field_conditions'];
175 $meta_conditions = $action_options['post_meta_conditions'];
176
177 $joins = array();
178 $where = array();
179
180 // Setup the post field conditions
181 foreach( $field_conditions as $condition ) {
182
183 // Parse automation tags replacements to both, key and value
184 $field = automatorwp_parse_automation_tags( $automation->id, $user_id, $condition['field'] );
185 $value = automatorwp_parse_automation_tags( $automation->id, $user_id, $condition['value'] );
186
187 // Sanitize
188 $field = sanitize_text_field( $field );
189 $value = sanitize_text_field( $value );
190
191 if( ! empty( $field ) ) {
192 $where[] = automatorwp_utilities_parse_condition_to_sql( 'p.' . $field, $condition['condition'], $value );
193
194 $this->field_conditions[] = array(
195 'field' => $field,
196 'condition' => $condition['condition'],
197 'value' => $value,
198 );
199 }
200 }
201
202 // Setup the post meta conditions
203 foreach( $meta_conditions as $condition ) {
204
205 // Parse automation tags replacements to both, key and value
206 $meta_key = automatorwp_parse_automation_tags( $automation->id, $user_id, $condition['meta_key'] );
207 $meta_value = automatorwp_parse_automation_tags( $automation->id, $user_id, $condition['meta_value'] );
208
209 // Sanitize
210 $meta_key = sanitize_text_field( $meta_key );
211 $meta_value = sanitize_text_field( $meta_value );
212
213 if( ! empty( $meta_key ) ) {
214 $index = count( $joins );
215
216 $joins[] = "INNER JOIN {$wpdb->postmeta} AS pm{$index} ON ( pm{$index}.post_id = p.ID AND pm{$index}.meta_key = '{$meta_key}' )";
217
218 $where[] = automatorwp_utilities_parse_condition_to_sql( "pm{$index}.meta_value", $condition['condition'], $meta_value, false );
219
220 $this->meta_conditions[] = array(
221 'meta_key' => $meta_key,
222 'condition' => $condition['condition'],
223 'meta_value' => $meta_value,
224 );
225 }
226 }
227
228 // Turn arrays into strings
229 $joins = implode( ' ', $joins );
230 $where = ( ! empty( $where ) ? 'WHERE ( ' . implode( ' ) AND ( ', $where ) . ' ) ' : '' );
231
232 $sql = "SELECT p.ID
233 FROM {$wpdb->posts} AS p
234 {$joins}
235 {$where}";
236
237 $post_ids = $wpdb->get_col( $sql );
238
239 // Bail if not posts found
240 if( count( $post_ids ) === 0 ) {
241 $this->result = __( 'No posts found to be deleted.', 'automatorwp' );
242 return;
243 }
244
245 // Delete the posts
246 foreach( $post_ids as $post_id ) {
247
248 wp_delete_post( $post_id, true );
249
250 }
251
252 $this->result = sprintf( __( '%d posts deleted.', 'automatorwp' ), count( $post_ids ) );
253
254 }
255
256 /**
257 * Register required hooks
258 *
259 * @since 1.0.0
260 */
261 public function hooks() {
262
263 // Log meta data
264 add_filter( 'automatorwp_user_completed_action_log_meta', array( $this, 'log_meta' ), 10, 5 );
265
266 // Log fields
267 add_filter( 'automatorwp_log_fields', array( $this, 'log_fields' ), 10, 5 );
268
269 parent::hooks();
270 }
271
272 /**
273 * Action custom log meta
274 *
275 * @since 1.0.0
276 *
277 * @param array $log_meta Log meta data
278 * @param stdClass $action The action object
279 * @param int $user_id The user ID
280 * @param array $action_options The action's stored options (with tags already passed)
281 * @param stdClass $automation The action's automation object
282 *
283 * @return array
284 */
285 public function log_meta( $log_meta, $action, $user_id, $action_options, $automation ) {
286
287 // Bail if action type don't match this action
288 if( $action->type !== $this->action ) {
289 return $log_meta;
290 }
291
292 // Store the filters applied
293 $log_meta['field_conditions'] = $this->field_conditions;
294 $log_meta['field_conditions_parsed'] = '';
295
296 foreach( $this->field_conditions as $condition ) {
297 $log_meta['field_conditions_parsed'] .= sprintf( '%s %s %s',
298 $condition['field'],
299 automatorwp_utilities_get_condition_label( $condition['condition'] ),
300 $condition['value']
301 ) . "<br>";
302 }
303
304 $log_meta['meta_conditions'] = $this->meta_conditions;
305 $log_meta['meta_conditions_parsed'] = '';
306
307 foreach( $this->meta_conditions as $condition ) {
308 $log_meta['meta_conditions_parsed'] .= sprintf( '%s %s %s',
309 $condition['meta_key'],
310 automatorwp_utilities_get_condition_label( $condition['condition'] ),
311 $condition['meta_value']
312 ) . "<br>";
313 }
314
315 // Store result
316 $log_meta['result'] = $this->result;
317
318 return $log_meta;
319 }
320
321 /**
322 * Action custom log fields
323 *
324 * @since 1.0.0
325 *
326 * @param array $log_fields The log fields
327 * @param stdClass $log The log object
328 * @param stdClass $object The trigger/action/automation object attached to the log
329 *
330 * @return array
331 */
332 public function log_fields( $log_fields, $log, $object ) {
333
334 // Bail if log is not assigned to an action
335 if( $log->type !== 'action' || $object->type !== $this->action )
336 return $log_fields;
337
338 $log_fields['posts_found_info'] = array(
339 'name' => __( 'Posts Filtered', 'automatorwp' ),
340 'desc' => __( 'Information about the filters applied and the posts found.', 'automatorwp' ),
341 'type' => 'title',
342 );
343
344 $log_fields['field_conditions_parsed'] = array(
345 'name' => __( 'Field conditions:', 'automatorwp' ),
346 'type' => 'text',
347 );
348
349 $log_fields['meta_conditions_parsed'] = array(
350 'name' => __( 'Meta conditions:', 'automatorwp' ),
351 'type' => 'text',
352 );
353
354 $log_fields['result'] = array(
355 'name' => __( 'Result:', 'automatorwp' ),
356 'type' => 'text',
357 );
358
359 return $log_fields;
360 }
361
362 }
363
364 new AutomatorWP_WordPress_Delete_Multiple_Posts( 'wordpress' );
365 new AutomatorWP_WordPress_Delete_Multiple_Posts( 'posts' );