Issues (4138)

classes/class-scpo-engine.php (3 issues)

1
<?php
2
3
namespace lsx_health_plan\classes;
4
5
class SCPO_Engine {
6
7
	/**
8
	 * Holds class instance
9
	 *
10
	 * @since 1.0.0
11
	 *
12
	 * @var      object \lsx_health_plan\classes\SCPO_Engine()
13
	 */
14
	protected static $instance = null;
15
16
	/**
17
	 * Return an instance of this class.
18
	 *
19
	 * @since 1.0.0
20
	 *
21
	 * @return    object \lsx_health_plan\classes\SCPO_Engine()    A single instance of this class.
22
	 */
23
	public static function get_instance() {
24
		// If the single instance hasn't been set, set it now.
25
		if ( null == self::$instance ) {
26
			self::$instance = new self;
27
		}
28
		return self::$instance;
29
	}
30
31
	public function __construct() {
32
		if ( ! get_option( 'lsx_to_scporder_install' ) ) {
33
			$this->lsx_to_scporder_install();
34
		}
35
36
		add_action( 'admin_init', array( $this, 'refresh' ) );
37
		add_action( 'admin_init', array( $this, 'load_script_css' ) );
38
39
		add_action( 'wp_ajax_update-menu-order', array(
40
			$this,
41
			'update_menu_order',
42
		) );
43
		add_action( 'wp_ajax_update-menu-order-tags', array(
44
			$this,
45
			'update_menu_order_tags',
46
		) );
47
48
		add_action( 'pre_get_posts', array(
49
			$this,
50
			'lsx_to_scporder_pre_get_posts',
51
		) );
52
53
		add_filter( 'get_previous_post_where', array(
54
			$this,
55
			'lsx_to_scporder_previous_post_where',
56
		) );
57
		add_filter( 'get_previous_post_sort', array(
58
			$this,
59
			'lsx_to_scporder_previous_post_sort',
60
		) );
61
		add_filter( 'get_next_post_where', array(
62
			$this,
63
			'lsx_to_scporder_next_post_where',
64
		) );
65
		add_filter( 'get_next_post_sort', array(
66
			$this,
67
			'lsx_to_scporder_next_post_sort',
68
		) );
69
70
		add_filter( 'get_terms_orderby', array(
71
			$this,
72
			'lsx_to_scporder_get_terms_orderby',
73
		), 10, 3 );
74
		add_filter( 'wp_get_object_terms', array(
75
			$this,
76
			'lsx_to_scporder_get_object_terms',
77
		), 10, 4 );
78
		add_filter( 'get_terms', array(
79
			$this,
80
			'lsx_to_scporder_get_object_terms',
81
		), 10, 4 );
82
	}
83
84
	public function lsx_to_scporder_install() {
85
		global $wpdb;
86
		$result = $wpdb->query( "DESCRIBE $wpdb->terms `lsx_to_term_order`" );
87
88
		if ( ! $result ) {
89
			$result = $wpdb->query( "ALTER TABLE $wpdb->terms ADD `lsx_to_term_order` INT(4) NULL DEFAULT '0'" );
90
		}
91
92
		update_option( 'lsx_to_scporder_install', 1 );
93
	}
94
95
	public function _check_load_script_css() {
96
		$active = false;
97
98
		$objects = $this->get_to_scporder_options_objects();
99
		$tags    = $this->get_to_scporder_options_tags();
100
101
		if ( empty( $objects ) && empty( $tags ) ) {
102
			return false;
103
		}
104
105
		if ( isset( $_GET['orderby'] ) || strstr( sanitize_text_field( $_SERVER['REQUEST_URI'] ), 'action=edit' ) || strstr( sanitize_text_field( $_SERVER['REQUEST_URI'] ), 'wp-admin/post-new.php' ) ) {
106
			return false;
107
		}
108
109
		if ( ! empty( $objects ) ) {
110
			if ( isset( $_GET['post_type'] ) && ! isset( $_GET['taxonomy'] ) && array_key_exists( sanitize_text_field( $_GET['post_type'] ), $objects ) ) { // if page or custom post types
111
				$active = true;
112
			}
113
			if ( ! isset( $_GET['post_type'] ) && strstr( sanitize_text_field( $_SERVER['REQUEST_URI'] ), 'wp-admin/edit.php' ) && array_key_exists( 'post', $objects ) ) { // if post
114
				$active = true;
115
			}
116
		}
117
118
		if ( ! empty( $tags ) ) {
119
			if ( isset( $_GET['taxonomy'] ) && array_key_exists( sanitize_text_field( $_GET['taxonomy'] ), $tags ) ) {
120
				$active = true;
121
			}
122
		}
123
124
		return $active;
125
	}
126
127
	public function load_script_css() {
128
		if ( $this->_check_load_script_css() ) {
129
			wp_enqueue_script( 'scporderjs', LSX_HEALTH_PLAN_URL . '/assets/js/scporder.min.js', array( 'jquery', 'jquery-ui-sortable' ), null, true );
130
131
			$scporderjs_params = array(
132
				'ajax_url'   => admin_url( 'admin-ajax.php' ),
133
				'ajax_nonce' => wp_create_nonce( 'scporder' ),
134
			);
135
136
			wp_localize_script( 'scporderjs', 'scporderjs_params', $scporderjs_params );
137
138
			wp_enqueue_style( 'scporder', LSX_HEALTH_PLAN_URL . '/assets/css/scporder.css', array(), null );
139
			wp_style_add_data( 'scporder', 'rtl', 'replace' );
140
		}
141
	}
142
143
	public function refresh() {
144
		global $wpdb;
145
		$objects = $this->get_to_scporder_options_objects();
146
		$tags    = $this->get_to_scporder_options_tags();
147
148
		if ( ! empty( $objects ) ) {
149
			foreach ( $objects as $object => $object_data ) {
150
				$result = $wpdb->get_results( $wpdb->prepare( "
151
					SELECT count(*) as cnt, max(menu_order) as max, min(menu_order) as min
152
					FROM $wpdb->posts
153
					WHERE post_type = '%s' AND post_status IN ('publish', 'pending', 'draft', 'private', 'future')
154
				", $object ) );
155
156
				if ( 0 == $result[0]->cnt || $result[0]->cnt == $result[0]->max ) {
157
					continue;
158
				}
159
160
				$results = $wpdb->get_results( $wpdb->prepare( "
161
					SELECT ID
162
					FROM $wpdb->posts
163
					WHERE post_type = '%s' AND post_status IN ('publish', 'pending', 'draft', 'private', 'future')
164
					ORDER BY menu_order ASC
165
				", $object ) );
166
167
				foreach ( $results as $key => $result ) {
168
					$wpdb->update(
169
						$wpdb->posts,
170
						array(
171
							'menu_order' => $key + 1,
172
						),
173
						array(
174
							'ID' => $result->ID,
175
						)
176
					);
177
				}
178
			}
179
		}
180
181
		if ( ! empty( $tags ) ) {
182
			foreach ( $tags as $taxonomy => $taxonomy_data ) {
183
				$result = $wpdb->get_results( $wpdb->prepare( "
184
					SELECT count(*) as cnt, max(lsx_to_term_order) as max, min(lsx_to_term_order) as min
185
					FROM $wpdb->terms AS terms
186
					INNER JOIN $wpdb->term_taxonomy AS term_taxonomy ON ( terms.term_id = term_taxonomy.term_id )
187
					WHERE term_taxonomy.taxonomy = '%s'
188
				", $taxonomy ) );
189
190
				if ( 0 == $result[0]->cnt || $result[0]->cnt == $result[0]->max ) {
191
					continue;
192
				}
193
194
				$results = $wpdb->get_results( $wpdb->prepare( "
195
					SELECT terms.term_id
196
					FROM $wpdb->terms AS terms
197
					INNER JOIN $wpdb->term_taxonomy AS term_taxonomy ON ( terms.term_id = term_taxonomy.term_id )
198
					WHERE term_taxonomy.taxonomy = '%s'
199
					ORDER BY lsx_to_term_order ASC
200
				", $taxonomy ) );
201
202
				foreach ( $results as $key => $result ) {
203
					$wpdb->update(
204
						$wpdb->terms,
205
						array(
206
							'lsx_to_term_order' => $key + 1,
207
						),
208
						array(
209
							'term_id' => $result->term_id,
210
						)
211
					);
212
				}
213
			}
214
		}
215
	}
216
217
	public function update_menu_order() {
218
		check_ajax_referer( 'scporder', 'security' );
219
220
		global $wpdb;
221
222
		parse_str( sanitize_text_field( $_POST['order'] ), $data );
223
224
		if ( ! is_array( $data ) ) {
225
			return false;
226
		}
227
228
		/*$id_arr = array();
0 ignored issues
show
Unused Code Comprehensibility introduced by
53% of this comment could be valid code. Did you maybe forget this after debugging?

Sometimes obsolete code just ends up commented out instead of removed. In this case it is better to remove the code once you have checked you do not need it.

The code might also have been commented out for debugging purposes. In this case it is vital that someone uncomments it again or your project may behave in very unexpected ways in production.

This check looks for comments that seem to be mostly valid code and reports them.

Loading history...
229
230
		foreach ( $data as $key => $values ) {
231
			foreach ( $values as $position => $id ) {
232
				$id_arr[] = $id;
233
			}
234
		}
235
236
		$menu_order_arr = array();
237
238
		foreach ( $id_arr as $key => $id ) {
239
			$results = $wpdb->get_results( "SELECT menu_order FROM $wpdb->posts WHERE ID = " . intval( $id ) );
240
			foreach ( $results as $result ) {
241
				$menu_order_arr[] = $result->menu_order;
242
			}
243
		}
244
245
		sort( $menu_order_arr );*/
246
247
		foreach ( $data as $key => $values ) {
248
			foreach ( $values as $position => $id ) {
249
				$wpdb->update(
250
					$wpdb->posts,
251
					array(
252
						'menu_order' => $position,
253
					),
254
					array(
255
						'ID' => intval( $id ),
256
					)
257
				);
258
			}
259
		}
260
	}
261
262
	public function update_menu_order_tags() {
263
		check_ajax_referer( 'scporder', 'security' );
264
265
		global $wpdb;
266
267
		parse_str( sanitize_text_field( $_POST['order'] ), $data );
268
269
		if ( ! is_array( $data ) ) {
270
			return false;
271
		}
272
273
		/*$current_user = wp_get_current_user();
0 ignored issues
show
Unused Code Comprehensibility introduced by
50% of this comment could be valid code. Did you maybe forget this after debugging?

Sometimes obsolete code just ends up commented out instead of removed. In this case it is better to remove the code once you have checked you do not need it.

The code might also have been commented out for debugging purposes. In this case it is vital that someone uncomments it again or your project may behave in very unexpected ways in production.

This check looks for comments that seem to be mostly valid code and reports them.

Loading history...
274
		if ( false === $current_user || 'lightspeed' !== $current_user->data->user_login ) {
275
			return false;
276
		}*/
277
278
		/*$id_arr = array();
0 ignored issues
show
Unused Code Comprehensibility introduced by
53% of this comment could be valid code. Did you maybe forget this after debugging?

Sometimes obsolete code just ends up commented out instead of removed. In this case it is better to remove the code once you have checked you do not need it.

The code might also have been commented out for debugging purposes. In this case it is vital that someone uncomments it again or your project may behave in very unexpected ways in production.

This check looks for comments that seem to be mostly valid code and reports them.

Loading history...
279
280
		foreach ( $data as $key => $values ) {
281
			foreach ( $values as $position => $id ) {
282
				$id_arr[] = $id;
283
			}
284
		}
285
286
		$menu_order_arr = array();
287
288
		foreach ( $id_arr as $key => $id ) {
289
			$results = $wpdb->get_results( "SELECT lsx_to_term_order FROM $wpdb->terms WHERE term_id = " . intval( $id ) );
290
			foreach ( $results as $result ) {
291
				$menu_order_arr[] = $result->lsx_to_term_order;
292
			}
293
		}
294
295
		sort( $menu_order_arr );*/
296
297
		foreach ( $data as $key => $values ) {
298
			$term_ids = array();
299
			foreach ( $values as $position => $id ) {
300
				$wpdb->update(
301
					$wpdb->terms,
302
					array(
303
						'lsx_to_term_order' => $position + 1,
304
					),
305
					array(
306
						'term_id' => intval( $id ),
307
					)
308
				);
309
				$term_ids[] = intval( $id );
310
			}
311
			clean_term_cache( $term_ids );
312
		}
313
	}
314
315
	public function lsx_to_scporder_previous_post_where( $where ) {
316
		global $post;
317
		$objects = $this->get_to_scporder_options_objects();
318
319
		if ( empty( $objects ) ) {
320
			return $where;
321
		}
322
323
		if ( isset( $post->post_type ) && array_key_exists( $post->post_type, $objects ) ) {
324
			$current_menu_order = $post->menu_order;
325
			$where              = "WHERE p.menu_order > '" . $current_menu_order . "' AND p.post_type = '" . $post->post_type . "' AND p.post_status = 'publish'";
326
		}
327
328
		return $where;
329
	}
330
331
	public function lsx_to_scporder_previous_post_sort( $orderby ) {
332
		global $post;
333
		$objects = $this->get_to_scporder_options_objects();
334
335
		if ( empty( $objects ) ) {
336
			return $orderby;
337
		}
338
339
		if ( isset( $post->post_type ) && array_key_exists( $post->post_type, $objects ) ) {
340
			$orderby = 'ORDER BY p.menu_order ASC LIMIT 1';
341
		}
342
343
		return $orderby;
344
	}
345
346
	public function lsx_to_scporder_next_post_where( $where ) {
347
		global $post;
348
		$objects = $this->get_to_scporder_options_objects();
349
350
		if ( empty( $objects ) ) {
351
			return $where;
352
		}
353
354
		if ( isset( $post->post_type ) && array_key_exists( $post->post_type, $objects ) ) {
355
			$current_menu_order = $post->menu_order;
356
			$where              = "WHERE p.menu_order < '" . $current_menu_order . "' AND p.post_type = '" . $post->post_type . "' AND p.post_status = 'publish'";
357
		}
358
359
		return $where;
360
	}
361
362
	public function lsx_to_scporder_next_post_sort( $orderby ) {
363
		global $post;
364
		$objects = $this->get_to_scporder_options_objects();
365
366
		if ( empty( $objects ) ) {
367
			return $orderby;
368
		}
369
370
		if ( isset( $post->post_type ) && array_key_exists( $post->post_type, $objects ) ) {
371
			$orderby = 'ORDER BY p.menu_order DESC LIMIT 1';
372
		}
373
374
		return $orderby;
375
	}
376
377
	public function lsx_to_scporder_pre_get_posts( $wp_query ) {
378
		$objects = $this->get_to_scporder_options_objects();
379
380
		if ( empty( $objects ) ) {
381
			return false;
382
		}
383
384
		if ( is_admin() ) {
385
			if ( isset( $wp_query->query['post_type'] ) && ! isset( $_GET['orderby'] ) ) {
386
				if ( array_key_exists( $wp_query->query['post_type'], $objects ) ) {
387
					$wp_query->set( 'orderby', 'menu_order' );
388
					$wp_query->set( 'order', 'ASC' );
389
				}
390
			}
391
		} else {
392
			$active = false;
393
394
			if ( isset( $wp_query->query['post_type'] ) ) {
395
				if ( ! is_array( $wp_query->query['post_type'] ) ) {
396
					if ( array_key_exists( $wp_query->query['post_type'], $objects ) ) {
397
						$active = true;
398
					}
399
				}
400
			} else {
401
				if ( array_key_exists( 'post', $objects ) ) {
402
					$active = true;
403
				}
404
			}
405
406
			if ( ! $active ) {
407
				return false;
408
			}
409
410
			if ( isset( $wp_query->query['disabled_custom_post_order'] ) ) {
411
				return false;
412
			}
413
414
			if ( isset( $wp_query->query['suppress_filters'] ) ) {
415
				if ( $wp_query->get( 'orderby' ) == 'date' ) {
416
					$wp_query->set( 'orderby', 'menu_order' );
417
				}
418
				if ( $wp_query->get( 'order' ) == 'DESC' ) {
419
					$wp_query->set( 'order', 'ASC' );
420
				}
421
			} else {
422
				if ( ! $wp_query->get( 'orderby' ) ) {
423
					$wp_query->set( 'orderby', 'menu_order' );
424
				}
425
				if ( ! $wp_query->get( 'order' ) ) {
426
					$wp_query->set( 'order', 'ASC' );
427
				}
428
			}
429
		}
430
	}
431
432
	public function lsx_to_scporder_get_terms_orderby( $orderby, $args ) {
433
434
		if ( is_admin() ) {
435
			return $orderby;
436
		}
437
438
		if ( isset( $args['disabled_custom_post_order'] ) ) {
439
			return $orderby;
440
		}
441
442
		$tags = $this->get_to_scporder_options_tags();
443
444
		if ( ! isset( $args['taxonomy'] ) ) {
445
			return $orderby;
446
		}
447
448
		$taxonomy = $args['taxonomy'];
449
		if ( is_array( $taxonomy ) && count( $taxonomy ) == 1 ) {
450
			$taxonomy = $taxonomy[0];
451
		}
452
		if ( ! is_array( $taxonomy ) && ! array_key_exists( $taxonomy, $tags ) ) {
453
			return $orderby;
454
		}
455
456
		$orderby = 't.lsx_to_term_order';
457
458
		return $orderby;
459
	}
460
461
	public function lsx_to_scporder_get_object_terms( $terms, $not_used, $args_1, $args_2 = null ) {
462
		$tags = $this->get_to_scporder_options_tags();
463
464
		if ( is_admin() && isset( $_GET['orderby'] ) ) {
465
			return $terms;
466
		}
467
468
		$args = is_null( $args_2 ) || ! is_array( $args_2 ) ? $args_1 : $args_2;
469
470
		if ( isset( $args['disabled_custom_post_order'] ) ) {
471
			return $terms;
472
		}
473
474
		foreach ( $terms as $key => $term ) {
475
			if ( is_object( $term ) && isset( $term->taxonomy ) ) {
476
				$taxonomy = $term->taxonomy;
477
				if ( ! array_key_exists( $taxonomy, $tags ) ) {
478
					return $terms;
479
				}
480
			} else {
481
				return $terms;
482
			}
483
		}
484
		usort( $terms, array( $this, 'taxcmp' ) );
485
		return $terms;
486
	}
487
488
	public function taxcmp( $a, $b ) {
489
		if ( $a->lsx_to_term_order == $b->lsx_to_term_order ) {
490
			return 0;
491
		}
492
		return ( $a->lsx_to_term_order < $b->lsx_to_term_order ) ? - 1 : 1;
493
	}
494
495
	public function get_to_scporder_options_objects() {
496
		$ordering = array(
497
			'plan' => 'plan',
498
		);
499
		return $ordering;
500
	}
501
502
	public function get_to_scporder_options_tags() {
503
		$ordering = array(
504
			'week' => 'week',
505
			'recipe-type' => 'recipe-type',
506
		);
507
		return $ordering;
508
	}
509
}
510
511