PluginProbe
Ultimate Store Kit – Store Builder Addons for Elementor, WooCommerce Store Builder, EDD Store Builder / 1.5.0
Ultimate Store Kit – Store Builder Addons for Elementor, WooCommerce Store Builder, EDD Store Builder v1.5.0
3.1.4 3.0.8 3.0.9 3.1.0 3.1.2 3.1.3 3.0.7 3.0.5 3.0.4 3.0.3 3.0.2 trunk 1.5.0 1.5.1 1.5.2 1.6.1 1.6.2 1.6.3 1.6.4 2.0.0 2.0.1 2.0.2 2.0.3 2.0.4 2.0.5 All 93 releases
ultimate-store-kit / includes / controls / group-query / group-control-query.php

group-control-query.php in Ultimate Store Kit – Store Builder Addons for Elementor, WooCommerce Store Builder, EDD Store Builder 1.5.0, at includes/controls/group-query/group-control-query.php

730 lines 20.3 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 namespace UltimateStoreKit\Includes\Controls\GroupQuery;
4
5 use Elementor\Controls_Manager;
6 use UltimateStoreKit\Includes\Controls\SelectInput\Dynamic_Select;
7
8 if (!defined('ABSPATH')) {
9 exit; // Exit if accessed directly.
10 }
11
12 trait Group_Control_Query {
13
14 public function register_query_builder_controls() {
15
16 $this->add_control(
17 'product_source',
18 [
19 'label' => __('Source', 'ultimate-store-kit'),
20 'type' => Controls_Manager::SELECT,
21 'options' => $this->getGroupControlQueryPostTypes(),
22 'default' => 'product',
23 ]
24 );
25 $this->add_control(
26 'product_limit',
27 [
28 'label' => esc_html__('Product Limit', 'ultimate-store-kit'),
29 'type' => Controls_Manager::NUMBER,
30 'default' => 9,
31 ]
32 );
33
34 $this->add_control(
35 'product_selected_ids',
36 [
37 'label' => __('Search & Select', 'ultimate-store-kit'),
38 'type' => Dynamic_Select::TYPE,
39 'multiple' => true,
40 'label_block' => true,
41 'query_args' => [
42 'query' => 'posts',
43 ],
44 'condition' => [
45 'product_source' => 'manual_selection',
46 ]
47 ]
48 );
49
50 $this->start_controls_tabs(
51 'tabs_product_include_exclude',
52 [
53 'condition' => [
54 'product_source!' => ['manual_selection', 'current_query'],
55 ]
56 ]
57 );
58
59 $this->start_controls_tab(
60 'tab_product_include',
61 [
62 'label' => __('Include', 'ultimate-store-kit'),
63 'condition' => [
64 'product_source!' => ['manual_selection', 'current_query'],
65 ]
66 ]
67 );
68
69 $this->add_control(
70 'product_include_by',
71 [
72 'label' => __('Include By', 'ultimate-store-kit'),
73 'type' => Controls_Manager::SELECT2,
74 'multiple' => true,
75 'label_block' => true,
76 'options' => [
77 'authors' => __('Authors', 'ultimate-store-kit'),
78 'terms' => __('Terms', 'ultimate-store-kit'),
79 ],
80 'condition' => [
81 'product_source!' => ['manual_selection', 'current_query'],
82 ]
83 ]
84 );
85
86 $this->add_control(
87 'product_include_author_ids',
88 [
89 'label' => __('Authors', 'ultimate-store-kit'),
90 'type' => Dynamic_Select::TYPE,
91 'multiple' => true,
92 'label_block' => true,
93 'query_args' => [
94 'query' => 'authors',
95 ],
96 'condition' => [
97 'product_include_by' => 'authors',
98 'product_source!' => ['manual_selection', 'current_query'],
99 ]
100 ]
101 );
102
103 $this->add_control(
104 'product_include_term_ids',
105 [
106 'label' => __('Terms', 'ultimate-store-kit'),
107 'description' => __('Terms are items in a taxonomy. The available taxonomies are: Categories, Tags, Formats and custom taxonomies.', 'ultimate-store-kit'),
108 'type' => Dynamic_Select::TYPE,
109 'multiple' => true,
110 'label_block' => true,
111 'placeholder' => __('Type and select terms', 'ultimate-store-kit'),
112 'query_args' => [
113 'query' => 'terms',
114 'widget_props' => [
115 'post_type' => 'product_source'
116 ]
117 ],
118 'condition' => [
119 'product_include_by' => 'terms',
120 'product_source!' => ['manual_selection', 'current_query', '_related_post_type'],
121 ]
122 ]
123 );
124
125 $this->end_controls_tab();
126
127 $this->start_controls_tab(
128 'tab_product_exclude',
129 [
130 'label' => __('Exclude', 'ultimate-store-kit'),
131 'condition' => [
132 'product_source!' => ['manual_selection', 'current_query'],
133 ]
134 ]
135 );
136
137 $this->add_control(
138 'product_exclude_by',
139 [
140 'label' => __('Exclude By', 'ultimate-store-kit'),
141 'type' => Controls_Manager::SELECT2,
142 'multiple' => true,
143 'label_block' => true,
144 'options' => [
145 'authors' => __('Authors', 'ultimate-store-kit'),
146 'current_post' => __('Current Post', 'ultimate-store-kit'),
147 'manual_selection' => __('Manual Selection', 'ultimate-store-kit'),
148 'terms' => __('Terms', 'ultimate-store-kit'),
149 ],
150 'condition' => [
151 'product_source!' => ['manual_selection', 'current_query'],
152 ]
153 ]
154 );
155
156 $this->add_control(
157 'posts_exclude_ids',
158 [
159 'label' => __('Search & Select', 'ultimate-store-kit'),
160 'type' => Dynamic_Select::TYPE,
161 'multiple' => true,
162 'label_block' => true,
163 'query_args' => [
164 'query' => 'posts',
165 'widget_props' => [
166 'post_type' => 'product_source'
167 ]
168 ],
169 'condition' => [
170 'product_source!' => ['manual_selection', 'current_query'],
171 'product_exclude_by' => 'manual_selection',
172 ]
173 ]
174 );
175
176 $this->add_control(
177 'product_exclude_author_ids',
178 [
179 'label' => __('Authors', 'ultimate-store-kit'),
180 'type' => Dynamic_Select::TYPE,
181 'multiple' => true,
182 'label_block' => true,
183 'query_args' => [
184 'query' => 'authors',
185 ],
186 'condition' => [
187 'product_exclude_by' => 'authors',
188 'product_source!' => ['manual_selection', 'current_query'],
189 ]
190 ]
191 );
192
193 $this->add_control(
194 'product_exclude_term_ids',
195 [
196 'label' => __('Terms', 'ultimate-store-kit'),
197 'description' => __('Terms are items in a taxonomy. The available taxonomies are: Categories, Tags, Formats and custom taxonomies.', 'ultimate-store-kit'),
198 'type' => Dynamic_Select::TYPE,
199 'multiple' => true,
200 'label_block' => true,
201 'placeholder' => __('Type and select terms', 'ultimate-store-kit'),
202 'query_args' => [
203 'query' => 'terms',
204 'widget_props' => [
205 'post_type' => 'product_source'
206 ]
207 ],
208 'condition' => [
209 'product_exclude_by' => 'terms',
210 'product_source!' => ['manual_selection', 'current_query', '_related_post_type'],
211 ]
212 ]
213 );
214
215 $this->end_controls_tab();
216 $this->end_controls_tabs();
217
218 $this->add_control(
219 'product_divider',
220 [
221 'type' => Controls_Manager::DIVIDER,
222 'condition' => [
223 'product_source!' => 'current_query',
224 ]
225 ]
226 );
227 $this->add_control(
228 'product_select_date',
229 [
230 'label' => __('Date', 'ultimate-store-kit'),
231 'type' => Controls_Manager::SELECT,
232 'default' => 'anytime',
233 'options' => [
234 'anytime' => __('All', 'ultimate-store-kit'),
235 'today' => __('Past Day', 'ultimate-store-kit'),
236 'week' => __('Past Week', 'ultimate-store-kit'),
237 'month' => __('Past Month', 'ultimate-store-kit'),
238 'quarter' => __('Past Quarter', 'ultimate-store-kit'),
239 'year' => __('Past Year', 'ultimate-store-kit'),
240 'exact' => __('Custom', 'ultimate-store-kit'),
241 ],
242 'condition' => [
243 'product_source!' => 'current_query',
244 ]
245 ]
246 );
247
248 $this->add_control(
249 'product_date_before',
250 [
251 'label' => __('Before', 'ultimate-store-kit'),
252 'type' => Controls_Manager::DATE_TIME,
253 'description' => __('Setting a ‘Before’ date will show all the posts published until the chosen date (inclusive).', 'ultimate-store-kit'),
254 'condition' => [
255 'product_select_date' => 'exact',
256 'product_source!' => 'current_query',
257 ]
258 ]
259 );
260
261 $this->add_control(
262 'product_date_after',
263 [
264 'label' => __('After', 'ultimate-store-kit'),
265 'type' => Controls_Manager::DATE_TIME,
266 'description' => __('Setting an ‘After’ date will show all the posts published since the chosen date (inclusive).', 'ultimate-store-kit'),
267 'condition' => [
268 'product_select_date' => 'exact',
269 'product_source!' => 'current_query',
270 ]
271 ]
272 );
273
274 $this->add_control(
275 'product_orderby',
276 [
277 'label' => __('Order By', 'bdthemes-prime-slider'),
278 'type' => Controls_Manager::SELECT,
279 'default' => 'date',
280 'options' => [
281 'title' => __('Title', 'bdthemes-prime-slider'),
282 'ID' => __('ID', 'bdthemes-prime-slider'),
283 'date' => __('Date', 'bdthemes-prime-slider'),
284 'author' => __('Author', 'bdthemes-prime-slider'),
285 'comment_count' => __('Comment Count', 'bdthemes-prime-slider'),
286 'menu_order' => __('Menu Order', 'bdthemes-prime-slider'),
287 'rand' => __('Random', 'bdthemes-prime-slider'),
288 'price' => __('Price', 'bdthemes-prime-slider'),
289 'sales' => __('Sales', 'bdthemes-prime-slider'),
290 ]
291 ]
292 );
293 $this->add_control(
294 'product_order',
295 [
296 'label' => __('Order', 'ultimate-store-kit'),
297 'type' => Controls_Manager::SELECT,
298 'default' => 'desc',
299 'options' => [
300 'asc' => __('ASC', 'ultimate-store-kit'),
301 'desc' => __('DESC', 'ultimate-store-kit'),
302 ],
303 'condition' => [
304 'product_source!' => 'current_query',
305 ]
306 ]
307 );
308 // Others Features
309 }
310
311 public function register_controls_wc_additional() {
312 $this->add_control(
313 'product_show_only',
314 [
315 'label' => esc_html__('Show Product', 'bdthemes-element-pack'),
316 'type' => Controls_Manager::SELECT,
317 'default' => 'all',
318 'options' => [
319 'all' => esc_html__('All Products', 'bdthemes-element-pack'),
320 'onsale' => esc_html__('On Sale', 'bdthemes-element-pack'),
321 'featured' => esc_html__('Featured', 'bdthemes-element-pack'),
322 ]
323 ]
324 );
325 $this->add_control(
326 'product_hide_free',
327 [
328 'label' => esc_html__('Hide Free Product', 'ultimate-store-kit'),
329 'type' => Controls_Manager::SWITCHER,
330
331 ]
332 );
333 $this->add_control(
334 'product_hide_out_stock',
335 [
336 'label' => esc_html__('Hide Out of Stock', 'ultimate-store-kit'),
337 'type' => Controls_Manager::SWITCHER,
338 ]
339 );
340 $this->add_control(
341 'product_only_with_featured_image',
342 [
343 'label' => __('Only Featured Image Post', 'ultimate-store-kit'),
344 'description' => __('Enable to display posts only when featured image is present.', 'ultimate-store-kit'),
345 'type' => Controls_Manager::SWITCHER,
346 'return_value' => 'yes',
347 'condition' => [
348 'product_source!' => 'current_query',
349 ]
350 ]
351 );
352 $this->add_control(
353 'query_id',
354 [
355 'label' => __('Query ID', 'ultimate-store-kit'),
356 'description' => __('Give your Query a custom unique id to allow server side filtering', 'ultimate-store-kit'),
357 'type' => Controls_Manager::TEXT,
358 'separator' => 'before',
359 ]
360 );
361 }
362
363 private function setMetaQueryArgs() {
364
365 $args = [];
366
367 if ('current_query' === $this->getGroupControlQueryPostType()) {
368 return [];
369 }
370 $args['paged'] = max(1, get_query_var('paged'), get_query_var('page'));
371 $args['posts_per_page'] = $this->get_settings('product_limit');
372 $args['order'] = $this->get_settings('product_order');
373 // $args['orderby'] = $this->get_settings('product_orderby');
374
375 if ('product' === $this->getGroupControlQueryPostType()) {
376 $product_visibility_term_ids = wc_get_product_visibility_term_ids();
377 if ('yes' == $this->get_settings('product_hide_free')) {
378 $args['meta_query'][] = [
379 'key' => '_price',
380 'value' => 0,
381 'compare' => '>',
382 'type' => 'DECIMAL',
383 ];
384 }
385
386 if ('yes' == $this->get_settings('product_hide_out_stock')) {
387 $args['tax_query'][] = [
388 [
389 'taxonomy' => 'product_visibility',
390 'field' => 'term_taxonomy_id',
391 'terms' => $product_visibility_term_ids['outofstock'],
392 'operator' => 'NOT IN',
393 ],
394 ]; // WPCS: slow query ok.
395 }
396 switch ($this->get_settings('product_show_only')) {
397 case 'featured':
398 $args['tax_query'][] = [
399 'taxonomy' => 'product_visibility',
400 'field' => 'term_taxonomy_id',
401 'terms' => $product_visibility_term_ids['featured'],
402 ];
403 break;
404 case 'onsale':
405 $product_ids_on_sale = wc_get_product_ids_on_sale();
406 $product_ids_on_sale[] = 0;
407 $args['post__in'] = $product_ids_on_sale;
408 break;
409 }
410 switch ($this->get_settings('product_orderby')) {
411 case 'price':
412 $args['meta_key'] = '_price'; // WPCS: slow query ok.
413 $args['orderby'] = 'meta_value_num';
414 break;
415 case 'sales':
416 $args['meta_key'] = 'total_sales'; // WPCS: slow query ok.
417 $args['orderby'] = 'meta_value_num';
418 break;
419 default:
420 $args['orderby'] = $this->get_settings('product_orderby');
421 }
422 }
423
424
425
426 /**
427 * Set Feature Images
428 */
429 if ($this->get_settings('product_only_with_featured_image') === 'yes') {
430 $args['meta_key'] = '_thumbnail_id';
431 }
432
433 /**
434 * Set Date
435 */
436
437 $selected_date = $this->get_settings('product_select_date');
438
439 if (!empty($selected_date)) {
440 $date_query = [];
441
442 switch ($selected_date) {
443 case 'today':
444 $date_query['after'] = '-1 day';
445 break;
446
447 case 'week':
448 $date_query['after'] = '-1 week';
449 break;
450
451 case 'month':
452 $date_query['after'] = '-1 month';
453 break;
454
455 case 'quarter':
456 $date_query['after'] = '-3 month';
457 break;
458
459 case 'year':
460 $date_query['after'] = '-1 year';
461 break;
462
463 case 'exact':
464 $after_date = $this->get_settings('product_date_after');
465 if (!empty($after_date)) {
466 $date_query['after'] = $after_date;
467 }
468
469 $before_date = $this->get_settings('product_date_before');
470 if (!empty($before_date)) {
471 $date_query['before'] = $before_date;
472 }
473
474 $date_query['inclusive'] = true;
475 break;
476 }
477
478 if (!empty($date_query)) {
479 $args['date_query'] = $date_query;
480 }
481 }
482
483 return $args;
484 }
485
486 protected function getGroupControlQueryArgs() {
487
488 $settings = $this->get_settings();
489 $args = $this->setMetaQueryArgs();
490 $args['post_status'] = 'publish';
491 $args['suppress_filters'] = false;
492 $exclude_by = $this->getGroupControlQueryParamBy('exclude');
493
494 // /**
495 // * Set Ignore Sticky
496 // */
497 // if (
498 // $this->getGroupControlQueryPostType() === 'post'
499 // && $this->get_settings('posts_ignore_sticky_posts') === 'yes'
500 // ) {
501 // $args['ignore_sticky_posts'] = true;
502
503 // if (in_array('current_post', $exclude_by)) {
504 // $args['post__not_in'] = [get_the_ID()];
505 // }
506 // }
507
508
509 if ($this->getGroupControlQueryPostType() === 'manual_selection') {
510 /**
511 * Set Including Manually
512 */
513 $selected_ids = $this->get_settings('product_selected_ids');
514 $selected_ids = wp_parse_id_list($selected_ids);
515 $args['post_type'] = 'product';
516 if (!empty($selected_ids)) {
517 $args['post__in'] = $selected_ids;
518 }
519 $args['ignore_sticky_posts'] = 1;
520 } elseif ('current_query' === $this->getGroupControlQueryPostType()) {
521 /**
522 * Make Current Query
523 */
524 $args = $GLOBALS['wp_query']->query_vars;
525 $args['paged'] = 1;
526 $args = apply_filters('ultimate_store_kit/query/get_query_args/current_query', $args);
527 } elseif ('_related_post_type' === $this->getGroupControlQueryPostType()) {
528 /**
529 * Set Related Query
530 */
531 $post_id = get_queried_object_id();
532 $related_post_id = is_singular() && (0 !== $post_id) ? $post_id : null;
533 $args['post_type'] = get_post_type($related_post_id);
534
535 $include_by = $this->getGroupControlQueryParamBy('include');
536 if (in_array('authors', $include_by)) {
537 $args['author__in'] = wp_parse_id_list($settings['product_include_author_ids']);
538 } else {
539 $args['author__in'] = get_post_field('post_author', $related_post_id);
540 }
541
542 $exclude_by = $this->getGroupControlQueryParamBy('exclude');
543 if (in_array('authors', $exclude_by)) {
544 $args['author__not_in'] = wp_parse_id_list($settings['product_exclude_author_ids']);
545 }
546
547 if (in_array('current_post', $exclude_by)) {
548 $args['post__not_in'] = [get_the_ID()];
549 }
550
551 $args['ignore_sticky_posts'] = 1;
552 $args = apply_filters('ultimate_store_kit/query/get_query_args/related_query', $args);
553 } else {
554
555 /**
556 * Set Post Type
557 */
558 $args['post_type'] = $this->getGroupControlQueryPostType();
559
560 /**
561 * Set Exclude Post
562 */
563 $exclude_by = $this->getGroupControlQueryParamBy('exclude');
564 $current_post = [];
565
566 if (in_array('current_post', $exclude_by) && is_singular()) {
567 $current_post = [get_the_ID()];
568 }
569
570 if (in_array('manual_selection', $exclude_by)) {
571 $exclude_ids = $settings['posts_exclude_ids'];
572 $args['post__not_in'] = array_merge($current_post, wp_parse_id_list($exclude_ids));
573 }
574 /**
575 * Set Authors
576 */
577 $include_by = $this->getGroupControlQueryParamBy('include');
578 $exclude_by = $this->getGroupControlQueryParamBy('exclude');
579 $include_users = [];
580 $exclude_users = [];
581
582 if (in_array('authors', $include_by)) {
583 $include_users = wp_parse_id_list($settings['product_include_author_ids']);
584 }
585
586 if (in_array('authors', $exclude_by)) {
587 $exclude_users = wp_parse_id_list($settings['product_exclude_author_ids']);
588 $include_users = array_diff($include_users, $exclude_users);
589 }
590
591 if (!empty($include_users)) {
592 $args['author__in'] = $include_users;
593 }
594
595 if (!empty($exclude_users)) {
596 $args['author__not_in'] = $exclude_users;;
597 }
598
599 /**
600 * Set Taxonomy
601 */
602 $include_by = $this->getGroupControlQueryParamBy('include');
603 $exclude_by = $this->getGroupControlQueryParamBy('exclude');
604 $include_terms = [];
605 $exclude_terms = [];
606 $terms_query = [];
607
608 if (in_array('terms', $include_by)) {
609 $include_terms = wp_parse_id_list($settings['product_include_term_ids']);
610 }
611
612 if (in_array('terms', $exclude_by)) {
613 $exclude_terms = wp_parse_id_list($settings['product_exclude_term_ids']);
614 $include_terms = array_diff($include_terms, $exclude_terms);
615 }
616
617 if (!empty($include_terms)) {
618 $tax_terms_map = $this->mapGroupControlQuery($include_terms);
619
620 foreach ($tax_terms_map as $tax => $terms) {
621 $terms_query[] = [
622 'taxonomy' => $tax,
623 'field' => 'term_id',
624 'terms' => $terms,
625 'operator' => 'IN',
626 ];
627 }
628 }
629
630 if (!empty($exclude_terms)) {
631 $tax_terms_map = $this->mapGroupControlQuery($exclude_terms);
632
633 foreach ($tax_terms_map as $tax => $terms) {
634 $terms_query[] = [
635 'taxonomy' => $tax,
636 'field' => 'term_id',
637 'terms' => $terms,
638 'operator' => 'NOT IN',
639 ];
640 }
641 }
642
643 if (!empty($terms_query)) {
644 $args['tax_query'] = $terms_query;
645 $args['tax_query']['relation'] = 'AND';
646 }
647 }
648
649 $query_id = $this->get_settings('query_id');
650 if (!empty($query_id)) {
651 add_action('pre_get_posts', [$this, 'pre_get_posts_query_filter']);
652 }
653
654 return $args;
655 }
656
657
658 /**
659 * @return mixed
660 */
661 private function getGroupControlQueryPostType() {
662 return $this->get_settings('product_source');
663 }
664
665 /**
666 * Get Query Params by args
667 *
668 * @param string $by
669 *
670 * @return array|mixed
671 */
672 private function getGroupControlQueryParamBy($by = 'exclude') {
673 $mapBy = [
674 'exclude' => 'product_exclude_by',
675 'include' => 'product_include_by',
676 ];
677
678 $setting = $this->get_settings($mapBy[$by]);
679
680 return (!empty($setting) ? $setting : []);
681 }
682
683 /**
684 * @param array $term_ids
685 *
686 * @return array
687 */
688 private function mapGroupControlQuery($term_ids = []) {
689 $terms = get_terms(
690 [
691 'term_taxonomy_id' => $term_ids,
692 'hide_empty' => false,
693 ]
694 );
695
696 $tax_terms_map = [];
697
698 foreach ($terms as $term) {
699 $taxonomy = $term->taxonomy;
700 $tax_terms_map[$taxonomy][] = $term->term_id;
701 }
702
703 return $tax_terms_map;
704 }
705
706 /**
707 * @return array|string[]|\WP_Post_Type[]
708 */
709 private function getGroupControlQueryPostTypes() {
710
711 $post_types = [
712 'product' => __('Product', 'ultimate-store-kit'),
713 'manual_selection' => __('Manual Selection', 'ultimate-store-kit'),
714 'current_query' => __('Current Query', 'ultimate-store-kit'),
715 '_related_post_type' => __('Related', 'ultimate-store-kit'),
716 ];
717
718 // $post_types = array_merge($post_types, $extra_types);
719
720 return $post_types;
721 }
722
723 public function pre_get_posts_query_filter($wp_query) {
724 if ($this) {
725 $query_id = $this->get_settings('query_id');
726 do_action("ultimate_store_kit/query/{$query_id}", $wp_query, $this);
727 }
728 }
729 }
730