PluginProbe
ShopEngine Elementor WooCommerce Builder Addon – All in One WooCommerce Solution with eCommerce Templates & Woo Widgets / 4.7.4
ShopEngine Elementor WooCommerce Builder Addon – All in One WooCommerce Solution with eCommerce Templates & Woo Widgets v4.7.4
4.9.5 4.9.4 4.9.3 4.9.2 4.9.1 4.9.0 2.0.0 2.1.0 2.2.0 2.2.1 2.2.2 2.3.0 2.4.0 2.5.0 2.5.1 3.0.0 3.1.0 3.1.1 4.0.0 4.0.1 4.1.0 4.1.1 4.2.0 4.2.1 4.3.0 All 85 releases
← All changes | plugin.php +241 -85 2.0.04.7.4 View file →
@@ -1,18 +1,22 @@
1 1 <?php
2 2
3 3 namespace ShopEngine;
4 4
5 +defined('ABSPATH') || exit;
6 +
5 7 use ShopEngine\Compatibility\Conflicts\Manifest as Conflict_Manifest;
6 8 use ShopEngine\Core\Builders\Base;
9 +use ShopEngine\Compatibility\Migrations\LangMigration;
7 10 use ShopEngine\Core\Query_Modifier;
11 +use ShopEngine\Core\Wc_Customizer\Register_Settings;
8 12 use ShopEngine\Core\Template_Cpt;
9 13 use ShopEngine\Libs\License\License_Route;
14 +use ShopEngine\Libs\Rating\Rating;
10 15 use ShopEngine\Libs\Updater\Init as Updater;
11 16 use ShopEngine\Modules\Manifest as Module_Manifest;
12 17 use ShopEngine\Widgets\Manifest;
13 18
14 -defined('ABSPATH') || exit;
15 19
16 20 /**
17 21 * Plugin final Class.
18 22 * Handles dynamically loading classes only when needed. Check Elementor Plugin, Woocomerce Plugin Loaded or Install.
@@ -29,11 +33,15 @@
29 33 */
30 34 public function __construct() {
31 35 // load autoload method
32 36 Autoloader::run();
37 + add_action( 'wp_ajax_shopengine_admin_action', [\ShopEngine\Utils\Util::class, 'shopengine_admin_action'] );
33 38 }
34 39
35 -
40 + public function utils_url()
41 + {
42 + return $this->plugin_url() . 'utils/';
43 + }
36 44 /**
37 45 * Public function init.
38 46 * call function for all
39 47 *
@@ -42,8 +50,11 @@
42 50 public function init() {
43 51
44 52 $error = false;
45 53
54 + // init notice class
55 + \Oxaim\Libs\Notice::init();
56 +
46 57 // check woocommerce plugin
47 58 if(!did_action('woocommerce_loaded')) {
48 59 add_action('admin_notices', [$this, 'missing_woocommerce']);
49 60
@@ -49,30 +60,38 @@
49 60
50 61 $error = true;
51 62 }
52 63
64 + $check_elementor_version = false;
65 +
53 66 // Check if Elementor installed and activated.
54 - if(!did_action('elementor/loaded')) {
55 - add_action('admin_notices', [$this, 'missing_elementor']);
67 + if(!did_action('elementor/loaded')) {
56 68
57 - $error = true;
58 - }
69 + if(!did_action('shopengine-gutenberg-addon/before_loaded')) {
59 70
71 + add_action('admin_notices', [$this, 'missing_elementor']);
72 +
73 + $error = true;
74 + }
75 + }
76 +
60 77 // Check for required Elementor version.
61 - if(defined('ELEMENTOR_VERSION') && !version_compare(ELEMENTOR_VERSION, '3.0.0', '>=')) {
62 - add_action('admin_notices', [$this, 'failed_elementor_version']);
78 + if(did_action('elementor/loaded') && defined('ELEMENTOR_VERSION') && !version_compare(ELEMENTOR_VERSION, '3.0.0', '>=')) {
63 79
64 - $error = true;
65 - }
80 + add_action('admin_notices', [$this, 'failed_elementor_version']);
66 81
82 + $error = true;
83 + }
84 +
67 85 if($error) {
68 -
69 86 return;
70 87 }
71 -
88 +
72 89 add_filter("plugin_action_links_shopengine/shopengine.php", function ($links) {
90 + $free = esc_html__("Go To Shopengine","shopengine");
91 + $pro = esc_html__("Go To ShopenginePro","shopengine");
73 92
74 - $custom_links[] = '<a href="'.admin_url('edit.php?post_type=shopengine-template#getting-started').'" target="_blank">' . esc_html__('Settings', 'shopengine') . '</a>';
93 + $custom_links[] = '<a title="' . $free . '" href="'.admin_url('edit.php?post_type=shopengine-template#getting-started').'" target="_blank">' . esc_html__('Settings', 'shopengine') . '</a>';
75 94
76 95 foreach ($custom_links as $custom_link):
77 96 array_unshift($links, $custom_link);
78 97 endforeach;
@@ -77,14 +96,23 @@
77 96 array_unshift($links, $custom_link);
78 97 endforeach;
79 98
80 99 if (!is_plugin_active('shopengine-pro/shopengine-pro.php')) {
81 - $links[] = '<a href="https://wpmet.com/plugin/shopengine/pricing/" style="color:#FCB214;font-weight:700" target="_blank">' . esc_html__('Go Pro', 'shopengine') . '</a>';
100 + $links[] = '<a title="' . $pro . '" href="https://wpmet.com/plugin/shopengine/pricing/" style="color:#FCB214;font-weight:700" target="_blank" rel="noopener">' . esc_html__('Go Pro', 'shopengine') . '</a>';
82 101 }
83 102 return $links;
84 103 });
85 104
105 + /**
106 + * EmailKit Global Class initialization
107 + *
108 + */
109 + if( !class_exists('EmailKit') && !did_action('edit_with_emailkit_loaded') && class_exists('\Wpmet\Libs\Emailkit') && \ShopEngine\Utils\Util::get_settings( 'shopengine_user_consent_for_banner', 'true' ) == 'true' ) {
86 110
111 + new \Wpmet\Libs\Emailkit();
112 + }
113 +
114 +
87 115 /**
88 116 * Routes initialization
89 117 *
90 118 */
@@ -97,62 +125,23 @@
97 125 add_action('admin_init', function () {
98 126 if(class_exists('ShopEngine_Pro')) {
99 127 new Updater();
100 128 }
101 -
129 + new \ShopEngine\Compatibility\Migrations\Direct_Checkout;
102 130 });
103 131
104 - global $pagenow;
105 132
106 - if(is_admin() && $pagenow == 'post.php' && $_REQUEST['action'] === 'edit') {
107 -
108 - $pid = $_REQUEST['post'];
109 - $po = get_post($pid);
110 -
111 - if($po->post_type === Template_Cpt::TYPE) {
112 -
113 - $url = get_admin_url() . 'edit.php?post_type=' . Template_Cpt::TYPE . '#' . Template_Cpt::TYPE;
114 -
115 - wp_safe_redirect($url);
116 - exit;
117 - }
118 - }
119 -
120 133 add_action('wp_loaded', function () {
121 -
122 - if(isset($_REQUEST['preview']) && $_REQUEST['preview'] == 'true' && !empty($_REQUEST['preview_id'])) {
123 -
124 - $pid = (int)$_REQUEST['preview_id'];
125 -
126 - $po = get_post($pid);
127 -
128 - if($po->post_type === Template_Cpt::TYPE) {
129 -
130 - $template = \ShopEngine\Core\Builders\Templates::get_registered_template_data($pid);
131 -
132 - if(empty($template) || !isset($template['url'])) {
133 - return;
134 - }
135 -
136 - $param = [
137 - 'shopengine_template_id' => $pid,
138 - 'preview_nonce' => wp_create_nonce('template_preview_' . $pid),
139 - 'change_template' => '1',
140 - ];
141 -
142 - $url = \ShopEngine\Utils\Helper::add_to_url($template['url'], $param);
143 -
144 - wp_safe_redirect($url);
145 - exit;
146 - }
147 - }
134 + /**
135 + * migrate data
136 + */
137 + LangMigration::instance()->init();
148 138 });
149 139
150 -
151 140 // avoid themes for loading woocommerce functions
152 - $avoid_themes = ['avada'];
141 + $avoid_themes = ['avada', 'woodmart', 'Avada', 'Woodmart'];
153 142
154 - if( !in_array( strtolower(wp_get_theme()), $avoid_themes) ) {
143 + if( !in_array(get_template(), $avoid_themes) ) {
155 144 /**
156 145 * Ensuring woocommerce functions are loaded before theme is modifying those
157 146 *
158 147 */
@@ -158,14 +147,20 @@
158 147 */
159 148 require_once WC_ABSPATH . '/includes/wc-template-functions.php';
160 149 }
161 150
162 - // Load custom elementor controls
163 - new \ShopEngine\Core\Elementor_Controls\Init();
164 151
165 - //Loading the scripts and styles
152 + if(did_action('elementor/loaded')) {
153 + // Load custom elementor controls
154 + new \ShopEngine\Core\Elementor_Controls\Init();
155 +
156 + //Loading the scripts and styles
157 + add_action('elementor/editor/after_enqueue_styles', [$this, 'js_css_elementor']);
158 + }
159 +
160 +
161 + //Loading public scripts and styles
166 162 add_action('wp_enqueue_scripts', [$this, 'js_css_public']);
167 - add_action('elementor/editor/after_enqueue_styles', [$this, 'js_css_elementor']);
168 163
169 164 //woocommece theme support
170 165 if(!current_theme_supports('woocommerce')) {
171 166 add_theme_support('woocommerce');
@@ -173,14 +168,142 @@
173 168 add_theme_support('wc-product-gallery-lightbox');
174 169 add_theme_support('wc-product-gallery-slider');
175 170 }
176 171
177 -
172 +
173 + $filter_string = ''; // elementskit,metform-pro
174 + $filter_string .= ((!in_array('elementskit/elementskit.php', apply_filters('active_plugins', get_option('active_plugins')))) ? '' : ',elementskit');
175 + $filter_string .= (!class_exists('\MetForm\Plugin') ? '' : ',metform');
176 + $filter_string .= (!class_exists('\MetForm_Pro\Plugin') ? '' : ',metform-pro');
177 +
178 178 #Registering new post-type & etc
179 179 Base::instance()->init();
180 180
181 - \ShopEngine\Core\Settings\Base::instance()->init();
182 181
182 + Rating::instance('shopengine')
183 + ->set_plugin( 'ShopEngine', 'https://wpmet.com/wordpress.org/rating/shopengine' )
184 + ->set_plugin_logo( 'https://ps.w.org/shopengine/assets/icon-256x256.gif?rev=2505061', 'width:150px !important' )
185 + ->set_priority( 11 )
186 + ->set_first_appear_day( 7 )
187 + ->set_condition( true )
188 + ->call();
189 +
190 + if ( is_admin() && \ShopEngine\Utils\Util::get_settings( 'shopengine_user_consent_for_banner', 'true' ) == 'true' ) {
191 +
192 + /**
193 + * Show WPMET stories widget in dashboard
194 + */
195 +
196 + \Wpmet\Libs\Stories::instance('shopengine')
197 +
198 + ->set_filter($filter_string)
199 + ->set_plugin('ShopEngine', 'https://wpmet.com/plugin/shopengine/')
200 + ->set_api_url('https://api.wpmet.com/public/stories/')
201 + ->call();
202 +
203 + // banner
204 + \Wpmet\Libs\Banner::instance('shopengine')
205 + ->set_filter(ltrim($filter_string, ','))
206 + ->set_api_url('https://api.wpmet.com/public/jhanda')
207 + ->set_plugin_screens('edit-shopengine-template')
208 + ->set_plugin_screens('edit-shopengine-template')
209 + ->call();
210 + }
211 +
212 + $apps_img_path = \ShopEngine::plugin_url() . 'assets/images/apps-page/';
213 + /**
214 + * Show our plugins menu for others wpmet plugins
215 + */
216 + \ShopEngine\Wpmet\Libs\Plugins::instance()->init('shopengine')
217 + ->set_parent_menu_slug('shopengine-settings')
218 + ->set_submenu_name('Our Plugins')
219 + ->set_section_title('Get More out of Your WooCommerce Website!')
220 + ->set_section_description('Install other plugins from us and take your WooCommerce site to the next level for absolutely free!')
221 + ->set_items_per_row(4)
222 + ->set_plugins(
223 + [
224 + 'elementskit-lite/elementskit-lite.php' => [
225 + 'name' => esc_html__('ElementsKit', 'shopengine'),
226 + 'url' => 'https://wordpress.org/plugins/elementskit-lite/',
227 + 'icon' => $apps_img_path. 'elementskit.gif',
228 + 'desc' => esc_html__('All-in-one Elementor addon trusted by 1 Million+ users, makes your website builder process easier with ultimate freedom.', 'shopengine'),
229 + 'docs' => 'https://wpmet.com/doc/elementskit/',
230 + ],
231 + 'getgenie/getgenie.php' => [
232 + 'name' => esc_html__('GetGenie', 'shopengine'),
233 + 'url' => 'https://wordpress.org/plugins/getgenie/',
234 + 'icon' => $apps_img_path.'getgenie.gif',
235 + 'desc' => esc_html__('Your personal AI assistant for content and SEO. Write content that ranks on Google with NLP keywords and SERP analysis data.', 'shopengine'),
236 + 'docs' => 'https://getgenie.ai/docs/',
237 + ],
238 + 'gutenkit-blocks-addon/gutenkit-blocks-addon.php' => [
239 + 'name' => esc_html__('GutenKit', 'shopengine'),
240 + 'url' => 'https://wordpress.org/plugins/gutenkit-blocks-addon/',
241 + 'icon' => $apps_img_path. 'guten-kit.png',
242 + 'desc' => esc_html__('Gutenberg blocks, patterns, and templates that extend the page-building experience using the WordPress block editor.', 'shopengine'),
243 + 'docs' => 'https://wpmet.com/doc/gutenkit/',
244 + ],
245 + 'metform/metform.php' => [
246 + 'name' => esc_html__('MetForm', 'shopengine'),
247 + 'url' => 'https://wordpress.org/plugins/metform/',
248 + 'icon' => $apps_img_path. 'metform.png',
249 + 'desc' => esc_html__('Drag & drop form builder for Elementor to create contact forms, multi-step forms, and more — smoother, faster, and better!', 'shopengine'),
250 + 'docs' => 'https://wpmet.com/doc/metform/',
251 + ],
252 + 'emailkit/EmailKit.php' => [
253 + 'name' => esc_html__('EmailKit', 'shopengine'),
254 + 'url' => 'https://wordpress.org/plugins/emailkit/',
255 + 'icon' => $apps_img_path . 'emailkit.png',
256 + 'desc' => esc_html__('Advanced email customizer for WooCommerce and WordPress. Build, customize, and send emails from WordPress to boost your sales!', 'shopengine'),
257 + 'docs' => 'https://wpmet.com/doc/emailkit/',
258 + ],
259 + 'wp-social/wp-social.php' => [
260 + 'name' => esc_html__('WP Social', 'shopengine'),
261 + 'url' => 'https://wordpress.org/plugins/wp-social/',
262 + 'icon' => $apps_img_path . 'wp-social.png',
263 + 'desc' => esc_html__('Add social share, login, and engagement counter — unified solution for all social media with tons of different styles for your website.', 'shopengine'),
264 + 'docs' => 'https://wpmet.com/doc/wp-social/',
265 + ],
266 + 'wp-ultimate-review/wp-ultimate-review.php' => [
267 + 'name' => esc_html__('WP Ultimate Review', 'shopengine'),
268 + 'url' => 'https://wordpress.org/plugins/wp-ultimate-review/',
269 + 'icon' => $apps_img_path . 'ultimate-review.png',
270 + 'desc' => esc_html__('Collect and showcase reviews on your website to build brand credibility and social proof with the easiest solution.','shopengine'),
271 + 'docs' => 'https://wpmet.com/doc/wp-ultimate-review/',
272 + ],
273 + 'wp-fundraising-donation/wp-fundraising.php' => [
274 + 'name' => esc_html__('FundEngine', 'shopengine'),
275 + 'url' => 'https://wordpress.org/plugins/wp-fundraising-donation/',
276 + 'icon' => $apps_img_path . 'fundengine.png',
277 + 'desc' => esc_html__('Create fundraising, crowdfunding, and donation websites with PayPal and Stripe payment gateway integration.', 'shopengine'),
278 + 'docs' => 'https://wpmet.com/doc/fundengine/',
279 + ],
280 + 'blocks-for-shopengine/shopengine-gutenberg-addon.php' => [
281 + 'name' => esc_html__('Blocks for ShopEngine', 'shopengine'),
282 + 'url' => 'https://wordpress.org/plugins/blocks-for-shopengine/',
283 + 'icon' => $apps_img_path. 'shopengine.gif',
284 + 'desc' => esc_html__('All in one WooCommerce solution for Gutenberg! Build your WooCommerce pages in a block editor with full customization.', 'shopengine'),
285 + 'docs' => 'https://wpmet.com/doc/shopengine/shopengine-gutenberg/',
286 + ],
287 + 'genie-image-ai/genie-image-ai.php' => [
288 + 'name' => esc_html__('Genie Image', 'shopengine'),
289 + 'url' => 'https://wordpress.org/plugins/genie-image-ai/',
290 + 'icon' => $apps_img_path . 'genie-image.png',
291 + 'desc' => esc_html__('AI-powered text-to-image generator for WordPress with OpenAI’s DALL-E 2 technology to generate high-quality images in one click.
292 + ', 'shopengine'),
293 + 'docs' => 'https://getgenie.ai/docs/',
294 + ],
295 + ]
296 + )
297 + ->call();
298 +
299 +
300 +
301 + \ShopEngine\Core\MultiLanguage\Language::instance()->init();
302 +
303 + \ShopEngine\Core\Settings\Base::instance()->init();
304 +
305 +
183 306 new Libs\Select_Api\Base();
184 307
185 308 (new Module_Manifest())->init();
186 309
@@ -195,11 +318,28 @@
195 318 add_action('get_header', [$this, 'shopengine_track_product_views']);
196 319
197 320 // database migrations
198 321 // (new \ShopEngine\Compatibility\Migrations\Migration())->init();
199 - (new \ShopEngine\Compatibility\Migrations\Temp_Migration())->init();
322 + // (new \ShopEngine\Compatibility\Migrations\Temp_Migration())->init();
200 323
324 +
325 + // call service providers
326 +
327 + $service_providers = include \ShopEngine::plugin_dir().'core/service-provider-manager.php';
328 + $method = 'init';
329 + foreach( $service_providers as $service_provider ){
330 +
331 + if(class_exists($service_provider) && method_exists($service_provider, $method)) {
332 + $instance = new $service_provider();
333 + $instance->$method();
334 + }
335 +
336 + }
337 +
201 338 add_filter('script_loader_tag', [$this, 'filter_load_type'], 99, 3);
339 +
340 + //it will register an option in customizer for woocommerce products catelog. It's related with our Arcive Products widget.
341 + Register_Settings::instance()->init();
202 342 }
203 343
204 344
205 345 // add async and defer attributes to enqueued scripts
@@ -228,14 +368,14 @@
228 368
229 369 $product_id = get_the_id();
230 370
231 371 $cookie_name = "shopengine_recent_viewed_product";
232 -
372 +
233 373 if(isset($_COOKIE[$cookie_name])) {
234 -
235 - $cookie_ids = $_COOKIE[$cookie_name];
374 +
375 + $cookie_ids = sanitize_text_field(wp_unslash($_COOKIE[$cookie_name]));
236 376 $product_ids = explode(',', $cookie_ids);
237 -
377 +
238 378 if(!is_array($product_ids)) {
239 379 $product_ids = [$product_ids];
240 380 }
241 381
@@ -243,14 +383,14 @@
243 383 unset($product_ids[$product_id]);
244 384 $product_ids[] = $product_id;
245 385
246 386 $cookie_value = implode(',', $product_ids);
247 -
387 +
248 388 } else {
249 - $cookie_value = $product_id;
389 + $cookie_value = $product_id;
250 390 }
251 391
252 - setcookie($cookie_name, $cookie_value, strtotime('+30 days'), '/');
392 + setcookie($cookie_name, $cookie_value, strtotime('+30 days'), '/' );
253 393
254 394 $count_key = 'shopengine_product_views_count';
255 395 $count = get_post_meta($product_id, $count_key, true);
256 396
@@ -269,12 +409,10 @@
269 409 * Include public function
270 410 *
271 411 * @since 1.0.0
272 412 */
273 - public function js_css_public() {
274 - wp_enqueue_style('shopengine-icon', \ShopEngine::plugin_url() . 'assets/css/shopengine-icon.css', false, \ShopEngine::version());
275 - wp_enqueue_style('shopengine-simple-scrollbar-css', \ShopEngine::plugin_url() . 'assets/css/simple-scrollbar.css', false, \ShopEngine::version());
276 - wp_enqueue_style('shopengine-public-css', \ShopEngine::plugin_url() . 'assets/css/public-style.css', false, \ShopEngine::version());
413 + public function js_css_public() {
414 + wp_register_style('shopengine-public', \ShopEngine::plugin_url() . 'assets/css/shopengine-public.css', false, \ShopEngine::version());
277 415
278 416 // Modal Stylesheet
279 417 wp_register_style('shopengine-modal-styles', \ShopEngine::plugin_url() . 'assets/css/shopengine-modal.css', false, \ShopEngine::version());
280 418
@@ -323,11 +461,11 @@
323 461
324 462
325 463 public function missing_woocommerce() {
326 464
327 - if(isset($_GET['activate'])) {
328 - unset($_GET['activate']);
329 - }
465 + if(!current_user_can('manage_options')) {
466 + return;
467 + }
330 468
331 469 if(file_exists(WP_PLUGIN_DIR . '/woocommerce/woocommerce.php')) {
332 470
333 471 $btn['label'] = esc_html__('Activate WooCommerce', 'shopengine');
@@ -343,8 +481,9 @@
343 481 [
344 482 'id' => 'missing-woo',
345 483 'type' => 'error',
346 484 'dismissible' => true,
485 + 'is_required' => true,
347 486 'btn' => $btn,
348 487 'message' => sprintf(esc_html__('ShopEngine requires woocommerce Plugin, which is currently NOT RUNNING.', 'shopengine'), '4.1.0'),
349 488 ]
350 489 );
@@ -352,11 +491,11 @@
352 491
353 492
354 493 public function missing_elementor() {
355 494
356 - if(isset($_GET['activate'])) {
357 - unset($_GET['activate']);
358 - }
495 + if(!current_user_can('manage_options')) {
496 + return;
497 + }
359 498
360 499 if(file_exists(WP_PLUGIN_DIR . '/elementor/elementor.php')) {
361 500
362 501 $btn['label'] = esc_html__('Activate Elementor', 'shopengine');
@@ -367,15 +506,28 @@
367 506 $btn['label'] = esc_html__('Install Elementor', 'shopengine');
368 507 $btn['url'] = wp_nonce_url(self_admin_url('update.php?action=install-plugin&plugin=elementor'), 'install-plugin_elementor');
369 508 }
370 509
510 + if(file_exists(WP_PLUGIN_DIR . '/blocks-for-shopengine/shopengine-gutenberg-addon.php')) {
511 +
512 + $btn2['label'] = esc_html__('Activate Blocks for ShopEngine', 'shopengine');
513 + $btn2['url'] = wp_nonce_url('plugins.php?action=activate&plugin=blocks-for-shopengine/shopengine-gutenberg-addon.php&plugin_status=all&paged=1', 'activate-plugin_blocks-for-shopengine/shopengine-gutenberg-addon.php');
514 +
515 + } else {
516 +
517 + $btn2['label'] = esc_html__('Install Blocks for ShopEngine', 'shopengine');
518 + $btn2['url'] = wp_nonce_url(self_admin_url('update.php?action=install-plugin&plugin=blocks-for-shopengine'), 'install-plugin_blocks-for-shopengine');
519 + }
520 +
371 521 Utils\Notice::push(
372 522 [
373 523 'id' => 'missing-elementor',
374 524 'type' => 'error',
525 + 'is_required' => true,
375 526 'dismissible' => true,
376 527 'btn' => $btn,
377 - 'message' => sprintf(esc_html__('ShopEngine requires Elementor version %1$s+, which is currently NOT RUNNING.', 'shopengine'), '3.0.0'),
528 + 'btn2' => $btn2,
529 + 'message' => esc_html__('To use ShopEngine, install Elementor (For the Elementor Builder) OR Blocks for ShopEngine (For Gutenberg Builder).', 'shopengine'),
378 530 ]
379 531 );
380 532 }
381 533
@@ -380,8 +532,12 @@
380 532 }
381 533
382 534
383 535 public function failed_elementor_version() {
536 +
537 + if(!current_user_can('manage_options')) {
538 + return;
539 + }
384 540
385 541 $btn['label'] = esc_html__('Update Elementor', 'shopengine');
386 542 $btn['url'] = wp_nonce_url(self_admin_url('update.php?action=upgrade-plugin&plugin=elementor'), 'upgrade-plugin_elementor');
387 543