1 | <?php |
||
2 | |||
3 | namespace lsx_health_plan\classes; |
||
4 | |||
5 | class SCPO_Engine { |
||
0 ignored issues
–
show
Coding Style
Documentation
introduced
by
![]() |
|||
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() { |
||
0 ignored issues
–
show
|
|||
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() { |
||
0 ignored issues
–
show
|
|||
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() { |
||
0 ignored issues
–
show
|
|||
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() { |
||
0 ignored issues
–
show
|
|||
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() { |
||
0 ignored issues
–
show
|
|||
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() { |
||
0 ignored issues
–
show
|
|||
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(); |
||
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() { |
||
0 ignored issues
–
show
|
|||
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(); |
||
274 | if ( false === $current_user || 'lightspeed' !== $current_user->data->user_login ) { |
||
275 | return false; |
||
276 | }*/ |
||
277 | |||
278 | /*$id_arr = array(); |
||
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 ) { |
||
0 ignored issues
–
show
|
|||
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 ) { |
||
0 ignored issues
–
show
|
|||
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 ) { |
||
0 ignored issues
–
show
|
|||
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 ) { |
||
0 ignored issues
–
show
|
|||
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 ) { |
||
0 ignored issues
–
show
|
|||
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 ) { |
||
0 ignored issues
–
show
|
|||
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 ) { |
||
0 ignored issues
–
show
|
|||
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 ) { |
||
0 ignored issues
–
show
|
|||
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() { |
||
0 ignored issues
–
show
|
|||
496 | $ordering = array( |
||
497 | 'plan' => 'plan', |
||
498 | ); |
||
499 | return $ordering; |
||
500 | } |
||
501 | |||
502 | public function get_to_scporder_options_tags() { |
||
0 ignored issues
–
show
|
|||
503 | $ordering = array( |
||
504 | 'week' => 'week', |
||
505 | 'recipe-type' => 'recipe-type', |
||
506 | ); |
||
507 | return $ordering; |
||
508 | } |
||
509 | } |
||
510 | |||
511 |