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
|
|||
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. ![]() |
|||
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. ![]() |
|||
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 |
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.