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

956 lines 32.1 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 if ( ! empty( $settings['raw_settings']['inner_slider_always_show_nav'] ) ) {
569 $classes .= ' inner-slider-always-show-nav';
570 }
571
572 $classes .= ' rtsb-' . $layout . $masonry_class . $loader_class;
573
574 return apply_filters( 'rtsb/elementor/row/classes', $classes, $settings );
575 }
576
577 /**
578 * Prepare pagination attributes.
579 *
580 * @param string $layout The layout type.
581 * @param bool $has_filters Whether the widget has filters.
582 * @param string $template The template name.
583 * @param array $settings The widget settings.
584 * @param bool $ajax Whether to enable AJAX pagination.
585 *
586 * @return string
587 */
588 public static function prepare_pagination_attr( $layout, $has_filters, $template, $settings, $ajax ) {
589 $is_cat = preg_match( '/category/', $layout );
590 $is_carousel = preg_match( '/slider/', $layout );
591
592 if ( $is_carousel ) {
593 return $has_filters ? self::pagination_data( $settings, $template ) : '';
594 } elseif ( $is_cat ) {
595 return '';
596 } else {
597 $ajax_pagination = ! empty( $settings['show_pagination'] ) && 'pagination' !== $settings['pagination_type'];
598 $page = Fns::product_filters_has_ajax( 'shop' ) || Fns::product_filters_has_ajax( 'archive' );
599 $condition = rtsb()->has_pro() && $ajax && ( $ajax_pagination || $has_filters || $page );
600
601 return $condition ? self::pagination_data( $settings, $template ) : '';
602 }
603 }
604
605 /**
606 * Archive JSON data.
607 *
608 * @param array $metas Data set.
609 * @param string $template Template name.
610 *
611 * @return string
612 */
613 public static function archive_data( $metas, $template ) {
614 $el_data = self::archive_meta_dataset( $metas, $template );
615
616 return ' data-rtsb-ajax=\'' . esc_js( wp_json_encode( $el_data ) ) . '\'';
617 }
618
619 /**
620 * Slider options.
621 *
622 * @param array $meta Meta values.
623 * @param array $settings Raw Settings.
624 *
625 * @return array
626 */
627 public static function slider_data( array $meta, $settings = [] ) {
628 $has_dots = $meta['slider_dot'] ? ' has-dot' : ' no-dot';
629 $has_dots .= $meta['slider_nav'] ? ' has-nav' : ' no-nav';
630 $d_col = 0 === $meta['d_cols'] ? self::default_columns( $meta['layout'] ) : $meta['d_cols'];
631 $t_col = 0 === $meta['t_cols'] ? 2 : $meta['t_cols'];
632 $m_col = 0 === $meta['m_cols'] ? 1 : $meta['m_cols'];
633
634 if ( \Elementor\Plugin::$instance->breakpoints->has_custom_breakpoints() ) {
635 // Widescreen.
636 $w_col = self::get_data( $settings, 'cols_widescreen' );
637 $w_col = 0 === $w_col ? self::default_columns( $meta['layout'] ) : $w_col;
638 $w_group = self::get_data( $settings, 'cols_group_widescreen', 1 );
639
640 // Laptop.
641 $l_col = self::get_data( $settings, 'cols_laptop' );
642 $l_col = 0 === $l_col ? self::default_columns( $meta['layout'] ) : $l_col;
643 $l_group = self::get_data( $settings, 'cols_group_laptop', 1 );
644
645 // Tablet Landscape.
646 $te_col = self::get_data( $settings, 'cols_tablet_extra' );
647 $te_col = 0 === $te_col ? 3 : $te_col;
648 $te_group = self::get_data( $settings, 'cols_group_tablet_extra', 1 );
649
650 // Mobile Landscape.
651 $me_col = self::get_data( $settings, 'cols_mobile_extra' );
652 $me_col = 0 === $me_col ? 2 : $me_col;
653 $me_group = self::get_data( $settings, 'cols_group_mobile_extra', 1 );
654
655 $el_breakpoints = Fns::get_elementor_breakpoints();
656
657 foreach ( $el_breakpoints as $key => $value ) {
658 if ( isset( $value['is_enabled'] ) && ! $value['is_enabled'] ) {
659 unset( $el_breakpoints[ $key ] );
660 }
661 }
662
663 $breakpoints = [
664 0 => [
665 'slidesPerView' => absint( $m_col ),
666 'slidesPerGroup' => absint( $meta['m_group'] ),
667 'pagination' => [
668 'dynamicBullets' => true,
669 ],
670 ],
671 ];
672
673 $desktop = [
674 'desktop' => [
675 'label' => 'Desktop',
676 'value' => 1920,
677 'is_enabled' => 1,
678 ],
679 ];
680
681 if ( ! empty( $el_breakpoints['laptop'] ) && $el_breakpoints['laptop']['is_enabled'] ) {
682 $widescreen_position = array_search( 'widescreen', array_keys( $el_breakpoints ), true );
683 $el_breakpoints = array_merge(
684 array_slice( $el_breakpoints, 0, $widescreen_position ),
685 $desktop,
686 array_slice( $el_breakpoints, $widescreen_position )
687 );
688 } else {
689 $desktop['desktop']['value'] = 1366;
690 $el_breakpoints['desktop'] = $desktop['desktop'];
691 }
692
693 foreach ( $el_breakpoints as $el_breakpoint => $value ) {
694 $breakpoint_value = ! empty( $value['value'] ) ? $value['value'] : $value['default_value'];
695 $dynamic_bullets = false;
696 $slides_per_view = $d_col;
697 $slides_per_group = $meta['d_group'];
698
699 switch ( $el_breakpoint ) {
700 case 'widescreen':
701 $slides_per_view = $w_col;
702 $slides_per_group = $w_group;
703
704 break;
705
706 case 'laptop':
707 $slides_per_view = $l_col;
708 $slides_per_group = $l_group;
709
710 break;
711
712 case 'tablet_extra':
713 $slides_per_view = $l_col;
714 $slides_per_group = $l_group;
715
716 if ( empty( $el_breakpoints['laptop'] ) ) {
717 $slides_per_view = $d_col;
718 $slides_per_group = $meta['d_group'];
719 }
720
721 break;
722
723 case 'tablet':
724 $slides_per_view = $te_col;
725 $slides_per_group = $te_group;
726
727 if ( empty( $el_breakpoints['laptop'] ) && empty( $el_breakpoints['tablet_extra'] ) ) {
728 $slides_per_view = $d_col;
729 $slides_per_group = $meta['d_group'];
730 } elseif ( empty( $el_breakpoints['laptop'] ) && ! empty( $el_breakpoints['tablet_extra'] ) ) {
731 $slides_per_view = $te_col;
732 $slides_per_group = $te_group;
733 } elseif ( ! empty( $el_breakpoints['laptop'] ) && empty( $el_breakpoints['tablet_extra'] ) ) {
734 $slides_per_view = $l_col;
735 $slides_per_group = $l_group;
736 }
737
738 break;
739
740 case 'mobile_extra':
741 $slides_per_view = $t_col;
742 $slides_per_group = $meta['t_group'];
743 $dynamic_bullets = true;
744
745 break;
746
747 case 'mobile':
748 $slides_per_view = $t_col;
749 $slides_per_group = $meta['t_group'];
750 $dynamic_bullets = true;
751
752 if ( ! empty( $el_breakpoints['mobile_extra'] ) ) {
753 $slides_per_view = $me_col;
754 $slides_per_group = $me_group;
755 }
756
757 break;
758 }
759
760 if ( $value['is_enabled'] ) {
761 $br = 'widescreen' !== $el_breakpoint ? $breakpoint_value + 1 : $breakpoint_value;
762
763 $breakpoints[ absint( $br ) ] = [
764 'slidesPerView' => absint( $slides_per_view ),
765 'slidesPerGroup' => absint( $slides_per_group ),
766 'pagination' => [
767 'dynamicBullets' => $dynamic_bullets,
768 ],
769 ];
770 }
771 }
772 } else {
773 $breakpoints = [
774 0 => [
775 'slidesPerView' => absint( $m_col ),
776 'slidesPerGroup' => absint( $meta['m_group'] ),
777 'pagination' => [
778 'dynamicBullets' => true,
779 ],
780 ],
781 768 => [
782 'slidesPerView' => absint( $t_col ),
783 'slidesPerGroup' => absint( $meta['t_group'] ),
784 'pagination' => [
785 'dynamicBullets' => false,
786 ],
787 ],
788 1025 => [
789 'slidesPerView' => absint( $d_col ),
790 'slidesPerGroup' => absint( $meta['d_group'] ),
791 'pagination' => [
792 'dynamicBullets' => false,
793 ],
794 ],
795 ];
796 }
797
798 $slider_options = [
799 'slidesPerView' => absint( $d_col ),
800 'slidesPerGroup' => absint( $meta['d_group'] ),
801 'speed' => absint( $meta['speed'] ),
802 'loop' => $meta['loop'],
803 'autoHeight' => $meta['auto_height'],
804 'preloadImages' => ! $meta['lazy_load'],
805 'lazy' => $meta['lazy_load'],
806 'breakpoints' => $breakpoints,
807 ];
808
809 if ( ! empty( $meta['raw_settings']['slider_slide_animation'] ) ) {
810 $slider_options['watchSlidesProgress'] = true;
811 }
812 if ( $meta['auto_play'] ) {
813 $slider_options['autoplay'] = [
814 'delay' => absint( $meta['auto_play_timeout'] ),
815 'pauseOnMouseEnter' => $meta['stop_on_hover'],
816 'disableOnInteraction' => false,
817 ];
818 }
819
820 $slider_options = apply_filters( 'rtsb/elementor/render/slider_dataset', $slider_options, $meta );
821 $carouselClass = 'rtsb-carousel-slider slider-loading rtsb-pos-s ' . $meta['nav_position'] . '-nav' . $has_dots;
822
823 return [
824 'data' => esc_js( wp_json_encode( $slider_options ) ),
825 'class' => $carouselClass,
826 ];
827 }
828
829 /**
830 * Preloader.
831 *
832 * @param string $layout Layout.
833 *
834 * @return string
835 */
836 public static function pre_loader( $layout ) {
837 $loader_class = '';
838
839 $is_carousel = preg_match( '/slider/', $layout );
840
841 if ( $is_carousel ) {
842 $loader_class = ' full-op';
843 }
844
845 return '<div class="rtsb-elements-loading rtsb-ball-clip-rotate"><div></div></div>';
846 }
847
848 /**
849 * Badge class.
850 *
851 * @param string $preset Badge preset.
852 *
853 * @return string|null
854 */
855 public static function badge_class( $preset ) {
856 switch ( $preset ) {
857 case 'preset-default':
858 $class = 'default-badge';
859 break;
860 case 'preset2':
861 $class = 'fill angle-right';
862 break;
863 case 'preset3':
864 $class = 'outline';
865 break;
866
867 case 'preset4':
868 $class = 'outline angle-right';
869 break;
870
871 default:
872 $class = 'fill';
873 break;
874 }
875
876 return $class;
877 }
878
879 /**
880 * Registers required scripts.
881 *
882 * @param array $scripts Scripts to register.
883 *
884 * @return void
885 */
886 public static function register_scripts( $scripts ) {
887 $caro = false;
888 $script = [];
889
890 $script[] = 'jquery';
891
892 foreach ( $scripts as $sc => $value ) {
893 if ( ! empty( $sc ) ) {
894 if ( 'isCarousel' === $sc ) {
895 $caro = $value;
896 }
897 }
898 }
899
900 if ( count( $scripts ) ) {
901 /**
902 * Scripts.
903 */
904 if ( $caro ) {
905 $script[] = 'swiper';
906 }
907
908 $script[] = 'rtsb-imagesloaded';
909 $script[] = 'rtsb-public';
910
911 foreach ( $script as $sc ) {
912 wp_enqueue_script( $sc );
913 }
914 }
915 }
916
917 /**
918 * Check if a wrapper is needed based on the current theme.
919 *
920 * @return bool
921 */
922 public static function is_wrapper_needed() {
923 $theme_list = apply_filters(
924 'rtsb/products/inner/wrapper/basedon/themes',
925 [
926 'twentytwentyone',
927 'twentytwentytwo',
928 'twentytwentythree',
929 'storefront',
930 'hello-elementor',
931 'astra',
932 ],
933 rtsb()->current_theme
934 );
935
936 if ( in_array( rtsb()->current_theme, $theme_list, true ) ) {
937 return true;
938 }
939
940 return false;
941 }
942
943 /**
944 * Get the number of products per page based on WooCommerce settings.
945 *
946 * @return int
947 */
948 public static function get_products_per_page() {
949 $products_row = absint( get_option( 'woocommerce_catalog_rows', 4 ) );
950 $products_col = absint( get_option( 'woocommerce_catalog_columns', 4 ) );
951 $products_per_page = apply_filters( 'rtsb/elementor/archive/products_per_page', $products_row * $products_col );
952
953 return ! empty( $products_per_page ) ? $products_per_page : 12;
954 }
955 }
956