PluginProbe
ShopBuilder – WooCommerce Builder For Elementor / 2.1.13
ShopBuilder – WooCommerce Builder For Elementor v2.1.13
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
← All changes | app/Elementor/Helper/RenderHelpers.php +95 -26 2.1.12.1.13 View file →
@@ -178,8 +178,9 @@
178 178 'out_of_stock_badge_text' => self::get_data( $meta, 'stock_badges_text', esc_html__( 'Out of Stock', 'shopbuilder' ) ),
179 179 'badge_position' => self::get_data( $meta, 'badges_position', 'top' ),
180 180 'badge_alignment' => self::get_data( $meta, 'badges_alignment', 'left' ),
181 181 'badge_preset' => self::get_data( $meta, 'custom_badge_preset', 'preset-1' ),
182 + 'enable_badges_module' => self::get_data( $meta, 'enable_badges_module', '' ),
182 183
183 184 // Link.
184 185 'image_link' => ! empty( $meta['image_link'] ),
185 186 'title_link' => ! empty( $meta['title_link'] ),
@@ -195,8 +196,9 @@
195 196 'auto_play' => ! empty( $meta['slide_autoplay'] ),
196 197 'stop_on_hover' => ! empty( $meta['pause_hover'] ),
197 198 'slider_nav' => ! empty( $meta['slider_nav'] ),
198 199 'slider_dot' => ! empty( $meta['slider_pagi'] ),
200 + 'slider_dynamic_dot' => ! empty( $meta['slider_dynamic_pagi'] ),
199 201 'loop' => ! empty( $meta['slider_loop'] ),
200 202 'lazy_load' => ! empty( $meta['slider_lazy_load'] ),
201 203 'auto_height' => ! empty( $meta['slider_auto_height'] ),
202 204 'speed' => self::get_data( $meta, 'slide_speed', 2000 ),
@@ -208,8 +210,12 @@
208 210 ],
209 211 $meta
210 212 );
211 213
214 + if ( ! empty( $meta['active_cat_slider'] ) ) {
215 + $data['active_cat_slider'] = true;
216 + }
217 +
212 218 if ( ! empty( $meta['cols_widescreen'] ) ) {
213 219 $data['w_cols'] = $meta['cols_widescreen'];
214 220 }
215 221
@@ -411,8 +417,9 @@
411 417
412 418 case 'list-layout1':
413 419 case 'list-layout2':
414 420 case 'list-layout3':
421 + case 'list-layout7':
415 422 case 'list-layout5':
416 423 $columns = 1;
417 424 break;
418 425
@@ -449,9 +456,9 @@
449 456 */
450 457 public static function pagination_data( $metas, $template ) {
451 458 $el_data = self::meta_dataset( $metas, $template );
452 459
453 - return esc_js( wp_json_encode( $el_data ) );
460 + return esc_js( wp_json_encode( $el_data, JSON_UNESCAPED_UNICODE ) );
454 461 }
455 462
456 463 /**
457 464 * Container classes
@@ -465,9 +472,10 @@
465 472 public static function prepare_container_classes( $metas = [], $settings = [], $custom_class = '' ) {
466 473 $classes = 'rtsb-elementor-container products rtsb-pos-r ';
467 474 $classes .= $custom_class;
468 475
469 - $layout = $metas['layout'];
476 + $raw_layout = esc_html( $metas['layout'] );
477 + $layout = self::filter_layout( $raw_layout );
470 478 $is_cat = preg_match( '/category/', $layout );
471 479 $cart_txt_class = '';
472 480
473 481 $animation = $metas['hover_animation'];
@@ -519,13 +527,59 @@
519 527 if ( rtsb()->has_pro() && ! empty( $settings['custom_ordering'] ) ) {
520 528 $classes .= ' has-custom-ordering';
521 529 }
522 530 }
531 + if ( rtsb()->has_pro() && ! empty( $settings['slider_slide_animation'] ) ) {
532 + $classes .= ' has-slide-animation';
533 + }
523 534
524 535 return apply_filters( 'rtsb/product/container/class', $classes, $settings );
525 536 }
526 537
527 538 /**
539 + * Function to filter and validate the layout against allowed patterns.
540 + *
541 + * @param string $layout The layout string to be filtered.
542 + * @param string $template The template to be checked.
543 + *
544 + * @return string
545 + */
546 + public static function filter_layout( $layout, $template = '' ) {
547 + $allowed_patterns = [ 'grid', 'list', 'slider', 'category' ];
548 + $layout_part = explode( '-', $layout );
549 + $default = 'grid-layout1';
550 +
551 + if ( empty( $layout_part[0] ) ) {
552 + return $default;
553 + }
554 +
555 + if ( in_array( $layout_part[0], $allowed_patterns, true ) ) {
556 + return $layout;
557 + } else {
558 + if ( ! empty( $template ) ) {
559 + $grid = preg_match( '/grid/', $template );
560 + $list = preg_match( '/list/', $template );
561 + $slider = preg_match( '/slider/', $template );
562 + $category = preg_match( '/category/', $template );
563 +
564 + if ( $grid ) {
565 + return $default;
566 + } elseif ( $list ) {
567 + return 'list-layout1';
568 + } elseif ( $slider ) {
569 + return 'slider-layout1';
570 + } elseif ( $category ) {
571 + return 'category-layout1';
572 + } else {
573 + return $default;
574 + }
575 + } else {
576 + return $default;
577 + }
578 + }
579 + }
580 +
581 + /**
528 582 * Row classes
529 583 *
530 584 * @param array $settings Settings array.
531 585 *
@@ -535,12 +589,17 @@
535 589 $masonry_class = null;
536 590 $classes = 'rtsb-row rtsb-content-loader element-loading';
537 591 $loader_class = ' rtsb-pre-loader';
538 592
539 - $layout = $settings['layout'];
593 + $raw_layout = esc_html( $settings['layout'] );
594 + $layout = self::filter_layout( $raw_layout );
540 595 $grid_type = $settings['grid_type'];
541 596 $is_carousel = preg_match( '/slider/', $layout );
542 597
598 + if ( preg_match( '/category/', $layout ) && ! empty( $settings['active_cat_slider'] ) ) {
599 + $classes .= ' rtsb-slider-layout';
600 + }
601 +
543 602 if ( 'even' === $grid_type ) {
544 603 $masonry_class = ' rtsb-even';
545 604 } elseif ( 'masonry' === $grid_type ) {
546 605 $masonry_class = ' rtsb-masonry';
@@ -548,8 +607,14 @@
548 607
549 608 if ( ! rtsb()->has_pro() || $is_carousel ) {
550 609 $masonry_class = ' rtsb-even';
551 610 }
611 + if ( $is_carousel && ! empty( $settings['raw_settings']['always_show_nav'] ) ) {
612 + $classes .= ' always-show-nav';
613 + }
614 + if ( ! empty( $settings['raw_settings']['inner_slider_always_show_nav'] ) ) {
615 + $classes .= ' inner-slider-always-show-nav';
616 + }
552 617
553 618 $classes .= ' rtsb-' . $layout . $masonry_class . $loader_class;
554 619
555 620 return apply_filters( 'rtsb/elementor/row/classes', $classes, $settings );
@@ -557,13 +622,13 @@
557 622
558 623 /**
559 624 * Prepare pagination attributes.
560 625 *
561 - * @param string $layout The layout type.
626 + * @param string $layout The layout type.
562 627 * @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.
628 + * @param string $template The template name.
629 + * @param array $settings The widget settings.
630 + * @param bool $ajax Whether to enable AJAX pagination.
566 631 *
567 632 * @return string
568 633 */
569 634 public static function prepare_pagination_attr( $layout, $has_filters, $template, $settings, $ajax ) {
@@ -575,9 +640,9 @@
575 640 } elseif ( $is_cat ) {
576 641 return '';
577 642 } else {
578 643 $ajax_pagination = ! empty( $settings['show_pagination'] ) && 'pagination' !== $settings['pagination_type'];
579 - $page = Fns::product_filters_has_ajax( 'shop' ) || Fns::product_filters_has_ajax( 'archive' );
644 + $page = Fns::product_filters_has_ajax( apply_filters( 'rtsb/builder/set/current/page/type', '' ) );
580 645 $condition = rtsb()->has_pro() && $ajax && ( $ajax_pagination || $has_filters || $page );
581 646
582 647 return $condition ? self::pagination_data( $settings, $template ) : '';
583 648 }
@@ -605,13 +670,14 @@
605 670 *
606 671 * @return array
607 672 */
608 673 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'];
674 + $has_dots = $meta['slider_dot'] ? ' has-dot' : ' no-dot';
675 + $has_dots .= $meta['slider_nav'] ? ' has-nav' : ' no-nav';
676 + $has_dynamic_dots = $meta['slider_dynamic_dot'] ? true : false;
677 + $d_col = 0 === $meta['d_cols'] ? self::default_columns( $meta['layout'] ) : $meta['d_cols'];
678 + $t_col = 0 === $meta['t_cols'] ? 2 : $meta['t_cols'];
679 + $m_col = 0 === $meta['m_cols'] ? 1 : $meta['m_cols'];
614 680
615 681 if ( \Elementor\Plugin::$instance->breakpoints->has_custom_breakpoints() ) {
616 682 // Widescreen.
617 683 $w_col = self::get_data( $settings, 'cols_widescreen' );
@@ -645,9 +711,9 @@
645 711 0 => [
646 712 'slidesPerView' => absint( $m_col ),
647 713 'slidesPerGroup' => absint( $meta['m_group'] ),
648 714 'pagination' => [
649 - 'dynamicBullets' => true,
715 + 'dynamicBullets' => $has_dynamic_dots,
650 716 ],
651 717 ],
652 718 ];
653 719
@@ -672,16 +738,16 @@
672 738 }
673 739
674 740 foreach ( $el_breakpoints as $el_breakpoint => $value ) {
675 741 $breakpoint_value = ! empty( $value['value'] ) ? $value['value'] : $value['default_value'];
676 - $dynamic_bullets = false;
742 + $dynamic_bullets = $has_dynamic_dots;
677 743 $slides_per_view = $d_col;
678 744 $slides_per_group = $meta['d_group'];
679 745
680 746 switch ( $el_breakpoint ) {
681 747 case 'widescreen':
682 - $slides_per_view = $w_col;
683 - $slides_per_group = $w_group;
748 + $slides_per_view = $w_col;
749 + $slides_per_group = $w_group;
684 750
685 751 break;
686 752
687 753 case 'laptop':
@@ -690,10 +756,10 @@
690 756
691 757 break;
692 758
693 759 case 'tablet_extra':
694 - $slides_per_view = $l_col;
695 - $slides_per_group = $l_group;
760 + $slides_per_view = $l_col;
761 + $slides_per_group = $l_group;
696 762
697 763 if ( empty( $el_breakpoints['laptop'] ) ) {
698 764 $slides_per_view = $d_col;
699 765 $slides_per_group = $meta['d_group'];
@@ -718,11 +784,11 @@
718 784
719 785 break;
720 786
721 787 case 'mobile_extra':
722 - $slides_per_view = $t_col;
723 - $slides_per_group = $meta['t_group'];
724 - $dynamic_bullets = true;
788 + $slides_per_view = $t_col;
789 + $slides_per_group = $meta['t_group'];
790 + $dynamic_bullets = $has_dynamic_dots;
725 791
726 792 break;
727 793
728 794 case 'mobile':
@@ -727,9 +793,9 @@
727 793
728 794 case 'mobile':
729 795 $slides_per_view = $t_col;
730 796 $slides_per_group = $meta['t_group'];
731 - $dynamic_bullets = true;
797 + $dynamic_bullets = $has_dynamic_dots;
732 798
733 799 if ( ! empty( $el_breakpoints['mobile_extra'] ) ) {
734 800 $slides_per_view = $me_col;
735 801 $slides_per_group = $me_group;
@@ -755,9 +821,9 @@
755 821 0 => [
756 822 'slidesPerView' => absint( $m_col ),
757 823 'slidesPerGroup' => absint( $meta['m_group'] ),
758 824 'pagination' => [
759 - 'dynamicBullets' => true,
825 + 'dynamicBullets' => $has_dynamic_dots,
760 826 ],
761 827 ],
762 828 768 => [
763 829 'slidesPerView' => absint( $t_col ),
@@ -762,9 +828,9 @@
762 828 768 => [
763 829 'slidesPerView' => absint( $t_col ),
764 830 'slidesPerGroup' => absint( $meta['t_group'] ),
765 831 'pagination' => [
766 - 'dynamicBullets' => false,
832 + 'dynamicBullets' => $has_dynamic_dots,
767 833 ],
768 834 ],
769 835 1025 => [
770 836 'slidesPerView' => absint( $d_col ),
@@ -769,9 +835,9 @@
769 835 1025 => [
770 836 'slidesPerView' => absint( $d_col ),
771 837 'slidesPerGroup' => absint( $meta['d_group'] ),
772 838 'pagination' => [
773 - 'dynamicBullets' => false,
839 + 'dynamicBullets' => $has_dynamic_dots,
774 840 ],
775 841 ],
776 842 ];
777 843 }
@@ -786,8 +852,11 @@
786 852 'lazy' => $meta['lazy_load'],
787 853 'breakpoints' => $breakpoints,
788 854 ];
789 855
856 + if ( ! empty( $meta['raw_settings']['slider_slide_animation'] ) ) {
857 + $slider_options['watchSlidesProgress'] = true;
858 + }
790 859 if ( $meta['auto_play'] ) {
791 860 $slider_options['autoplay'] = [
792 861 'delay' => absint( $meta['auto_play_timeout'] ),
793 862 'pauseOnMouseEnter' => $meta['stop_on_hover'],