PluginProbe ʕ •ᴥ•ʔ
Premium Addons for Elementor – Powerful Elementor Templates & Widgets / 4.11.84
Premium Addons for Elementor – Powerful Elementor Templates & Widgets v4.11.84
4.11.84 4.11.83 4.11.82 4.11.80 4.11.81 4.11.79 4.11.78 4.11.77 4.11.76 4.11.75 3.20.5 4.11.69 3.20.6 4.11.7 3.20.7 4.11.70 3.20.8 4.11.71 3.20.9 4.11.72 3.21.1 4.11.73 3.21.2 4.11.74 3.21.3 4.11.8 3.21.4 4.11.9 3.21.5 4.2.0 3.21.6 4.2.1 3.3.0 4.2.2 3.3.1 4.2.3 3.3.2 4.2.4 3.3.3 4.2.5 3.3.4 4.2.6 3.3.5 4.2.7 3.3.6 4.2.8 3.3.7 4.2.9 3.3.8 4.3.0 3.3.9 4.3.1 3.4.0 4.3.2 3.4.1 4.3.3 3.4.2 4.3.4 3.4.3 4.3.5 3.4.4 4.3.6 3.4.5 4.3.7 3.4.6 4.3.8 3.4.7 4.3.9 3.4.8 4.4.0 3.4.9 4.4.1 3.5.0 4.4.2 3.5.1 4.4.3 3.5.2 4.4.4 3.5.3 4.4.5 3.5.4 4.4.6 3.5.5 4.4.7 3.5.6 4.4.8 3.5.7 4.4.9 3.5.8 4.5.0 3.5.9 4.5.1 3.6.0 4.5.2 3.6.1 4.5.3 3.6.2 4.5.4 3.6.3 4.5.5 3.6.4 4.5.6 3.6.5 4.5.7 3.6.6 4.5.8 3.6.7 4.5.9 3.6.8 4.6.0 3.6.9 4.6.1 3.7.0 4.7.0 3.7.1 4.7.1 3.7.2 4.7.2 3.7.3 4.7.3 3.7.4 4.7.4 3.7.5 4.7.5 3.7.6 4.7.6 3.7.7 4.7.7 3.7.8 4.7.8 3.7.9 4.7.9 3.8.0 4.8.0 3.8.1 4.8.1 3.8.2 4.8.10 3.8.3 4.8.11 3.8.4 4.8.2 3.8.5 4.8.3 3.8.6 4.8.4 3.8.7 4.8.5 3.8.8 4.8.6 3.8.9 4.8.7 3.9.0 4.8.8 3.9.1 4.8.9 3.9.2 4.9.0 3.9.3 4.9.0-beta1 3.9.4 4.9.0-beta2 3.9.5 4.9.1 3.9.6 4.9.10 3.9.7 4.9.11 3.9.8 4.9.12 3.9.9 4.9.13 4.0.1 4.9.14 4.0.3 4.9.15 4.0.4 4.9.16 4.0.5 4.9.17 4.0.6 4.9.18 4.0.7 4.9.19 4.0.8 4.9.2 4.0.9 4.9.20 4.1.0 4.9.21 4.1.1 4.9.22 4.1.2 4.9.23 4.1.3 4.9.24 trunk 4.1.4 4.9.25 1.0 4.1.5 4.9.26 1.01 4.1.6 4.9.27 1.02 4.1.7 4.9.28 1.03 4.1.8 4.9.29 1.04 4.1.9 4.9.3 1.05 4.10.0 4.9.30 1.06 4.10.1 4.9.31 1.07 4.10.10 4.9.32 1.08 4.10.11 4.9.33 1.09 4.10.12 4.9.34 2.0 4.10.13 4.9.35 2.0.1 4.10.14 4.9.36 2.0.2 4.10.15 4.9.37 2.0.3 4.10.16 4.9.38 2.0.4 4.10.17 4.9.39 2.0.5 4.10.18 4.9.4 2.0.6 4.10.19 4.9.40 2.0.7 4.10.2 4.9.41 2.0.8 4.10.20 4.9.42 2.0.9 4.10.21 4.9.43 2.1.0 4.10.22 4.9.45 2.1.1 4.10.23 4.9.46 2.1.2 4.10.24 4.9.47 2.1.3 4.10.25 4.9.48 2.1.4 4.10.26 4.9.49 2.1.5 4.10.27 4.9.5 2.1.5-beta1 4.10.28 4.9.50 2.1.6 4.10.29 4.9.51 2.1.7 4.10.3 4.9.52 2.1.8 4.10.30 4.9.53 2.1.9 4.10.31 4.9.54 2.2.0 4.10.32 4.9.55 2.2.1 4.10.33 4.9.56 2.2.2 4.10.34 4.9.57 2.2.3 4.10.35 4.9.6 2.2.4 4.10.36 4.9.7 2.2.5 4.10.37 4.9.8 2.2.6 4.10.38 4.9.9 2.2.7 4.10.39 2.2.8 4.10.4 2.2.9 4.10.40 2.3.0 4.10.41 2.3.1 4.10.42 2.3.2 4.10.43 2.3.3 4.10.44 2.3.4 4.10.45 2.3.5 4.10.46 2.3.6 4.10.47 2.3.7 4.10.48 2.3.8 4.10.49 2.3.9 4.10.5 2.4.0 4.10.50 2.4.1 4.10.51 2.5.0 4.10.52 2.5.1 4.10.53 2.5.2 4.10.54 2.5.3 4.10.55 2.5.4 4.10.56 2.5.5 4.10.57 2.5.6 4.10.58 2.5.7 4.10.59 2.5.8 4.10.6 2.5.9 4.10.60 2.6.0 4.10.61 2.6.1 4.10.62 2.6.2 4.10.63 2.6.3 4.10.64 2.6.4 4.10.65 2.6.5 4.10.66 2.6.6 4.10.67 2.6.7 4.10.68 2.6.8 4.10.69 2.6.9 4.10.7 2.7.0 4.10.70 2.7.1 4.10.71 2.7.2 4.10.72 2.7.3 4.10.73 2.7.4 4.10.74 2.7.5 4.10.75 2.7.6 4.10.76 2.7.7 4.10.77 2.7.8 4.10.78 2.7.9 4.10.79 2.8.0 4.10.8 2.8.1 4.10.80 2.8.2 4.10.81 2.8.3 4.10.82 2.8.4 4.10.83 2.8.5 4.10.84 2.8.6 4.10.85 2.8.7 4.10.86 2.8.8 4.10.87 2.8.9 4.10.88 2.9.0 4.10.89 2.9.1 4.10.9 2.9.2 4.10.90 2.9.3 4.11.0 2.9.4 4.11.1 2.9.5 4.11.10 2.9.6 4.11.11 2.9.7 4.11.12 2.9.8 4.11.13 2.9.9 4.11.14 3.0.0 4.11.15 3.0.1 4.11.16 3.0.2 4.11.17 3.0.3 4.11.18 3.0.4 4.11.19 3.0.5 4.11.2 3.0.6 4.11.20 3.0.7 4.11.21 3.0.8 4.11.22 3.0.9 4.11.23 3.1.0 4.11.24 3.1.1 4.11.25 3.1.2 4.11.26 3.1.3 4.11.27 3.1.4 4.11.28 3.1.5 4.11.29 3.1.6 4.11.3 3.1.7 4.11.30 3.1.8 4.11.31 3.1.9 4.11.32 3.10.0 4.11.33 3.10.1 4.11.34 3.10.2 4.11.35 3.10.3 4.11.36 3.10.4 4.11.37 3.10.5 4.11.38 3.10.6 4.11.39 3.10.7 4.11.4 3.10.8 4.11.40 3.10.9 4.11.41 3.11.0 4.11.42 3.11.1 4.11.43 3.11.2 4.11.44 3.11.3 4.11.45 3.11.4 4.11.46 3.11.5 4.11.47 3.11.6 4.11.48 3.11.7 4.11.49 3.11.8 4.11.5 3.11.9 4.11.50 3.12.0 4.11.51 3.12.1 4.11.52 3.12.2 4.11.53 3.12.3 4.11.54 3.2.0 4.11.55 3.2.1 4.11.56 3.2.2 4.11.57 3.2.3 4.11.58 3.2.4 4.11.59 3.2.5 4.11.6 3.2.6 4.11.60 3.2.7 4.11.61 3.2.8 4.11.62 3.2.9 4.11.63 3.20.0 4.11.64 3.20.1 4.11.65 3.20.2 4.11.66 3.20.3 4.11.67 3.20.4 4.11.68
premium-addons-for-elementor / includes / helpers / query-helper.php
premium-addons-for-elementor / includes / helpers Last commit date
acf-helper.php 2 months ago ajax-helper.php 2 months ago device-detector.php 2 months ago pa-nav-menu-walker.php 2 months ago papro-promotion.php 1 day ago query-helper.php 2 days ago widget-class-map.php 2 months ago widget-name-map.php 2 months ago
query-helper.php
448 lines
1 <?php
2 /**
3 * Query Helper Class
4 *
5 * @package PremiumAddons
6 */
7
8 namespace PremiumAddons\Includes\Helpers;
9
10 if ( ! defined( 'ABSPATH' ) ) {
11 exit; // Exit if accessed directly.
12 }
13
14 /**
15 * Class Query_Helper.
16 */
17 class Query_Helper {
18
19
20 /**
21 * Class instance
22 *
23 * @var instance
24 */
25 private static $instance = null;
26
27
28 /**
29 * Query_Helper constructor.
30 */
31 public function __construct() {
32 }
33
34 /**
35 * Get authors
36 *
37 * Get posts author array
38 *
39 * @since 3.20.3
40 * @access public
41 *
42 * @return array
43 */
44 public static function get_authors() {
45
46 $users = get_users(
47 array(
48 'role__in' => array( 'administrator', 'editor', 'author', 'contributor' ),
49 'fields' => array( 'ID', 'display_name' ), // Only fetch the necessary fields.
50 )
51 );
52
53 $options = array();
54
55 foreach ( $users as $user ) {
56 if ( 'wp_update_service' === $user->display_name ) {
57 continue;
58 }
59
60 $options[ $user->ID ] = $user->display_name;
61 }
62
63 return $options;
64 }
65
66 /**
67 * Get query args
68 *
69 * Get query arguments array
70 *
71 * @since 3.20.3
72 * @access public
73 *
74 * @param array $settings widget settings.
75 * @param string $target_post_type target post type.
76 *
77 * @return array query args
78 */
79 public static function get_query_args( $settings, $target_post_type = '' ) {
80
81 // Non-paginated widgets (e.g. ticker) must not inherit the main query's page number,
82 // otherwise they return empty results when the archive is on page 2+.
83 $paged = ( isset( $settings['widget_type'] ) && 'premium-post-ticker' === $settings['widget_type'] ) ? 1 : self::get_paged();
84 $tax_count = 0;
85
86 $post_type = $settings['post_type_filter'];
87 $post_id = get_the_ID();
88
89 if ( 'main' === $post_type ) {
90
91 global $wp_query;
92
93 $main_query = clone $wp_query;
94
95 return $main_query->query_vars;
96
97 }
98
99 $post_args = array(
100 'post_type' => ! empty( $target_post_type ) ? $target_post_type : $post_type,
101 'posts_per_page' => empty( $settings['premium_blog_number_of_posts'] ) ? 9999 : $settings['premium_blog_number_of_posts'],
102 'paged' => $paged,
103 'post_status' => 'publish',
104 'suppress_filters' => false,
105 );
106
107 // If select field control option is enabled in AJAX search, then return because we don't want any other post args.
108 if ( ! empty( $target_post_type ) ) {
109 return $post_args;
110 }
111
112 if ( 'related' === $post_type ) {
113 $current_post_type = get_post_type( $post_id );
114 $post_args['post_type'] = $current_post_type;
115 }
116
117 $post_args['orderby'] = $settings['premium_blog_order_by'];
118 $post_args['order'] = $settings['premium_blog_order'];
119
120 if ( 'meta_value' === $settings['premium_blog_order_by'] ) {
121 $post_args['meta_key'] = $settings['premium_blog_meta_key'];
122 }
123
124 if ( isset( $settings['posts_from'] ) ) {
125
126 if ( '' !== $settings['posts_from'] ) {
127 $last_time = strtotime( '-1 ' . $settings['posts_from'] );
128
129 $start_date = gmdate( 'Y-m-d', $last_time );
130 $end_date = gmdate( 'Y-m-d' );
131
132 $post_args['date_query'] = array(
133 array(
134 'after' => $start_date,
135 'before' => $end_date,
136 'inclusive' => true,
137 ),
138 );
139
140 }
141 }
142
143 $excluded_posts = array();
144
145 if ( ! empty( $settings['premium_blog_posts_exclude'] ) && 'post' === $post_type ) {
146
147 if ( 'premium-search-form' !== $settings['widget_type'] && 'post__in' === $settings['posts_filter_rule'] ) {
148 $post_args['post__in'] = $settings['premium_blog_posts_exclude'];
149 } else {
150 $excluded_posts = $settings['premium_blog_posts_exclude'];
151 }
152 } elseif ( 'related' === $post_type ) {
153
154 if ( 'product' === $current_post_type ) {
155
156 $post_cats = self::get_product_cats_ids( $post_id );
157
158 $post_args['tax_query'][] = array(
159 'taxonomy' => 'product_cat',
160 'field' => 'term_id',
161 'terms' => $post_cats,
162 'operator' => 'IN',
163 );
164
165 } else {
166 $post_cats = wp_get_post_categories( $post_id );
167
168 if ( ! empty( $post_cats ) ) {
169 $post_args['category__in'] = $post_cats;
170 }
171 }
172 } elseif ( ! empty( $settings['custom_posts_filter'] ) && ! in_array( $post_type, array( 'post', 'related' ), true ) ) {
173
174 // Optimization: Removed expensive validation that fetched all posts for the current post type.
175 // WP_Query already handles post type filtering when using post__in or post__not_in.
176 if ( 'post__in' === $settings['posts_filter_rule'] ) {
177 $post_args['post__in'] = $settings['custom_posts_filter'];
178 } else {
179 $excluded_posts = $settings['custom_posts_filter'];
180 }
181 }
182
183 if ( ! empty( $settings['premium_blog_users'] ) ) {
184
185 $post_args[ $settings['author_filter_rule'] ] = $settings['premium_blog_users'];
186 }
187
188 if ( 'related' !== $post_type ) {
189 // Get all the taxonomies associated with the post type.
190 $taxonomy = self::get_taxnomies( $post_type );
191
192 if ( ! empty( $taxonomy ) && ! is_wp_error( $taxonomy ) ) {
193
194 // Get all taxonomy values under the taxonomy.
195
196 $tax_count = 0;
197 foreach ( $taxonomy as $index => $tax ) {
198
199 if ( ! empty( $settings[ 'tax_' . $index . '_' . $post_type . '_filter' ] ) ) {
200
201 $operator = $settings[ $index . '_' . $post_type . '_filter_rule' ];
202
203 $post_args['tax_query'][] = array(
204 'taxonomy' => $index,
205 'field' => 'slug',
206 'terms' => $settings[ 'tax_' . $index . '_' . $post_type . '_filter' ],
207 'operator' => $operator,
208 );
209 ++$tax_count;
210 }
211 }
212 }
213 }
214
215 // needs to be checked.
216 if ( '' !== $settings['active_cat'] && '*' !== $settings['active_cat'] && 'related' !== $post_type ) {
217
218 $filter_type = $settings['filter_tabs_type'];
219
220 if ( 'tag' === $settings['filter_tabs_type'] ) {
221 $filter_type = 'post_tag';
222 }
223
224 $post_args['tax_query'][] = array(
225 'taxonomy' => $filter_type,
226 'field' => 'slug',
227 'terms' => $settings['active_cat'],
228 'operator' => 'IN',
229 );
230
231 }
232
233 if ( isset( $settings['premium_blog_offset'] ) && 0 < $settings['premium_blog_offset'] ) {
234
235 /**
236 * Offset break the pagination. Using WordPress's work around
237 *
238 * @see https://codex.wordpress.org/Making_Custom_Queries_using_Offset_and_Pagination
239 */
240 $post_args['offset_to_fix'] = $settings['premium_blog_offset'];
241
242 }
243
244 if ( isset( $settings['ignore_sticky_posts'] ) ) {
245 if ( 'yes' === $settings['ignore_sticky_posts'] ) {
246 $excluded_posts = array_merge( $excluded_posts, get_option( 'sticky_posts', array() ) );
247 } else {
248 $post_args['ignore_sticky_posts'] = true;
249 }
250 }
251
252 if ( ( isset( $settings['query_exclude_current'] ) && 'yes' === $settings['query_exclude_current'] ) || 'related' === $post_type ) {
253 $excluded_posts[] = $post_id;
254 }
255
256 $post_args['post__not_in'] = $excluded_posts;
257
258 return $post_args;
259 }
260
261 /**
262 * Get paged
263 *
264 * Returns the paged number for the query.
265 *
266 * @since 3.20.0
267 * @return int
268 */
269 public static function get_paged() {
270
271 global $wp_the_query, $paged;
272
273 $nonce = isset( $_POST['nonce'] ) ? sanitize_text_field( wp_unslash( $_POST['nonce'] ) ) : false;
274
275 if ( $nonce && wp_verify_nonce( $nonce, 'pa-blog-widget-nonce' ) ) {
276 if ( isset( $_POST['page_number'] ) && '' !== $_POST['page_number'] ) {
277 return sanitize_text_field( wp_unslash( $_POST['page_number'] ) );
278 }
279 }
280
281 // Check the 'paged' query var.
282 $paged_qv = $wp_the_query->get( 'paged' );
283
284 if ( is_numeric( $paged_qv ) ) {
285 return $paged_qv;
286 }
287
288 // Check the 'page' query var.
289 $page_qv = $wp_the_query->get( 'page' );
290
291 if ( is_numeric( $page_qv ) ) {
292 return $page_qv;
293 }
294
295 // Check the $paged global?
296 if ( is_numeric( $paged ) ) {
297 return $paged;
298 }
299
300 return 0;
301 }
302
303 /**
304 * Retrieves the product's categories IDs.
305 *
306 * @access public
307 * @since 2.8.20
308 *
309 * @param int $prod_id product id.
310 *
311 * @return array
312 */
313 public static function get_product_cats_ids( $prod_id ) {
314
315 $prod_cats = get_the_terms( $prod_id, 'product_cat' );
316 $cats_ids = array();
317
318 foreach ( $prod_cats as $index => $cat ) {
319 $cats_ids[] = $cat->term_id;
320 }
321
322 return $cats_ids;
323 }
324
325 /**
326 * Get posts list
327 *
328 * Used to set Premium_Post_Filter control default settings.
329 *
330 * @param string $post_type post type.
331 *
332 * @return array
333 */
334 public static function get_default_posts_list( $post_type ) {
335
336 // Use WP object cache to avoid repeated expensive database queries for post lists.
337 $cache_key = 'pa_posts_list_' . $post_type;
338 $options = wp_cache_get( $cache_key, 'premium_addons' );
339
340 if ( false !== $options ) {
341 return $options;
342 }
343
344 global $wpdb;
345
346 $list = $wpdb->get_results(
347 $wpdb->prepare(
348 "SELECT ID, post_title FROM $wpdb->posts WHERE post_type = %s AND post_status = 'publish'",
349 $post_type
350 )
351 ); // phpcs:ignore
352
353 $options = array();
354
355 if ( ! empty( $list ) ) {
356 foreach ( $list as $post ) {
357 $options[ $post->ID ] = $post->post_title;
358 }
359 }
360
361 wp_cache_set( $cache_key, $options, 'premium_addons', 15 * MINUTE_IN_SECONDS );
362
363 return $options;
364 }
365
366 /**
367 * Get taxonomies.
368 *
369 * Get post taxonomies for post type
370 *
371 * @since 3.20.3
372 * @access public
373 *
374 * @param string $type Post type.
375 */
376 public static function get_taxnomies( $type ) {
377
378 $taxonomies = get_object_taxonomies( $type, 'objects' );
379
380 $data = array();
381
382 foreach ( $taxonomies as $tax_slug => $tax ) {
383
384 if ( ! $tax->public || ! $tax->show_ui ) {
385 continue;
386 }
387
388 $data[ $tax_slug ] = (object) array(
389 'label' => $tax->label,
390 );
391 }
392
393 return $data;
394 }
395
396 /**
397 * Get posts types
398 *
399 * Get posts types array
400 *
401 * @since 3.20.3
402 * @access public
403 *
404 * @return array
405 */
406 public static function get_posts_types() {
407
408 $post_types = get_post_types(
409 array(
410 'public' => true,
411 ),
412 'objects'
413 );
414
415 $options = array();
416
417 foreach ( $post_types as $post_type ) {
418
419 if ( 'attachment' === $post_type->name ) {
420 continue;
421 }
422
423 $options[ $post_type->name ] = $post_type->label;
424 }
425
426 return $options;
427 }
428
429 /**
430 * Creates and returns an instance of the class
431 *
432 * @since 1.0.0
433 * @access public
434 *
435 * @return object
436 */
437 public static function get_instance() {
438
439 if ( ! isset( self::$instance ) ) {
440
441 self::$instance = new self();
442
443 }
444
445 return self::$instance;
446 }
447 }
448