Completed
Push — 137-feature/construct-post-mod... ( 2fadb4...c92423 )
by Maria Daniel Deepak
03:42
created

Bulk_Delete_Post_Meta::do_delete_post_meta()   B

Complexity

Conditions 3
Paths 3

Size

Total Lines 42
Code Lines 26

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 12

Importance

Changes 0
Metric Value
cc 3
eloc 26
nc 3
nop 0
dl 0
loc 42
ccs 0
cts 25
cp 0
crap 12
rs 8.8571
c 0
b 0
f 0
1
<?php
2
/**
3
 * Utility class for deleting Post Meta.
4
 *
5
 * @since      5.4
6
 *
7
 * @author     Sudar
8
 *
9
 * @package    BulkDelete\Meta
10
 */
11
class Bulk_Delete_Post_Meta {
12
	/**
13
	 * Box slug.
14
	 *
15
	 * @since 5.4
16
	 */
17
	const BOX_POST_META = 'bd-post-meta';
18
19
	/**
20
	 * Cron Hook.
21
	 *
22
	 * @since 5.4
23
	 */
24
	const CRON_HOOK     = 'do-bulk-delete-post-meta';
25
26
	/**
27
	 * Register post-meta meta box for delete meta page.
28
	 *
29
	 * @static
30
	 *
31
	 * @since 5.4
32
	 */
33
	public static function add_delete_post_meta_box() {
34
		$bd = BULK_DELETE();
35
36
		add_meta_box(
37
			self::BOX_POST_META,
38
			__( 'Bulk Delete Post Meta', 'bulk-delete' ),
39
			array( __CLASS__, 'render_delete_post_meta_box' ),
40
			$bd->meta_page,
41
			'advanced'
42
		);
43
	}
44
45
	/**
46
	 * Render delete post-meta meta box for delete meta page.
47
	 *
48
	 * @static
49
	 *
50
	 * @since 5.4
51
	 */
52
	public static function render_delete_post_meta_box() {
53
		if ( Bulk_Delete_Meta::is_meta_box_hidden( self::BOX_POST_META ) ) {
54
			printf( __( 'This section just got enabled. Kindly <a href = "%1$s">refresh</a> the page to fully enable it.', 'bulk-delete' ), 'admin.php?page=' . Bulk_Delete_meta::META_PAGE_SLUG );
55
56
			return;
57
		}
58
?>
59
        <!-- Post Meta box start-->
60
        <fieldset class="options">
61
<?php
62
		$types = get_post_types( array(
63
				'public'   => true,
64
				'_builtin' => false,
65
			), 'names'
66
		);
67
68
		array_unshift( $types, 'post' );
69
?>
70
        <h4><?php _e( 'Select the post type whose post meta fields you want to delete', 'bulk-delete' ); ?></h4>
71
        <table class="optiontable">
72
<?php
73
		foreach ( $types as $type ) {
74
?>
75
            <tr>
76
                <td>
77
                    <input name="smbd_pm_post_type" value = "<?php echo $type; ?>" type = "radio" class = "smbd_pm_post_type" <?php checked( $type, 'post' ); ?>>
78
                    <label for="smbd_pm_post_type"><?php echo $type; ?> </label>
79
                </td>
80
            </tr>
81
<?php
82
		}
83
?>
84
        </table>
85
86
        <h4><?php _e( 'Choose your post meta field settings', 'bulk-delete' ); ?></h4>
87
        <table class="optiontable">
88
            <tr>
89
                <td>
90
                    <input name="smbd_pm_use_value" value="false" type="radio" checked>
91
                    <label for="smbd_pm_use_value"><?php echo __( 'Delete based on post meta key name only', 'bulk-delete' ); ?></label>
92
                </td>
93
            </tr>
94
95
            <tr>
96
                <td>
97
                    <input name="smbd_pm_use_value" id="smbd_pm_use_value" value="true" type="radio" disabled>
98
                    <label for="smbd_pm_use_value"><?php echo __( 'Delete based on post meta key name and value', 'bulk-delete' ); ?></label>
99
                    <span class="bd-pm-pro" style="color:red; vertical-align: middle;">
100
                        <?php _e( 'Only available in Pro Addon', 'bulk-delete' ); ?> <a href = "http://bulkwp.com/addons/bulk-delete-post-meta/?utm_source=wpadmin&utm_campaign=BulkDelete&utm_medium=buynow&utm_content=bd-m-p" target="_blank">Buy now</a>
101
                    </span>
102
                </td>
103
            </tr>
104
105
            <tr>
106
                <td>
107
                    <label for="smbd_pm_key"><?php _e( 'Post Meta Key ', 'bulk-delete' ); ?></label>
108
                    <input name="smbd_pm_key" id="smbd_pm_key" placeholder="<?php _e( 'Meta Key', 'bulk-delete' ); ?>">
109
                </td>
110
            </tr>
111
        </table>
112
<?php
113
		/**
114
		 * Add more fields to the delete post meta field form.
115
		 * This hook can be used to add more fields to the delete post meta field form.
116
		 *
117
		 * @since 5.4
118
		 */
119
		do_action( 'bd_delete_post_meta_form' );
120
?>
121
        <table class="optiontable">
122
            <tr>
123
                <td>
124
                    <h4><?php _e( 'Choose your deletion options', 'bulk-delete' ); ?></h4>
125
                </td>
126
            </tr>
127
128
            <tr>
129
                <td>
130
                    <input name="smbd_pm_restrict" id="smbd_pm_restrict" value = "true" type = "checkbox" >
131
                    <?php _e( 'Only restrict to posts which are ', 'bulk-delete' );?>
132
                    <select name="smbd_pm_op" id="smbd_pm_op" disabled>
133
                        <option value ="before"><?php _e( 'older than', 'bulk-delete' );?></option>
134
                        <option value ="after"><?php _e( 'posted within last', 'bulk-delete' );?></option>
135
                    </select>
136
                    <input type ="textbox" name="smbd_pm_days" id="smbd_pm_days" disabled value ="0" maxlength="4" size="4"><?php _e( 'days', 'bulk-delete' );?>
137
                </td>
138
            </tr>
139
140
            <tr>
141
                <td>
142
                    <input name="smbd_pm_limit" id="smbd_pm_limit" value = "true" type = "checkbox">
143
                    <?php _e( 'Only delete post meta field from first ', 'bulk-delete' );?>
144
                    <input type ="textbox" name="smbd_pm_limit_to" id="smbd_pm_limit_to" disabled value ="0" maxlength="4" size="4"><?php _e( 'posts.', 'bulk-delete' );?>
145
                    <?php _e( 'Use this option if there are more than 1000 posts and the script timesout.', 'bulk-delete' ) ?>
146
                </td>
147
            </tr>
148
149
            <tr>
150
                <td>
151
                    <input name="smbd_pm_cron" value = "false" type = "radio" checked="checked"> <?php _e( 'Delete now', 'bulk-delete' ); ?>
152
                    <input name="smbd_pm_cron" value = "true" type = "radio" id = "smbd_pm_cron" disabled > <?php _e( 'Schedule', 'bulk-delete' ); ?>
153
                    <input name="smbd_pm_cron_start" id = "smbd_pm_cron_start" value = "now" type = "text" disabled><?php _e( 'repeat ', 'bulk-delete' );?>
154
                    <select name="smbd_pm_cron_freq" id = "smbd_pm_cron_freq" disabled>
155
                        <option value = "-1"><?php _e( "Don't repeat", 'bulk-delete' ); ?></option>
156
<?php
157
		$schedules = wp_get_schedules();
158
		foreach ( $schedules as $key => $value ) {
159
?>
160
                        <option value = "<?php echo $key; ?>"><?php echo $value['display']; ?></option>
161
<?php
162
		}
163
?>
164
                    </select>
165
                    <span class="bd-pm-pro" style="color:red">
166
                        <?php _e( 'Only available in Pro Addon', 'bulk-delete' ); ?> <a href = "http://bulkwp.com/addons/bulk-delete-post-meta/?utm_source=wpadmin&utm_campaign=BulkDelete&utm_medium=buynow&utm_content=bd-m-p">Buy now</a>
167
                    </span>
168
                </td>
169
            </tr>
170
171
            <tr>
172
                <td>
173
                    <?php _e( 'Enter time in Y-m-d H:i:s format or enter now to use current time', 'bulk-delete' );?>
174
                </td>
175
            </tr>
176
177
        </table>
178
        </fieldset>
179
180
        <p>
181
            <button type="submit" name="bd_action" value="delete_meta_post" class="button-primary"><?php _e( 'Bulk Delete ', 'bulk-delete' ) ?>&raquo;</button>
182
        </p>
183
        <!-- Post Meta box end-->
184
<?php
185
	}
186
187
	/**
188
	 * Filter JS Array and add validation hooks.
189
	 *
190
	 * @since 5.4
191
	 * @static
192
	 *
193
	 * @param array $js_array JavaScript Array
194
	 *
195
	 * @return array Modified JavaScript Array
196
	 */
197
	public static function filter_js_array( $js_array ) {
198
		$js_array['dt_iterators'][]                 = '_pm';
199
		$js_array['validators']['delete_meta_post'] = 'noValidation';
200
201
		$js_array['pre_action_msg']['delete_meta_post'] = 'deletePMWarning';
202
		$js_array['msg']['deletePMWarning']             = __( 'Are you sure you want to delete all the post meta fields that match the selected filters?', 'bulk-delete' );
203
204
		return $js_array;
205
	}
206
207
	/**
208
	 * Controller for deleting post meta fields.
209
	 *
210
	 * @static
211
	 *
212
	 * @since  5.4
213
	 */
214
	public static function do_delete_post_meta() {
215
		$delete_options              = array();
216
		$delete_options['post_type'] = esc_sql( array_get( $_POST, 'smbd_pm_post_type', 'post' ) );
217
218
		$delete_options['use_value'] = array_get_bool( $_POST, 'smbd_pm_use_value', false );
219
		$delete_options['meta_key']  = esc_sql( array_get( $_POST, 'smbd_pm_key', '' ) );
220
221
		$delete_options['limit_to']  = absint( array_get( $_POST, 'smbd_pm_limit_to', 0 ) );
222
223
		$delete_options['restrict']  = array_get_bool( $_POST, 'smbd_pm_restrict', false );
224
		$delete_options['op']        = esc_sql( array_get( $_POST, 'smbd_pm_op', 'before' ) );
225
		$delete_options['days']      = absint( array_get( $_POST, 'smbd_pm_days', 0 ) );
226
227
		/**
228
		 * Delete post-meta delete options filter.
229
		 * This filter is for processing filtering options for deleting post meta.
230
		 *
231
		 * @since 5.4
232
		 */
233
		$delete_options = apply_filters( 'bd_delete_post_meta_options', $delete_options, $_POST );
234
235
		if ( 'true' == array_get( $_POST, 'smbd_pm_cron', 'false' ) ) {
236
			$freq = $_POST['smbd_pm_cron_freq'];
237
			$time = strtotime( $_POST['smbd_pm_cron_start'] ) - ( get_option( 'gmt_offset' ) * 60 * 60 );
238
239
			if ( $freq == -1 ) {
240
				wp_schedule_single_event( $time, self::CRON_HOOK, array( $delete_options ) );
241
			} else {
242
				wp_schedule_event( $time, $freq, self::CRON_HOOK, array( $delete_options ) );
243
			}
244
			$msg = __( 'Post meta fields from the posts with the selected criteria are scheduled for deletion.', 'bulk-delete' ) . ' ' .
245
				sprintf( __( 'See the full list of <a href = "%s">scheduled tasks</a>' , 'bulk-delete' ), get_bloginfo( 'wpurl' ) . '/wp-admin/admin.php?page=' . Bulk_Delete::CRON_PAGE_SLUG );
246
		} else {
247
			$deleted_count = self::delete_post_meta( $delete_options );
248
			$msg           = sprintf( _n( 'Deleted post meta field from %d post', 'Deleted post meta field from %d posts' , $deleted_count, 'bulk-delete' ), $deleted_count );
249
		}
250
251
		add_settings_error(
252
			Bulk_Delete_Meta::META_PAGE_SLUG,
253
			'deleted-posts',
254
			$msg,
255
			'updated'
256
		);
257
	}
258
259
	/**
260
	 * Delete Post Meta.
261
	 *
262
	 * @static
263
	 *
264
	 * @since  5.4
265
	 *
266
	 * @param array $delete_options Options for deleting
267
	 *
268
	 * @return int Number of posts that were deleted
269
	 */
270
	public static function delete_post_meta( $delete_options ) {
271
		$count     = 0;
272
		$post_type = $delete_options['post_type'];
273
		$limit_to  = $delete_options['limit_to'];
274
		$meta_key  = $delete_options['meta_key'];
275
		$use_value = $delete_options['use_value'];
276
		$restrict  = $delete_options['restrict'];
277
		$days      = $delete_options['days'];
278
		$op        = $delete_options['op'];
279
280
		$options = array(
281
			'post_status' => 'publish',
282
			'post_type'   => $post_type,
283
		);
284
285
		if ( $limit_to > 0 ) {
286
			$options['showposts'] = $limit_to;
287
		} else {
288
			$options['nopaging'] = 'true';
289
		}
290
291
		if ( $restrict ) {
292
			$options['date_query'] = array(
293
				array(
294
					'column' => 'post_date',
295
					$op      => "{$days} day ago",
296
				),
297
			);
298
		}
299
300
		if ( $use_value ) {
301
			$options['meta_query'] = apply_filters( 'bd_delete_post_meta_query', array(), $delete_options );
302
		} else {
303
			$options['meta_key'] = $meta_key;
304
		}
305
306
		$post_ids = bd_query( $options );
307
		foreach ( $post_ids as $post_id ) {
308
			if ( delete_post_meta( $post_id, $meta_key ) ) {
309
				$count++;
310
			}
311
		}
312
313
		return $count;
314
	}
315
}
316
317
// hooks
318 1
add_action( 'bd_add_meta_box_for_meta', array( 'Bulk_Delete_Post_Meta', 'add_delete_post_meta_box' ) );
319 1
add_action( 'bd_delete_meta_post', array( 'Bulk_Delete_Post_Meta', 'do_delete_post_meta' ) );
320
321 1
add_filter( 'bd_javascript_array', array( 'Bulk_Delete_Post_Meta', 'filter_js_array' ) );
322
?>
323