PluginProbe
ShopBuilder – WooCommerce Builder For Elementor / 2.5.2
ShopBuilder – WooCommerce Builder For Elementor v2.5.2
3.4.2 3.4.1 3.4.0 2.0.1 2.0.2 2.0.3 2.1.0 2.1.1 2.1.10 2.1.11 2.1.12 2.1.13 2.1.14 2.1.15 2.1.2 2.1.3 2.1.4 2.1.5 2.1.6 2.1.7 2.1.8 2.1.9 2.2.0 2.2.1 2.2.2 All 63 releases
shopbuilder / app / Elementor / Helper / RenderHelpers.php

RenderHelpers.php in ShopBuilder – WooCommerce Builder For Elementor 2.5.2, at app/Elementor/Helper/RenderHelpers.php

1,022 lines 34.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 Elementor\Plugin;
13 use RadiusTheme\SB\Helpers\Fns;
14 use RadiusTheme\SB\Helpers\BuilderFns;
15
16 // Do not allow directly accessing this file.
17 if ( ! defined( 'ABSPATH' ) ) {
18 exit( 'This script cannot be accessed directly.' );
19 }
20
21 /**
22 * BuilderFns class
23 */
24 class RenderHelpers {
25 /**
26 * Get data.
27 *
28 * @param array|string $haystack The array or string to search for the value.
29 * @param string $needle The key to look for in the array or the string itself.
30 * @param mixed $default The default value to return if the key is not.
31 *
32 * @return mixed
33 */
34 public static function get_data( $haystack, $needle, $default = null ) {
35 if ( is_array( $haystack ) && ! empty( $haystack[ $needle ] ) ) {
36 return $haystack[ $needle ];
37 } elseif ( is_string( $haystack ) && ! empty( $haystack ) ) {
38 return $haystack;
39 } else {
40 return $default;
41 }
42 }
43
44 /**
45 * Builds an array with field values.
46 *
47 * @param array $meta Field values.
48 * @param string $template Template name.
49 * @param array $raw_settings Raw settings.
50 *
51 * @return array
52 */
53 public static function meta_dataset( array $meta, $template = '', $raw_settings = [] ) {
54 $c_image_size = self::get_data( $meta, 'image_custom_dimension', [] );
55 $c_image_size['crop'] = self::get_data( $meta, 'image_crop', [] );
56
57 if ( ( ! empty( $_GET['displayview'] ) && 'list' === $_GET['displayview'] ) || ( empty( $_GET['displayview'] ) && ( ! empty( $meta['view_mode'] ) && 'list' === $meta['view_mode'] ) ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended
58 $meta['cols'] = self::get_data( $meta, 'list_cols', 1 );
59 $meta['cols_tablet'] = self::get_data( $meta, 'list_cols_tablet', $meta['cols'] );
60 $meta['cols_mobile'] = self::get_data( $meta, 'list_cols_mobile', $meta['cols'] );
61 }
62
63 $data = apply_filters(
64 'rtsb/elementor/render/meta_dataset',
65 [
66 // Layout.
67 'widget' => 'custom',
68 'template' => self::get_data( $template, '', '' ),
69 'raw_settings' => $raw_settings,
70 'layout' => self::get_data( $meta, 'layout', 'layout1' ),
71 'grid_layout' => self::get_data( $raw_settings, 'layout', 'grid-layout1' ),
72 'list_layout' => self::get_data( $raw_settings, 'list_layout', 'list-layout1' ),
73 'd_cols' => self::get_data( $meta, 'cols', 0 ),
74 't_cols' => self::get_data( $meta, 'cols_tablet', 2 ),
75 'm_cols' => self::get_data( $meta, 'cols_mobile', 1 ),
76 'grid_type' => self::get_data( $meta, 'grid_style', 'even' ),
77
78 // Query.
79 'post_in' => self::get_data( $meta, 'include_posts', [] ),
80 'post_not_in' => self::get_data( $meta, 'exclude_posts', [] ),
81 'limit' => ( empty( $meta['posts_limit'] ) || '-1' === $meta['posts_limit'] ) ? 10000000 : $meta['posts_limit'],
82 'offset' => self::get_data( $meta, 'posts_offset', 0 ),
83 'order_by' => self::get_data( $meta, 'posts_order_by', 'date' ),
84 'order' => self::get_data( $meta, 'posts_order', 'DESC' ),
85 'author_in' => self::get_data( $meta, 'filter_author', [] ),
86 'display_by' => self::get_data( $meta, 'products_filter', 'date' ),
87 'categories' => self::get_data( $meta, 'filter_categories', [] ),
88 'tags' => self::get_data( $meta, 'filter_tags', [] ),
89 'attributes' => self::get_data( $meta, 'filter_attributes', [] ),
90 'relation' => self::get_data( $meta, 'tax_relation', 'OR' ),
91 'category_source' => self::get_data( $meta, 'select_source', 'product_cat' ),
92 'category_term' => self::get_data( $meta, 'select_cat' ),
93 'display_cat_by' => self::get_data( $meta, 'display_cat_by' ),
94 'include_cats' => self::get_data( $meta, 'include_cats', [] ),
95 'exclude_cats' => self::get_data( $meta, 'exclude_cats', [] ),
96 'select_parent_cat' => self::get_data( $meta, 'select_parent_cat' ),
97 'select_cats' => self::get_data( $meta, 'select_cats', [] ),
98 'select_cat_ids' => self::get_data( $meta, 'include_cat_ids', '' ),
99 'cats_limit' => ( empty( $meta['cats_limit'] ) || '-1' === $meta['cats_limit'] ) ? 10000000 : $meta['cats_limit'],
100 'show_empty' => ! empty( $meta['show_empty'] ),
101 'show_uncategorized' => ! empty( $meta['show_uncategorized'] ),
102 'show_subcats' => ! empty( $meta['show_subcats'] ),
103 'show_top_level_cats' => ! empty( $meta['show_top_level_cats'] ),
104 'cats_order_by' => self::get_data( $meta, 'cats_order_by', 'name' ),
105 'cats_order' => self::get_data( $meta, 'cats_order', 'DESC' ),
106 'rtsb_order' => self::get_data( $meta, 'rtsb_order', 'ASC' ),
107 'rtsb_orderby' => self::get_data( $meta, 'rtsb_orderby', 'menu_order' ),
108
109 // Pagination.
110 'pagination' => ! empty( $meta['show_pagination'] ),
111 'posts_loading_type' => self::get_data( $meta, 'pagination_type', 'pagination' ),
112 'posts_per_page' => self::get_data( $meta, 'pagination_per_page', '' ),
113
114 // Image.
115 'f_img' => ! empty( $meta['show_featured_image'] ),
116 'gallery_img' => ! empty( $meta['show_product_gallery'] ),
117 'c_img' => ! empty( $meta['show_cat_image'] ),
118 'hover_img' => ! empty( $meta['show_hover_image'] ),
119 'f_img_size' => self::get_data( $meta, 'image', 'medium' ),
120 'custom_img_size' => ! empty( $c_image_size ) && is_array( $c_image_size ) ? $c_image_size : [],
121 'default_img_id' => ! empty( $meta['default_preview_image']['id'] ) ? $meta['default_preview_image']['id'] : null,
122 'show_overlay' => ! empty( $meta['show_overlay'] ),
123 'hover_animation' => self::get_data( $meta, 'image_hover_animation', 'none' ),
124 'show_custom_image' => ! empty( $meta['show_custom_image'] ),
125 'custom_image' => ! empty( $meta['custom_image']['id'] ) ? $meta['custom_image']['id'] : null,
126
127 // Visibility.
128 'visibility' => ! empty( self::content_visibility( $meta ) ) ? self::content_visibility( $meta ) : [],
129
130 // Action Buttons.
131 'btn_preset' => self::get_data( $meta, 'action_btn_preset', 'preset1' ),
132 'btn_position' => self::get_data( $meta, 'action_btn_position', 'above' ),
133 'tooltip_position' => self::get_data( $meta, 'action_btn_tooltip_position', 'top' ),
134
135 // Product Title.
136 'title_tag' => self::get_data( $meta, 'title_tag', 'h3' ),
137 'title_hover' => ! empty( $meta['title_hover'] ),
138 'title_limit' => self::get_data( $meta, 'title_limit', 'default' ),
139 'title_limit_custom' => self::get_data( $meta, 'title_limit_custom' ),
140 'show_custom_title' => ! empty( $meta['show_custom_title'] ),
141 'cat_custom_title' => self::get_data( $meta, 'custom_title', '' ),
142
143 // Variation Swatches.
144 'swatch_position' => self::get_data( $meta, 'swatch_position', 'top' ),
145 'swatch_type' => self::get_data( $meta, 'swatch_type', 'circle' ),
146
147 // Short Description.
148 'show_custom_excerpt' => ! empty( $meta['show_custom_description'] ),
149 'cat_custom_excerpt' => self::get_data( $meta, 'custom_description', '' ),
150 'cat_excerpt_position' => self::get_data( $meta, 'excerpt_position', 'below' ),
151 'excerpt_limit' => self::get_data( $meta, 'excerpt_limit', 'default' ),
152 'excerpt_limit_custom' => self::get_data( $meta, 'excerpt_limit_custom', 200 ),
153
154 // Count.
155 'count_position' => self::get_data( $meta, 'count_display_type', 'flex' ),
156 'before_count' => self::get_data( $meta, 'before_count', '' ),
157 'after_count' => self::get_data( $meta, 'after_count', '' ),
158
159 // Add to cart.
160 'show_cart_icon' => ! empty( $meta['show_cart_icon'] ),
161 'show_cart_text' => ! empty( $meta['show_cart_text'] ),
162 'add_to_cart_icon' => self::get_data( $meta, 'add_to_cart_icon', [] ),
163 'add_to_cart_success_icon' => self::get_data( $meta, 'add_to_cart_success_icon', [] ),
164 'add_to_cart_text' => self::get_data( $meta, 'add_to_cart_text', esc_html__( 'Add to Cart', 'shopbuilder' ) ),
165 'add_to_cart_success_text' => self::get_data( $meta, 'add_to_cart_success_text', '' ),
166 'add_to_cart_alignment' => self::get_data( $meta, 'cart_icon_alignment', 'left' ),
167
168 // Action Button Icons.
169 'quick_view_icon' => self::get_data( $meta, 'quick_view_icon', [] ),
170 'comparison_icon' => self::get_data( $meta, 'comparison_icon', [] ),
171 'comparison_icon_added' => self::get_data( $meta, 'comparison_icon_added', [] ),
172 'wishlist_icon' => self::get_data( $meta, 'wishlist_icon', [] ),
173 'wishlist_icon_added' => self::get_data( $meta, 'wishlist_icon_added', [] ),
174
175 // Badges.
176 'sale_badge_type' => self::get_data( $meta, 'sale_badges_type', 'percentage' ),
177 'sale_badge_text' => self::get_data( $meta, 'sale_badges_text', esc_html__( 'Sale', 'shopbuilder' ) ),
178 'custom_badge_text' => self::get_data( $meta, 'custom_badge_text', esc_html__( 'Sale', 'shopbuilder' ) ),
179 'out_of_stock_badge_text' => self::get_data( $meta, 'stock_badges_text', esc_html__( 'Out of Stock', 'shopbuilder' ) ),
180 'badge_position' => self::get_data( $meta, 'badges_position', 'top' ),
181 'badge_alignment' => self::get_data( $meta, 'badges_alignment', 'left' ),
182 'badge_preset' => self::get_data( $meta, 'custom_badge_preset', 'preset-1' ),
183 'enable_badges_module' => self::get_data( $meta, 'enable_badges_module', '' ),
184
185 // Link.
186 'image_link' => ! empty( $meta['image_link'] ),
187 'title_link' => ! empty( $meta['title_link'] ),
188 'hover_btn_text' => self::get_data( $meta, 'hover_btn_text', esc_html__( 'See Details', 'shopbuilder' ) ),
189 'show_hover_btn_icon' => ! empty( $meta['show_hover_btn_icon'] ),
190 'hover_btn_icon' => self::get_data( $meta, 'hover_btn_icon', [] ),
191 'custom_link' => self::get_data( $meta, 'custom_link' ),
192
193 // Slider.
194 'd_group' => self::get_data( $meta, 'cols_group', 1 ),
195 't_group' => self::get_data( $meta, 'cols_group_tablet', 1 ),
196 'm_group' => self::get_data( $meta, 'cols_group_mobile', 1 ),
197 'auto_play' => ! empty( $meta['slide_autoplay'] ),
198 'stop_on_hover' => ! empty( $meta['pause_hover'] ),
199 'slider_nav' => ! empty( $meta['slider_nav'] ),
200 'slider_dot' => ! empty( $meta['slider_pagi'] ),
201 'slider_dynamic_dot' => ! empty( $meta['slider_dynamic_pagi'] ),
202 'loop' => ! empty( $meta['slider_loop'] ),
203 'lazy_load' => ! empty( $meta['slider_lazy_load'] ),
204 'auto_height' => ! empty( $meta['slider_auto_height'] ),
205 'speed' => self::get_data( $meta, 'slide_speed', 2000 ),
206 'space_between' => isset( $meta['grid_gap']['size'] ) && strlen( $meta['grid_gap']['size'] ) ? $meta['grid_gap']['size'] : 30,
207 'auto_play_timeout' => self::get_data( $meta, 'autoplay_timeout', 5000 ),
208 'nav_position' => self::get_data( $meta, 'slider_nav_position', 'top' ),
209 'left_arrow_icon' => self::get_data( $meta, 'slider_left_arrow_icon', [] ),
210 'right_arrow_icon' => self::get_data( $meta, 'slider_right_arrow_icon', [] ),
211 ],
212 $meta
213 );
214
215 if ( ! empty( $meta['active_cat_slider'] ) ) {
216 $data['active_cat_slider'] = true;
217 }
218
219 if ( ! empty( $meta['cols_widescreen'] ) ) {
220 $data['w_cols'] = $meta['cols_widescreen'];
221 }
222
223 if ( ! empty( $meta['cols_laptop'] ) ) {
224 $data['l_cols'] = $meta['cols_laptop'];
225 }
226
227 if ( ! empty( $meta['cols_tablet_extra'] ) ) {
228 $data['te_cols'] = $meta['cols_tablet_extra'];
229 }
230
231 if ( ! empty( $meta['cols_mobile_extra'] ) ) {
232 $data['me_cols'] = $meta['cols_mobile_extra'];
233 }
234
235 $queried_obj = get_queried_object();
236
237 if ( is_shop() || is_product_taxonomy() ) {
238 $data['posts_per_page'] = self::get_products_per_page();
239 $data['order_by'] = self::get_data( $data, 'rtsb_orderby', $data['order_by'] );
240 $data['order'] = self::get_data( $data, 'rtsb_order', $data['order'] );
241 }
242
243 if ( ! is_shop() && is_product_taxonomy() ) {
244 if ( ! empty( $queried_obj->taxonomy ) ) {
245 $data['queried_tax'] = esc_html( $queried_obj->taxonomy );
246 }
247
248 if ( ! empty( $queried_obj->term_id ) ) {
249 $data['queried_term'] = esc_html( $queried_obj->term_id );
250 }
251 }
252
253 return apply_filters( 'rtsb/elementor/render/meta_dataset_final', $data, $meta, $raw_settings );
254 }
255
256 /**
257 * Builds an array with field values.
258 *
259 * @param array $meta Field values.
260 * @param string $template Template name.
261 *
262 * @return array
263 */
264 public static function archive_meta_dataset( array $meta, $template = '' ) {
265 $data = apply_filters(
266 'rtsb/elementor/render/archive_meta_dataset',
267 [
268 // Layout.
269 'widget' => 'default',
270 'template' => self::get_data( $template, '', '' ),
271 'view_mode' => self::get_data( $meta, 'view_mode', 'grid' ),
272 'show_flash_sale' => ! empty( $meta['show_flash_sale'] ),
273 'wishlist_button' => ! empty( $meta['wishlist_button'] ),
274 'comparison_button' => ! empty( $meta['comparison_button'] ),
275 'quick_view_button' => ! empty( $meta['quick_view_button'] ),
276 'show_rating' => ! empty( $meta['show_rating'] ),
277 'show_pagination' => ! empty( $meta['show_pagination'] ),
278 'cart_icon' => self::get_data( $meta, 'cart_icon', [] ),
279 'wishlist_icon' => self::get_data( $meta, 'wishlist_icon', [] ),
280 'wishlist_icon_added' => self::get_data( $meta, 'wishlist_icon_added', [] ),
281 'comparison_icon' => self::get_data( $meta, 'comparison_icon', [] ),
282 'comparison_icon_added' => self::get_data( $meta, 'comparison_icon_added', [] ),
283 'quick_view_icon' => self::get_data( $meta, 'quick_view_icon', [] ),
284 'prev_icon' => self::get_data( $meta, 'prev_icon', [] ),
285 'next_icon' => self::get_data( $meta, 'next_icon', [] ),
286 'posts_per_page' => self::get_products_per_page(),
287 'rtsb_order' => self::get_data( $meta, 'rtsb_order', 'ASC' ),
288 'rtsb_orderby' => self::get_data( $meta, 'rtsb_orderby', 'menu_order' ),
289 'tooltip_position' => self::get_data( $meta, 'action_btn_tooltip_position', 'top' ),
290 ],
291 $meta
292 );
293
294 $queried_obj = get_queried_object();
295
296 if ( ! is_shop() && BuilderFns::is_archive() ) {
297 if ( ! empty( $queried_obj->taxonomy ) ) {
298 $data['queried_tax'] = esc_html( $queried_obj->taxonomy );
299 }
300
301 if ( ! empty( $queried_obj->term_id ) ) {
302 $data['queried_term'] = esc_html( $queried_obj->term_id );
303 }
304 }
305
306 return apply_filters( 'rtsb/elementor/render/archive_meta_dataset_final', $data, $meta );
307 }
308
309 /**
310 * Setting up content visibility
311 *
312 * @param array $settings Elementor settings.
313 *
314 * @return array
315 */
316 public static function content_visibility( $settings ) {
317 $visibility = [];
318
319 if ( ! empty( $settings['show_title'] ) ) {
320 $visibility[] = 'title';
321 }
322
323 if ( ! empty( $settings['show_short_desc'] ) ) {
324 $visibility[] = 'excerpt';
325 }
326
327 if ( ! empty( $settings['show_price'] ) ) {
328 $visibility[] = 'price';
329 }
330
331 if ( ! empty( $settings['show_rating'] ) ) {
332 $visibility[] = 'rating';
333 }
334
335 if ( ! empty( $settings['show_badges'] ) ) {
336 $visibility[] = 'badges';
337 }
338
339 if ( ! empty( $settings['show_categories'] ) ) {
340 $visibility[] = 'categories';
341 }
342
343 if ( ! empty( $settings['single_category'] ) ) {
344 $visibility[] = 'single-cat';
345 }
346
347 if ( ! empty( $settings['show_swatches'] ) ) {
348 $visibility[] = 'swatches';
349 }
350
351 if ( ! empty( $settings['show_vs_clear_btn'] ) ) {
352 $visibility[] = 'clear-btn';
353 }
354
355 if ( ! empty( $settings['show_count'] ) ) {
356 $visibility[] = 'count';
357 }
358
359 if ( ! empty( $settings['show_wishlist'] ) ) {
360 $visibility[] = 'wishlist';
361 }
362
363 if ( ! empty( $settings['show_compare'] ) ) {
364 $visibility[] = 'compare';
365 }
366
367 if ( ! empty( $settings['show_quick_view'] ) ) {
368 $visibility[] = 'quick_view';
369 }
370
371 if ( ! empty( $settings['show_add_to_cart'] ) ) {
372 $visibility[] = 'add_to_cart';
373 }
374
375 return $visibility;
376 }
377
378 /**
379 * Set Default Layout.
380 *
381 * @param string $layout Layout.
382 *
383 * @return string
384 */
385 public static function set_default_layout( $layout ) {
386 $is_list = preg_match( '/list/', $layout );
387 $is_cat_single = preg_match( '/category-single/', $layout );
388 $is_cat = preg_match( '/category/', $layout );
389 $is_carousel = preg_match( '/slider/', $layout );
390 $default = 'grid-layout1';
391
392 if ( $is_list ) {
393 $default = 'list-layout1';
394 } elseif ( $is_cat_single ) {
395 $default = 'category-single-layout1';
396 } elseif ( $is_cat ) {
397 $default = 'category-layout1';
398 } elseif ( $is_carousel ) {
399 $default = 'slider-layout1';
400 }
401
402 return $default;
403 }
404
405 /**
406 * Default layout columns.
407 *
408 * @param int $layout Layout.
409 *
410 * @return int
411 */
412 public static function default_columns( $layout ) {
413 switch ( $layout ) {
414 case 'grid-layout2':
415 case 'slider-layout2':
416 $columns = 3;
417 break;
418
419 case 'list-layout1':
420 case 'list-layout2':
421 case 'list-layout3':
422 case 'list-layout7':
423 case 'list-layout5':
424 $columns = 1;
425 break;
426
427 case 'list-layout4':
428 case 'list-layout6':
429 case 'slider-layout5':
430 case 'slider-layout8':
431 $columns = 2;
432 break;
433
434 case 'grid-layout6':
435 case 'grid-layout9':
436 $columns = 5;
437 break;
438
439 case 'category-layout1':
440 $columns = 6;
441 break;
442
443 default:
444 $columns = 4;
445 break;
446 }
447
448 return apply_filters( 'rtsb/element/general/default_columns', $columns, $layout );
449 }
450
451 /**
452 * Pagination JSON data.
453 *
454 * @param array $metas Data set.
455 * @param string $template Template name.
456 *
457 * @return string
458 */
459 public static function pagination_data( $metas, $template ) {
460 $el_data = self::meta_dataset( $metas, $template );
461
462 return esc_js( wp_json_encode( $el_data, JSON_UNESCAPED_UNICODE ) );
463 }
464
465 /**
466 * Container classes
467 *
468 * @param array $metas Meta data.
469 * @param array $settings Settings array.
470 * @param string $custom_class Custom class.
471 *
472 * @return mixed|null
473 */
474 public static function prepare_container_classes( $metas = [], $settings = [], $custom_class = '' ) {
475 $classes = 'rtsb-elementor-container products rtsb-pos-r ';
476 $classes .= $custom_class;
477
478 $raw_layout = esc_html( $metas['layout'] );
479 $layout = self::filter_layout( $raw_layout );
480 $is_cat = preg_match( '/category/', $layout );
481 $cart_txt_class = '';
482
483 $animation = $metas['hover_animation'];
484
485 if ( ! $is_cat ) {
486 $cart_txt_class = $metas['show_cart_text'] ? ' has-cart-text' : ' no-cart-text';
487 $animation .= ' gallery-hover-' . ( ! empty( $settings['gallery_hover_animation'] ) ? $settings['gallery_hover_animation'] : 'fade' );
488 }
489
490 $badge_class = [
491 'position' => $metas['badge_position'],
492 'alignment' => $metas['badge_alignment'],
493 ];
494
495 if ( ! in_array( 'clear-btn', $metas['visibility'], true ) ) {
496 $classes .= ' no-clear-btn';
497 }
498
499 $classes .= ! empty( $metas['pagination'] ) ? ' rtsb-has-pagination' : ' rtsb-no-pagination';
500 $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'] );
501
502 if ( $metas['show_overlay'] ) {
503 $classes .= ' has-overlay';
504 }
505
506 if ( in_array( 'single-cat', $metas['visibility'], true ) ) {
507 $classes .= ' show-single-cat';
508 }
509
510 if ( ! $is_cat ) {
511 $action_btn_classes = [
512 'show_compare_text' => 'has-compare-text',
513 'show_quick_view_text' => 'has-quick-view-text',
514 'show_wishlist_text' => 'has-wishlist-text',
515 'show_compare_icon' => 'no-compare-icon',
516 'show_quick_view_icon' => 'no-quick-view-icon',
517 'show_wishlist_icon' => 'no-wishlist-icon',
518 'show_quick_checkout_icon' => 'no-quick_checkout-icon',
519 ];
520
521 foreach ( $action_btn_classes as $setting_key => $class ) {
522 if ( strpos( $setting_key, 'icon' ) !== false ) {
523 $classes .= empty( $settings[ $setting_key ] ) ? ' ' . $class : '';
524 } else {
525 $classes .= ! empty( $settings[ $setting_key ] ) ? ' ' . $class : '';
526 }
527 }
528
529 if ( rtsb()->has_pro() && ! empty( $settings['custom_ordering'] ) ) {
530 $classes .= ' has-custom-ordering';
531 }
532 }
533 if ( rtsb()->has_pro() && ! empty( $settings['slider_slide_animation'] ) ) {
534 $classes .= ' has-slide-animation';
535 }
536
537 return apply_filters( 'rtsb/product/container/class', $classes, $settings );
538 }
539
540 /**
541 * Function to filter and validate the layout against allowed patterns.
542 *
543 * @param string $layout The layout string to be filtered.
544 * @param string $template The template to be checked.
545 *
546 * @return string
547 */
548 public static function filter_layout( $layout, $template = '' ) {
549 $allowed_patterns = apply_filters( 'rtsb/elementor/custom_layout', [ 'grid', 'list', 'slider', 'category', 'toyup', 'zilly' ] );
550 $layout_part = explode( '-', $layout );
551 $default = 'grid-layout1';
552
553 if ( empty( $layout_part[0] ) ) {
554 return $default;
555 }
556
557 if ( in_array( $layout_part[0], $allowed_patterns, true ) ) {
558 return $layout;
559 } else {
560 if ( ! empty( $template ) ) {
561 $grid = preg_match( '/grid/', $template );
562 $list = preg_match( '/list/', $template );
563 $slider = preg_match( '/slider/', $template );
564 $category = preg_match( '/category/', $template );
565
566 if ( $grid ) {
567 return $default;
568 } elseif ( $list ) {
569 return 'list-layout1';
570 } elseif ( $slider ) {
571 return 'slider-layout1';
572 } elseif ( $category ) {
573 return 'category-layout1';
574 } else {
575 return $default;
576 }
577 } else {
578 return $default;
579 }
580 }
581 }
582
583 /**
584 * Row classes
585 *
586 * @param array $settings Settings array.
587 *
588 * @return mixed|null
589 */
590 public static function prepare_row_classes( $settings = [] ) {
591 $masonry_class = null;
592 $classes = 'rtsb-row rtsb-content-loader element-loading';
593 $loader_class = ' rtsb-pre-loader';
594
595 $raw_layout = esc_html( $settings['layout'] );
596 $layout = self::filter_layout( $raw_layout );
597 $grid_type = $settings['grid_type'];
598 $is_carousel = preg_match( '/slider/', $layout );
599
600 if ( preg_match( '/category/', $layout ) && ! empty( $settings['active_cat_slider'] ) ) {
601 $classes .= ' rtsb-slider-layout';
602 }
603
604 if ( 'equal' === $grid_type ) {
605 $masonry_class = ' rtsb-equal';
606 } elseif ( 'masonry' === $grid_type ) {
607 $masonry_class = ' rtsb-masonry';
608 } else {
609 $masonry_class = ' rtsb-even';
610 }
611
612 if ( ! rtsb()->has_pro() || $is_carousel ) {
613 $masonry_class = ' rtsb-even';
614 }
615
616 if ( $is_carousel && ! empty( $settings['raw_settings']['always_show_nav'] ) ) {
617 $classes .= ' always-show-nav';
618 }
619
620 if ( ! empty( $settings['raw_settings']['inner_slider_always_show_nav'] ) ) {
621 $classes .= ' inner-slider-always-show-nav';
622 }
623
624 if ( empty( $settings['raw_settings']['cols_mobile'] ) ) {
625 $classes .= ' rtsb-mobile-flex-row';
626 }
627
628 $classes .= ' rtsb-' . $layout . $masonry_class . $loader_class;
629
630 return apply_filters( 'rtsb/elementor/row/classes', $classes, $settings );
631 }
632
633 /**
634 * Prepare pagination attributes.
635 *
636 * @param string $layout The layout type.
637 * @param bool $has_filters Whether the widget has filters.
638 * @param string $template The template name.
639 * @param array $settings The widget settings.
640 * @param bool $ajax Whether to enable AJAX pagination.
641 *
642 * @return string
643 */
644 public static function prepare_pagination_attr( $layout, $has_filters, $template, $settings, $ajax ) {
645 $is_cat = preg_match( '/category/', $layout );
646 $is_carousel = preg_match( '/slider/', $layout );
647
648 if ( $is_carousel ) {
649 return $has_filters ? self::pagination_data( $settings, $template ) : '';
650 } elseif ( $is_cat ) {
651 return '';
652 } else {
653 $ajax_pagination = ! empty( $settings['show_pagination'] ) && 'pagination' !== $settings['pagination_type'];
654 $page = Fns::product_filters_has_ajax( apply_filters( 'rtsb/builder/set/current/page/type', '' ) );
655 $condition = rtsb()->has_pro() && $ajax && ( $ajax_pagination || $has_filters || $page );
656
657 return $condition ? self::pagination_data( $settings, $template ) : '';
658 }
659 }
660
661 /**
662 * Archive JSON data.
663 *
664 * @param array $metas Data set.
665 * @param string $template Template name.
666 *
667 * @return string
668 */
669 public static function archive_data( $metas, $template ) {
670 $el_data = self::archive_meta_dataset( $metas, $template );
671
672 return ' data-rtsb-ajax=\'' . esc_js( wp_json_encode( $el_data ) ) . '\'';
673 }
674
675 /**
676 * Slider options.
677 *
678 * @param array $meta Meta values.
679 * @param array $settings Raw Settings.
680 *
681 * @return array
682 */
683 public static function slider_data( array $meta, $settings = [] ) {
684 $has_dots = $meta['slider_dot'] ? ' has-dot' : ' no-dot';
685 $has_dots .= $meta['slider_nav'] ? ' has-nav' : ' no-nav';
686 $has_dynamic_dots = $meta['slider_dynamic_dot'] ? true : false;
687 $d_col = 0 === $meta['d_cols'] ? self::default_columns( $meta['layout'] ) : $meta['d_cols'];
688 $t_col = 0 === $meta['t_cols'] ? 2 : $meta['t_cols'];
689 $m_col = 0 === $meta['m_cols'] ? 1 : $meta['m_cols'];
690
691 if ( Plugin::$instance->breakpoints->has_custom_breakpoints() ) {
692 // Widescreen.
693 $w_col = self::get_data( $settings, 'cols_widescreen' );
694 $w_col = 0 === $w_col ? self::default_columns( $meta['layout'] ) : $w_col;
695 $w_group = self::get_data( $settings, 'cols_group_widescreen', 1 );
696
697 // Laptop.
698 $l_col = self::get_data( $settings, 'cols_laptop' );
699 $l_col = 0 === $l_col ? self::default_columns( $meta['layout'] ) : $l_col;
700 $l_group = self::get_data( $settings, 'cols_group_laptop', 1 );
701
702 // Tablet Landscape.
703 $te_col = self::get_data( $settings, 'cols_tablet_extra' );
704 $te_col = 0 === $te_col ? 3 : $te_col;
705 $te_group = self::get_data( $settings, 'cols_group_tablet_extra', 1 );
706
707 // Mobile Landscape.
708 $me_col = self::get_data( $settings, 'cols_mobile_extra' );
709 $me_col = 0 === $me_col ? 2 : $me_col;
710 $me_group = self::get_data( $settings, 'cols_group_mobile_extra', 1 );
711
712 $el_breakpoints = Fns::get_elementor_breakpoints();
713
714 foreach ( $el_breakpoints as $key => $value ) {
715 if ( isset( $value['is_enabled'] ) && ! $value['is_enabled'] ) {
716 unset( $el_breakpoints[ $key ] );
717 }
718 }
719
720 $breakpoints = [
721 0 => [
722 'slidesPerView' => absint( $m_col ),
723 'slidesPerGroup' => absint( $meta['m_group'] ),
724 'pagination' => [
725 'dynamicBullets' => $has_dynamic_dots,
726 ],
727 ],
728 ];
729
730 $desktop = [
731 'desktop' => [
732 'label' => 'Desktop',
733 'value' => 1920,
734 'is_enabled' => 1,
735 ],
736 ];
737
738 if ( ! empty( $el_breakpoints['laptop'] ) && $el_breakpoints['laptop']['is_enabled'] ) {
739 $widescreen_position = array_search( 'widescreen', array_keys( $el_breakpoints ), true );
740 $el_breakpoints = array_merge(
741 array_slice( $el_breakpoints, 0, $widescreen_position ),
742 $desktop,
743 array_slice( $el_breakpoints, $widescreen_position )
744 );
745 } else {
746 $desktop['desktop']['value'] = 1366;
747 $el_breakpoints['desktop'] = $desktop['desktop'];
748 }
749
750 foreach ( $el_breakpoints as $el_breakpoint => $value ) {
751 $breakpoint_value = ! empty( $value['value'] ) ? $value['value'] : $value['default_value'];
752 $dynamic_bullets = $has_dynamic_dots;
753 $slides_per_view = $d_col;
754 $slides_per_group = $meta['d_group'];
755
756 switch ( $el_breakpoint ) {
757 case 'widescreen':
758 $slides_per_view = $w_col;
759 $slides_per_group = $w_group;
760
761 break;
762
763 case 'laptop':
764 $slides_per_view = $l_col;
765 $slides_per_group = $l_group;
766
767 break;
768
769 case 'tablet_extra':
770 $slides_per_view = $l_col;
771 $slides_per_group = $l_group;
772
773 if ( empty( $el_breakpoints['laptop'] ) ) {
774 $slides_per_view = $d_col;
775 $slides_per_group = $meta['d_group'];
776 }
777
778 break;
779
780 case 'tablet':
781 $slides_per_view = $te_col;
782 $slides_per_group = $te_group;
783
784 if ( empty( $el_breakpoints['laptop'] ) && empty( $el_breakpoints['tablet_extra'] ) ) {
785 $slides_per_view = $d_col;
786 $slides_per_group = $meta['d_group'];
787 } elseif ( empty( $el_breakpoints['laptop'] ) && ! empty( $el_breakpoints['tablet_extra'] ) ) {
788 $slides_per_view = $te_col;
789 $slides_per_group = $te_group;
790 } elseif ( ! empty( $el_breakpoints['laptop'] ) && empty( $el_breakpoints['tablet_extra'] ) ) {
791 $slides_per_view = $l_col;
792 $slides_per_group = $l_group;
793 }
794
795 break;
796
797 case 'mobile_extra':
798 $slides_per_view = $t_col;
799 $slides_per_group = $meta['t_group'];
800 $dynamic_bullets = $has_dynamic_dots;
801
802 break;
803
804 case 'mobile':
805 $slides_per_view = $t_col;
806 $slides_per_group = $meta['t_group'];
807 $dynamic_bullets = $has_dynamic_dots;
808
809 if ( ! empty( $el_breakpoints['mobile_extra'] ) ) {
810 $slides_per_view = $me_col;
811 $slides_per_group = $me_group;
812 }
813
814 break;
815 }
816
817 if ( $value['is_enabled'] ) {
818 $br = 'widescreen' !== $el_breakpoint ? $breakpoint_value + 1 : $breakpoint_value;
819
820 $breakpoints[ absint( $br ) ] = [
821 'slidesPerView' => absint( $slides_per_view ),
822 'slidesPerGroup' => absint( $slides_per_group ),
823 'pagination' => [
824 'dynamicBullets' => $dynamic_bullets,
825 ],
826 ];
827 }
828 }
829 } else {
830 $breakpoints = [
831 0 => [
832 'slidesPerView' => absint( $m_col ),
833 'slidesPerGroup' => absint( $meta['m_group'] ),
834 'pagination' => [
835 'dynamicBullets' => $has_dynamic_dots,
836 ],
837 ],
838 768 => [
839 'slidesPerView' => absint( $t_col ),
840 'slidesPerGroup' => absint( $meta['t_group'] ),
841 'pagination' => [
842 'dynamicBullets' => $has_dynamic_dots,
843 ],
844 ],
845 1025 => [
846 'slidesPerView' => absint( $d_col ),
847 'slidesPerGroup' => absint( $meta['d_group'] ),
848 'pagination' => [
849 'dynamicBullets' => $has_dynamic_dots,
850 ],
851 ],
852 ];
853 }
854
855 $slider_options = [
856 'slidesPerView' => absint( $d_col ),
857 'slidesPerGroup' => absint( $meta['d_group'] ),
858 'speed' => absint( $meta['speed'] ),
859 'loop' => $meta['loop'],
860 'autoHeight' => $meta['auto_height'],
861 'preloadImages' => ! $meta['lazy_load'],
862 'lazy' => $meta['lazy_load'],
863 'breakpoints' => $breakpoints,
864 ];
865
866 if ( ! empty( $meta['raw_settings']['slider_slide_animation'] ) ) {
867 $slider_options['watchSlidesProgress'] = true;
868 }
869 if ( $meta['auto_play'] ) {
870 $slider_options['autoplay'] = [
871 'delay' => absint( $meta['auto_play_timeout'] ),
872 'pauseOnMouseEnter' => $meta['stop_on_hover'],
873 'disableOnInteraction' => false,
874 ];
875 }
876
877 $slider_options = apply_filters( 'rtsb/elementor/render/slider_dataset', $slider_options, $meta );
878 $carouselClass = 'rtsb-carousel-slider slider-loading rtsb-pos-s ' . $meta['nav_position'] . '-nav' . $has_dots;
879
880 return [
881 'data' => esc_js( wp_json_encode( $slider_options ) ),
882 'class' => $carouselClass,
883 ];
884 }
885
886 /**
887 * Preloader.
888 *
889 * @param string $layout Layout.
890 *
891 * @return string
892 */
893 public static function pre_loader( $layout ) {
894 $loader_class = '';
895
896 $is_carousel = preg_match( '/slider/', $layout );
897
898 if ( $is_carousel ) {
899 $loader_class = ' full-op';
900 }
901
902 return '<div class="rtsb-elements-loading rtsb-ball-clip-rotate"><div></div></div>';
903 }
904
905 /**
906 * Badge class.
907 *
908 * @param string $preset Badge preset.
909 *
910 * @return string|null
911 */
912 public static function badge_class( $preset ) {
913 switch ( $preset ) {
914 case 'preset-default':
915 $class = 'default-badge';
916 break;
917 case 'preset2':
918 $class = 'fill angle-right';
919 break;
920 case 'preset3':
921 $class = 'outline';
922 break;
923
924 case 'preset4':
925 $class = 'outline angle-right';
926 break;
927
928 default:
929 $class = 'fill';
930 break;
931 }
932
933 return $class;
934 }
935
936 /**
937 * Registers required scripts.
938 *
939 * @param array $scripts Scripts to register.
940 *
941 * @return void
942 */
943 public static function register_scripts( $scripts ) {
944 $caro = false;
945 $masonry = false;
946 $script = [];
947
948 $script[] = 'jquery';
949
950 foreach ( $scripts as $sc => $value ) {
951 if ( ! empty( $sc ) ) {
952 if ( 'isCarousel' === $sc ) {
953 $caro = $value;
954 }
955
956 if ( 'isMasonry' === $sc ) {
957 $masonry = $value;
958 }
959 }
960 }
961
962 if ( count( $scripts ) ) {
963 /**
964 * Scripts.
965 */
966 if ( $caro ) {
967 $script[] = 'swiper';
968 }
969
970 if ( $masonry ) {
971 $script[] = 'masonry';
972 }
973
974 $script[] = 'rtsb-imagesloaded';
975 $script[] = 'rtsb-public';
976
977 foreach ( $script as $sc ) {
978 wp_enqueue_script( $sc );
979 }
980 }
981 }
982
983 /**
984 * Check if a wrapper is needed based on the current theme.
985 *
986 * @return bool
987 */
988 public static function is_wrapper_needed() {
989 $theme_list = apply_filters(
990 'rtsb/products/inner/wrapper/basedon/themes',
991 [
992 'twentytwentyone',
993 'twentytwentytwo',
994 'twentytwentythree',
995 'storefront',
996 'hello-elementor',
997 'astra',
998 ],
999 rtsb()->current_theme
1000 );
1001
1002 if ( in_array( rtsb()->current_theme, $theme_list, true ) ) {
1003 return true;
1004 }
1005
1006 return false;
1007 }
1008
1009 /**
1010 * Get the number of products per page based on WooCommerce settings.
1011 *
1012 * @return int
1013 */
1014 public static function get_products_per_page() {
1015 $products_row = absint( get_option( 'woocommerce_catalog_rows', 4 ) );
1016 $products_col = absint( get_option( 'woocommerce_catalog_columns', 4 ) );
1017 $products_per_page = apply_filters( 'rtsb/elementor/archive/products_per_page', $products_row * $products_col );
1018
1019 return ! empty( $products_per_page ) ? $products_per_page : 12;
1020 }
1021 }
1022