PluginProbe
ShopBuilder – WooCommerce Builder For Elementor / 2.4.2
ShopBuilder – WooCommerce Builder For Elementor v2.4.2
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.4.2, at app/Elementor/Helper/RenderHelpers.php

1,010 lines 33.8 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 case 'grid-layout9':
435 $columns = 5;
436 break;
437
438 case 'category-layout1':
439 $columns = 6;
440 break;
441
442 default:
443 $columns = 4;
444 break;
445 }
446
447 return apply_filters( 'rtsb/element/general/default_columns', $columns, $layout );
448 }
449
450 /**
451 * Pagination JSON data.
452 *
453 * @param array $metas Data set.
454 * @param string $template Template name.
455 *
456 * @return string
457 */
458 public static function pagination_data( $metas, $template ) {
459 $el_data = self::meta_dataset( $metas, $template );
460
461 return esc_js( wp_json_encode( $el_data, JSON_UNESCAPED_UNICODE ) );
462 }
463
464 /**
465 * Container classes
466 *
467 * @param array $metas Meta data.
468 * @param array $settings Settings array.
469 * @param string $custom_class Custom class.
470 *
471 * @return mixed|null
472 */
473 public static function prepare_container_classes( $metas = [], $settings = [], $custom_class = '' ) {
474 $classes = 'rtsb-elementor-container products rtsb-pos-r ';
475 $classes .= $custom_class;
476
477 $raw_layout = esc_html( $metas['layout'] );
478 $layout = self::filter_layout( $raw_layout );
479 $is_cat = preg_match( '/category/', $layout );
480 $cart_txt_class = '';
481
482 $animation = $metas['hover_animation'];
483
484 if ( ! $is_cat ) {
485 $cart_txt_class = $metas['show_cart_text'] ? ' has-cart-text' : ' no-cart-text';
486 $animation .= ' gallery-hover-' . ( ! empty( $settings['gallery_hover_animation'] ) ? $settings['gallery_hover_animation'] : 'fade' );
487 }
488
489 $badge_class = [
490 'position' => $metas['badge_position'],
491 'alignment' => $metas['badge_alignment'],
492 ];
493
494 if ( ! in_array( 'clear-btn', $metas['visibility'], true ) ) {
495 $classes .= ' no-clear-btn';
496 }
497
498 $classes .= ! empty( $metas['pagination'] ) ? ' rtsb-has-pagination' : ' rtsb-no-pagination';
499 $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'] );
500
501 if ( $metas['show_overlay'] ) {
502 $classes .= ' has-overlay';
503 }
504
505 if ( in_array( 'single-cat', $metas['visibility'], true ) ) {
506 $classes .= ' show-single-cat';
507 }
508
509 if ( ! $is_cat ) {
510 $action_btn_classes = [
511 'show_compare_text' => 'has-compare-text',
512 'show_quick_view_text' => 'has-quick-view-text',
513 'show_wishlist_text' => 'has-wishlist-text',
514 'show_compare_icon' => 'no-compare-icon',
515 'show_quick_view_icon' => 'no-quick-view-icon',
516 'show_wishlist_icon' => 'no-wishlist-icon',
517 'show_quick_checkout_icon' => 'no-quick_checkout-icon',
518 ];
519
520 foreach ( $action_btn_classes as $setting_key => $class ) {
521 if ( strpos( $setting_key, 'icon' ) !== false ) {
522 $classes .= empty( $settings[ $setting_key ] ) ? ' ' . $class : '';
523 } else {
524 $classes .= ! empty( $settings[ $setting_key ] ) ? ' ' . $class : '';
525 }
526 }
527
528 if ( rtsb()->has_pro() && ! empty( $settings['custom_ordering'] ) ) {
529 $classes .= ' has-custom-ordering';
530 }
531 }
532 if ( rtsb()->has_pro() && ! empty( $settings['slider_slide_animation'] ) ) {
533 $classes .= ' has-slide-animation';
534 }
535
536 return apply_filters( 'rtsb/product/container/class', $classes, $settings );
537 }
538
539 /**
540 * Function to filter and validate the layout against allowed patterns.
541 *
542 * @param string $layout The layout string to be filtered.
543 * @param string $template The template to be checked.
544 *
545 * @return string
546 */
547 public static function filter_layout( $layout, $template = '' ) {
548 $allowed_patterns = apply_filters( 'rtsb/elementor/custom_layout', [ 'grid', 'list', 'slider', 'category', 'toyup', 'zilly' ] );
549 $layout_part = explode( '-', $layout );
550 $default = 'grid-layout1';
551
552 if ( empty( $layout_part[0] ) ) {
553 return $default;
554 }
555
556 if ( in_array( $layout_part[0], $allowed_patterns, true ) ) {
557 return $layout;
558 } else {
559 if ( ! empty( $template ) ) {
560 $grid = preg_match( '/grid/', $template );
561 $list = preg_match( '/list/', $template );
562 $slider = preg_match( '/slider/', $template );
563 $category = preg_match( '/category/', $template );
564
565 if ( $grid ) {
566 return $default;
567 } elseif ( $list ) {
568 return 'list-layout1';
569 } elseif ( $slider ) {
570 return 'slider-layout1';
571 } elseif ( $category ) {
572 return 'category-layout1';
573 } else {
574 return $default;
575 }
576 } else {
577 return $default;
578 }
579 }
580 }
581
582 /**
583 * Row classes
584 *
585 * @param array $settings Settings array.
586 *
587 * @return mixed|null
588 */
589 public static function prepare_row_classes( $settings = [] ) {
590 $masonry_class = null;
591 $classes = 'rtsb-row rtsb-content-loader element-loading';
592 $loader_class = ' rtsb-pre-loader';
593
594 $raw_layout = esc_html( $settings['layout'] );
595 $layout = self::filter_layout( $raw_layout );
596 $grid_type = $settings['grid_type'];
597 $is_carousel = preg_match( '/slider/', $layout );
598
599 if ( preg_match( '/category/', $layout ) && ! empty( $settings['active_cat_slider'] ) ) {
600 $classes .= ' rtsb-slider-layout';
601 }
602
603 if ( 'even' === $grid_type ) {
604 $masonry_class = ' rtsb-even';
605 } elseif ( 'masonry' === $grid_type ) {
606 $masonry_class = ' rtsb-masonry';
607 }
608
609 if ( ! rtsb()->has_pro() || $is_carousel ) {
610 $masonry_class = ' rtsb-even';
611 }
612
613 if ( $is_carousel && ! empty( $settings['raw_settings']['always_show_nav'] ) ) {
614 $classes .= ' always-show-nav';
615 }
616
617 if ( ! empty( $settings['raw_settings']['inner_slider_always_show_nav'] ) ) {
618 $classes .= ' inner-slider-always-show-nav';
619 }
620
621 if ( empty( $settings['raw_settings']['cols_mobile'] ) ) {
622 $classes .= ' rtsb-mobile-flex-row';
623 }
624
625 $classes .= ' rtsb-' . $layout . $masonry_class . $loader_class;
626
627 return apply_filters( 'rtsb/elementor/row/classes', $classes, $settings );
628 }
629
630 /**
631 * Prepare pagination attributes.
632 *
633 * @param string $layout The layout type.
634 * @param bool $has_filters Whether the widget has filters.
635 * @param string $template The template name.
636 * @param array $settings The widget settings.
637 * @param bool $ajax Whether to enable AJAX pagination.
638 *
639 * @return string
640 */
641 public static function prepare_pagination_attr( $layout, $has_filters, $template, $settings, $ajax ) {
642 $is_cat = preg_match( '/category/', $layout );
643 $is_carousel = preg_match( '/slider/', $layout );
644
645 if ( $is_carousel ) {
646 return $has_filters ? self::pagination_data( $settings, $template ) : '';
647 } elseif ( $is_cat ) {
648 return '';
649 } else {
650 $ajax_pagination = ! empty( $settings['show_pagination'] ) && 'pagination' !== $settings['pagination_type'];
651 $page = Fns::product_filters_has_ajax( apply_filters( 'rtsb/builder/set/current/page/type', '' ) );
652 $condition = rtsb()->has_pro() && $ajax && ( $ajax_pagination || $has_filters || $page );
653
654 return $condition ? self::pagination_data( $settings, $template ) : '';
655 }
656 }
657
658 /**
659 * Archive JSON data.
660 *
661 * @param array $metas Data set.
662 * @param string $template Template name.
663 *
664 * @return string
665 */
666 public static function archive_data( $metas, $template ) {
667 $el_data = self::archive_meta_dataset( $metas, $template );
668
669 return ' data-rtsb-ajax=\'' . esc_js( wp_json_encode( $el_data ) ) . '\'';
670 }
671
672 /**
673 * Slider options.
674 *
675 * @param array $meta Meta values.
676 * @param array $settings Raw Settings.
677 *
678 * @return array
679 */
680 public static function slider_data( array $meta, $settings = [] ) {
681 $has_dots = $meta['slider_dot'] ? ' has-dot' : ' no-dot';
682 $has_dots .= $meta['slider_nav'] ? ' has-nav' : ' no-nav';
683 $has_dynamic_dots = $meta['slider_dynamic_dot'] ? true : false;
684 $d_col = 0 === $meta['d_cols'] ? self::default_columns( $meta['layout'] ) : $meta['d_cols'];
685 $t_col = 0 === $meta['t_cols'] ? 2 : $meta['t_cols'];
686 $m_col = 0 === $meta['m_cols'] ? 1 : $meta['m_cols'];
687
688 if ( \Elementor\Plugin::$instance->breakpoints->has_custom_breakpoints() ) {
689 // Widescreen.
690 $w_col = self::get_data( $settings, 'cols_widescreen' );
691 $w_col = 0 === $w_col ? self::default_columns( $meta['layout'] ) : $w_col;
692 $w_group = self::get_data( $settings, 'cols_group_widescreen', 1 );
693
694 // Laptop.
695 $l_col = self::get_data( $settings, 'cols_laptop' );
696 $l_col = 0 === $l_col ? self::default_columns( $meta['layout'] ) : $l_col;
697 $l_group = self::get_data( $settings, 'cols_group_laptop', 1 );
698
699 // Tablet Landscape.
700 $te_col = self::get_data( $settings, 'cols_tablet_extra' );
701 $te_col = 0 === $te_col ? 3 : $te_col;
702 $te_group = self::get_data( $settings, 'cols_group_tablet_extra', 1 );
703
704 // Mobile Landscape.
705 $me_col = self::get_data( $settings, 'cols_mobile_extra' );
706 $me_col = 0 === $me_col ? 2 : $me_col;
707 $me_group = self::get_data( $settings, 'cols_group_mobile_extra', 1 );
708
709 $el_breakpoints = Fns::get_elementor_breakpoints();
710
711 foreach ( $el_breakpoints as $key => $value ) {
712 if ( isset( $value['is_enabled'] ) && ! $value['is_enabled'] ) {
713 unset( $el_breakpoints[ $key ] );
714 }
715 }
716
717 $breakpoints = [
718 0 => [
719 'slidesPerView' => absint( $m_col ),
720 'slidesPerGroup' => absint( $meta['m_group'] ),
721 'pagination' => [
722 'dynamicBullets' => $has_dynamic_dots,
723 ],
724 ],
725 ];
726
727 $desktop = [
728 'desktop' => [
729 'label' => 'Desktop',
730 'value' => 1920,
731 'is_enabled' => 1,
732 ],
733 ];
734
735 if ( ! empty( $el_breakpoints['laptop'] ) && $el_breakpoints['laptop']['is_enabled'] ) {
736 $widescreen_position = array_search( 'widescreen', array_keys( $el_breakpoints ), true );
737 $el_breakpoints = array_merge(
738 array_slice( $el_breakpoints, 0, $widescreen_position ),
739 $desktop,
740 array_slice( $el_breakpoints, $widescreen_position )
741 );
742 } else {
743 $desktop['desktop']['value'] = 1366;
744 $el_breakpoints['desktop'] = $desktop['desktop'];
745 }
746
747 foreach ( $el_breakpoints as $el_breakpoint => $value ) {
748 $breakpoint_value = ! empty( $value['value'] ) ? $value['value'] : $value['default_value'];
749 $dynamic_bullets = $has_dynamic_dots;
750 $slides_per_view = $d_col;
751 $slides_per_group = $meta['d_group'];
752
753 switch ( $el_breakpoint ) {
754 case 'widescreen':
755 $slides_per_view = $w_col;
756 $slides_per_group = $w_group;
757
758 break;
759
760 case 'laptop':
761 $slides_per_view = $l_col;
762 $slides_per_group = $l_group;
763
764 break;
765
766 case 'tablet_extra':
767 $slides_per_view = $l_col;
768 $slides_per_group = $l_group;
769
770 if ( empty( $el_breakpoints['laptop'] ) ) {
771 $slides_per_view = $d_col;
772 $slides_per_group = $meta['d_group'];
773 }
774
775 break;
776
777 case 'tablet':
778 $slides_per_view = $te_col;
779 $slides_per_group = $te_group;
780
781 if ( empty( $el_breakpoints['laptop'] ) && empty( $el_breakpoints['tablet_extra'] ) ) {
782 $slides_per_view = $d_col;
783 $slides_per_group = $meta['d_group'];
784 } elseif ( empty( $el_breakpoints['laptop'] ) && ! empty( $el_breakpoints['tablet_extra'] ) ) {
785 $slides_per_view = $te_col;
786 $slides_per_group = $te_group;
787 } elseif ( ! empty( $el_breakpoints['laptop'] ) && empty( $el_breakpoints['tablet_extra'] ) ) {
788 $slides_per_view = $l_col;
789 $slides_per_group = $l_group;
790 }
791
792 break;
793
794 case 'mobile_extra':
795 $slides_per_view = $t_col;
796 $slides_per_group = $meta['t_group'];
797 $dynamic_bullets = $has_dynamic_dots;
798
799 break;
800
801 case 'mobile':
802 $slides_per_view = $t_col;
803 $slides_per_group = $meta['t_group'];
804 $dynamic_bullets = $has_dynamic_dots;
805
806 if ( ! empty( $el_breakpoints['mobile_extra'] ) ) {
807 $slides_per_view = $me_col;
808 $slides_per_group = $me_group;
809 }
810
811 break;
812 }
813
814 if ( $value['is_enabled'] ) {
815 $br = 'widescreen' !== $el_breakpoint ? $breakpoint_value + 1 : $breakpoint_value;
816
817 $breakpoints[ absint( $br ) ] = [
818 'slidesPerView' => absint( $slides_per_view ),
819 'slidesPerGroup' => absint( $slides_per_group ),
820 'pagination' => [
821 'dynamicBullets' => $dynamic_bullets,
822 ],
823 ];
824 }
825 }
826 } else {
827 $breakpoints = [
828 0 => [
829 'slidesPerView' => absint( $m_col ),
830 'slidesPerGroup' => absint( $meta['m_group'] ),
831 'pagination' => [
832 'dynamicBullets' => $has_dynamic_dots,
833 ],
834 ],
835 768 => [
836 'slidesPerView' => absint( $t_col ),
837 'slidesPerGroup' => absint( $meta['t_group'] ),
838 'pagination' => [
839 'dynamicBullets' => $has_dynamic_dots,
840 ],
841 ],
842 1025 => [
843 'slidesPerView' => absint( $d_col ),
844 'slidesPerGroup' => absint( $meta['d_group'] ),
845 'pagination' => [
846 'dynamicBullets' => $has_dynamic_dots,
847 ],
848 ],
849 ];
850 }
851
852 $slider_options = [
853 'slidesPerView' => absint( $d_col ),
854 'slidesPerGroup' => absint( $meta['d_group'] ),
855 'speed' => absint( $meta['speed'] ),
856 'loop' => $meta['loop'],
857 'autoHeight' => $meta['auto_height'],
858 'preloadImages' => ! $meta['lazy_load'],
859 'lazy' => $meta['lazy_load'],
860 'breakpoints' => $breakpoints,
861 ];
862
863 if ( ! empty( $meta['raw_settings']['slider_slide_animation'] ) ) {
864 $slider_options['watchSlidesProgress'] = true;
865 }
866 if ( $meta['auto_play'] ) {
867 $slider_options['autoplay'] = [
868 'delay' => absint( $meta['auto_play_timeout'] ),
869 'pauseOnMouseEnter' => $meta['stop_on_hover'],
870 'disableOnInteraction' => false,
871 ];
872 }
873
874 $slider_options = apply_filters( 'rtsb/elementor/render/slider_dataset', $slider_options, $meta );
875 $carouselClass = 'rtsb-carousel-slider slider-loading rtsb-pos-s ' . $meta['nav_position'] . '-nav' . $has_dots;
876
877 return [
878 'data' => esc_js( wp_json_encode( $slider_options ) ),
879 'class' => $carouselClass,
880 ];
881 }
882
883 /**
884 * Preloader.
885 *
886 * @param string $layout Layout.
887 *
888 * @return string
889 */
890 public static function pre_loader( $layout ) {
891 $loader_class = '';
892
893 $is_carousel = preg_match( '/slider/', $layout );
894
895 if ( $is_carousel ) {
896 $loader_class = ' full-op';
897 }
898
899 return '<div class="rtsb-elements-loading rtsb-ball-clip-rotate"><div></div></div>';
900 }
901
902 /**
903 * Badge class.
904 *
905 * @param string $preset Badge preset.
906 *
907 * @return string|null
908 */
909 public static function badge_class( $preset ) {
910 switch ( $preset ) {
911 case 'preset-default':
912 $class = 'default-badge';
913 break;
914 case 'preset2':
915 $class = 'fill angle-right';
916 break;
917 case 'preset3':
918 $class = 'outline';
919 break;
920
921 case 'preset4':
922 $class = 'outline angle-right';
923 break;
924
925 default:
926 $class = 'fill';
927 break;
928 }
929
930 return $class;
931 }
932
933 /**
934 * Registers required scripts.
935 *
936 * @param array $scripts Scripts to register.
937 *
938 * @return void
939 */
940 public static function register_scripts( $scripts ) {
941 $caro = false;
942 $script = [];
943
944 $script[] = 'jquery';
945
946 foreach ( $scripts as $sc => $value ) {
947 if ( ! empty( $sc ) ) {
948 if ( 'isCarousel' === $sc ) {
949 $caro = $value;
950 }
951 }
952 }
953
954 if ( count( $scripts ) ) {
955 /**
956 * Scripts.
957 */
958 if ( $caro ) {
959 $script[] = 'swiper';
960 }
961
962 $script[] = 'rtsb-imagesloaded';
963 $script[] = 'rtsb-public';
964
965 foreach ( $script as $sc ) {
966 wp_enqueue_script( $sc );
967 }
968 }
969 }
970
971 /**
972 * Check if a wrapper is needed based on the current theme.
973 *
974 * @return bool
975 */
976 public static function is_wrapper_needed() {
977 $theme_list = apply_filters(
978 'rtsb/products/inner/wrapper/basedon/themes',
979 [
980 'twentytwentyone',
981 'twentytwentytwo',
982 'twentytwentythree',
983 'storefront',
984 'hello-elementor',
985 'astra',
986 ],
987 rtsb()->current_theme
988 );
989
990 if ( in_array( rtsb()->current_theme, $theme_list, true ) ) {
991 return true;
992 }
993
994 return false;
995 }
996
997 /**
998 * Get the number of products per page based on WooCommerce settings.
999 *
1000 * @return int
1001 */
1002 public static function get_products_per_page() {
1003 $products_row = absint( get_option( 'woocommerce_catalog_rows', 4 ) );
1004 $products_col = absint( get_option( 'woocommerce_catalog_columns', 4 ) );
1005 $products_per_page = apply_filters( 'rtsb/elementor/archive/products_per_page', $products_row * $products_col );
1006
1007 return ! empty( $products_per_page ) ? $products_per_page : 12;
1008 }
1009 }
1010