PluginProbe ʕ •ᴥ•ʔ
ShopEngine Elementor WooCommerce Builder Addon – All in One WooCommerce Solution / 1.4.0
ShopEngine Elementor WooCommerce Builder Addon – All in One WooCommerce Solution v1.4.0
4.9.2 4.9.1 4.9.0 2.0.0 2.1.0 2.2.0 2.2.1 2.2.2 2.3.0 2.4.0 2.5.0 2.5.1 3.0.0 3.1.0 3.1.1 4.0.0 4.0.1 4.1.0 4.1.1 4.2.0 4.2.1 4.3.0 4.3.1 4.4.0 4.5.0 4.5.1 4.6.0 4.6.1 4.6.2 4.6.3 4.6.4 4.6.5 4.6.6 4.6.7 4.6.8 4.6.9 4.7.0 4.7.1 4.7.2 4.7.3 4.7.4 4.7.5 4.7.6 4.7.7 4.7.8 4.7.9 4.8.0 4.8.1 4.8.2 4.8.3 4.8.4 4.8.5 4.8.6 4.8.7 4.8.8 4.8.9 trunk 0.1.2-beta 0.1.3-beta 0.1.4-beta 1.0.0 1.1.0 1.1.1 1.1.2 1.1.3 1.2.0 1.2.1 1.3.0 1.3.1 1.3.2 1.3.3 1.3.4 1.4.0 1.4.1 1.5.0 1.5.1 1.6.0 1.6.1 1.7.0 1.8.0 1.8.1 1.9.0
shopengine / core / query-modifier.php
shopengine / core Last commit date
builders 4 years ago elementor-controls 4 years ago export-import 4 years ago page-templates 4 years ago register 4 years ago sample-designs 4 years ago settings 4 years ago query-modifier.php 4 years ago template-cpt.php 4 years ago
query-modifier.php
133 lines
1 <?php
2
3 namespace ShopEngine\Core;
4
5 use ShopEngine\Traits\Singleton;
6
7 class Query_Modifier
8 {
9
10 use Singleton;
11
12 public function init() {
13
14 add_action('pre_get_posts', [$this, 'modify_query']);
15 }
16
17 public function modify_query($query) {
18
19 if(is_admin() || !$query->is_main_query() || $query->is_single === true) {
20 return;
21 }
22
23 if(!isset($query->query_vars['wc_query']) || $query->query_vars['wc_query'] != 'product_query') {
24 return;
25 }
26
27 // query filter begins
28
29 // update query for product per page filter
30 if(!empty($_GET['shopengine_products_per_page'])) {
31 $query->set('posts_per_page', absint($_GET['shopengine_products_per_page']));
32 }
33
34 //update query if query param has color & attribute filter
35 foreach($_GET as $key => $value) {
36
37 $color_prefix = 'shopengine_filter_color_';
38
39 $attribute_prefix = 'shopengine_filter_attribute_';
40
41 $image_prefix = 'shopengine_filter_image_';
42
43 $label_prefix = 'shopengine_filter_label_';
44
45 $shipping_prefix = 'shopengine_filter_shipping_';
46
47 $category_prefix = 'shopengine_filter_category';
48
49 $stock_prefix = 'shopengine_filter_stock';
50
51 $sale_prefix ='shopengine_filter_onsale';
52
53 if( $key === $category_prefix ) {
54
55 $query = $this->attribute_query($key.'product_cat', $category_prefix, $value, $query);
56
57 } elseif( strpos($key, $color_prefix) !== false) {
58
59 $query = $this->attribute_query($key, $color_prefix, $value, $query);
60
61 } elseif( strpos($key, $attribute_prefix) !== false ) {
62
63 $query = $this->attribute_query($key, $attribute_prefix, $value, $query);
64
65 } elseif( strpos($key, $image_prefix) !== false ) {
66
67 $query = $this->attribute_query($key, $image_prefix, $value, $query);
68
69 } elseif( strpos($key, $label_prefix) !== false ) {
70
71 $query = $this->attribute_query($key, $label_prefix, $value, $query);
72
73 } elseif( strpos($key, $shipping_prefix) !== false ) {
74
75 $query = $this->attribute_query($key, $shipping_prefix, $value, $query);
76
77 } elseif( $key === $stock_prefix ) {
78
79 $query->set('meta_query',
80 [
81 [
82 'key' => '_stock_status',
83 'value' => $value,
84 'compare' => 'IN'
85 ]
86 ]
87 );
88
89 } elseif( $key === $sale_prefix ) {
90
91 $s = explode(',', $value);
92 $sale_query = ['relation' => 'OR'];
93
94 foreach($s as $v) {
95
96 if($v === 'on_sale') {
97 $sale_query[] = [
98 'key' => '_sale_price',
99 'value' => 0,
100 'compare' => '>',
101 'type' => 'numeric',
102 'operator' => 'OR',
103 ];
104 } else {
105 $sale_query[] = [
106 'key' => '_sale_price',
107 'compare' => 'NOT EXISTS',
108 'operator' => 'OR',
109 ];
110 }
111 }
112 $query->set('meta_query', $sale_query);
113 }
114 }
115 }
116
117 public function attribute_query($key, $prefix, $value, $query) {
118
119 $taxonomy = str_replace($prefix, '', $key);
120 $query->set('tax_query',
121 [
122 [
123 'taxonomy' => $taxonomy,
124 'field' => 'slug',
125 'terms' => $value,
126 'operator' => 'IN',
127 ],
128 ]
129 );
130 return $query;
131 }
132 }
133