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

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