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