PluginProbe
ShopBuilder – WooCommerce Builder For Elementor / 2.1.14
ShopBuilder – WooCommerce Builder For Elementor v2.1.14
3.4.2 3.4.1 3.4.0 2.0.1 2.0.2 2.0.3 2.1.0 2.1.1 2.1.10 2.1.11 2.1.12 2.1.13 2.1.14 2.1.15 2.1.2 2.1.3 2.1.4 2.1.5 2.1.6 2.1.7 2.1.8 2.1.9 2.2.0 2.2.1 2.2.2 All 63 releases
shopbuilder / app / Elementor / Helper / RenderHelpers.php

RenderHelpers.php in ShopBuilder – WooCommerce Builder For Elementor 2.1.14, at app/Elementor/Helper/RenderHelpers.php

1,003 lines 33.7 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 /**
3 * Elementor Render Helper Class.
4 *
5 * This class contains render helper logics.
6 *
7 * @package RadiusTheme\SB
8 */
9
10 namespace RadiusTheme\SB\Elementor\Helper;
11
12 use RadiusTheme\SB\Helpers\BuilderFns;
13 use RadiusTheme\SB\Helpers\Fns;
14
15 // Do not allow directly accessing this file.
16 if ( ! defined( 'ABSPATH' ) ) {
17 exit( 'This script cannot be accessed directly.' );
18 }
19
20 /**
21 * BuilderFns class
22 */
23 class RenderHelpers {
24 /**
25 * Get data.
26 *
27 * @param array|string $haystack The array or string to search for the value.
28 * @param string $needle The key to look for in the array or the string itself.
29 * @param mixed $default The default value to return if the key is not.
30 *
31 * @return mixed
32 */
33 public static function get_data( $haystack, $needle, $default = null ) {
34 if ( is_array( $haystack ) && ! empty( $haystack[ $needle ] ) ) {
35 return $haystack[ $needle ];
36 } elseif ( is_string( $haystack ) && ! empty( $haystack ) ) {
37 return $haystack;
38 } else {
39 return $default;
40 }
41 }
42
43 /**
44 * Builds an array with field values.
45 *
46 * @param array $meta Field values.
47 * @param string $template Template name.
48 * @param array $raw_settings Raw settings.
49 *
50 * @return array
51 */
52 public static function meta_dataset( array $meta, $template = '', $raw_settings = [] ) {
53 $c_image_size = self::get_data( $meta, 'image_custom_dimension', [] );
54 $c_image_size['crop'] = self::get_data( $meta, 'image_crop', [] );
55
56 if ( ( ! empty( $_GET['displayview'] ) && 'list' === $_GET['displayview'] ) || ( empty( $_GET['displayview'] ) && ( ! empty( $meta['view_mode'] ) && 'list' === $meta['view_mode'] ) ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended
57 $meta['cols'] = self::get_data( $meta, 'list_cols', 1 );
58 $meta['cols_tablet'] = self::get_data( $meta, 'list_cols_tablet', $meta['cols'] );
59 $meta['cols_mobile'] = self::get_data( $meta, 'list_cols_mobile', $meta['cols'] );
60 }
61
62 $data = apply_filters(
63 'rtsb/elementor/render/meta_dataset',
64 [
65 // Layout.
66 'widget' => 'custom',
67 'template' => self::get_data( $template, '', '' ),
68 'raw_settings' => $raw_settings,
69 'layout' => self::get_data( $meta, 'layout', 'layout1' ),
70 'grid_layout' => self::get_data( $raw_settings, 'layout', 'grid-layout1' ),
71 'list_layout' => self::get_data( $raw_settings, 'list_layout', 'list-layout1' ),
72 'd_cols' => self::get_data( $meta, 'cols', 0 ),
73 't_cols' => self::get_data( $meta, 'cols_tablet', 2 ),
74 'm_cols' => self::get_data( $meta, 'cols_mobile', 1 ),
75 'grid_type' => self::get_data( $meta, 'grid_style', 'even' ),
76
77 // Query.
78 'post_in' => self::get_data( $meta, 'include_posts', [] ),
79 'post_not_in' => self::get_data( $meta, 'exclude_posts', [] ),
80 'limit' => ( empty( $meta['posts_limit'] ) || '-1' === $meta['posts_limit'] ) ? 10000000 : $meta['posts_limit'],
81 'offset' => self::get_data( $meta, 'posts_offset', 0 ),
82 'order_by' => self::get_data( $meta, 'posts_order_by', 'date' ),
83 'order' => self::get_data( $meta, 'posts_order', 'DESC' ),
84 'author_in' => self::get_data( $meta, 'filter_author', [] ),
85 'display_by' => self::get_data( $meta, 'products_filter', 'date' ),
86 'categories' => self::get_data( $meta, 'filter_categories', [] ),
87 'tags' => self::get_data( $meta, 'filter_tags', [] ),
88 'attributes' => self::get_data( $meta, 'filter_attributes', [] ),
89 'relation' => self::get_data( $meta, 'tax_relation', 'OR' ),
90 'category_source' => self::get_data( $meta, 'select_source', 'product_cat' ),
91 'category_term' => self::get_data( $meta, 'select_cat' ),
92 'display_cat_by' => self::get_data( $meta, 'display_cat_by' ),
93 'include_cats' => self::get_data( $meta, 'include_cats', [] ),
94 'exclude_cats' => self::get_data( $meta, 'exclude_cats', [] ),
95 'select_parent_cat' => self::get_data( $meta, 'select_parent_cat' ),
96 'select_cats' => self::get_data( $meta, 'select_cats', [] ),
97 'select_cat_ids' => self::get_data( $meta, 'include_cat_ids', '' ),
98 'cats_limit' => ( empty( $meta['cats_limit'] ) || '-1' === $meta['cats_limit'] ) ? 10000000 : $meta['cats_limit'],
99 'show_empty' => ! empty( $meta['show_empty'] ),
100 'show_uncategorized' => ! empty( $meta['show_uncategorized'] ),
101 'show_subcats' => ! empty( $meta['show_subcats'] ),
102 'show_top_level_cats' => ! empty( $meta['show_top_level_cats'] ),
103 'cats_order_by' => self::get_data( $meta, 'cats_order_by', 'name' ),
104 'cats_order' => self::get_data( $meta, 'cats_order', 'DESC' ),
105 'rtsb_order' => self::get_data( $meta, 'rtsb_order', 'ASC' ),
106 'rtsb_orderby' => self::get_data( $meta, 'rtsb_orderby', 'menu_order' ),
107
108 // Pagination.
109 'pagination' => ! empty( $meta['show_pagination'] ),
110 'posts_loading_type' => self::get_data( $meta, 'pagination_type', 'pagination' ),
111 'posts_per_page' => self::get_data( $meta, 'pagination_per_page', '' ),
112
113 // Image.
114 'f_img' => ! empty( $meta['show_featured_image'] ),
115 'gallery_img' => ! empty( $meta['show_product_gallery'] ),
116 'c_img' => ! empty( $meta['show_cat_image'] ),
117 'hover_img' => ! empty( $meta['show_hover_image'] ),
118 'f_img_size' => self::get_data( $meta, 'image', 'medium' ),
119 'custom_img_size' => ! empty( $c_image_size ) && is_array( $c_image_size ) ? $c_image_size : [],
120 'default_img_id' => ! empty( $meta['default_preview_image']['id'] ) ? $meta['default_preview_image']['id'] : null,
121 'show_overlay' => ! empty( $meta['show_overlay'] ),
122 'hover_animation' => self::get_data( $meta, 'image_hover_animation', 'none' ),
123 'show_custom_image' => ! empty( $meta['show_custom_image'] ),
124 'custom_image' => ! empty( $meta['custom_image']['id'] ) ? $meta['custom_image']['id'] : null,
125
126 // Visibility.
127 'visibility' => ! empty( self::content_visibility( $meta ) ) ? self::content_visibility( $meta ) : [],
128
129 // Action Buttons.
130 'btn_preset' => self::get_data( $meta, 'action_btn_preset', 'preset1' ),
131 'btn_position' => self::get_data( $meta, 'action_btn_position', 'above' ),
132 'tooltip_position' => self::get_data( $meta, 'action_btn_tooltip_position', 'top' ),
133
134 // Product Title.
135 'title_tag' => self::get_data( $meta, 'title_tag', 'h3' ),
136 'title_hover' => ! empty( $meta['title_hover'] ),
137 'title_limit' => self::get_data( $meta, 'title_limit', 'default' ),
138 'title_limit_custom' => self::get_data( $meta, 'title_limit_custom' ),
139 'show_custom_title' => ! empty( $meta['show_custom_title'] ),
140 'cat_custom_title' => self::get_data( $meta, 'custom_title', '' ),
141
142 // Variation Swatches.
143 'swatch_position' => self::get_data( $meta, 'swatch_position', 'top' ),
144 'swatch_type' => self::get_data( $meta, 'swatch_type', 'circle' ),
145
146 // Short Description.
147 'show_custom_excerpt' => ! empty( $meta['show_custom_description'] ),
148 'cat_custom_excerpt' => self::get_data( $meta, 'custom_description', '' ),
149 'cat_excerpt_position' => self::get_data( $meta, 'excerpt_position', 'below' ),
150 'excerpt_limit' => self::get_data( $meta, 'excerpt_limit', 'default' ),
151 'excerpt_limit_custom' => self::get_data( $meta, 'excerpt_limit_custom', 200 ),
152
153 // Count.
154 'count_position' => self::get_data( $meta, 'count_display_type', 'flex' ),
155 'before_count' => self::get_data( $meta, 'before_count', '' ),
156 'after_count' => self::get_data( $meta, 'after_count', '' ),
157
158 // Add to cart.
159 'show_cart_icon' => ! empty( $meta['show_cart_icon'] ),
160 'show_cart_text' => ! empty( $meta['show_cart_text'] ),
161 'add_to_cart_icon' => self::get_data( $meta, 'add_to_cart_icon', [] ),
162 'add_to_cart_success_icon' => self::get_data( $meta, 'add_to_cart_success_icon', [] ),
163 'add_to_cart_text' => self::get_data( $meta, 'add_to_cart_text', esc_html__( 'Add to Cart', 'shopbuilder' ) ),
164 'add_to_cart_success_text' => self::get_data( $meta, 'add_to_cart_success_text', '' ),
165 'add_to_cart_alignment' => self::get_data( $meta, 'cart_icon_alignment', 'left' ),
166
167 // Action Button Icons.
168 'quick_view_icon' => self::get_data( $meta, 'quick_view_icon', [] ),
169 'comparison_icon' => self::get_data( $meta, 'comparison_icon', [] ),
170 'comparison_icon_added' => self::get_data( $meta, 'comparison_icon_added', [] ),
171 'wishlist_icon' => self::get_data( $meta, 'wishlist_icon', [] ),
172 'wishlist_icon_added' => self::get_data( $meta, 'wishlist_icon_added', [] ),
173
174 // Badges.
175 'sale_badge_type' => self::get_data( $meta, 'sale_badges_type', 'percentage' ),
176 'sale_badge_text' => self::get_data( $meta, 'sale_badges_text', esc_html__( 'Sale', 'shopbuilder' ) ),
177 'custom_badge_text' => self::get_data( $meta, 'custom_badge_text', esc_html__( 'Sale', 'shopbuilder' ) ),
178 'out_of_stock_badge_text' => self::get_data( $meta, 'stock_badges_text', esc_html__( 'Out of Stock', 'shopbuilder' ) ),
179 'badge_position' => self::get_data( $meta, 'badges_position', 'top' ),
180 'badge_alignment' => self::get_data( $meta, 'badges_alignment', 'left' ),
181 'badge_preset' => self::get_data( $meta, 'custom_badge_preset', 'preset-1' ),
182 'enable_badges_module' => self::get_data( $meta, 'enable_badges_module', '' ),
183
184 // Link.
185 'image_link' => ! empty( $meta['image_link'] ),
186 'title_link' => ! empty( $meta['title_link'] ),
187 'hover_btn_text' => self::get_data( $meta, 'hover_btn_text', esc_html__( 'See Details', 'shopbuilder' ) ),
188 'show_hover_btn_icon' => ! empty( $meta['show_hover_btn_icon'] ),
189 'hover_btn_icon' => self::get_data( $meta, 'hover_btn_icon', [] ),
190 'custom_link' => self::get_data( $meta, 'custom_link' ),
191
192 // Slider.
193 'd_group' => self::get_data( $meta, 'cols_group', 1 ),
194 't_group' => self::get_data( $meta, 'cols_group_tablet', 1 ),
195 'm_group' => self::get_data( $meta, 'cols_group_mobile', 1 ),
196 'auto_play' => ! empty( $meta['slide_autoplay'] ),
197 'stop_on_hover' => ! empty( $meta['pause_hover'] ),
198 'slider_nav' => ! empty( $meta['slider_nav'] ),
199 'slider_dot' => ! empty( $meta['slider_pagi'] ),
200 'slider_dynamic_dot' => ! empty( $meta['slider_dynamic_pagi'] ),
201 'loop' => ! empty( $meta['slider_loop'] ),
202 'lazy_load' => ! empty( $meta['slider_lazy_load'] ),
203 'auto_height' => ! empty( $meta['slider_auto_height'] ),
204 'speed' => self::get_data( $meta, 'slide_speed', 2000 ),
205 'space_between' => isset( $meta['grid_gap']['size'] ) && strlen( $meta['grid_gap']['size'] ) ? $meta['grid_gap']['size'] : 30,
206 'auto_play_timeout' => self::get_data( $meta, 'autoplay_timeout', 5000 ),
207 'nav_position' => self::get_data( $meta, 'slider_nav_position', 'top' ),
208 'left_arrow_icon' => self::get_data( $meta, 'slider_left_arrow_icon', [] ),
209 'right_arrow_icon' => self::get_data( $meta, 'slider_right_arrow_icon', [] ),
210 ],
211 $meta
212 );
213
214 if ( ! empty( $meta['active_cat_slider'] ) ) {
215 $data['active_cat_slider'] = true;
216 }
217
218 if ( ! empty( $meta['cols_widescreen'] ) ) {
219 $data['w_cols'] = $meta['cols_widescreen'];
220 }
221
222 if ( ! empty( $meta['cols_laptop'] ) ) {
223 $data['l_cols'] = $meta['cols_laptop'];
224 }
225
226 if ( ! empty( $meta['cols_tablet_extra'] ) ) {
227 $data['te_cols'] = $meta['cols_tablet_extra'];
228 }
229
230 if ( ! empty( $meta['cols_mobile_extra'] ) ) {
231 $data['me_cols'] = $meta['cols_mobile_extra'];
232 }
233
234 $queried_obj = get_queried_object();
235
236 if ( is_shop() || is_product_taxonomy() ) {
237 $data['posts_per_page'] = self::get_products_per_page();
238 $data['order_by'] = self::get_data( $data, 'rtsb_orderby', $data['order_by'] );
239 $data['order'] = self::get_data( $data, 'rtsb_order', $data['order'] );
240 }
241
242 if ( ! is_shop() && is_product_taxonomy() ) {
243 if ( ! empty( $queried_obj->taxonomy ) ) {
244 $data['queried_tax'] = esc_html( $queried_obj->taxonomy );
245 }
246
247 if ( ! empty( $queried_obj->term_id ) ) {
248 $data['queried_term'] = esc_html( $queried_obj->term_id );
249 }
250 }
251
252 return apply_filters( 'rtsb/elementor/render/meta_dataset_final', $data, $meta, $raw_settings );
253 }
254
255 /**
256 * Builds an array with field values.
257 *
258 * @param array $meta Field values.
259 * @param string $template Template name.
260 *
261 * @return array
262 */
263 public static function archive_meta_dataset( array $meta, $template = '' ) {
264 $data = apply_filters(
265 'rtsb/elementor/render/archive_meta_dataset',
266 [
267 // Layout.
268 'widget' => 'default',
269 'template' => self::get_data( $template, '', '' ),
270 'view_mode' => self::get_data( $meta, 'view_mode', 'grid' ),
271 'show_flash_sale' => ! empty( $meta['show_flash_sale'] ),
272 'wishlist_button' => ! empty( $meta['wishlist_button'] ),
273 'comparison_button' => ! empty( $meta['comparison_button'] ),
274 'quick_view_button' => ! empty( $meta['quick_view_button'] ),
275 'show_rating' => ! empty( $meta['show_rating'] ),
276 'show_pagination' => ! empty( $meta['show_pagination'] ),
277 'cart_icon' => self::get_data( $meta, 'cart_icon', [] ),
278 'wishlist_icon' => self::get_data( $meta, 'wishlist_icon', [] ),
279 'wishlist_icon_added' => self::get_data( $meta, 'wishlist_icon_added', [] ),
280 'comparison_icon' => self::get_data( $meta, 'comparison_icon', [] ),
281 'comparison_icon_added' => self::get_data( $meta, 'comparison_icon_added', [] ),
282 'quick_view_icon' => self::get_data( $meta, 'quick_view_icon', [] ),
283 'prev_icon' => self::get_data( $meta, 'prev_icon', [] ),
284 'next_icon' => self::get_data( $meta, 'next_icon', [] ),
285 'posts_per_page' => self::get_products_per_page(),
286 'rtsb_order' => self::get_data( $meta, 'rtsb_order', 'ASC' ),
287 'rtsb_orderby' => self::get_data( $meta, 'rtsb_orderby', 'menu_order' ),
288 'tooltip_position' => self::get_data( $meta, 'action_btn_tooltip_position', 'top' ),
289 ],
290 $meta
291 );
292
293 $queried_obj = get_queried_object();
294
295 if ( ! is_shop() && BuilderFns::is_archive() ) {
296 if ( ! empty( $queried_obj->taxonomy ) ) {
297 $data['queried_tax'] = esc_html( $queried_obj->taxonomy );
298 }
299
300 if ( ! empty( $queried_obj->term_id ) ) {
301 $data['queried_term'] = esc_html( $queried_obj->term_id );
302 }
303 }
304
305 return apply_filters( 'rtsb/elementor/render/archive_meta_dataset_final', $data, $meta );
306 }
307
308 /**
309 * Setting up content visibility
310 *
311 * @param array $settings Elementor settings.
312 *
313 * @return array
314 */
315 public static function content_visibility( $settings ) {
316 $visibility = [];
317
318 if ( ! empty( $settings['show_title'] ) ) {
319 $visibility[] = 'title';
320 }
321
322 if ( ! empty( $settings['show_short_desc'] ) ) {
323 $visibility[] = 'excerpt';
324 }
325
326 if ( ! empty( $settings['show_price'] ) ) {
327 $visibility[] = 'price';
328 }
329
330 if ( ! empty( $settings['show_rating'] ) ) {
331 $visibility[] = 'rating';
332 }
333
334 if ( ! empty( $settings['show_badges'] ) ) {
335 $visibility[] = 'badges';
336 }
337
338 if ( ! empty( $settings['show_categories'] ) ) {
339 $visibility[] = 'categories';
340 }
341
342 if ( ! empty( $settings['single_category'] ) ) {
343 $visibility[] = 'single-cat';
344 }
345
346 if ( ! empty( $settings['show_swatches'] ) ) {
347 $visibility[] = 'swatches';
348 }
349
350 if ( ! empty( $settings['show_vs_clear_btn'] ) ) {
351 $visibility[] = 'clear-btn';
352 }
353
354 if ( ! empty( $settings['show_count'] ) ) {
355 $visibility[] = 'count';
356 }
357
358 if ( ! empty( $settings['show_wishlist'] ) ) {
359 $visibility[] = 'wishlist';
360 }
361
362 if ( ! empty( $settings['show_compare'] ) ) {
363 $visibility[] = 'compare';
364 }
365
366 if ( ! empty( $settings['show_quick_view'] ) ) {
367 $visibility[] = 'quick_view';
368 }
369
370 if ( ! empty( $settings['show_add_to_cart'] ) ) {
371 $visibility[] = 'add_to_cart';
372 }
373
374 return $visibility;
375 }
376
377 /**
378 * Set Default Layout.
379 *
380 * @param string $layout Layout.
381 *
382 * @return string
383 */
384 public static function set_default_layout( $layout ) {
385 $is_list = preg_match( '/list/', $layout );
386 $is_cat_single = preg_match( '/category-single/', $layout );
387 $is_cat = preg_match( '/category/', $layout );
388 $is_carousel = preg_match( '/slider/', $layout );
389 $default = 'grid-layout1';
390
391 if ( $is_list ) {
392 $default = 'list-layout1';
393 } elseif ( $is_cat_single ) {
394 $default = 'category-single-layout1';
395 } elseif ( $is_cat ) {
396 $default = 'category-layout1';
397 } elseif ( $is_carousel ) {
398 $default = 'slider-layout1';
399 }
400
401 return $default;
402 }
403
404 /**
405 * Default layout columns.
406 *
407 * @param int $layout Layout.
408 *
409 * @return int
410 */
411 public static function default_columns( $layout ) {
412 switch ( $layout ) {
413 case 'grid-layout2':
414 case 'slider-layout2':
415 $columns = 3;
416 break;
417
418 case 'list-layout1':
419 case 'list-layout2':
420 case 'list-layout3':
421 case 'list-layout7':
422 case 'list-layout5':
423 $columns = 1;
424 break;
425
426 case 'list-layout4':
427 case 'list-layout6':
428 case 'slider-layout5':
429 case 'slider-layout8':
430 $columns = 2;
431 break;
432
433 case 'grid-layout6':
434 $columns = 5;
435 break;
436
437 case 'category-layout1':
438 $columns = 6;
439 break;
440
441 default:
442 $columns = 4;
443 break;
444 }
445
446 return apply_filters( 'rtsb/element/general/default_columns', $columns, $layout );
447 }
448
449 /**
450 * Pagination JSON data.
451 *
452 * @param array $metas Data set.
453 * @param string $template Template name.
454 *
455 * @return string
456 */
457 public static function pagination_data( $metas, $template ) {
458 $el_data = self::meta_dataset( $metas, $template );
459
460 return esc_js( wp_json_encode( $el_data, JSON_UNESCAPED_UNICODE ) );
461 }
462
463 /**
464 * Container classes
465 *
466 * @param array $metas Meta data.
467 * @param array $settings Settings array.
468 * @param string $custom_class Custom class.
469 *
470 * @return mixed|null
471 */
472 public static function prepare_container_classes( $metas = [], $settings = [], $custom_class = '' ) {
473 $classes = 'rtsb-elementor-container products rtsb-pos-r ';
474 $classes .= $custom_class;
475
476 $raw_layout = esc_html( $metas['layout'] );
477 $layout = self::filter_layout( $raw_layout );
478 $is_cat = preg_match( '/category/', $layout );
479 $cart_txt_class = '';
480
481 $animation = $metas['hover_animation'];
482
483 if ( ! $is_cat ) {
484 $cart_txt_class = $metas['show_cart_text'] ? ' has-cart-text' : ' no-cart-text';
485 $animation .= ' gallery-hover-' . ( ! empty( $settings['gallery_hover_animation'] ) ? $settings['gallery_hover_animation'] : 'fade' );
486 }
487
488 $badge_class = [
489 'position' => $metas['badge_position'],
490 'alignment' => $metas['badge_alignment'],
491 ];
492
493 if ( ! in_array( 'clear-btn', $metas['visibility'], true ) ) {
494 $classes .= ' no-clear-btn';
495 }
496
497 $classes .= ! empty( $metas['pagination'] ) ? ' rtsb-has-pagination' : ' rtsb-no-pagination';
498 $classes .= ' badge-' . esc_attr( $badge_class['position'] ) . ' badge-' . esc_attr( $badge_class['alignment'] ) . esc_attr( $cart_txt_class ) . ' img-hover-' . esc_attr( $animation ) . ' excerpt-' . esc_attr( $metas['cat_excerpt_position'] );
499
500 if ( $metas['show_overlay'] ) {
501 $classes .= ' has-overlay';
502 }
503
504 if ( in_array( 'single-cat', $metas['visibility'], true ) ) {
505 $classes .= ' show-single-cat';
506 }
507
508 if ( ! $is_cat ) {
509 $action_btn_classes = [
510 'show_compare_text' => 'has-compare-text',
511 'show_quick_view_text' => 'has-quick-view-text',
512 'show_wishlist_text' => 'has-wishlist-text',
513 'show_compare_icon' => 'no-compare-icon',
514 'show_quick_view_icon' => 'no-quick-view-icon',
515 'show_wishlist_icon' => 'no-wishlist-icon',
516 'show_quick_checkout_icon' => 'no-quick_checkout-icon',
517 ];
518
519 foreach ( $action_btn_classes as $setting_key => $class ) {
520 if ( strpos( $setting_key, 'icon' ) !== false ) {
521 $classes .= empty( $settings[ $setting_key ] ) ? ' ' . $class : '';
522 } else {
523 $classes .= ! empty( $settings[ $setting_key ] ) ? ' ' . $class : '';
524 }
525 }
526
527 if ( rtsb()->has_pro() && ! empty( $settings['custom_ordering'] ) ) {
528 $classes .= ' has-custom-ordering';
529 }
530 }
531 if ( rtsb()->has_pro() && ! empty( $settings['slider_slide_animation'] ) ) {
532 $classes .= ' has-slide-animation';
533 }
534
535 return apply_filters( 'rtsb/product/container/class', $classes, $settings );
536 }
537
538 /**
539 * Function to filter and validate the layout against allowed patterns.
540 *
541 * @param string $layout The layout string to be filtered.
542 * @param string $template The template to be checked.
543 *
544 * @return string
545 */
546 public static function filter_layout( $layout, $template = '' ) {
547 $allowed_patterns = apply_filters( 'rtsb/elementor/custom_layout', [ 'grid', 'list', 'slider', 'category', 'toyup', 'zilly' ] );
548 $layout_part = explode( '-', $layout );
549 $default = 'grid-layout1';
550
551 if ( empty( $layout_part[0] ) ) {
552 return $default;
553 }
554
555 if ( in_array( $layout_part[0], $allowed_patterns, true ) ) {
556 return $layout;
557 } else {
558 if ( ! empty( $template ) ) {
559 $grid = preg_match( '/grid/', $template );
560 $list = preg_match( '/list/', $template );
561 $slider = preg_match( '/slider/', $template );
562 $category = preg_match( '/category/', $template );
563
564 if ( $grid ) {
565 return $default;
566 } elseif ( $list ) {
567 return 'list-layout1';
568 } elseif ( $slider ) {
569 return 'slider-layout1';
570 } elseif ( $category ) {
571 return 'category-layout1';
572 } else {
573 return $default;
574 }
575 } else {
576 return $default;
577 }
578 }
579 }
580
581 /**
582 * Row classes
583 *
584 * @param array $settings Settings array.
585 *
586 * @return mixed|null
587 */
588 public static function prepare_row_classes( $settings = [] ) {
589 $masonry_class = null;
590 $classes = 'rtsb-row rtsb-content-loader element-loading';
591 $loader_class = ' rtsb-pre-loader';
592
593 $raw_layout = esc_html( $settings['layout'] );
594 $layout = self::filter_layout( $raw_layout );
595 $grid_type = $settings['grid_type'];
596 $is_carousel = preg_match( '/slider/', $layout );
597
598 if ( preg_match( '/category/', $layout ) && ! empty( $settings['active_cat_slider'] ) ) {
599 $classes .= ' rtsb-slider-layout';
600 }
601
602 if ( 'even' === $grid_type ) {
603 $masonry_class = ' rtsb-even';
604 } elseif ( 'masonry' === $grid_type ) {
605 $masonry_class = ' rtsb-masonry';
606 }
607
608 if ( ! rtsb()->has_pro() || $is_carousel ) {
609 $masonry_class = ' rtsb-even';
610 }
611 if ( $is_carousel && ! empty( $settings['raw_settings']['always_show_nav'] ) ) {
612 $classes .= ' always-show-nav';
613 }
614 if ( ! empty( $settings['raw_settings']['inner_slider_always_show_nav'] ) ) {
615 $classes .= ' inner-slider-always-show-nav';
616 }
617
618 $classes .= ' rtsb-' . $layout . $masonry_class . $loader_class;
619
620 return apply_filters( 'rtsb/elementor/row/classes', $classes, $settings );
621 }
622
623 /**
624 * Prepare pagination attributes.
625 *
626 * @param string $layout The layout type.
627 * @param bool $has_filters Whether the widget has filters.
628 * @param string $template The template name.
629 * @param array $settings The widget settings.
630 * @param bool $ajax Whether to enable AJAX pagination.
631 *
632 * @return string
633 */
634 public static function prepare_pagination_attr( $layout, $has_filters, $template, $settings, $ajax ) {
635 $is_cat = preg_match( '/category/', $layout );
636 $is_carousel = preg_match( '/slider/', $layout );
637
638 if ( $is_carousel ) {
639 return $has_filters ? self::pagination_data( $settings, $template ) : '';
640 } elseif ( $is_cat ) {
641 return '';
642 } else {
643 $ajax_pagination = ! empty( $settings['show_pagination'] ) && 'pagination' !== $settings['pagination_type'];
644 $page = Fns::product_filters_has_ajax( apply_filters( 'rtsb/builder/set/current/page/type', '' ) );
645 $condition = rtsb()->has_pro() && $ajax && ( $ajax_pagination || $has_filters || $page );
646
647 return $condition ? self::pagination_data( $settings, $template ) : '';
648 }
649 }
650
651 /**
652 * Archive JSON data.
653 *
654 * @param array $metas Data set.
655 * @param string $template Template name.
656 *
657 * @return string
658 */
659 public static function archive_data( $metas, $template ) {
660 $el_data = self::archive_meta_dataset( $metas, $template );
661
662 return ' data-rtsb-ajax=\'' . esc_js( wp_json_encode( $el_data ) ) . '\'';
663 }
664
665 /**
666 * Slider options.
667 *
668 * @param array $meta Meta values.
669 * @param array $settings Raw Settings.
670 *
671 * @return array
672 */
673 public static function slider_data( array $meta, $settings = [] ) {
674 $has_dots = $meta['slider_dot'] ? ' has-dot' : ' no-dot';
675 $has_dots .= $meta['slider_nav'] ? ' has-nav' : ' no-nav';
676 $has_dynamic_dots = $meta['slider_dynamic_dot'] ? true : false;
677 $d_col = 0 === $meta['d_cols'] ? self::default_columns( $meta['layout'] ) : $meta['d_cols'];
678 $t_col = 0 === $meta['t_cols'] ? 2 : $meta['t_cols'];
679 $m_col = 0 === $meta['m_cols'] ? 1 : $meta['m_cols'];
680
681 if ( \Elementor\Plugin::$instance->breakpoints->has_custom_breakpoints() ) {
682 // Widescreen.
683 $w_col = self::get_data( $settings, 'cols_widescreen' );
684 $w_col = 0 === $w_col ? self::default_columns( $meta['layout'] ) : $w_col;
685 $w_group = self::get_data( $settings, 'cols_group_widescreen', 1 );
686
687 // Laptop.
688 $l_col = self::get_data( $settings, 'cols_laptop' );
689 $l_col = 0 === $l_col ? self::default_columns( $meta['layout'] ) : $l_col;
690 $l_group = self::get_data( $settings, 'cols_group_laptop', 1 );
691
692 // Tablet Landscape.
693 $te_col = self::get_data( $settings, 'cols_tablet_extra' );
694 $te_col = 0 === $te_col ? 3 : $te_col;
695 $te_group = self::get_data( $settings, 'cols_group_tablet_extra', 1 );
696
697 // Mobile Landscape.
698 $me_col = self::get_data( $settings, 'cols_mobile_extra' );
699 $me_col = 0 === $me_col ? 2 : $me_col;
700 $me_group = self::get_data( $settings, 'cols_group_mobile_extra', 1 );
701
702 $el_breakpoints = Fns::get_elementor_breakpoints();
703
704 foreach ( $el_breakpoints as $key => $value ) {
705 if ( isset( $value['is_enabled'] ) && ! $value['is_enabled'] ) {
706 unset( $el_breakpoints[ $key ] );
707 }
708 }
709
710 $breakpoints = [
711 0 => [
712 'slidesPerView' => absint( $m_col ),
713 'slidesPerGroup' => absint( $meta['m_group'] ),
714 'pagination' => [
715 'dynamicBullets' => $has_dynamic_dots,
716 ],
717 ],
718 ];
719
720 $desktop = [
721 'desktop' => [
722 'label' => 'Desktop',
723 'value' => 1920,
724 'is_enabled' => 1,
725 ],
726 ];
727
728 if ( ! empty( $el_breakpoints['laptop'] ) && $el_breakpoints['laptop']['is_enabled'] ) {
729 $widescreen_position = array_search( 'widescreen', array_keys( $el_breakpoints ), true );
730 $el_breakpoints = array_merge(
731 array_slice( $el_breakpoints, 0, $widescreen_position ),
732 $desktop,
733 array_slice( $el_breakpoints, $widescreen_position )
734 );
735 } else {
736 $desktop['desktop']['value'] = 1366;
737 $el_breakpoints['desktop'] = $desktop['desktop'];
738 }
739
740 foreach ( $el_breakpoints as $el_breakpoint => $value ) {
741 $breakpoint_value = ! empty( $value['value'] ) ? $value['value'] : $value['default_value'];
742 $dynamic_bullets = $has_dynamic_dots;
743 $slides_per_view = $d_col;
744 $slides_per_group = $meta['d_group'];
745
746 switch ( $el_breakpoint ) {
747 case 'widescreen':
748 $slides_per_view = $w_col;
749 $slides_per_group = $w_group;
750
751 break;
752
753 case 'laptop':
754 $slides_per_view = $l_col;
755 $slides_per_group = $l_group;
756
757 break;
758
759 case 'tablet_extra':
760 $slides_per_view = $l_col;
761 $slides_per_group = $l_group;
762
763 if ( empty( $el_breakpoints['laptop'] ) ) {
764 $slides_per_view = $d_col;
765 $slides_per_group = $meta['d_group'];
766 }
767
768 break;
769
770 case 'tablet':
771 $slides_per_view = $te_col;
772 $slides_per_group = $te_group;
773
774 if ( empty( $el_breakpoints['laptop'] ) && empty( $el_breakpoints['tablet_extra'] ) ) {
775 $slides_per_view = $d_col;
776 $slides_per_group = $meta['d_group'];
777 } elseif ( empty( $el_breakpoints['laptop'] ) && ! empty( $el_breakpoints['tablet_extra'] ) ) {
778 $slides_per_view = $te_col;
779 $slides_per_group = $te_group;
780 } elseif ( ! empty( $el_breakpoints['laptop'] ) && empty( $el_breakpoints['tablet_extra'] ) ) {
781 $slides_per_view = $l_col;
782 $slides_per_group = $l_group;
783 }
784
785 break;
786
787 case 'mobile_extra':
788 $slides_per_view = $t_col;
789 $slides_per_group = $meta['t_group'];
790 $dynamic_bullets = $has_dynamic_dots;
791
792 break;
793
794 case 'mobile':
795 $slides_per_view = $t_col;
796 $slides_per_group = $meta['t_group'];
797 $dynamic_bullets = $has_dynamic_dots;
798
799 if ( ! empty( $el_breakpoints['mobile_extra'] ) ) {
800 $slides_per_view = $me_col;
801 $slides_per_group = $me_group;
802 }
803
804 break;
805 }
806
807 if ( $value['is_enabled'] ) {
808 $br = 'widescreen' !== $el_breakpoint ? $breakpoint_value + 1 : $breakpoint_value;
809
810 $breakpoints[ absint( $br ) ] = [
811 'slidesPerView' => absint( $slides_per_view ),
812 'slidesPerGroup' => absint( $slides_per_group ),
813 'pagination' => [
814 'dynamicBullets' => $dynamic_bullets,
815 ],
816 ];
817 }
818 }
819 } else {
820 $breakpoints = [
821 0 => [
822 'slidesPerView' => absint( $m_col ),
823 'slidesPerGroup' => absint( $meta['m_group'] ),
824 'pagination' => [
825 'dynamicBullets' => $has_dynamic_dots,
826 ],
827 ],
828 768 => [
829 'slidesPerView' => absint( $t_col ),
830 'slidesPerGroup' => absint( $meta['t_group'] ),
831 'pagination' => [
832 'dynamicBullets' => $has_dynamic_dots,
833 ],
834 ],
835 1025 => [
836 'slidesPerView' => absint( $d_col ),
837 'slidesPerGroup' => absint( $meta['d_group'] ),
838 'pagination' => [
839 'dynamicBullets' => $has_dynamic_dots,
840 ],
841 ],
842 ];
843 }
844
845 $slider_options = [
846 'slidesPerView' => absint( $d_col ),
847 'slidesPerGroup' => absint( $meta['d_group'] ),
848 'speed' => absint( $meta['speed'] ),
849 'loop' => $meta['loop'],
850 'autoHeight' => $meta['auto_height'],
851 'preloadImages' => ! $meta['lazy_load'],
852 'lazy' => $meta['lazy_load'],
853 'breakpoints' => $breakpoints,
854 ];
855
856 if ( ! empty( $meta['raw_settings']['slider_slide_animation'] ) ) {
857 $slider_options['watchSlidesProgress'] = true;
858 }
859 if ( $meta['auto_play'] ) {
860 $slider_options['autoplay'] = [
861 'delay' => absint( $meta['auto_play_timeout'] ),
862 'pauseOnMouseEnter' => $meta['stop_on_hover'],
863 'disableOnInteraction' => false,
864 ];
865 }
866
867 $slider_options = apply_filters( 'rtsb/elementor/render/slider_dataset', $slider_options, $meta );
868 $carouselClass = 'rtsb-carousel-slider slider-loading rtsb-pos-s ' . $meta['nav_position'] . '-nav' . $has_dots;
869
870 return [
871 'data' => esc_js( wp_json_encode( $slider_options ) ),
872 'class' => $carouselClass,
873 ];
874 }
875
876 /**
877 * Preloader.
878 *
879 * @param string $layout Layout.
880 *
881 * @return string
882 */
883 public static function pre_loader( $layout ) {
884 $loader_class = '';
885
886 $is_carousel = preg_match( '/slider/', $layout );
887
888 if ( $is_carousel ) {
889 $loader_class = ' full-op';
890 }
891
892 return '<div class="rtsb-elements-loading rtsb-ball-clip-rotate"><div></div></div>';
893 }
894
895 /**
896 * Badge class.
897 *
898 * @param string $preset Badge preset.
899 *
900 * @return string|null
901 */
902 public static function badge_class( $preset ) {
903 switch ( $preset ) {
904 case 'preset-default':
905 $class = 'default-badge';
906 break;
907 case 'preset2':
908 $class = 'fill angle-right';
909 break;
910 case 'preset3':
911 $class = 'outline';
912 break;
913
914 case 'preset4':
915 $class = 'outline angle-right';
916 break;
917
918 default:
919 $class = 'fill';
920 break;
921 }
922
923 return $class;
924 }
925
926 /**
927 * Registers required scripts.
928 *
929 * @param array $scripts Scripts to register.
930 *
931 * @return void
932 */
933 public static function register_scripts( $scripts ) {
934 $caro = false;
935 $script = [];
936
937 $script[] = 'jquery';
938
939 foreach ( $scripts as $sc => $value ) {
940 if ( ! empty( $sc ) ) {
941 if ( 'isCarousel' === $sc ) {
942 $caro = $value;
943 }
944 }
945 }
946
947 if ( count( $scripts ) ) {
948 /**
949 * Scripts.
950 */
951 if ( $caro ) {
952 $script[] = 'swiper';
953 }
954
955 $script[] = 'rtsb-imagesloaded';
956 $script[] = 'rtsb-public';
957
958 foreach ( $script as $sc ) {
959 wp_enqueue_script( $sc );
960 }
961 }
962 }
963
964 /**
965 * Check if a wrapper is needed based on the current theme.
966 *
967 * @return bool
968 */
969 public static function is_wrapper_needed() {
970 $theme_list = apply_filters(
971 'rtsb/products/inner/wrapper/basedon/themes',
972 [
973 'twentytwentyone',
974 'twentytwentytwo',
975 'twentytwentythree',
976 'storefront',
977 'hello-elementor',
978 'astra',
979 ],
980 rtsb()->current_theme
981 );
982
983 if ( in_array( rtsb()->current_theme, $theme_list, true ) ) {
984 return true;
985 }
986
987 return false;
988 }
989
990 /**
991 * Get the number of products per page based on WooCommerce settings.
992 *
993 * @return int
994 */
995 public static function get_products_per_page() {
996 $products_row = absint( get_option( 'woocommerce_catalog_rows', 4 ) );
997 $products_col = absint( get_option( 'woocommerce_catalog_columns', 4 ) );
998 $products_per_page = apply_filters( 'rtsb/elementor/archive/products_per_page', $products_row * $products_col );
999
1000 return ! empty( $products_per_page ) ? $products_per_page : 12;
1001 }
1002 }
1003