PluginProbe
ShopEngine Elementor WooCommerce Builder Addon – All in One WooCommerce Solution with eCommerce Templates & Woo Widgets / 4.9.4
ShopEngine Elementor WooCommerce Builder Addon – All in One WooCommerce Solution with eCommerce Templates & Woo Widgets v4.9.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 +257 -51 2.2.24.9.4 View file →
@@ -1,18 +1,23 @@
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;
17 +use ShopEngine\Utils\Feedback\Plugin_Unsubscribe;
12 18 use ShopEngine\Widgets\Manifest;
13 19
14 -defined('ABSPATH') || exit;
15 20
16 21 /**
17 22 * Plugin final Class.
18 23 * Handles dynamically loading classes only when needed. Check Elementor Plugin, Woocomerce Plugin Loaded or Install.
@@ -29,11 +34,15 @@
29 34 */
30 35 public function __construct() {
31 36 // load autoload method
32 37 Autoloader::run();
38 + add_action( 'wp_ajax_shopengine_admin_action', [\ShopEngine\Utils\Util::class, 'shopengine_admin_action'] );
33 39 }
34 40
35 -
41 + public function utils_url()
42 + {
43 + return $this->plugin_url() . 'utils/';
44 + }
36 45 /**
37 46 * Public function init.
38 47 * call function for all
39 48 *
@@ -42,8 +51,11 @@
42 51 public function init() {
43 52
44 53 $error = false;
45 54
55 + // init notice class
56 + \Oxaim\Libs\Notice::init();
57 +
46 58 // check woocommerce plugin
47 59 if(!did_action('woocommerce_loaded')) {
48 60 add_action('admin_notices', [$this, 'missing_woocommerce']);
49 61
@@ -74,11 +86,15 @@
74 86 if($error) {
75 87 return;
76 88 }
77 89
90 +
91 +
78 92 add_filter("plugin_action_links_shopengine/shopengine.php", function ($links) {
93 + $free = esc_html__("Go To Shopengine","shopengine");
94 + $pro = esc_html__("Go To ShopenginePro","shopengine");
79 95
80 - $custom_links[] = '<a href="'.admin_url('edit.php?post_type=shopengine-template#getting-started').'" target="_blank">' . esc_html__('Settings', 'shopengine') . '</a>';
96 + $custom_links[] = '<a title="' . $free . '" href="'.admin_url('edit.php?post_type=shopengine-template#getting-started').'" target="_blank">' . esc_html__('Settings', 'shopengine') . '</a>';
81 97
82 98 foreach ($custom_links as $custom_link):
83 99 array_unshift($links, $custom_link);
84 100 endforeach;
@@ -83,20 +99,43 @@
83 99 array_unshift($links, $custom_link);
84 100 endforeach;
85 101
86 102 if (!is_plugin_active('shopengine-pro/shopengine-pro.php')) {
87 - $links[] = '<a href="https://wpmet.com/plugin/shopengine/pricing/" style="color:#FCB214;font-weight:700" target="_blank">' . esc_html__('Go Pro', 'shopengine') . '</a>';
103 + $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>';
88 104 }
89 105 return $links;
90 106 });
91 107
108 + if(\ShopEngine\Utils\Util::get_settings( 'shopengine_user_consent_for_banner', 'true' ) == 'true'){
109 +
110 + /**
111 + * EmailKit Global Class initialization
112 + *
113 + */
114 + if( !class_exists('EmailKit') && !did_action('edit_with_emailkit_loaded') && class_exists('\Wpmet\Libs\Emailkit') ) {
115 +
116 + new \Wpmet\Libs\Emailkit();
117 + }
118 +
119 + /**
120 + * MetForm get free templates promotional class initialization
121 + *
122 + */
123 + if( !did_action('metform/after_load') && did_action('elementor/loaded') && class_exists('\Wpmet\Libs\Metform_Promo_Banner') ) {
124 +
125 + new \Wpmet\Libs\Metform_Promo_Banner();
126 + }
127 + }
92 128
129 +
93 130 /**
94 131 * Routes initialization
95 132 *
96 133 */
97 134 new License_Route();
98 -
135 +
136 + // Initialize deactivation feedback modal
137 + new \ShopEngine\Utils\Feedback\Plugin_Unsubscribe();
99 138 /**
100 139 * Run pro plugin updater here....
101 140 *
102 141 */
@@ -103,45 +142,23 @@
103 142 add_action('admin_init', function () {
104 143 if(class_exists('ShopEngine_Pro')) {
105 144 new Updater();
106 145 }
146 + new \ShopEngine\Compatibility\Migrations\Direct_Checkout;
107 147 });
108 148
109 149
110 150 add_action('wp_loaded', function () {
111 -
112 - if(isset($_REQUEST['preview']) && $_REQUEST['preview'] == 'true' && !empty($_REQUEST['preview_id'])) {
113 -
114 - $pid = (int)$_REQUEST['preview_id'];
115 -
116 - $po = get_post($pid);
117 -
118 - if($po->post_type === Template_Cpt::TYPE) {
119 -
120 - $template = \ShopEngine\Core\Builders\Templates::get_registered_template_data($pid);
121 -
122 - if(empty($template) || !isset($template['url'])) {
123 - return;
124 - }
125 -
126 - $param = [
127 - 'shopengine_template_id' => $pid,
128 - 'preview_nonce' => wp_create_nonce('template_preview_' . $pid),
129 - 'change_template' => '1',
130 - ];
131 -
132 - $url = \ShopEngine\Utils\Helper::add_to_url($template['url'], $param);
133 -
134 - wp_safe_redirect($url);
135 - exit;
136 - }
137 - }
151 + /**
152 + * migrate data
153 + */
154 + LangMigration::instance()->init();
138 155 });
139 156
140 157 // avoid themes for loading woocommerce functions
141 - $avoid_themes = ['avada', 'avada child'];
158 + $avoid_themes = ['avada', 'woodmart', 'Avada', 'Woodmart'];
142 159
143 - if(!in_array(strtolower(wp_get_theme()), $avoid_themes)) {
160 + if( !in_array(get_template(), $avoid_themes) ) {
144 161 /**
145 162 * Ensuring woocommerce functions are loaded before theme is modifying those
146 163 *
147 164 */
@@ -154,11 +171,27 @@
154 171 new \ShopEngine\Core\Elementor_Controls\Init();
155 172
156 173 //Loading the scripts and styles
157 174 add_action('elementor/editor/after_enqueue_styles', [$this, 'js_css_elementor']);
175 +
176 + // Register widgets immediately after elementor is loaded with higher priority
177 + if(is_plugin_active('related-products-manager-woocommerce/related-products-manager-for-woocommerce.php')) {
178 +
179 + add_action('elementor/widgets/register', function() {
180 + (new Manifest())->init();
181 + }, 5); // Priority 5 to load early
182 + }
183 +
158 184 }
159 185
186 + // Cart validation compatibility with WC Min Max Quantity plugin
160 187
188 + if ( function_exists( 'is_plugin_active' ) && is_plugin_active( 'woo-min-max-quantity-step-control-single/wcmmq.php' ) ) {
189 +
190 + add_filter( 'wcmmq_cart_validation_check', [ $this, 'shopengine_wcmmq_cart_validation_compat' ], 10, 2 );
191 + }
192 +
193 +
161 194 //Loading public scripts and styles
162 195 add_action('wp_enqueue_scripts', [$this, 'js_css_public']);
163 196
164 197 //woocommece theme support
@@ -168,20 +201,158 @@
168 201 add_theme_support('wc-product-gallery-lightbox');
169 202 add_theme_support('wc-product-gallery-slider');
170 203 }
171 204
172 -
205 +
206 + $filter_string = ''; // elementskit,metform-pro
207 + $filter_string .= ((!in_array('elementskit/elementskit.php', apply_filters('active_plugins', get_option('active_plugins')))) ? '' : ',elementskit');
208 + $filter_string .= (!class_exists('\MetForm\Plugin') ? '' : ',metform');
209 + $filter_string .= (!class_exists('\MetForm_Pro\Plugin') ? '' : ',metform-pro');
210 +
173 211 #Registering new post-type & etc
174 212 Base::instance()->init();
213 +
175 214
215 + Rating::instance('shopengine')
216 + ->set_plugin( 'ShopEngine', 'https://wpmet.com/wordpress.org/rating/shopengine' )
217 + ->set_rating_url( 'https://wordpress.org/support/plugin/shopengine/reviews/#new-post' )
218 + ->set_plugin_logo( 'https://ps.w.org/shopengine/assets/icon-256x256.gif?rev=2505061', 'width:150px !important' )
219 + ->set_priority( 11 )
220 + ->set_first_appear_day( 7 )
221 + ->set_condition( true )
222 + ->call();
223 +
224 + if ( is_admin() && \ShopEngine\Utils\Util::get_settings( 'shopengine_user_consent_for_banner', 'true' ) == 'true' ) {
225 +
226 + /**
227 + * Show WPMET stories widget in dashboard
228 + */
229 +
230 + \Wpmet\Libs\Stories::instance('shopengine')
231 +
232 + ->set_filter($filter_string)
233 + ->set_plugin('ShopEngine', 'https://wpmet.com/plugin/shopengine/')
234 + ->set_api_url('https://api.wpmet.com/public/stories/')
235 + ->call();
236 +
237 + // banner
238 + \Wpmet\Libs\Banner::instance('shopengine')
239 + ->set_filter(ltrim($filter_string, ','))
240 + ->set_api_url('https://api.wpmet.com/public/jhanda')
241 + ->set_plugin_screens('edit-shopengine-template')
242 + ->set_plugin_screens('edit-shopengine-template')
243 + ->call();
244 + }
245 +
246 + add_action('init', function () {
247 + $apps_img_path = \ShopEngine::plugin_url() . 'assets/images/apps-page/';
248 + /**
249 + * Show our plugins menu for others wpmet plugins
250 + */
251 + \ShopEngine\Wpmet\Libs\Plugins::instance()->init('shopengine')
252 + ->set_parent_menu_slug('shopengine-settings')
253 + ->set_submenu_name(esc_html__('Our Plugins', 'shopengine'))
254 + ->set_section_title(esc_html__('Get More out of Your WooCommerce Website!', 'shopengine'))
255 + ->set_section_description(esc_html__('Install other plugins from us and take your WooCommerce site to the next level for absolutely free!', 'shopengine'))
256 + ->set_items_per_row(4)
257 + ->set_plugins(
258 + [
259 + 'elementskit-lite/elementskit-lite.php' => [
260 + 'name' => esc_html__('ElementsKit', 'shopengine'),
261 + 'url' => 'https://wordpress.org/plugins/elementskit-lite/',
262 + 'icon' => $apps_img_path. 'elementskit.gif',
263 + 'desc' => esc_html__('All-in-one Elementor addon trusted by 1 Million+ users, makes your website builder process easier with ultimate freedom.', 'shopengine'),
264 + 'docs' => 'https://wpmet.com/doc/elementskit/',
265 + ],
266 + 'gutenkit-blocks-addon/gutenkit-blocks-addon.php' => [
267 + 'name' => esc_html__('GutenKit', 'shopengine'),
268 + 'url' => 'https://wordpress.org/plugins/gutenkit-blocks-addon/',
269 + 'icon' => $apps_img_path. 'guten-kit.png',
270 + 'desc' => esc_html__('Gutenberg blocks, patterns, and templates that extend the page-building experience using the WordPress block editor.', 'shopengine'),
271 + 'docs' => 'https://wpmet.com/doc/gutenkit/',
272 + ],
273 + 'rox-dynamic-cpt-fields-engine/rox-dynamic-cpt-fields-engine.php' => [
274 + 'name' => esc_html__('Rox Dynamic CPT Fields', 'shopengine'),
275 + 'url' => 'https://wordpress.org/plugins/rox-dynamic-cpt-fields-engine/',
276 + 'icon' => 'https://ps.w.org/rox-dynamic-cpt-fields-engine/assets/icon-256x256.jpeg?rev=3538537',
277 + 'desc' => esc_html__('Build custom post types, fields, taxonomies, and dynamic frontend layouts for WordPress, with zero coding and full AI-generated schema.', 'shopengine'),
278 + 'docs' => 'https://wpmet.com/doc/rox-dynamic-cpt-fields-engine/',
279 + ],
280 + 'rox-appointment-booking/rox-appointment-booking.php' => [
281 + 'name' => esc_html__('Rox Appointment Booking', 'shopengine'),
282 + 'url' => 'https://wordpress.org/plugins/rox-appointment-booking/',
283 + 'icon' => 'https://ps.w.org/rox-appointment-booking/assets/icon-256x256.png?rev=3575641',
284 + 'desc' => esc_html__('Manage bookings, agents, payments, and calendars from one dashboard! A complete appointment and scheduling solution for WordPress.', 'shopengine'),
285 + 'docs' => 'https://wpmet.com/doc/rox-appointment-booking/',
286 + ],
287 + 'metform/metform.php' => [
288 + 'name' => esc_html__('MetForm', 'shopengine'),
289 + 'url' => 'https://wordpress.org/plugins/metform/',
290 + 'icon' => $apps_img_path. 'metform.png',
291 + 'desc' => esc_html__('Drag & drop form builder for Elementor to create contact forms, multi-step forms, and more — smoother, faster, and better!', 'shopengine'),
292 + 'docs' => 'https://wpmet.com/doc/metform/',
293 + ],
294 + 'popup-builder-block/popup-builder-block.php' => [
295 + 'name' => esc_html__('PopupKit', 'shopengine'),
296 + 'url' => 'https://wordpress.org/plugins/popup-builder-block/',
297 + 'icon' => 'https://ps.w.org/popup-builder-block/assets/icon-256x256.png?rev=3316844',
298 + 'desc' => esc_html__('Design popups that convert, right in your WordPress dashboard.', 'shopengine'),
299 + 'docs' => 'https://wpmet.com/doc/popupkit/',
300 + ],
301 + 'table-builder-block/table-builder-block.php' => [
302 + 'name' => esc_html__('TableKit', 'shopengine'),
303 + 'url' => 'https://wordpress.org/plugins/table-builder-block/',
304 + 'icon' => 'https://ps.w.org/table-builder-block/assets/icon-256x256.png?rev=3509972',
305 + 'desc' => esc_html__('Fully Customizable. Multi-Media Integration. Synch Any Data Files. All Within Block Editor.', 'shopengine'),
306 + 'docs' => 'https://wpmet.com/doc/tablekit/',
307 + ],
308 + 'getgenie/getgenie.php' => [
309 + 'name' => esc_html__('GetGenie', 'shopengine'),
310 + 'url' => 'https://wordpress.org/plugins/getgenie/',
311 + 'icon' => $apps_img_path.'getgenie.gif',
312 + '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'),
313 + 'docs' => 'https://getgenie.ai/docs/',
314 + ],
315 + 'emailkit/EmailKit.php' => [
316 + 'name' => esc_html__('EmailKit', 'shopengine'),
317 + 'url' => 'https://wordpress.org/plugins/emailkit/',
318 + 'icon' => $apps_img_path . 'emailkit.png',
319 + 'desc' => esc_html__('Advanced email customizer for WooCommerce and WordPress. Build, customize, and send emails from WordPress to boost your sales!', 'shopengine'),
320 + 'docs' => 'https://wpmet.com/doc/emailkit/',
321 + ],
322 + 'wp-social/wp-social.php' => [
323 + 'name' => esc_html__('WP Social', 'shopengine'),
324 + 'url' => 'https://wordpress.org/plugins/wp-social/',
325 + 'icon' => $apps_img_path . 'wp-social.png',
326 + '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'),
327 + 'docs' => 'https://wpmet.com/doc/wp-social/',
328 + ],
329 + 'blocks-for-shopengine/shopengine-gutenberg-addon.php' => [
330 + 'name' => esc_html__('Blocks for ShopEngine', 'shopengine'),
331 + 'url' => 'https://wordpress.org/plugins/blocks-for-shopengine/',
332 + 'icon' => $apps_img_path. 'shopengine.gif',
333 + 'desc' => esc_html__('All in one WooCommerce solution for Gutenberg! Build your WooCommerce pages in a block editor with full customization.', 'shopengine'),
334 + 'docs' => 'https://wpmet.com/doc/shopengine/shopengine-gutenberg/',
335 + ],
336 + ]
337 + )
338 + ->call();
339 +
340 + // working get instance of elementor widget
341 + (new Manifest())->init();
342 + } );
343 +
344 +
345 +
346 + \ShopEngine\Core\MultiLanguage\Language::instance()->init();
347 +
176 348 \ShopEngine\Core\Settings\Base::instance()->init();
177 349
350 +
178 351 new Libs\Select_Api\Base();
179 352
180 353 (new Module_Manifest())->init();
181 354
182 - // working get instance of elementor widget
183 - (new Manifest())->init();
184 355
185 356 Query_Modifier::instance()->init();
186 357
187 358 (new Conflict_Manifest())->init();
@@ -190,9 +361,9 @@
190 361 add_action('get_header', [$this, 'shopengine_track_product_views']);
191 362
192 363 // database migrations
193 364 // (new \ShopEngine\Compatibility\Migrations\Migration())->init();
194 - (new \ShopEngine\Compatibility\Migrations\Temp_Migration())->init();
365 + // (new \ShopEngine\Compatibility\Migrations\Temp_Migration())->init();
195 366
196 367
197 368 // call service providers
198 369
@@ -206,14 +377,33 @@
206 377 }
207 378
208 379 }
209 380
381 + add_filter('script_loader_tag', [$this, 'filter_load_type'], 99, 3);
210 382
383 + //it will register an option in customizer for woocommerce products catelog. It's related with our Arcive Products widget.
384 + Register_Settings::instance()->init();
385 + }
211 386
212 - add_filter('script_loader_tag', [$this, 'filter_load_type'], 99, 3);
387 + public function shopengine_wcmmq_cart_validation_compat( $check, $request ) {
388 +
389 + $cart_widget_flag = isset( $_REQUEST['shopengine_cart_widget'] )
390 + ? sanitize_text_field( wp_unslash( $_REQUEST['shopengine_cart_widget'] ) )
391 + : '';
392 + $cart_widget_nonce = isset( $_REQUEST['shopengine_cart_widget_nonce'] )
393 + ? sanitize_text_field( wp_unslash( $_REQUEST['shopengine_cart_widget_nonce'] ) )
394 + : '';
395 +
396 + if ( $cart_widget_flag === '1' && wp_verify_nonce( $cart_widget_nonce, 'shopengine_cart_widget' ) ) {
397 + return false; // Skip WC MMQ validation for verified ShopEngine cart widget requests
398 + }
399 + return $check; // Proceed with normal validation for other requests
213 400 }
214 401
215 402
403 +
404 +
405 +
216 406 // add async and defer attributes to enqueued scripts
217 407 public function filter_load_type($tag, $handle, $src) {
218 408
219 409 if(strpos($handle, '-async') !== false) {
@@ -242,9 +432,9 @@
242 432 $cookie_name = "shopengine_recent_viewed_product";
243 433
244 434 if(isset($_COOKIE[$cookie_name])) {
245 435
246 - $cookie_ids = $_COOKIE[$cookie_name];
436 + $cookie_ids = sanitize_text_field(wp_unslash($_COOKIE[$cookie_name]));
247 437 $product_ids = explode(',', $cookie_ids);
248 438
249 439 if(!is_array($product_ids)) {
250 440 $product_ids = [$product_ids];
@@ -280,12 +470,10 @@
280 470 * Include public function
281 471 *
282 472 * @since 1.0.0
283 473 */
284 - public function js_css_public() {
285 - wp_enqueue_style('shopengine-icon', \ShopEngine::plugin_url() . 'assets/css/shopengine-icon.css', false, \ShopEngine::version());
286 - wp_enqueue_style('shopengine-simple-scrollbar-css', \ShopEngine::plugin_url() . 'assets/css/simple-scrollbar.css', false, \ShopEngine::version());
287 - wp_enqueue_style('shopengine-public-css', \ShopEngine::plugin_url() . 'assets/css/public-style.css', false, \ShopEngine::version());
474 + public function js_css_public() {
475 + wp_register_style('shopengine-public', \ShopEngine::plugin_url() . 'assets/css/shopengine-public.css', false, \ShopEngine::version());
288 476
289 477 // Modal Stylesheet
290 478 wp_register_style('shopengine-modal-styles', \ShopEngine::plugin_url() . 'assets/css/shopengine-modal.css', false, \ShopEngine::version());
291 479
@@ -334,11 +522,11 @@
334 522
335 523
336 524 public function missing_woocommerce() {
337 525
338 - if(isset($_GET['activate'])) {
339 - unset($_GET['activate']);
340 - }
526 + if(!current_user_can('manage_options')) {
527 + return;
528 + }
341 529
342 530 if(file_exists(WP_PLUGIN_DIR . '/woocommerce/woocommerce.php')) {
343 531
344 532 $btn['label'] = esc_html__('Activate WooCommerce', 'shopengine');
@@ -354,8 +542,9 @@
354 542 [
355 543 'id' => 'missing-woo',
356 544 'type' => 'error',
357 545 'dismissible' => true,
546 + 'is_required' => true,
358 547 'btn' => $btn,
359 548 'message' => sprintf(esc_html__('ShopEngine requires woocommerce Plugin, which is currently NOT RUNNING.', 'shopengine'), '4.1.0'),
360 549 ]
361 550 );
@@ -363,11 +552,11 @@
363 552
364 553
365 554 public function missing_elementor() {
366 555
367 - if(isset($_GET['activate'])) {
368 - unset($_GET['activate']);
369 - }
556 + if(!current_user_can('manage_options')) {
557 + return;
558 + }
370 559
371 560 if(file_exists(WP_PLUGIN_DIR . '/elementor/elementor.php')) {
372 561
373 562 $btn['label'] = esc_html__('Activate Elementor', 'shopengine');
@@ -378,15 +567,28 @@
378 567 $btn['label'] = esc_html__('Install Elementor', 'shopengine');
379 568 $btn['url'] = wp_nonce_url(self_admin_url('update.php?action=install-plugin&plugin=elementor'), 'install-plugin_elementor');
380 569 }
381 570
571 + if(file_exists(WP_PLUGIN_DIR . '/blocks-for-shopengine/shopengine-gutenberg-addon.php')) {
572 +
573 + $btn2['label'] = esc_html__('Activate Blocks for ShopEngine', 'shopengine');
574 + $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');
575 +
576 + } else {
577 +
578 + $btn2['label'] = esc_html__('Install Blocks for ShopEngine', 'shopengine');
579 + $btn2['url'] = wp_nonce_url(self_admin_url('update.php?action=install-plugin&plugin=blocks-for-shopengine'), 'install-plugin_blocks-for-shopengine');
580 + }
581 +
382 582 Utils\Notice::push(
383 583 [
384 584 'id' => 'missing-elementor',
385 585 'type' => 'error',
586 + 'is_required' => true,
386 587 'dismissible' => true,
387 588 'btn' => $btn,
388 - 'message' => sprintf(esc_html__('ShopEngine requires Elementor version %1$s+, which is currently NOT RUNNING.', 'shopengine'), '3.0.0'),
589 + 'btn2' => $btn2,
590 + 'message' => esc_html__('To use ShopEngine, install Elementor (For the Elementor Builder) OR Blocks for ShopEngine (For Gutenberg Builder).', 'shopengine'),
389 591 ]
390 592 );
391 593 }
392 594
@@ -391,8 +593,12 @@
391 593 }
392 594
393 595
394 596 public function failed_elementor_version() {
597 +
598 + if(!current_user_can('manage_options')) {
599 + return;
600 + }
395 601
396 602 $btn['label'] = esc_html__('Update Elementor', 'shopengine');
397 603 $btn['url'] = wp_nonce_url(self_admin_url('update.php?action=upgrade-plugin&plugin=elementor'), 'upgrade-plugin_elementor');
398 604