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

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