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

942 lines 31.6 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
183 // Link.
184 'image_link' => ! empty( $meta['image_link'] ),
185 'title_link' => ! empty( $meta['title_link'] ),
186 'hover_btn_text' => self::get_data( $meta, 'hover_btn_text', esc_html__( 'See Details', 'shopbuilder' ) ),
187 'show_hover_btn_icon' => ! empty( $meta['show_hover_btn_icon'] ),
188 'hover_btn_icon' => self::get_data( $meta, 'hover_btn_icon', [] ),
189 'custom_link' => self::get_data( $meta, 'custom_link' ),
190
191 // Slider.
192 'd_group' => self::get_data( $meta, 'cols_group', 1 ),
193 't_group' => self::get_data( $meta, 'cols_group_tablet', 1 ),
194 'm_group' => self::get_data( $meta, 'cols_group_mobile', 1 ),
195 'auto_play' => ! empty( $meta['slide_autoplay'] ),
196 'stop_on_hover' => ! empty( $meta['pause_hover'] ),
197 'slider_nav' => ! empty( $meta['slider_nav'] ),
198 'slider_dot' => ! empty( $meta['slider_pagi'] ),
199 'loop' => ! empty( $meta['slider_loop'] ),
200 'lazy_load' => ! empty( $meta['slider_lazy_load'] ),
201 'auto_height' => ! empty( $meta['slider_auto_height'] ),
202 'speed' => self::get_data( $meta, 'slide_speed', 2000 ),
203 'space_between' => isset( $meta['grid_gap']['size'] ) && strlen( $meta['grid_gap']['size'] ) ? $meta['grid_gap']['size'] : 30,
204 'auto_play_timeout' => self::get_data( $meta, 'autoplay_timeout', 5000 ),
205 'nav_position' => self::get_data( $meta, 'slider_nav_position', 'top' ),
206 'left_arrow_icon' => self::get_data( $meta, 'slider_left_arrow_icon', [] ),
207 'right_arrow_icon' => self::get_data( $meta, 'slider_right_arrow_icon', [] ),
208 ],
209 $meta
210 );
211
212 if ( ! empty( $meta['cols_widescreen'] ) ) {
213 $data['w_cols'] = $meta['cols_widescreen'];
214 }
215
216 if ( ! empty( $meta['cols_laptop'] ) ) {
217 $data['l_cols'] = $meta['cols_laptop'];
218 }
219
220 if ( ! empty( $meta['cols_tablet_extra'] ) ) {
221 $data['te_cols'] = $meta['cols_tablet_extra'];
222 }
223
224 if ( ! empty( $meta['cols_mobile_extra'] ) ) {
225 $data['me_cols'] = $meta['cols_mobile_extra'];
226 }
227
228 $queried_obj = get_queried_object();
229
230 if ( is_shop() || is_product_taxonomy() ) {
231 $data['posts_per_page'] = self::get_products_per_page();
232 $data['order_by'] = self::get_data( $data, 'rtsb_orderby', $data['order_by'] );
233 $data['order'] = self::get_data( $data, 'rtsb_order', $data['order'] );
234 }
235
236 if ( ! is_shop() && is_product_taxonomy() ) {
237 if ( ! empty( $queried_obj->taxonomy ) ) {
238 $data['queried_tax'] = esc_html( $queried_obj->taxonomy );
239 }
240
241 if ( ! empty( $queried_obj->term_id ) ) {
242 $data['queried_term'] = esc_html( $queried_obj->term_id );
243 }
244 }
245
246 return apply_filters( 'rtsb/elementor/render/meta_dataset_final', $data, $meta, $raw_settings );
247 }
248
249 /**
250 * Builds an array with field values.
251 *
252 * @param array $meta Field values.
253 * @param string $template Template name.
254 *
255 * @return array
256 */
257 public static function archive_meta_dataset( array $meta, $template = '' ) {
258 $data = apply_filters(
259 'rtsb/elementor/render/archive_meta_dataset',
260 [
261 // Layout.
262 'widget' => 'default',
263 'template' => self::get_data( $template, '', '' ),
264 'view_mode' => self::get_data( $meta, 'view_mode', 'grid' ),
265 'show_flash_sale' => ! empty( $meta['show_flash_sale'] ),
266 'wishlist_button' => ! empty( $meta['wishlist_button'] ),
267 'comparison_button' => ! empty( $meta['comparison_button'] ),
268 'quick_view_button' => ! empty( $meta['quick_view_button'] ),
269 'show_rating' => ! empty( $meta['show_rating'] ),
270 'show_pagination' => ! empty( $meta['show_pagination'] ),
271 'cart_icon' => self::get_data( $meta, 'cart_icon', [] ),
272 'wishlist_icon' => self::get_data( $meta, 'wishlist_icon', [] ),
273 'wishlist_icon_added' => self::get_data( $meta, 'wishlist_icon_added', [] ),
274 'comparison_icon' => self::get_data( $meta, 'comparison_icon', [] ),
275 'comparison_icon_added' => self::get_data( $meta, 'comparison_icon_added', [] ),
276 'quick_view_icon' => self::get_data( $meta, 'quick_view_icon', [] ),
277 'prev_icon' => self::get_data( $meta, 'prev_icon', [] ),
278 'next_icon' => self::get_data( $meta, 'next_icon', [] ),
279 'posts_per_page' => self::get_products_per_page(),
280 'rtsb_order' => self::get_data( $meta, 'rtsb_order', 'ASC' ),
281 'rtsb_orderby' => self::get_data( $meta, 'rtsb_orderby', 'menu_order' ),
282 'tooltip_position' => self::get_data( $meta, 'action_btn_tooltip_position', 'top' ),
283 ],
284 $meta
285 );
286
287 $queried_obj = get_queried_object();
288
289 if ( ! is_shop() && BuilderFns::is_archive() ) {
290 if ( ! empty( $queried_obj->taxonomy ) ) {
291 $data['queried_tax'] = esc_html( $queried_obj->taxonomy );
292 }
293
294 if ( ! empty( $queried_obj->term_id ) ) {
295 $data['queried_term'] = esc_html( $queried_obj->term_id );
296 }
297 }
298
299 return apply_filters( 'rtsb/elementor/render/archive_meta_dataset_final', $data, $meta );
300 }
301
302 /**
303 * Setting up content visibility
304 *
305 * @param array $settings Elementor settings.
306 *
307 * @return array
308 */
309 public static function content_visibility( $settings ) {
310 $visibility = [];
311
312 if ( ! empty( $settings['show_title'] ) ) {
313 $visibility[] = 'title';
314 }
315
316 if ( ! empty( $settings['show_short_desc'] ) ) {
317 $visibility[] = 'excerpt';
318 }
319
320 if ( ! empty( $settings['show_price'] ) ) {
321 $visibility[] = 'price';
322 }
323
324 if ( ! empty( $settings['show_rating'] ) ) {
325 $visibility[] = 'rating';
326 }
327
328 if ( ! empty( $settings['show_badges'] ) ) {
329 $visibility[] = 'badges';
330 }
331
332 if ( ! empty( $settings['show_categories'] ) ) {
333 $visibility[] = 'categories';
334 }
335
336 if ( ! empty( $settings['single_category'] ) ) {
337 $visibility[] = 'single-cat';
338 }
339
340 if ( ! empty( $settings['show_swatches'] ) ) {
341 $visibility[] = 'swatches';
342 }
343
344 if ( ! empty( $settings['show_vs_clear_btn'] ) ) {
345 $visibility[] = 'clear-btn';
346 }
347
348 if ( ! empty( $settings['show_count'] ) ) {
349 $visibility[] = 'count';
350 }
351
352 if ( ! empty( $settings['show_wishlist'] ) ) {
353 $visibility[] = 'wishlist';
354 }
355
356 if ( ! empty( $settings['show_compare'] ) ) {
357 $visibility[] = 'compare';
358 }
359
360 if ( ! empty( $settings['show_quick_view'] ) ) {
361 $visibility[] = 'quick_view';
362 }
363
364 if ( ! empty( $settings['show_add_to_cart'] ) ) {
365 $visibility[] = 'add_to_cart';
366 }
367
368 return $visibility;
369 }
370
371 /**
372 * Set Default Layout.
373 *
374 * @param string $layout Layout.
375 *
376 * @return string
377 */
378 public static function set_default_layout( $layout ) {
379 $is_list = preg_match( '/list/', $layout );
380 $is_cat_single = preg_match( '/category-single/', $layout );
381 $is_cat = preg_match( '/category/', $layout );
382 $is_carousel = preg_match( '/slider/', $layout );
383 $default = 'grid-layout1';
384
385 if ( $is_list ) {
386 $default = 'list-layout1';
387 } elseif ( $is_cat_single ) {
388 $default = 'category-single-layout1';
389 } elseif ( $is_cat ) {
390 $default = 'category-layout1';
391 } elseif ( $is_carousel ) {
392 $default = 'slider-layout1';
393 }
394
395 return $default;
396 }
397
398 /**
399 * Default layout columns.
400 *
401 * @param int $layout Layout.
402 *
403 * @return int
404 */
405 public static function default_columns( $layout ) {
406 switch ( $layout ) {
407 case 'grid-layout2':
408 case 'slider-layout2':
409 $columns = 3;
410 break;
411
412 case 'list-layout1':
413 case 'list-layout2':
414 case 'list-layout3':
415 case 'list-layout7':
416 case 'list-layout5':
417 $columns = 1;
418 break;
419
420 case 'list-layout4':
421 case 'list-layout6':
422 case 'slider-layout5':
423 case 'slider-layout8':
424 $columns = 2;
425 break;
426
427 case 'grid-layout6':
428 $columns = 5;
429 break;
430
431 case 'category-layout1':
432 $columns = 6;
433 break;
434
435 default:
436 $columns = 4;
437 break;
438 }
439
440 return apply_filters( 'rtsb/element/general/default_columns', $columns, $layout );
441 }
442
443 /**
444 * Pagination JSON data.
445 *
446 * @param array $metas Data set.
447 * @param string $template Template name.
448 *
449 * @return string
450 */
451 public static function pagination_data( $metas, $template ) {
452 $el_data = self::meta_dataset( $metas, $template );
453
454 return esc_js( wp_json_encode( $el_data, JSON_UNESCAPED_UNICODE ) );
455 }
456
457 /**
458 * Container classes
459 *
460 * @param array $metas Meta data.
461 * @param array $settings Settings array.
462 * @param string $custom_class Custom class.
463 *
464 * @return mixed|null
465 */
466 public static function prepare_container_classes( $metas = [], $settings = [], $custom_class = '' ) {
467 $classes = 'rtsb-elementor-container products rtsb-pos-r ';
468 $classes .= $custom_class;
469
470 $layout = $metas['layout'];
471 $is_cat = preg_match( '/category/', $layout );
472 $cart_txt_class = '';
473
474 $animation = $metas['hover_animation'];
475
476 if ( ! $is_cat ) {
477 $cart_txt_class = $metas['show_cart_text'] ? ' has-cart-text' : ' no-cart-text';
478 $animation .= ' gallery-hover-' . ( ! empty( $settings['gallery_hover_animation'] ) ? $settings['gallery_hover_animation'] : 'fade' );
479 }
480
481 $badge_class = [
482 'position' => $metas['badge_position'],
483 'alignment' => $metas['badge_alignment'],
484 ];
485
486 if ( ! in_array( 'clear-btn', $metas['visibility'], true ) ) {
487 $classes .= ' no-clear-btn';
488 }
489
490 $classes .= ! empty( $metas['pagination'] ) ? ' rtsb-has-pagination' : ' rtsb-no-pagination';
491 $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'] );
492
493 if ( $metas['show_overlay'] ) {
494 $classes .= ' has-overlay';
495 }
496
497 if ( in_array( 'single-cat', $metas['visibility'], true ) ) {
498 $classes .= ' show-single-cat';
499 }
500
501 if ( ! $is_cat ) {
502 $action_btn_classes = [
503 'show_compare_text' => 'has-compare-text',
504 'show_quick_view_text' => 'has-quick-view-text',
505 'show_wishlist_text' => 'has-wishlist-text',
506 'show_compare_icon' => 'no-compare-icon',
507 'show_quick_view_icon' => 'no-quick-view-icon',
508 'show_wishlist_icon' => 'no-wishlist-icon',
509 'show_quick_checkout_icon' => 'no-quick_checkout-icon',
510 ];
511
512 foreach ( $action_btn_classes as $setting_key => $class ) {
513 if ( strpos( $setting_key, 'icon' ) !== false ) {
514 $classes .= empty( $settings[ $setting_key ] ) ? ' ' . $class : '';
515 } else {
516 $classes .= ! empty( $settings[ $setting_key ] ) ? ' ' . $class : '';
517 }
518 }
519
520 if ( rtsb()->has_pro() && ! empty( $settings['custom_ordering'] ) ) {
521 $classes .= ' has-custom-ordering';
522 }
523
524 if ( rtsb()->has_pro() && ! empty( $settings['slider_slide_animation'] ) ) {
525 $classes .= ' has-slide-animation';
526 }
527 }
528
529 return apply_filters( 'rtsb/product/container/class', $classes, $settings );
530 }
531
532 /**
533 * Row classes
534 *
535 * @param array $settings Settings array.
536 *
537 * @return mixed|null
538 */
539 public static function prepare_row_classes( $settings = [] ) {
540 $masonry_class = null;
541 $classes = 'rtsb-row rtsb-content-loader element-loading';
542 $loader_class = ' rtsb-pre-loader';
543
544 $layout = $settings['layout'];
545 $grid_type = $settings['grid_type'];
546 $is_carousel = preg_match( '/slider/', $layout );
547
548 if ( 'even' === $grid_type ) {
549 $masonry_class = ' rtsb-even';
550 } elseif ( 'masonry' === $grid_type ) {
551 $masonry_class = ' rtsb-masonry';
552 }
553
554 if ( ! rtsb()->has_pro() || $is_carousel ) {
555 $masonry_class = ' rtsb-even';
556 }
557
558 $classes .= ' rtsb-' . $layout . $masonry_class . $loader_class;
559
560 return apply_filters( 'rtsb/elementor/row/classes', $classes, $settings );
561 }
562
563 /**
564 * Prepare pagination attributes.
565 *
566 * @param string $layout The layout type.
567 * @param bool $has_filters Whether the widget has filters.
568 * @param string $template The template name.
569 * @param array $settings The widget settings.
570 * @param bool $ajax Whether to enable AJAX pagination.
571 *
572 * @return string
573 */
574 public static function prepare_pagination_attr( $layout, $has_filters, $template, $settings, $ajax ) {
575 $is_cat = preg_match( '/category/', $layout );
576 $is_carousel = preg_match( '/slider/', $layout );
577
578 if ( $is_carousel ) {
579 return $has_filters ? self::pagination_data( $settings, $template ) : '';
580 } elseif ( $is_cat ) {
581 return '';
582 } else {
583 $ajax_pagination = ! empty( $settings['show_pagination'] ) && 'pagination' !== $settings['pagination_type'];
584 $page = Fns::product_filters_has_ajax( 'shop' ) || Fns::product_filters_has_ajax( 'archive' );
585 $condition = rtsb()->has_pro() && $ajax && ( $ajax_pagination || $has_filters || $page );
586
587 return $condition ? self::pagination_data( $settings, $template ) : '';
588 }
589 }
590
591 /**
592 * Archive JSON data.
593 *
594 * @param array $metas Data set.
595 * @param string $template Template name.
596 *
597 * @return string
598 */
599 public static function archive_data( $metas, $template ) {
600 $el_data = self::archive_meta_dataset( $metas, $template );
601
602 return ' data-rtsb-ajax=\'' . esc_js( wp_json_encode( $el_data ) ) . '\'';
603 }
604
605 /**
606 * Slider options.
607 *
608 * @param array $meta Meta values.
609 * @param array $settings Raw Settings.
610 *
611 * @return array
612 */
613 public static function slider_data( array $meta, $settings = [] ) {
614 $has_dots = $meta['slider_dot'] ? ' has-dot' : ' no-dot';
615 $has_dots .= $meta['slider_nav'] ? ' has-nav' : ' no-nav';
616 $d_col = 0 === $meta['d_cols'] ? self::default_columns( $meta['layout'] ) : $meta['d_cols'];
617 $t_col = 0 === $meta['t_cols'] ? 2 : $meta['t_cols'];
618 $m_col = 0 === $meta['m_cols'] ? 1 : $meta['m_cols'];
619
620 if ( \Elementor\Plugin::$instance->breakpoints->has_custom_breakpoints() ) {
621 // Widescreen.
622 $w_col = self::get_data( $settings, 'cols_widescreen' );
623 $w_col = 0 === $w_col ? self::default_columns( $meta['layout'] ) : $w_col;
624 $w_group = self::get_data( $settings, 'cols_group_widescreen', 1 );
625
626 // Laptop.
627 $l_col = self::get_data( $settings, 'cols_laptop' );
628 $l_col = 0 === $l_col ? self::default_columns( $meta['layout'] ) : $l_col;
629 $l_group = self::get_data( $settings, 'cols_group_laptop', 1 );
630
631 // Tablet Landscape.
632 $te_col = self::get_data( $settings, 'cols_tablet_extra' );
633 $te_col = 0 === $te_col ? 3 : $te_col;
634 $te_group = self::get_data( $settings, 'cols_group_tablet_extra', 1 );
635
636 // Mobile Landscape.
637 $me_col = self::get_data( $settings, 'cols_mobile_extra' );
638 $me_col = 0 === $me_col ? 2 : $me_col;
639 $me_group = self::get_data( $settings, 'cols_group_mobile_extra', 1 );
640
641 $el_breakpoints = Fns::get_elementor_breakpoints();
642
643 foreach ( $el_breakpoints as $key => $value ) {
644 if ( isset( $value['is_enabled'] ) && ! $value['is_enabled'] ) {
645 unset( $el_breakpoints[ $key ] );
646 }
647 }
648
649 $breakpoints = [
650 0 => [
651 'slidesPerView' => absint( $m_col ),
652 'slidesPerGroup' => absint( $meta['m_group'] ),
653 'pagination' => [
654 'dynamicBullets' => true,
655 ],
656 ],
657 ];
658
659 $desktop = [
660 'desktop' => [
661 'label' => 'Desktop',
662 'value' => 1920,
663 'is_enabled' => 1,
664 ],
665 ];
666
667 if ( ! empty( $el_breakpoints['laptop'] ) && $el_breakpoints['laptop']['is_enabled'] ) {
668 $widescreen_position = array_search( 'widescreen', array_keys( $el_breakpoints ), true );
669 $el_breakpoints = array_merge(
670 array_slice( $el_breakpoints, 0, $widescreen_position ),
671 $desktop,
672 array_slice( $el_breakpoints, $widescreen_position )
673 );
674 } else {
675 $desktop['desktop']['value'] = 1366;
676 $el_breakpoints['desktop'] = $desktop['desktop'];
677 }
678
679 foreach ( $el_breakpoints as $el_breakpoint => $value ) {
680 $breakpoint_value = ! empty( $value['value'] ) ? $value['value'] : $value['default_value'];
681 $dynamic_bullets = false;
682 $slides_per_view = $d_col;
683 $slides_per_group = $meta['d_group'];
684
685 switch ( $el_breakpoint ) {
686 case 'widescreen':
687 $slides_per_view = $w_col;
688 $slides_per_group = $w_group;
689
690 break;
691
692 case 'laptop':
693 $slides_per_view = $l_col;
694 $slides_per_group = $l_group;
695
696 break;
697
698 case 'tablet_extra':
699 $slides_per_view = $l_col;
700 $slides_per_group = $l_group;
701
702 if ( empty( $el_breakpoints['laptop'] ) ) {
703 $slides_per_view = $d_col;
704 $slides_per_group = $meta['d_group'];
705 }
706
707 break;
708
709 case 'tablet':
710 $slides_per_view = $te_col;
711 $slides_per_group = $te_group;
712
713 if ( empty( $el_breakpoints['laptop'] ) && empty( $el_breakpoints['tablet_extra'] ) ) {
714 $slides_per_view = $d_col;
715 $slides_per_group = $meta['d_group'];
716 } elseif ( empty( $el_breakpoints['laptop'] ) && ! empty( $el_breakpoints['tablet_extra'] ) ) {
717 $slides_per_view = $te_col;
718 $slides_per_group = $te_group;
719 } elseif ( ! empty( $el_breakpoints['laptop'] ) && empty( $el_breakpoints['tablet_extra'] ) ) {
720 $slides_per_view = $l_col;
721 $slides_per_group = $l_group;
722 }
723
724 break;
725
726 case 'mobile_extra':
727 $slides_per_view = $t_col;
728 $slides_per_group = $meta['t_group'];
729 $dynamic_bullets = true;
730
731 break;
732
733 case 'mobile':
734 $slides_per_view = $t_col;
735 $slides_per_group = $meta['t_group'];
736 $dynamic_bullets = true;
737
738 if ( ! empty( $el_breakpoints['mobile_extra'] ) ) {
739 $slides_per_view = $me_col;
740 $slides_per_group = $me_group;
741 }
742
743 break;
744 }
745
746 if ( $value['is_enabled'] ) {
747 $br = 'widescreen' !== $el_breakpoint ? $breakpoint_value + 1 : $breakpoint_value;
748
749 $breakpoints[ absint( $br ) ] = [
750 'slidesPerView' => absint( $slides_per_view ),
751 'slidesPerGroup' => absint( $slides_per_group ),
752 'pagination' => [
753 'dynamicBullets' => $dynamic_bullets,
754 ],
755 ];
756 }
757 }
758 } else {
759 $breakpoints = [
760 0 => [
761 'slidesPerView' => absint( $m_col ),
762 'slidesPerGroup' => absint( $meta['m_group'] ),
763 'pagination' => [
764 'dynamicBullets' => true,
765 ],
766 ],
767 768 => [
768 'slidesPerView' => absint( $t_col ),
769 'slidesPerGroup' => absint( $meta['t_group'] ),
770 'pagination' => [
771 'dynamicBullets' => false,
772 ],
773 ],
774 1025 => [
775 'slidesPerView' => absint( $d_col ),
776 'slidesPerGroup' => absint( $meta['d_group'] ),
777 'pagination' => [
778 'dynamicBullets' => false,
779 ],
780 ],
781 ];
782 }
783
784 $slider_options = [
785 'slidesPerView' => absint( $d_col ),
786 'slidesPerGroup' => absint( $meta['d_group'] ),
787 'speed' => absint( $meta['speed'] ),
788 'loop' => $meta['loop'],
789 'autoHeight' => $meta['auto_height'],
790 'preloadImages' => ! $meta['lazy_load'],
791 'lazy' => $meta['lazy_load'],
792 'breakpoints' => $breakpoints,
793 ];
794
795 if ( ! empty( $meta['raw_settings']['slider_slide_animation'] ) ) {
796 $slider_options['watchSlidesProgress'] = true;
797 }
798 if ( $meta['auto_play'] ) {
799 $slider_options['autoplay'] = [
800 'delay' => absint( $meta['auto_play_timeout'] ),
801 'pauseOnMouseEnter' => $meta['stop_on_hover'],
802 'disableOnInteraction' => false,
803 ];
804 }
805
806 $slider_options = apply_filters( 'rtsb/elementor/render/slider_dataset', $slider_options, $meta );
807 $carouselClass = 'rtsb-carousel-slider slider-loading rtsb-pos-s ' . $meta['nav_position'] . '-nav' . $has_dots;
808
809 return [
810 'data' => esc_js( wp_json_encode( $slider_options ) ),
811 'class' => $carouselClass,
812 ];
813 }
814
815 /**
816 * Preloader.
817 *
818 * @param string $layout Layout.
819 *
820 * @return string
821 */
822 public static function pre_loader( $layout ) {
823 $loader_class = '';
824
825 $is_carousel = preg_match( '/slider/', $layout );
826
827 if ( $is_carousel ) {
828 $loader_class = ' full-op';
829 }
830
831 return '<div class="rtsb-elements-loading rtsb-ball-clip-rotate"><div></div></div>';
832 }
833
834 /**
835 * Badge class.
836 *
837 * @param string $preset Badge preset.
838 *
839 * @return string|null
840 */
841 public static function badge_class( $preset ) {
842 switch ( $preset ) {
843 case 'preset-default':
844 $class = 'default-badge';
845 break;
846 case 'preset2':
847 $class = 'fill angle-right';
848 break;
849 case 'preset3':
850 $class = 'outline';
851 break;
852
853 case 'preset4':
854 $class = 'outline angle-right';
855 break;
856
857 default:
858 $class = 'fill';
859 break;
860 }
861
862 return $class;
863 }
864
865 /**
866 * Registers required scripts.
867 *
868 * @param array $scripts Scripts to register.
869 *
870 * @return void
871 */
872 public static function register_scripts( $scripts ) {
873 $caro = false;
874 $script = [];
875
876 $script[] = 'jquery';
877
878 foreach ( $scripts as $sc => $value ) {
879 if ( ! empty( $sc ) ) {
880 if ( 'isCarousel' === $sc ) {
881 $caro = $value;
882 }
883 }
884 }
885
886 if ( count( $scripts ) ) {
887 /**
888 * Scripts.
889 */
890 if ( $caro ) {
891 $script[] = 'swiper';
892 }
893
894 $script[] = 'rtsb-imagesloaded';
895 $script[] = 'rtsb-public';
896
897 foreach ( $script as $sc ) {
898 wp_enqueue_script( $sc );
899 }
900 }
901 }
902
903 /**
904 * Check if a wrapper is needed based on the current theme.
905 *
906 * @return bool
907 */
908 public static function is_wrapper_needed() {
909 $theme_list = apply_filters(
910 'rtsb/products/inner/wrapper/basedon/themes',
911 [
912 'twentytwentyone',
913 'twentytwentytwo',
914 'twentytwentythree',
915 'storefront',
916 'hello-elementor',
917 'astra',
918 ],
919 rtsb()->current_theme
920 );
921
922 if ( in_array( rtsb()->current_theme, $theme_list, true ) ) {
923 return true;
924 }
925
926 return false;
927 }
928
929 /**
930 * Get the number of products per page based on WooCommerce settings.
931 *
932 * @return int
933 */
934 public static function get_products_per_page() {
935 $products_row = absint( get_option( 'woocommerce_catalog_rows', 4 ) );
936 $products_col = absint( get_option( 'woocommerce_catalog_columns', 4 ) );
937 $products_per_page = apply_filters( 'rtsb/elementor/archive/products_per_page', $products_row * $products_col );
938
939 return ! empty( $products_per_page ) ? $products_per_page : 12;
940 }
941 }
942