PluginProbe
ShopBuilder – WooCommerce Builder For Elementor / 3.1.3
ShopBuilder – WooCommerce Builder For Elementor v3.1.3
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/Controllers/BuilderController.php +102 -53 2.1.23.1.3 View file →
@@ -8,15 +8,15 @@
8 8 namespace RadiusTheme\SB\Controllers;
9 9
10 10 use RadiusTheme\SB\Helpers\Fns;
11 11 use RadiusTheme\SB\Helpers\BuilderFns;
12 +use RadiusTheme\SB\Models\GeneralList;
13 +use RadiusTheme\SB\Models\ElementList;
12 14 use RadiusTheme\SB\Traits\SingletonTrait;
13 15 use RadiusTheme\SB\Controllers\Builder\BuilderCpt;
14 16 use RadiusTheme\SB\Controllers\Hooks\BuilderHooks;
15 17 use RadiusTheme\SB\Elementor\Controls\ImageSelectorControl;
16 18 use RadiusTheme\SB\Elementor\Controls\Select2AjaxControl;
17 -use RadiusTheme\SB\Models\ElementList;
18 -use RadiusTheme\SBPRO\Helpers\FnsPro;
19 19
20 20 // Do not allow directly accessing this file.
21 21 if ( ! defined( 'ABSPATH' ) ) {
22 22 exit( 'This script cannot be accessed directly.' );
@@ -61,22 +61,19 @@
61 61 BuilderHooks::instance();
62 62 }
63 63
64 64 BuilderCpt::instance();
65 -
66 - $this->elementor_init();
67 - $this->both_builder_frontend();
68 -
69 - // add_action( 'elementor/init', [ $this, 'elementor_init' ] );
70 - add_action( 'elementor/editor/before_enqueue_scripts', [ $this, 'editor_scripts' ] );
71 - // add_action( 'template_redirect', [ $this, 'both_builder_frontend' ], 99 );
72 -
65 + if ( defined( 'ELEMENTOR_VERSION' ) ) {
66 + $this->elementor_init();
67 + $this->both_builder_frontend();
68 + add_action( 'elementor/editor/before_enqueue_scripts', [ $this, 'editor_scripts' ] );
69 + }
73 70 // RT Select2 Ajax.
74 - add_action( 'wp_ajax_rt_select2_object_search', [ $this, 'select2_ajax_posts_filter_autocomplete' ] );
75 - add_action( 'wp_ajax_nopriv_rt_select2_object_search', [ $this, 'select2_ajax_posts_filter_autocomplete' ] );
71 + add_action( 'wp_ajax_rtsb_select2_object_search', [ $this, 'select2_ajax_posts_filter_autocomplete' ] );
72 + add_action( 'wp_ajax_nopriv_rtsb_select2_object_search', [ $this, 'select2_ajax_posts_filter_autocomplete' ] );
76 73 // Select2 ajax save data.
77 - add_action( 'wp_ajax_rt_select2_get_title', [ $this, 'select2_ajax_get_posts_value_titles' ] );
78 - add_action( 'wp_ajax_nopriv_rt_select2_get_title', [ $this, 'select2_ajax_get_posts_value_titles' ] );
74 + add_action( 'wp_ajax_rtsb_select2_get_title', [ $this, 'select2_ajax_get_posts_value_titles' ] );
75 + add_action( 'wp_ajax_nopriv_rtsb_select2_get_title', [ $this, 'select2_ajax_get_posts_value_titles' ] );
79 76 }
80 77
81 78 /**
82 79 * Apply for frontend.
@@ -93,13 +90,20 @@
93 90 *
94 91 * @return void
95 92 */
96 93 public function elementor_init() {
97 - add_action( 'elementor/elements/categories_registered', [ $this, 'add_elementor_widget_categories' ] );
98 - add_action( 'elementor/widgets/register', [ $this, 'init_widgets' ] );
99 - add_action( 'elementor/controls/register', [ $this, 'init_controls' ] );
100 - add_filter( 'elementor/editor/localize_settings', [ $this, 'promotePremiumWidgets' ] );
101 - add_action( 'elementor/icons_manager/additional_tabs', [ $this, 'rtsb_icons' ] );
94 + add_action(
95 + 'init',
96 + function () {
97 + if ( Fns::should_load_elementor_scripts() ) {
98 + add_action( 'elementor/elements/categories_registered', [ $this, 'add_elementor_widget_categories' ] );
99 + add_action( 'elementor/widgets/register', [ $this, 'init_widgets' ] );
100 + add_action( 'elementor/controls/register', [ $this, 'init_controls' ] );
101 + add_filter( 'elementor/editor/localize_settings', [ $this, 'promotePremiumWidgets' ] );
102 + add_action( 'elementor/icons_manager/additional_tabs', [ $this, 'rtsb_icons' ] );
103 + }
104 + }
105 + );
102 106 }
103 107
104 108 /**
105 109 * Register Category
@@ -108,21 +112,29 @@
108 112 *
109 113 * @return void
110 114 */
111 115 public function add_elementor_widget_categories( $elements_manager ) {
112 - $type = BuilderFns::builder_type( get_the_ID() );
113 - $builder_type = ! empty( BuilderFns::builder_page_types()[ $type ] ) ? BuilderFns::builder_page_types()[ $type ] : '';
114 - $builder_type = str_replace( 'My Account - ', '', $builder_type );
115 - $categories['rtsb-shopbuilder'] = [
116 - 'title' => esc_html__( 'ShopBuilder', 'shopbuilder' ) . ' - ' . ucfirst( $builder_type ),
117 - 'icon' => 'fa fa-plug',
118 - ];
119 - $categories['rtsb-shopbuilder-general'] = [
120 - 'title' => esc_html__( 'Shopbuilder - General', 'shopbuilder' ),
121 - 'icon' => 'fa fa-plug',
122 - ];
116 + $categories = [];
117 + $builder_id = get_queried_object_id();
118 + $id = Fns::wpml_object_id( $builder_id, BuilderFns::$post_type_tb, 'default' );
119 + $type = BuilderFns::builder_type( $id );
123 120
124 - $categories = apply_filters( 'rtsb_elementor_widgets_category_lists', $categories );
121 + if ( $type ) {
122 + $builder_type = ! empty( BuilderFns::builder_page_types()[ $type ] ) ? BuilderFns::builder_page_types()[ $type ] : '';
123 + $builder_type = str_replace( [ 'My Account - ', 'Endpoint: ' ], '', $builder_type );
124 + $categories['rtsb-shopbuilder'] = [
125 + 'title' => esc_html__( 'ShopBuilder', 'shopbuilder' ) . ' - ' . ucfirst( $builder_type ),
126 + 'icon' => 'fa fa-plug',
127 + ];
128 + }
129 + if ( 'quick-view' !== $type ) {
130 + $categories['rtsb-shopbuilder-general'] = [
131 + 'title' => esc_html__( 'Shopbuilder - General', 'shopbuilder' ),
132 + 'icon' => 'fa fa-plug',
133 + ];
134 + }
135 + $categories = apply_filters( 'rtsb_elementor_widgets_category_lists', $categories );
136 +
125 137 $other_categories = $elements_manager->get_categories();
126 138 $categories = array_merge(
127 139 array_slice( $other_categories, 0, 1 ),
128 140 $categories,
@@ -128,10 +140,10 @@
128 140 $categories,
129 141 array_slice( $other_categories, 1 )
130 142 );
131 143
132 - $set_categories = function ( $categories ) {
133 - $this->categories = $categories;
144 + $set_categories = function ( $categories ) use ( $elements_manager ) {
145 + $elements_manager->categories = $categories;
134 146 };
135 147
136 148 $set_categories->call( $elements_manager, $categories );
137 149 }
@@ -152,10 +164,14 @@
152 164
153 165 /**
154 166 * Init Widgets
155 167 *
156 - * Include widgets files and register them
168 + * Include widget files and register them
157 169 *
170 + * @param object $widgets_manager Widgets Manager.
171 + *
172 + * @return void
173 + *
158 174 * @since 1.0.0
159 175 */
160 176 public function init_widgets( $widgets_manager ) {
161 177
@@ -223,9 +239,9 @@
223 239 *
224 240 * @return array
225 241 */
226 242 public function rtsb_icons( $tabs = [] ) {
227 - $custom_icons = $this->get_icons();
243 + $custom_icons = Fns::get_custom_icon_names();
228 244
229 245 $tabs['shopbuilder-icons'] = [
230 246 'name' => 'rtsb-fonts',
231 247 'label' => esc_html__( 'ShopBuilder Icons', 'shopbuilder' ),
@@ -282,9 +298,9 @@
282 298 *
283 299 * @since 2.0.0
284 300 */
285 301 if ( did_action( 'elementor/loaded' ) && 'elementor' === $this->page_edit_with ) {
286 - do_action( 'elementor/page_templates/header-footer/before_content' );
302 + do_action( 'elementor/page_templates/header-footer/before_content' ); // phpcs:ignore WordPress.NamingConventions.ValidHookName.UseUnderscores
287 303 }
288 304
289 305 $parent_class = apply_filters( 'rtsb/builder/content/parent_class', [] );
290 306
@@ -290,8 +306,18 @@
290 306
291 307 if ( BuilderFns::is_product() ) {
292 308 $product_id = Fns::get_prepared_product_id();
293 309 $parent_class = wc_get_product_class( $parent_class, $product_id );
310 + if ( function_exists( 'rtwpvs' ) ) {
311 + $_product = Fns::get_product();
312 + if ( $_product->is_type( 'variable' ) ) {
313 + $parent_class[] = 'rtwpvs-product';
314 + $beside_label = function_exists( 'rtwpvsp' ) && rtwpvs()->get_option( 'attribute_on_click_behavior' );
315 + if ( $beside_label ) {
316 + $parent_class[] = 'rtwpvs-selected-term-beside-label';
317 + }
318 + }
319 + }
294 320 }
295 321
296 322 if ( BuilderFns::is_shop() ) {
297 323 $parent_class[] = 'shop';
@@ -313,9 +339,12 @@
313 339 if ( ! apply_filters( 'rtsb/multi/step/checkout/widget', true ) ) {
314 340 return;
315 341 }
316 342 ?>
317 - <form name="checkout" method="post" class="rtsb-woocommerce-checkout checkout" action="<?php echo esc_url( wc_get_checkout_url() ); ?>" enctype="multipart/form-data">
343 + <!--
344 + woocommerce-checkout added for fix issue with payment method ( Revolut Pay )
345 + -->
346 + <form name="checkout" method="post" class="rtsb-woocommerce-checkout woocommerce-checkout checkout" action="<?php echo esc_url( wc_get_checkout_url() ); ?>" enctype="multipart/form-data">
318 347 <?php
319 348 }
320 349 }
321 350
@@ -332,9 +361,9 @@
332 361 *
333 362 * @since 2.0.0
334 363 */
335 364 if ( did_action( 'elementor/loaded' ) && 'elementor' === $this->page_edit_with ) {
336 - do_action( 'elementor/page_templates/header-footer/after_content' );
365 + do_action( 'elementor/page_templates/header-footer/after_content' ); // phpcs:ignore WordPress.NamingConventions.ValidHookName.UseUnderscores
337 366 }
338 367
339 368 if ( BuilderFns::is_checkout() ) {
340 369 if ( ! apply_filters( 'rtsb/multi/step/checkout/widget', true ) ) {
@@ -355,24 +384,28 @@
355 384 *
356 385 * @return void
357 386 */
358 387 public function select2_ajax_posts_filter_autocomplete() {
359 -
388 + if ( ! wp_verify_nonce( Fns::get_nonce(), rtsb()->nonceText ) ) {
389 + wp_send_json_error( [] );
390 + }
360 391 $query_per_page = 15;
361 392 $post_type = 'post';
362 393 $source_name = 'post_type';
363 - $paged = $_POST['page'] ?? 1;
364 -
394 + $paged = absint( $_POST['page'] ?? 1 );
365 395 if ( ! empty( $_POST['post_type'] ) ) {
396 + // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.MissingUnslash
366 397 $post_type = sanitize_text_field( $_POST['post_type'] );
367 398 }
368 399
369 400 if ( ! empty( $_POST['source_name'] ) ) {
401 + // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.MissingUnslash
370 402 $source_name = sanitize_text_field( $_POST['source_name'] );
371 403 }
372 404
405 + // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.MissingUnslash
373 406 $search = ! empty( $_POST['search'] ) ? sanitize_text_field( $_POST['search'] ) : '';
374 - $results = $post_list = [];
407 + $results = $post_list = []; // phpcs:ignore Squiz.PHP.DisallowMultipleAssignments.Found
375 408 switch ( $source_name ) {
376 409 case 'taxonomy':
377 410 $args = [
378 411 'hide_empty' => false,
@@ -381,9 +414,9 @@
381 414 'search' => $search,
382 415 'number' => '5',
383 416 ];
384 417
385 - if ( $post_type !== 'all' ) {
418 + if ( 'all' !== $post_type ) {
386 419 $args['taxonomy'] = $post_type;
387 420 }
388 421
389 422 $post_list = wp_list_pluck( get_terms( $args ), 'name', 'term_id' );
@@ -430,17 +463,22 @@
430 463 * @return void
431 464 */
432 465 public function select2_ajax_get_posts_value_titles() {
433 466
467 + if ( ! wp_verify_nonce( Fns::get_nonce(), rtsb()->nonceText ) ) {
468 + wp_send_json_error( [] );
469 + }
470 +
434 471 if ( empty( $_POST['id'] ) ) {
435 472 wp_send_json_error( [] );
436 473 }
437 474
475 + // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.MissingUnslash, WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
438 476 if ( empty( array_filter( $_POST['id'] ) ) ) {
439 477 wp_send_json_error( [] );
440 478 }
441 479 $ids = array_map( 'intval', $_POST['id'] );
442 - $source_name = ! empty( $_POST['source_name'] ) ? sanitize_text_field( $_POST['source_name'] ) : '';
480 + $source_name = ! empty( $_POST['source_name'] ) ? sanitize_text_field( $_POST['source_name'] ) : ''; // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.MissingUnslash
443 481
444 482 switch ( $source_name ) {
445 483 case 'taxonomy':
446 484 $args = [
@@ -449,9 +487,11 @@
449 487 'order' => 'ASC',
450 488 'include' => implode( ',', $ids ),
451 489 ];
452 490
453 - if ( $_POST['post_type'] !== 'all' ) {
491 + // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotValidated
492 + if ( 'all' !== $_POST['post_type'] ) {
493 + // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotValidated, WordPress.Security.ValidatedSanitizedInput.MissingUnslash
454 494 $args['taxonomy'] = sanitize_text_field( $_POST['post_type'] );
455 495 }
456 496
457 497 $response = wp_list_pluck( get_terms( $args ), 'name', 'term_id' );
@@ -469,9 +509,9 @@
469 509 break;
470 510 default:
471 511 $post_info = get_posts(
472 512 [
473 - 'post_type' => sanitize_text_field( $_POST['post_type'] ),
513 + 'post_type' => sanitize_text_field( $_POST['post_type'] ), // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.MissingUnslash, WordPress.Security.ValidatedSanitizedInput.InputNotValidated
474 514 'include' => implode( ',', $ids ),
475 515 ]
476 516 );
477 517 $response = wp_list_pluck( $post_info, 'post_title', 'ID' );
@@ -487,12 +527,12 @@
487 527
488 528 /**
489 529 * Ajax callback for rt-select2
490 530 *
491 - * @param $post_type
492 - * @param $limit
493 - * @param $search
494 - * @param $paged
531 + * @param string $post_type Post type.
532 + * @param int $limit Limit.
533 + * @param string $search Search.
534 + * @param int $paged Paged.
495 535 *
496 536 * @return array
497 537 */
498 538 public function get_query_data( $post_type = 'any', $limit = 10, $search = '', $paged = 1 ) {
@@ -529,10 +569,19 @@
529 569 if ( ! empty( $search ) ) {
530 570 $where .= $wpdb->prepare( " AND {$wpdb->posts}.post_title LIKE %s", '%' . esc_sql( $search ) . '%' );
531 571 }
532 572
573 + // Add a query for shop_coupon post-type to check 'show on frontend' meta.
574 + if ( 'shop_coupon' === $post_type ) {
575 + $where .= " AND {$wpdb->posts}.ID IN (
576 + SELECT post_id FROM {$wpdb->postmeta}
577 + WHERE meta_key = 'rtsb_show_on_frontend'
578 + AND meta_value = 'on'
579 + )";
580 + }
581 +
533 582 $query = "select post_title,ID from $wpdb->posts where post_status = 'publish' {$where} {$limit}";
534 - $results = $wpdb->get_results( $query );
583 + $results = $wpdb->get_results( $query ); // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.PreparedSQL.NotPrepared, WordPress.DB.DirectDatabaseQuery.NoCaching
535 584
536 585 if ( ! empty( $results ) ) {
537 586 foreach ( $results as $row ) {
538 587 $data[ $row->ID ] = $row->post_title . ' [#' . $row->ID . ']';
@@ -563,10 +612,10 @@
563 612
564 613 $pro_widgets = [
565 614 [
566 615 'name' => 'rtsb-ajax-product-filters',
567 - 'title' => esc_html__( 'Ajax Product Filters', 'testimonial-slider-showcase' ),
568 - 'description' => esc_html__( 'Ajax Product Filters', 'testimonial-slider-showcase' ),
616 + 'title' => esc_html__( 'Ajax Product Filters', 'shopbuilder' ),
617 + 'description' => esc_html__( 'Ajax Product Filters', 'shopbuilder' ),
569 618 'icon' => 'rtsb-el-custom rtsb-element icon-rtsb-ajax-product-filters rtsb-promotional-element',
570 619 'categories' => '[ "rtsb-shopbuilder" ]',
571 620 ],
572 621 ];