PluginProbe
ShopBuilder – WooCommerce Builder For Elementor / 3.4.2
ShopBuilder – WooCommerce Builder For Elementor v3.4.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
← All changes | app/ShopBuilder.php +182 -147 2.1.23.4.2 View file →
@@ -4,14 +4,21 @@
4 4 *
5 5 * @package RadiusTheme\SB
6 6 */
7 7
8 +namespace RadiusTheme\SB;
8 9
10 +use RadiusTheme\SB\AI\AIinit;
11 +use RadiusTheme\SB\Helpers\Cache;
12 +use RadiusTheme\SB\Helpers\Migration;
9 13 use RadiusTheme\SB\Helpers\Installation;
10 14 use RadiusTheme\SB\Modules\ModuleManager;
11 15 use RadiusTheme\SB\Traits\SingletonTrait;
16 +use RadiusTheme\SB\Controllers\Shortcodes;
12 17 use RadiusTheme\SB\Controllers\Dependencies;
18 +use RadiusTheme\SB\Controllers\CacheController;
13 19 use RadiusTheme\SB\Controllers\Admin\AdminInit;
20 +use RadiusTheme\SB\Controllers\Admin\PluginRow;
14 21 use RadiusTheme\SB\Controllers\AssetsController;
15 22 use RadiusTheme\SB\Controllers\BuilderController;
16 23 use RadiusTheme\SB\Controllers\SupportController;
17 24 use RadiusTheme\SB\Controllers\Hooks\FilterHooks;
@@ -17,9 +24,10 @@
17 24 use RadiusTheme\SB\Controllers\Hooks\FilterHooks;
18 25 use RadiusTheme\SB\Controllers\Hooks\ActionHooks;
19 26 use RadiusTheme\SB\Controllers\Frontend\Ajax\AddToCart;
20 27 use RadiusTheme\SB\Controllers\Frontend\Ajax\AjaxLogin;
21 -use RadiusTheme\SB\Helpers\Migration;
28 +use RadiusTheme\SB\Controllers\Frontend\OrderReviewQuantity;
29 +use RadiusTheme\SB\Controllers\Frontend\Ajax\UpdateCheckoutSection;
22 30
23 31 // Do not allow directly accessing this file.
24 32 if ( ! defined( 'ABSPATH' ) ) {
25 33 exit( 'This script cannot be accessed directly.' );
@@ -24,152 +32,152 @@
24 32 if ( ! defined( 'ABSPATH' ) ) {
25 33 exit( 'This script cannot be accessed directly.' );
26 34 }
27 35
28 -require_once RTSB_PATH . 'vendor/autoload.php';
36 +/**
37 + * Main initialization class.
38 + */
39 +final class ShopBuilder {
29 40
30 -if ( ! class_exists( ShopBuilder::class ) ) {
31 41 /**
32 - * Main initialization class.
42 + * Nonce id
43 + *
44 + * @var string
33 45 */
34 - final class ShopBuilder {
46 + public $nonceId = '__rtsb_wpnonce';
35 47
36 - /**
37 - * Nonce id
38 - *
39 - * @var string
40 - */
41 - public $nonceId = '__rtsb_wpnonce';
48 + /**
49 + * Nonce Text
50 + *
51 + * @var string
52 + */
53 + public $nonceText = 'rtsb_nonce';
42 54
43 - /**
44 - * Nonce Text
45 - *
46 - * @var string
47 - */
48 - public $nonceText = 'rtsb_nonce';
55 + /**
56 + * Post Type.
57 + *
58 + * @var string
59 + */
60 + public $post_type;
49 61
50 - /**
51 - * Post Type.
52 - *
53 - * @var string
54 - */
55 - public $post_type;
62 + /**
63 + * Post Type.
64 + *
65 + * @var string
66 + */
67 + public $current_theme;
68 + /**
69 + * Singleton
70 + */
56 71
57 - /**
58 - * Post Type.
59 - *
60 - * @var string
61 - */
62 - public $current_theme;
63 - /**
64 - * Singleton
65 - */
72 + /**
73 + * URL for fetch API
74 + *
75 + * @var string
76 + */
77 + public $BASE_API = 'https://shopbuilderwp.com/demo/wp-json/rtsb/v1/layouts/';
66 78
67 - /**
68 - * URL for fetch API
69 - * @var string
70 - */
71 - public $BASE_API = 'https://shopbuilderwp.com/wp-json/rtsb/v1/layouts/';
79 + use SingletonTrait;
72 80
73 - use SingletonTrait;
81 + /**
82 + * Class Constructor
83 + */
84 + private function __construct() {
85 + $this->post_type = 'product';
86 + $this->current_theme = wp_get_theme()->get( 'Template' ) ? wp_get_theme()->get( 'Template' ) : ( wp_get_theme()->get( 'TextDomain' ) ? wp_get_theme()->get( 'TextDomain' ) : strtolower( str_replace( ' ', '', wp_get_theme()->get( 'Name' ) ) ) );
87 + add_action( 'plugins_loaded', [ $this, 'init' ], 15 );
88 + add_action( 'upgrader_process_complete', [ $this, 'maybe_run_after_update' ], 10, 2 );
74 89
75 - /**
76 - * Class Constructor
77 - */
78 - private function __construct() {
79 - $this->define_constants();
80 - $this->post_type = 'product';
81 - $this->current_theme = wp_get_theme()->get( 'Template' ) ? wp_get_theme()->get( 'Template' ) : wp_get_theme()->get( 'TextDomain' );
82 - add_action( 'init', [ $this, 'language' ] );
83 - add_action( 'plugins_loaded', [ $this, 'init' ], 15 );
90 + // Runs before anything reads or writes the object cache: Installation is
91 + // on init:5 and ModuleManager on init:15. Registered here rather than in
92 + // init() so version tracking stays accurate even while a dependency is
93 + // missing and the rest of the plugin is dormant.
94 + add_action( 'init', [ Cache::class, 'maybe_rotate_group' ], 1 );
84 95
85 - // Register Plugin Active Hook.
86 - register_activation_hook( RTSB_FILE, [ Installation::class, 'activate' ] );
96 + // Register Plugin Active Hook.
97 + register_activation_hook( RTSB_FILE, [ Installation::class, 'activate' ] );
87 98
88 - // Register Plugin Deactivate Hook.
89 - register_deactivation_hook( RTSB_FILE, [ Installation::class, 'deactivation' ] );
99 + // Register Plugin Deactivate Hook.
100 + register_deactivation_hook( RTSB_FILE, [ Installation::class, 'deactivation' ] );
90 101
102 + if ( Dependencies::instance()->check() ) {
91 103 SupportController::instance();
92 -
93 - // HPOS Declare compatibility
94 - add_action(
95 - 'before_woocommerce_init',
96 - function() {
97 - if ( class_exists( \Automattic\WooCommerce\Utilities\FeaturesUtil::class ) ) {
98 - \Automattic\WooCommerce\Utilities\FeaturesUtil::declare_compatibility( 'custom_order_tables', RTSB_FILE, true );
99 - }
104 + }
105 + // HPOS Declare compatibility.
106 + add_action(
107 + 'before_woocommerce_init',
108 + function () {
109 + if ( class_exists( \Automattic\WooCommerce\Utilities\FeaturesUtil::class ) ) {
110 + \Automattic\WooCommerce\Utilities\FeaturesUtil::declare_compatibility( 'custom_order_tables', RTSB_FILE, true );
100 111 }
101 - );
102 -
103 - }
104 -
105 - /**
106 - * Constants
107 - *
108 - * @return void
109 - */
110 - private function define_constants() {
111 - if ( ! defined( 'RTSB_ABSPATH' ) ) {
112 - define( 'RTSB_ABSPATH', dirname( RTSB_FILE ) . '/' );
113 112 }
113 + );
114 + }
114 115
115 - if ( ! defined( 'RTSB_URL' ) ) {
116 - define( 'RTSB_URL', plugins_url( '', RTSB_FILE ) );
117 - }
116 + /**
117 + * Assets url generate with given assets file
118 + *
119 + * @param string $file File.
120 + *
121 + * @return string
122 + */
123 + public function get_assets_uri( $file ) {
124 + $file = ltrim( $file, '/' );
118 125
119 - }
126 + return trailingslashit( RTSB_URL . '/assets' ) . $file;
127 + }
120 128
129 + /**
130 + * Assets path.
131 + *
132 + * @param string $file File.
133 + *
134 + * @return string
135 + */
136 + public function get_assets_path( $file ) {
137 + $file = ltrim( $file, '/' );
121 138
122 - /**
123 - * Assets url generate with given assets file
124 - *
125 - * @param string $file File.
126 - *
127 - * @return string
128 - */
129 - public function get_assets_uri( $file ) {
130 - $file = ltrim( $file, '/' );
139 + return trailingslashit( RTSB_PATH . 'assets' ) . $file;
140 + }
131 141
132 - return trailingslashit( RTSB_URL . '/assets' ) . $file;
133 - }
142 + /**
143 + * Get the template path.
144 + *
145 + * @return string
146 + */
147 + public function get_template_path() {
148 + return apply_filters( 'rtsb/template/path', 'shopbuilder/' );
149 + }
134 150
135 - /**
136 - * Get the template path.
137 - *
138 - * @return string
139 - */
140 - public function get_template_path() {
141 - return apply_filters( 'rtsb/template/path', 'shopbuilder/' );
142 - }
151 + /**
152 + * Get the plugin path.
153 + *
154 + * @return string
155 + */
156 + public function plugin_path() {
157 + return untrailingslashit( plugin_dir_path( RTSB_FILE ) );
158 + }
143 159
144 - /**
145 - * Get the plugin path.
146 - *
147 - * @return string
148 - */
149 - public function plugin_path() {
150 - return untrailingslashit( plugin_dir_path( RTSB_FILE ) );
160 + /**
161 + * Init
162 + *
163 + * @return void
164 + */
165 + public function init() {
166 + // Plugin row links (Settings/Demo/Documentation/Get Pro) must register
167 + // regardless of dependency state so users can always reach Settings or
168 + // docs even when WooCommerce/Elementor is inactive.
169 + if ( is_admin() ) {
170 + PluginRow::instance();
151 171 }
152 172
153 - /**
154 - * Load Text Domain
155 - */
156 - public function language() {
157 - load_plugin_textdomain( 'shopbuilder', false, dirname( plugin_basename( RTSB_FILE ) ) . '/languages/' );
173 + if ( ! Dependencies::instance()->check() ) {
174 + return;
158 175 }
159 176
160 - /**
161 - * Init
162 - *
163 - * @return void
164 - */
165 - public function init() {
166 - if ( ! Dependencies::instance()->check() ) {
167 - return;
168 - }
169 -
177 + try {
170 178 do_action( 'rtsb/before/loaded' );
171 -
179 + CacheController::instance();
172 180 // Include File.
173 181 AssetsController::instance();
174 182 ModuleManager::instance();
175 183
@@ -175,9 +183,13 @@
175 183
176 184 // Ajax.
177 185 AddToCart::instance();
178 186 AjaxLogin::instance();
187 + UpdateCheckoutSection::instance();
179 188
189 + // Checkout.
190 + OrderReviewQuantity::instance();
191 +
180 192 BuilderController::instance();
181 193 FilterHooks::init_hooks();
182 194 ActionHooks::init_hooks();
183 195
@@ -182,54 +194,77 @@
182 194 ActionHooks::init_hooks();
183 195
184 196 Installation::init();
185 197 Migration::init();
198 + AIinit::instance();
186 199
187 200 if ( is_admin() ) {
188 201 AdminInit::instance();
189 202 }
190 203
204 + Shortcodes::instance();
205 +
191 206 do_action( 'rtsb/after/loaded' );
207 + } catch ( \Throwable $e ) {
208 + error_log( 'ShopBuilder init error: ' . $e->getMessage() ); // phpcs:ignore WordPress.PHP.DevelopmentFunctions.error_log_error_log
192 209 }
193 -
194 - /**
195 - * Checks if Pro version installed
196 - *
197 - * @return boolean
198 - */
199 - public function has_pro() {
200 - return function_exists( 'rtsbpro' );
201 - }
202 -
203 - /**
204 - * PRO Version URL.
205 - *
206 - * @return string
207 - */
208 - public function pro_version_link() {
209 - return 'https://shopbuilderwp.com/';
210 - }
211 210 }
212 211
213 212 /**
214 - * @return ShopBuilder
213 + * Maybe Run After Update
214 + *
215 + * @param object $upgrader_object Upgrader Object.
216 + * @param array $options Options.
217 + *
218 + * @return void
215 219 */
216 - function rtsb() {
217 - static $cached_instance;
220 + public function maybe_run_after_update( $upgrader_object, $options ) {
221 + if ( 'plugin' !== $options['type'] || ! in_array( $options['action'], [ 'install', 'update' ], true ) ) {
222 + return;
223 + }
218 224
219 - if (null !== $cached_instance) {
220 - return $cached_instance;
225 + $basename = plugin_basename( RTSB_FILE );
226 + $slug = dirname( $basename );
227 +
228 + // Bulk update flow: WordPress passes every plugin in the batch.
229 + if ( ! empty( $options['plugins'] ) ) {
230 + if ( in_array( $basename, (array) $options['plugins'], true ) ) {
231 + Cache::clear_all_cache();
232 + }
233 + return;
221 234 }
222 235
223 - $cached_instance = wp_cache_get('shopbuilder_instance', 'shopbuilder_cache');
236 + // Single update flow: WordPress passes the basename under `plugin`.
237 + if ( ! empty( $options['plugin'] ) ) {
238 + if ( $basename === $options['plugin'] ) {
239 + Cache::clear_all_cache();
240 + }
241 + return;
242 + }
224 243
225 - if (false === $cached_instance) {
226 - $cached_instance = ShopBuilder::instance();
227 - wp_cache_set('shopbuilder_instance', $cached_instance, 'shopbuilder_cache');
244 + // Upload-based installation: only the destination folder name is known.
245 + if (
246 + ! empty( $upgrader_object->result['destination_name'] ) &&
247 + $slug === $upgrader_object->result['destination_name']
248 + ) {
249 + Cache::clear_all_cache();
228 250 }
251 + }
229 252
230 - return $cached_instance;
253 + /**
254 + * Checks if Pro version installed.
255 + *
256 + * @return boolean
257 + */
258 + public function has_pro() {
259 + return function_exists( 'rtsbpro' ); // Fns::is_pro_authorized() will add in the future for checking pro Version Compatibility.
231 260 }
232 261
233 -
234 - rtsb();
262 + /**
263 + * PRO Version URL.
264 + *
265 + * @return string
266 + */
267 + public function pro_version_link() {
268 + return 'https://shopbuilderwp.com/';
269 + }
235 270 }