PluginProbe ʕ •ᴥ•ʔ
ShopEngine Elementor WooCommerce Builder Addon – All in One WooCommerce Solution / 4.9.0
ShopEngine Elementor WooCommerce Builder Addon – All in One WooCommerce Solution v4.9.0
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 4.3.1 4.4.0 4.5.0 4.5.1 4.6.0 4.6.1 4.6.2 4.6.3 4.6.4 4.6.5 4.6.6 4.6.7 4.6.8 4.6.9 4.7.0 4.7.1 4.7.2 4.7.3 4.7.4 4.7.5 4.7.6 4.7.7 4.7.8 4.7.9 4.8.0 4.8.1 4.8.2 4.8.3 4.8.4 4.8.5 4.8.6 4.8.7 4.8.8 4.8.9 trunk 0.1.2-beta 0.1.3-beta 0.1.4-beta 1.0.0 1.1.0 1.1.1 1.1.2 1.1.3 1.2.0 1.2.1 1.3.0 1.3.1 1.3.2 1.3.3 1.3.4 1.4.0 1.4.1 1.5.0 1.5.1 1.6.0 1.6.1 1.7.0 1.8.0 1.8.1 1.9.0
shopengine / plugin.php
shopengine Last commit date
assets 3 weeks ago base 3 weeks ago compatibility 3 weeks ago core 3 weeks ago languages 3 weeks ago libs 3 weeks ago modules 3 weeks ago traits 3 years ago utils 3 weeks ago widgets 3 weeks ago woocommerce 1 year ago autoloader.php 4 years ago phpcs.xml 3 years ago plugin.php 3 weeks ago readme.txt 3 weeks ago shopengine.php 3 weeks ago
plugin.php
625 lines
1 <?php
2
3 namespace ShopEngine;
4
5 defined('ABSPATH') || exit;
6
7 use ShopEngine\Compatibility\Conflicts\Manifest as Conflict_Manifest;
8 use ShopEngine\Core\Builders\Base;
9 use ShopEngine\Compatibility\Migrations\LangMigration;
10 use ShopEngine\Core\Query_Modifier;
11 use ShopEngine\Core\Wc_Customizer\Register_Settings;
12 use ShopEngine\Core\Template_Cpt;
13 use ShopEngine\Libs\License\License_Route;
14 use ShopEngine\Libs\Rating\Rating;
15 use ShopEngine\Libs\Updater\Init as Updater;
16 use ShopEngine\Modules\Manifest as Module_Manifest;
17 use ShopEngine\Utils\Feedback\Plugin_Unsubscribe;
18 use ShopEngine\Widgets\Manifest;
19
20
21 /**
22 * Plugin final Class.
23 * Handles dynamically loading classes only when needed. Check Elementor Plugin, Woocomerce Plugin Loaded or Install.
24 *
25 * @since 1.0.0
26 */
27 final class Plugin {
28
29 private static $instance;
30
31 /**
32 * __construct function
33 * @since 1.0.0
34 */
35 public function __construct() {
36 // load autoload method
37 Autoloader::run();
38 add_action( 'wp_ajax_shopengine_admin_action', [\ShopEngine\Utils\Util::class, 'shopengine_admin_action'] );
39 }
40
41 public function utils_url()
42 {
43 return $this->plugin_url() . 'utils/';
44 }
45 /**
46 * Public function init.
47 * call function for all
48 *
49 * @since 1.0.0
50 */
51 public function init() {
52
53 $error = false;
54
55 // init notice class
56 \Oxaim\Libs\Notice::init();
57
58 // check woocommerce plugin
59 if(!did_action('woocommerce_loaded')) {
60 add_action('admin_notices', [$this, 'missing_woocommerce']);
61
62 $error = true;
63 }
64
65 $check_elementor_version = false;
66
67 // Check if Elementor installed and activated.
68 if(!did_action('elementor/loaded')) {
69
70 if(!did_action('shopengine-gutenberg-addon/before_loaded')) {
71
72 add_action('admin_notices', [$this, 'missing_elementor']);
73
74 $error = true;
75 }
76 }
77
78 // Check for required Elementor version.
79 if(did_action('elementor/loaded') && defined('ELEMENTOR_VERSION') && !version_compare(ELEMENTOR_VERSION, '3.0.0', '>=')) {
80
81 add_action('admin_notices', [$this, 'failed_elementor_version']);
82
83 $error = true;
84 }
85
86 if($error) {
87 return;
88 }
89
90
91
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");
95
96 $custom_links[] = '<a title="' . $free . '" href="'.admin_url('edit.php?post_type=shopengine-template#getting-started').'" target="_blank">' . esc_html__('Settings', 'shopengine') . '</a>';
97
98 foreach ($custom_links as $custom_link):
99 array_unshift($links, $custom_link);
100 endforeach;
101
102 if (!is_plugin_active('shopengine-pro/shopengine-pro.php')) {
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>';
104 }
105 return $links;
106 });
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 }
128
129
130 /**
131 * Routes initialization
132 *
133 */
134 new License_Route();
135
136 // Initialize deactivation feedback modal
137 new \ShopEngine\Utils\Feedback\Plugin_Unsubscribe();
138 /**
139 * Run pro plugin updater here....
140 *
141 */
142 add_action('admin_init', function () {
143 if(class_exists('ShopEngine_Pro')) {
144 new Updater();
145 }
146 new \ShopEngine\Compatibility\Migrations\Direct_Checkout;
147 });
148
149
150 add_action('wp_loaded', function () {
151 /**
152 * migrate data
153 */
154 LangMigration::instance()->init();
155 });
156
157 // avoid themes for loading woocommerce functions
158 $avoid_themes = ['avada', 'woodmart', 'Avada', 'Woodmart'];
159
160 if( !in_array(get_template(), $avoid_themes) ) {
161 /**
162 * Ensuring woocommerce functions are loaded before theme is modifying those
163 *
164 */
165 require_once WC_ABSPATH . '/includes/wc-template-functions.php';
166 }
167
168
169 if(did_action('elementor/loaded')) {
170 // Load custom elementor controls
171 new \ShopEngine\Core\Elementor_Controls\Init();
172
173 //Loading the scripts and styles
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
184 }
185
186 // Cart validation compatibility with WC Min Max Quantity plugin
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
194 //Loading public scripts and styles
195 add_action('wp_enqueue_scripts', [$this, 'js_css_public']);
196
197 //woocommece theme support
198 if(!current_theme_supports('woocommerce')) {
199 add_theme_support('woocommerce');
200 add_theme_support('wc-product-gallery-zoom');
201 add_theme_support('wc-product-gallery-lightbox');
202 add_theme_support('wc-product-gallery-slider');
203 }
204
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
211 #Registering new post-type & etc
212 Base::instance()->init();
213
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('Our Plugins')
254 ->set_section_title('Get More out of Your WooCommerce Website!')
255 ->set_section_description('Install other plugins from us and take your WooCommerce site to the next level for absolutely free!')
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 'getgenie/getgenie.php' => [
267 'name' => esc_html__('GetGenie', 'shopengine'),
268 'url' => 'https://wordpress.org/plugins/getgenie/',
269 'icon' => $apps_img_path.'getgenie.gif',
270 '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'),
271 'docs' => 'https://getgenie.ai/docs/',
272 ],
273 'gutenkit-blocks-addon/gutenkit-blocks-addon.php' => [
274 'name' => esc_html__('GutenKit', 'shopengine'),
275 'url' => 'https://wordpress.org/plugins/gutenkit-blocks-addon/',
276 'icon' => $apps_img_path. 'guten-kit.png',
277 'desc' => esc_html__('Gutenberg blocks, patterns, and templates that extend the page-building experience using the WordPress block editor.', 'shopengine'),
278 'docs' => 'https://wpmet.com/doc/gutenkit/',
279 ],
280 'metform/metform.php' => [
281 'name' => esc_html__('MetForm', 'shopengine'),
282 'url' => 'https://wordpress.org/plugins/metform/',
283 'icon' => $apps_img_path. 'metform.png',
284 'desc' => esc_html__('Drag & drop form builder for Elementor to create contact forms, multi-step forms, and more — smoother, faster, and better!', 'shopengine'),
285 'docs' => 'https://wpmet.com/doc/metform/',
286 ],
287 'emailkit/EmailKit.php' => [
288 'name' => esc_html__('EmailKit', 'shopengine'),
289 'url' => 'https://wordpress.org/plugins/emailkit/',
290 'icon' => $apps_img_path . 'emailkit.png',
291 'desc' => esc_html__('Advanced email customizer for WooCommerce and WordPress. Build, customize, and send emails from WordPress to boost your sales!', 'shopengine'),
292 'docs' => 'https://wpmet.com/doc/emailkit/',
293 ],
294 'wp-social/wp-social.php' => [
295 'name' => esc_html__('WP Social', 'shopengine'),
296 'url' => 'https://wordpress.org/plugins/wp-social/',
297 'icon' => $apps_img_path . 'wp-social.png',
298 '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'),
299 'docs' => 'https://wpmet.com/doc/wp-social/',
300 ],
301 'wp-ultimate-review/wp-ultimate-review.php' => [
302 'name' => esc_html__('WP Ultimate Review', 'shopengine'),
303 'url' => 'https://wordpress.org/plugins/wp-ultimate-review/',
304 'icon' => $apps_img_path . 'ultimate-review.png',
305 'desc' => esc_html__('Collect and showcase reviews on your website to build brand credibility and social proof with the easiest solution.','shopengine'),
306 'docs' => 'https://wpmet.com/doc/wp-ultimate-review/',
307 ],
308 'wp-fundraising-donation/wp-fundraising.php' => [
309 'name' => esc_html__('FundEngine', 'shopengine'),
310 'url' => 'https://wordpress.org/plugins/wp-fundraising-donation/',
311 'icon' => $apps_img_path . 'fundengine.png',
312 'desc' => esc_html__('Create fundraising, crowdfunding, and donation websites with PayPal and Stripe payment gateway integration.', 'shopengine'),
313 'docs' => 'https://wpmet.com/doc/fundengine/',
314 ],
315 'blocks-for-shopengine/shopengine-gutenberg-addon.php' => [
316 'name' => esc_html__('Blocks for ShopEngine', 'shopengine'),
317 'url' => 'https://wordpress.org/plugins/blocks-for-shopengine/',
318 'icon' => $apps_img_path. 'shopengine.gif',
319 'desc' => esc_html__('All in one WooCommerce solution for Gutenberg! Build your WooCommerce pages in a block editor with full customization.', 'shopengine'),
320 'docs' => 'https://wpmet.com/doc/shopengine/shopengine-gutenberg/',
321 ],
322 'genie-image-ai/genie-image-ai.php' => [
323 'name' => esc_html__('Genie Image', 'shopengine'),
324 'url' => 'https://wordpress.org/plugins/genie-image-ai/',
325 'icon' => $apps_img_path . 'genie-image.png',
326 '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.
327 ', 'shopengine'),
328 'docs' => 'https://getgenie.ai/docs/',
329 ],
330 ]
331 )
332 ->call();
333
334 // working get instance of elementor widget
335 (new Manifest())->init();
336 } );
337
338
339
340 \ShopEngine\Core\MultiLanguage\Language::instance()->init();
341
342 \ShopEngine\Core\Settings\Base::instance()->init();
343
344
345 new Libs\Select_Api\Base();
346
347 (new Module_Manifest())->init();
348
349
350 Query_Modifier::instance()->init();
351
352 (new Conflict_Manifest())->init();
353
354 // view count
355 add_action('get_header', [$this, 'shopengine_track_product_views']);
356
357 // database migrations
358 // (new \ShopEngine\Compatibility\Migrations\Migration())->init();
359 // (new \ShopEngine\Compatibility\Migrations\Temp_Migration())->init();
360
361
362 // call service providers
363
364 $service_providers = include \ShopEngine::plugin_dir().'core/service-provider-manager.php';
365 $method = 'init';
366 foreach( $service_providers as $service_provider ){
367
368 if(class_exists($service_provider) && method_exists($service_provider, $method)) {
369 $instance = new $service_provider();
370 $instance->$method();
371 }
372
373 }
374
375 add_filter('script_loader_tag', [$this, 'filter_load_type'], 99, 3);
376
377 //it will register an option in customizer for woocommerce products catelog. It's related with our Arcive Products widget.
378 Register_Settings::instance()->init();
379 }
380
381 public function shopengine_wcmmq_cart_validation_compat( $check, $request ) {
382
383 $cart_widget_flag = isset( $_REQUEST['shopengine_cart_widget'] )
384 ? sanitize_text_field( wp_unslash( $_REQUEST['shopengine_cart_widget'] ) )
385 : '';
386 $cart_widget_nonce = isset( $_REQUEST['shopengine_cart_widget_nonce'] )
387 ? sanitize_text_field( wp_unslash( $_REQUEST['shopengine_cart_widget_nonce'] ) )
388 : '';
389
390 if ( $cart_widget_flag === '1' && wp_verify_nonce( $cart_widget_nonce, 'shopengine_cart_widget' ) ) {
391 return false; // Skip WC MMQ validation for verified ShopEngine cart widget requests
392 }
393 return $check; // Proceed with normal validation for other requests
394 }
395
396
397
398
399
400 // add async and defer attributes to enqueued scripts
401 public function filter_load_type($tag, $handle, $src) {
402
403 if(strpos($handle, '-async') !== false) {
404 $tag = str_replace(' src', ' async="async" src', $tag);
405 }
406
407 if(strpos($handle, '-defer') !== false) {
408 $tag = str_replace('<script ', '<script defer ', $tag);
409 }
410
411 return $tag;
412 }
413
414 /**
415 * Public function shopengine_track_product_views
416 * Adding Product Views Count Meta
417 */
418 public function shopengine_track_product_views() {
419
420 if(class_exists('WooCommerce') && !is_product()) {
421 return;
422 }
423
424 $product_id = get_the_id();
425
426 $cookie_name = "shopengine_recent_viewed_product";
427
428 if(isset($_COOKIE[$cookie_name])) {
429
430 $cookie_ids = sanitize_text_field(wp_unslash($_COOKIE[$cookie_name]));
431 $product_ids = explode(',', $cookie_ids);
432
433 if(!is_array($product_ids)) {
434 $product_ids = [$product_ids];
435 }
436
437 $product_ids = array_combine($product_ids, $product_ids);
438 unset($product_ids[$product_id]);
439 $product_ids[] = $product_id;
440
441 $cookie_value = implode(',', $product_ids);
442
443 } else {
444 $cookie_value = $product_id;
445 }
446
447 setcookie($cookie_name, $cookie_value, strtotime('+30 days'), '/' );
448
449 $count_key = 'shopengine_product_views_count';
450 $count = get_post_meta($product_id, $count_key, true);
451
452 if($count == '') {
453 $count = 1;
454 delete_post_meta($product_id, $count_key);
455 add_post_meta($product_id, $count_key, '1');
456 } else {
457 $count++;
458 update_post_meta($product_id, $count_key, $count);
459 }
460 }
461
462 /**
463 * Public function js_css_public .
464 * Include public function
465 *
466 * @since 1.0.0
467 */
468 public function js_css_public() {
469 wp_register_style('shopengine-public', \ShopEngine::plugin_url() . 'assets/css/shopengine-public.css', false, \ShopEngine::version());
470
471 // Modal Stylesheet
472 wp_register_style('shopengine-modal-styles', \ShopEngine::plugin_url() . 'assets/css/shopengine-modal.css', false, \ShopEngine::version());
473
474 // Modal Script
475 wp_register_script('shopengine-modal-script', \ShopEngine::plugin_url() . 'assets/js/shopengine-modal.js', ['jquery'], \ShopEngine::version(), true);
476
477 wp_enqueue_script('shopengine-simple-scrollbar.js-js', \ShopEngine::plugin_url() . 'assets/js/simple-scrollbar.js', [], \ShopEngine::version(), true);
478 wp_enqueue_script('shopengine-filter-js', \ShopEngine::plugin_url() . 'assets/js/filter.js', [], \ShopEngine::version(), true);
479 wp_enqueue_script('shopengine-js', \ShopEngine::plugin_url() . 'assets/js/public.js', [], \ShopEngine::version(), true);
480
481
482 wp_localize_script('shopengine-js', 'shopEngineApiSettings', [
483 'resturl' => get_rest_url(),
484 'rest_nonce' => wp_create_nonce('wp_rest'),
485 ]);
486
487
488 /**
489 * Registering libs css/js
490 *
491 */
492
493 wp_register_style(
494 'lib-sqv-css',
495 \ShopEngine::plugin_url() . '/assets/sqv/smart-quick-view.css',
496 [],
497 \ShopEngine::version()
498 );
499
500 wp_register_script(
501 'lib-sqv-js',
502 \ShopEngine::plugin_url() . 'assets/sqv/smart-quick-view.js',
503 ['jquery', 'wc-single-product'],
504 \ShopEngine::version(),
505 true
506 );
507 }
508
509 public function js_css_elementor() {
510 wp_enqueue_style('shopnegine-panel-icon', \ShopEngine::plugin_url() . 'assets/css/shopengine-icon.css', false, \ShopEngine::version());
511
512 if('shopengine-template' === get_post_type()):
513 wp_enqueue_style('shopnegine-editor-css', \ShopEngine::plugin_url() . 'assets/css/editor.css', false, \ShopEngine::version());
514 endif;
515 }
516
517
518 public function missing_woocommerce() {
519
520 if(!current_user_can('manage_options')) {
521 return;
522 }
523
524 if(file_exists(WP_PLUGIN_DIR . '/woocommerce/woocommerce.php')) {
525
526 $btn['label'] = esc_html__('Activate WooCommerce', 'shopengine');
527 $btn['url'] = wp_nonce_url('plugins.php?action=activate&plugin=woocommerce/woocommerce.php&plugin_status=all&paged=1', 'activate-plugin_woocommerce/woocommerce.php');
528
529 } else {
530
531 $btn['label'] = esc_html__('Install WooCommerce', 'shopengine');
532 $btn['url'] = wp_nonce_url(self_admin_url('update.php?action=install-plugin&plugin=woocommerce'), 'install-plugin_woocommerce');
533 }
534
535 Utils\Notice::push(
536 [
537 'id' => 'missing-woo',
538 'type' => 'error',
539 'dismissible' => true,
540 'is_required' => true,
541 'btn' => $btn,
542 'message' => sprintf(esc_html__('ShopEngine requires woocommerce Plugin, which is currently NOT RUNNING.', 'shopengine'), '4.1.0'),
543 ]
544 );
545 }
546
547
548 public function missing_elementor() {
549
550 if(!current_user_can('manage_options')) {
551 return;
552 }
553
554 if(file_exists(WP_PLUGIN_DIR . '/elementor/elementor.php')) {
555
556 $btn['label'] = esc_html__('Activate Elementor', 'shopengine');
557 $btn['url'] = wp_nonce_url('plugins.php?action=activate&plugin=elementor/elementor.php&plugin_status=all&paged=1', 'activate-plugin_elementor/elementor.php');
558
559 } else {
560
561 $btn['label'] = esc_html__('Install Elementor', 'shopengine');
562 $btn['url'] = wp_nonce_url(self_admin_url('update.php?action=install-plugin&plugin=elementor'), 'install-plugin_elementor');
563 }
564
565 if(file_exists(WP_PLUGIN_DIR . '/blocks-for-shopengine/shopengine-gutenberg-addon.php')) {
566
567 $btn2['label'] = esc_html__('Activate Blocks for ShopEngine', 'shopengine');
568 $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');
569
570 } else {
571
572 $btn2['label'] = esc_html__('Install Blocks for ShopEngine', 'shopengine');
573 $btn2['url'] = wp_nonce_url(self_admin_url('update.php?action=install-plugin&plugin=blocks-for-shopengine'), 'install-plugin_blocks-for-shopengine');
574 }
575
576 Utils\Notice::push(
577 [
578 'id' => 'missing-elementor',
579 'type' => 'error',
580 'is_required' => true,
581 'dismissible' => true,
582 'btn' => $btn,
583 'btn2' => $btn2,
584 'message' => esc_html__('To use ShopEngine, install Elementor (For the Elementor Builder) OR Blocks for ShopEngine (For Gutenberg Builder).', 'shopengine'),
585 ]
586 );
587 }
588
589
590 public function failed_elementor_version() {
591
592 if(!current_user_can('manage_options')) {
593 return;
594 }
595
596 $btn['label'] = esc_html__('Update Elementor', 'shopengine');
597 $btn['url'] = wp_nonce_url(self_admin_url('update.php?action=upgrade-plugin&plugin=elementor'), 'upgrade-plugin_elementor');
598
599 Utils\Notice::push(
600 [
601 'id' => 'unsupported-elementor-version',
602 'type' => 'error',
603 'dismissible' => true,
604 'btn' => $btn,
605 'message' => sprintf(esc_html__('ShopEngine requires Elementor version %1$s+, which is currently NOT RUNNING.', 'shopengine'), '3.0.0'),
606 ]
607 );
608 }
609
610
611 public function flush_rewrites() {
612 $form_cpt = new Core\Builders\Cpt();
613 $form_cpt->flush_rewrites();
614 }
615
616
617 public static function instance() {
618 if(!self::$instance) {
619 self::$instance = new self();
620 }
621
622 return self::$instance;
623 }
624 }
625