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