PluginProbe ʕ •ᴥ•ʔ
ShopEngine Elementor WooCommerce Builder Addon – All in One WooCommerce Solution / 4.8.9
ShopEngine Elementor WooCommerce Builder Addon – All in One WooCommerce Solution v4.8.9
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 2 months ago base 2 months ago compatibility 2 months ago core 2 months ago languages 2 months ago libs 2 months ago modules 2 months ago traits 3 years ago utils 11 months ago widgets 2 months ago woocommerce 1 year ago autoloader.php 4 years ago phpcs.xml 3 years ago plugin.php 2 months ago readme.txt 1 month ago shopengine.php 2 months ago
plugin.php
595 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\Widgets\Manifest;
18
19
20 /**
21 * Plugin final Class.
22 * Handles dynamically loading classes only when needed. Check Elementor Plugin, Woocomerce Plugin Loaded or Install.
23 *
24 * @since 1.0.0
25 */
26 final class Plugin {
27
28 private static $instance;
29
30 /**
31 * __construct function
32 * @since 1.0.0
33 */
34 public function __construct() {
35 // load autoload method
36 Autoloader::run();
37 add_action( 'wp_ajax_shopengine_admin_action', [\ShopEngine\Utils\Util::class, 'shopengine_admin_action'] );
38 }
39
40 public function utils_url()
41 {
42 return $this->plugin_url() . 'utils/';
43 }
44 /**
45 * Public function init.
46 * call function for all
47 *
48 * @since 1.0.0
49 */
50 public function init() {
51
52 $error = false;
53
54 // init notice class
55 \Oxaim\Libs\Notice::init();
56
57 // check woocommerce plugin
58 if(!did_action('woocommerce_loaded')) {
59 add_action('admin_notices', [$this, 'missing_woocommerce']);
60
61 $error = true;
62 }
63
64 $check_elementor_version = false;
65
66 // Check if Elementor installed and activated.
67 if(!did_action('elementor/loaded')) {
68
69 if(!did_action('shopengine-gutenberg-addon/before_loaded')) {
70
71 add_action('admin_notices', [$this, 'missing_elementor']);
72
73 $error = true;
74 }
75 }
76
77 // Check for required Elementor version.
78 if(did_action('elementor/loaded') && defined('ELEMENTOR_VERSION') && !version_compare(ELEMENTOR_VERSION, '3.0.0', '>=')) {
79
80 add_action('admin_notices', [$this, 'failed_elementor_version']);
81
82 $error = true;
83 }
84
85 if($error) {
86 return;
87 }
88
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");
92
93 $custom_links[] = '<a title="' . $free . '" href="'.admin_url('edit.php?post_type=shopengine-template#getting-started').'" target="_blank">' . esc_html__('Settings', 'shopengine') . '</a>';
94
95 foreach ($custom_links as $custom_link):
96 array_unshift($links, $custom_link);
97 endforeach;
98
99 if (!is_plugin_active('shopengine-pro/shopengine-pro.php')) {
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>';
101 }
102 return $links;
103 });
104
105 if(\ShopEngine\Utils\Util::get_settings( 'shopengine_user_consent_for_banner', 'true' ) == 'true'){
106
107 /**
108 * EmailKit Global Class initialization
109 *
110 */
111 if( !class_exists('EmailKit') && !did_action('edit_with_emailkit_loaded') && class_exists('\Wpmet\Libs\Emailkit') ) {
112
113 new \Wpmet\Libs\Emailkit();
114 }
115
116 /**
117 * MetForm get free templates promotional class initialization
118 *
119 */
120 if( !did_action('metform/after_load') && did_action('elementor/loaded') && class_exists('\Wpmet\Libs\Metform_Promo_Banner') ) {
121
122 new \Wpmet\Libs\Metform_Promo_Banner();
123 }
124 }
125
126
127 /**
128 * Routes initialization
129 *
130 */
131 new License_Route();
132
133 /**
134 * Run pro plugin updater here....
135 *
136 */
137 add_action('admin_init', function () {
138 if(class_exists('ShopEngine_Pro')) {
139 new Updater();
140 }
141 new \ShopEngine\Compatibility\Migrations\Direct_Checkout;
142 });
143
144
145 add_action('wp_loaded', function () {
146 /**
147 * migrate data
148 */
149 LangMigration::instance()->init();
150 });
151
152 // avoid themes for loading woocommerce functions
153 $avoid_themes = ['avada', 'woodmart', 'Avada', 'Woodmart'];
154
155 if( !in_array(get_template(), $avoid_themes) ) {
156 /**
157 * Ensuring woocommerce functions are loaded before theme is modifying those
158 *
159 */
160 require_once WC_ABSPATH . '/includes/wc-template-functions.php';
161 }
162
163
164 if(did_action('elementor/loaded')) {
165 // Load custom elementor controls
166 new \ShopEngine\Core\Elementor_Controls\Init();
167
168 //Loading the scripts and styles
169 add_action('elementor/editor/after_enqueue_styles', [$this, 'js_css_elementor']);
170
171 // Register widgets immediately after elementor is loaded with higher priority
172 if(is_plugin_active('related-products-manager-woocommerce/related-products-manager-for-woocommerce.php')) {
173
174 add_action('elementor/widgets/register', function() {
175 (new Manifest())->init();
176 }, 5); // Priority 5 to load early
177 }
178
179 }
180
181
182 //Loading public scripts and styles
183 add_action('wp_enqueue_scripts', [$this, 'js_css_public']);
184
185 //woocommece theme support
186 if(!current_theme_supports('woocommerce')) {
187 add_theme_support('woocommerce');
188 add_theme_support('wc-product-gallery-zoom');
189 add_theme_support('wc-product-gallery-lightbox');
190 add_theme_support('wc-product-gallery-slider');
191 }
192
193
194 $filter_string = ''; // elementskit,metform-pro
195 $filter_string .= ((!in_array('elementskit/elementskit.php', apply_filters('active_plugins', get_option('active_plugins')))) ? '' : ',elementskit');
196 $filter_string .= (!class_exists('\MetForm\Plugin') ? '' : ',metform');
197 $filter_string .= (!class_exists('\MetForm_Pro\Plugin') ? '' : ',metform-pro');
198
199 #Registering new post-type & etc
200 Base::instance()->init();
201
202
203 Rating::instance('shopengine')
204 ->set_plugin( 'ShopEngine', 'https://wpmet.com/wordpress.org/rating/shopengine' )
205 ->set_rating_url( 'https://wordpress.org/support/plugin/shopengine/reviews/#new-post' )
206 ->set_plugin_logo( 'https://ps.w.org/shopengine/assets/icon-256x256.gif?rev=2505061', 'width:150px !important' )
207 ->set_priority( 11 )
208 ->set_first_appear_day( 7 )
209 ->set_condition( true )
210 ->call();
211
212 if ( is_admin() && \ShopEngine\Utils\Util::get_settings( 'shopengine_user_consent_for_banner', 'true' ) == 'true' ) {
213
214 /**
215 * Show WPMET stories widget in dashboard
216 */
217
218 \Wpmet\Libs\Stories::instance('shopengine')
219
220 ->set_filter($filter_string)
221 ->set_plugin('ShopEngine', 'https://wpmet.com/plugin/shopengine/')
222 ->set_api_url('https://api.wpmet.com/public/stories/')
223 ->call();
224
225 // banner
226 \Wpmet\Libs\Banner::instance('shopengine')
227 ->set_filter(ltrim($filter_string, ','))
228 ->set_api_url('https://api.wpmet.com/public/jhanda')
229 ->set_plugin_screens('edit-shopengine-template')
230 ->set_plugin_screens('edit-shopengine-template')
231 ->call();
232 }
233
234 add_action('init', function () {
235 $apps_img_path = \ShopEngine::plugin_url() . 'assets/images/apps-page/';
236 /**
237 * Show our plugins menu for others wpmet plugins
238 */
239 \ShopEngine\Wpmet\Libs\Plugins::instance()->init('shopengine')
240 ->set_parent_menu_slug('shopengine-settings')
241 ->set_submenu_name('Our Plugins')
242 ->set_section_title('Get More out of Your WooCommerce Website!')
243 ->set_section_description('Install other plugins from us and take your WooCommerce site to the next level for absolutely free!')
244 ->set_items_per_row(4)
245 ->set_plugins(
246 [
247 'elementskit-lite/elementskit-lite.php' => [
248 'name' => esc_html__('ElementsKit', 'shopengine'),
249 'url' => 'https://wordpress.org/plugins/elementskit-lite/',
250 'icon' => $apps_img_path. 'elementskit.gif',
251 'desc' => esc_html__('All-in-one Elementor addon trusted by 1 Million+ users, makes your website builder process easier with ultimate freedom.', 'shopengine'),
252 'docs' => 'https://wpmet.com/doc/elementskit/',
253 ],
254 'getgenie/getgenie.php' => [
255 'name' => esc_html__('GetGenie', 'shopengine'),
256 'url' => 'https://wordpress.org/plugins/getgenie/',
257 'icon' => $apps_img_path.'getgenie.gif',
258 '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'),
259 'docs' => 'https://getgenie.ai/docs/',
260 ],
261 'gutenkit-blocks-addon/gutenkit-blocks-addon.php' => [
262 'name' => esc_html__('GutenKit', 'shopengine'),
263 'url' => 'https://wordpress.org/plugins/gutenkit-blocks-addon/',
264 'icon' => $apps_img_path. 'guten-kit.png',
265 'desc' => esc_html__('Gutenberg blocks, patterns, and templates that extend the page-building experience using the WordPress block editor.', 'shopengine'),
266 'docs' => 'https://wpmet.com/doc/gutenkit/',
267 ],
268 'metform/metform.php' => [
269 'name' => esc_html__('MetForm', 'shopengine'),
270 'url' => 'https://wordpress.org/plugins/metform/',
271 'icon' => $apps_img_path. 'metform.png',
272 'desc' => esc_html__('Drag & drop form builder for Elementor to create contact forms, multi-step forms, and more — smoother, faster, and better!', 'shopengine'),
273 'docs' => 'https://wpmet.com/doc/metform/',
274 ],
275 'emailkit/EmailKit.php' => [
276 'name' => esc_html__('EmailKit', 'shopengine'),
277 'url' => 'https://wordpress.org/plugins/emailkit/',
278 'icon' => $apps_img_path . 'emailkit.png',
279 'desc' => esc_html__('Advanced email customizer for WooCommerce and WordPress. Build, customize, and send emails from WordPress to boost your sales!', 'shopengine'),
280 'docs' => 'https://wpmet.com/doc/emailkit/',
281 ],
282 'wp-social/wp-social.php' => [
283 'name' => esc_html__('WP Social', 'shopengine'),
284 'url' => 'https://wordpress.org/plugins/wp-social/',
285 'icon' => $apps_img_path . 'wp-social.png',
286 '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'),
287 'docs' => 'https://wpmet.com/doc/wp-social/',
288 ],
289 'wp-ultimate-review/wp-ultimate-review.php' => [
290 'name' => esc_html__('WP Ultimate Review', 'shopengine'),
291 'url' => 'https://wordpress.org/plugins/wp-ultimate-review/',
292 'icon' => $apps_img_path . 'ultimate-review.png',
293 'desc' => esc_html__('Collect and showcase reviews on your website to build brand credibility and social proof with the easiest solution.','shopengine'),
294 'docs' => 'https://wpmet.com/doc/wp-ultimate-review/',
295 ],
296 'wp-fundraising-donation/wp-fundraising.php' => [
297 'name' => esc_html__('FundEngine', 'shopengine'),
298 'url' => 'https://wordpress.org/plugins/wp-fundraising-donation/',
299 'icon' => $apps_img_path . 'fundengine.png',
300 'desc' => esc_html__('Create fundraising, crowdfunding, and donation websites with PayPal and Stripe payment gateway integration.', 'shopengine'),
301 'docs' => 'https://wpmet.com/doc/fundengine/',
302 ],
303 'blocks-for-shopengine/shopengine-gutenberg-addon.php' => [
304 'name' => esc_html__('Blocks for ShopEngine', 'shopengine'),
305 'url' => 'https://wordpress.org/plugins/blocks-for-shopengine/',
306 'icon' => $apps_img_path. 'shopengine.gif',
307 'desc' => esc_html__('All in one WooCommerce solution for Gutenberg! Build your WooCommerce pages in a block editor with full customization.', 'shopengine'),
308 'docs' => 'https://wpmet.com/doc/shopengine/shopengine-gutenberg/',
309 ],
310 'genie-image-ai/genie-image-ai.php' => [
311 'name' => esc_html__('Genie Image', 'shopengine'),
312 'url' => 'https://wordpress.org/plugins/genie-image-ai/',
313 'icon' => $apps_img_path . 'genie-image.png',
314 '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.
315 ', 'shopengine'),
316 'docs' => 'https://getgenie.ai/docs/',
317 ],
318 ]
319 )
320 ->call();
321
322 // working get instance of elementor widget
323 (new Manifest())->init();
324 } );
325
326
327
328 \ShopEngine\Core\MultiLanguage\Language::instance()->init();
329
330 \ShopEngine\Core\Settings\Base::instance()->init();
331
332
333 new Libs\Select_Api\Base();
334
335 (new Module_Manifest())->init();
336
337
338 Query_Modifier::instance()->init();
339
340 (new Conflict_Manifest())->init();
341
342 // view count
343 add_action('get_header', [$this, 'shopengine_track_product_views']);
344
345 // database migrations
346 // (new \ShopEngine\Compatibility\Migrations\Migration())->init();
347 // (new \ShopEngine\Compatibility\Migrations\Temp_Migration())->init();
348
349
350 // call service providers
351
352 $service_providers = include \ShopEngine::plugin_dir().'core/service-provider-manager.php';
353 $method = 'init';
354 foreach( $service_providers as $service_provider ){
355
356 if(class_exists($service_provider) && method_exists($service_provider, $method)) {
357 $instance = new $service_provider();
358 $instance->$method();
359 }
360
361 }
362
363 add_filter('script_loader_tag', [$this, 'filter_load_type'], 99, 3);
364
365 //it will register an option in customizer for woocommerce products catelog. It's related with our Arcive Products widget.
366 Register_Settings::instance()->init();
367 }
368
369
370 // add async and defer attributes to enqueued scripts
371 public function filter_load_type($tag, $handle, $src) {
372
373 if(strpos($handle, '-async') !== false) {
374 $tag = str_replace(' src', ' async="async" src', $tag);
375 }
376
377 if(strpos($handle, '-defer') !== false) {
378 $tag = str_replace('<script ', '<script defer ', $tag);
379 }
380
381 return $tag;
382 }
383
384 /**
385 * Public function shopengine_track_product_views
386 * Adding Product Views Count Meta
387 */
388 public function shopengine_track_product_views() {
389
390 if(class_exists('WooCommerce') && !is_product()) {
391 return;
392 }
393
394 $product_id = get_the_id();
395
396 $cookie_name = "shopengine_recent_viewed_product";
397
398 if(isset($_COOKIE[$cookie_name])) {
399
400 $cookie_ids = sanitize_text_field(wp_unslash($_COOKIE[$cookie_name]));
401 $product_ids = explode(',', $cookie_ids);
402
403 if(!is_array($product_ids)) {
404 $product_ids = [$product_ids];
405 }
406
407 $product_ids = array_combine($product_ids, $product_ids);
408 unset($product_ids[$product_id]);
409 $product_ids[] = $product_id;
410
411 $cookie_value = implode(',', $product_ids);
412
413 } else {
414 $cookie_value = $product_id;
415 }
416
417 setcookie($cookie_name, $cookie_value, strtotime('+30 days'), '/' );
418
419 $count_key = 'shopengine_product_views_count';
420 $count = get_post_meta($product_id, $count_key, true);
421
422 if($count == '') {
423 $count = 1;
424 delete_post_meta($product_id, $count_key);
425 add_post_meta($product_id, $count_key, '1');
426 } else {
427 $count++;
428 update_post_meta($product_id, $count_key, $count);
429 }
430 }
431
432 /**
433 * Public function js_css_public .
434 * Include public function
435 *
436 * @since 1.0.0
437 */
438 public function js_css_public() {
439 wp_register_style('shopengine-public', \ShopEngine::plugin_url() . 'assets/css/shopengine-public.css', false, \ShopEngine::version());
440
441 // Modal Stylesheet
442 wp_register_style('shopengine-modal-styles', \ShopEngine::plugin_url() . 'assets/css/shopengine-modal.css', false, \ShopEngine::version());
443
444 // Modal Script
445 wp_register_script('shopengine-modal-script', \ShopEngine::plugin_url() . 'assets/js/shopengine-modal.js', ['jquery'], \ShopEngine::version(), true);
446
447 wp_enqueue_script('shopengine-simple-scrollbar.js-js', \ShopEngine::plugin_url() . 'assets/js/simple-scrollbar.js', [], \ShopEngine::version(), true);
448 wp_enqueue_script('shopengine-filter-js', \ShopEngine::plugin_url() . 'assets/js/filter.js', [], \ShopEngine::version(), true);
449 wp_enqueue_script('shopengine-js', \ShopEngine::plugin_url() . 'assets/js/public.js', [], \ShopEngine::version(), true);
450
451
452 wp_localize_script('shopengine-js', 'shopEngineApiSettings', [
453 'resturl' => get_rest_url(),
454 'rest_nonce' => wp_create_nonce('wp_rest'),
455 ]);
456
457
458 /**
459 * Registering libs css/js
460 *
461 */
462
463 wp_register_style(
464 'lib-sqv-css',
465 \ShopEngine::plugin_url() . '/assets/sqv/smart-quick-view.css',
466 [],
467 \ShopEngine::version()
468 );
469
470 wp_register_script(
471 'lib-sqv-js',
472 \ShopEngine::plugin_url() . 'assets/sqv/smart-quick-view.js',
473 ['jquery', 'wc-single-product'],
474 \ShopEngine::version(),
475 true
476 );
477 }
478
479 public function js_css_elementor() {
480 wp_enqueue_style('shopnegine-panel-icon', \ShopEngine::plugin_url() . 'assets/css/shopengine-icon.css', false, \ShopEngine::version());
481
482 if('shopengine-template' === get_post_type()):
483 wp_enqueue_style('shopnegine-editor-css', \ShopEngine::plugin_url() . 'assets/css/editor.css', false, \ShopEngine::version());
484 endif;
485 }
486
487
488 public function missing_woocommerce() {
489
490 if(!current_user_can('manage_options')) {
491 return;
492 }
493
494 if(file_exists(WP_PLUGIN_DIR . '/woocommerce/woocommerce.php')) {
495
496 $btn['label'] = esc_html__('Activate WooCommerce', 'shopengine');
497 $btn['url'] = wp_nonce_url('plugins.php?action=activate&plugin=woocommerce/woocommerce.php&plugin_status=all&paged=1', 'activate-plugin_woocommerce/woocommerce.php');
498
499 } else {
500
501 $btn['label'] = esc_html__('Install WooCommerce', 'shopengine');
502 $btn['url'] = wp_nonce_url(self_admin_url('update.php?action=install-plugin&plugin=woocommerce'), 'install-plugin_woocommerce');
503 }
504
505 Utils\Notice::push(
506 [
507 'id' => 'missing-woo',
508 'type' => 'error',
509 'dismissible' => true,
510 'is_required' => true,
511 'btn' => $btn,
512 'message' => sprintf(esc_html__('ShopEngine requires woocommerce Plugin, which is currently NOT RUNNING.', 'shopengine'), '4.1.0'),
513 ]
514 );
515 }
516
517
518 public function missing_elementor() {
519
520 if(!current_user_can('manage_options')) {
521 return;
522 }
523
524 if(file_exists(WP_PLUGIN_DIR . '/elementor/elementor.php')) {
525
526 $btn['label'] = esc_html__('Activate Elementor', 'shopengine');
527 $btn['url'] = wp_nonce_url('plugins.php?action=activate&plugin=elementor/elementor.php&plugin_status=all&paged=1', 'activate-plugin_elementor/elementor.php');
528
529 } else {
530
531 $btn['label'] = esc_html__('Install Elementor', 'shopengine');
532 $btn['url'] = wp_nonce_url(self_admin_url('update.php?action=install-plugin&plugin=elementor'), 'install-plugin_elementor');
533 }
534
535 if(file_exists(WP_PLUGIN_DIR . '/blocks-for-shopengine/shopengine-gutenberg-addon.php')) {
536
537 $btn2['label'] = esc_html__('Activate Blocks for ShopEngine', 'shopengine');
538 $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');
539
540 } else {
541
542 $btn2['label'] = esc_html__('Install Blocks for ShopEngine', 'shopengine');
543 $btn2['url'] = wp_nonce_url(self_admin_url('update.php?action=install-plugin&plugin=blocks-for-shopengine'), 'install-plugin_blocks-for-shopengine');
544 }
545
546 Utils\Notice::push(
547 [
548 'id' => 'missing-elementor',
549 'type' => 'error',
550 'is_required' => true,
551 'dismissible' => true,
552 'btn' => $btn,
553 'btn2' => $btn2,
554 'message' => esc_html__('To use ShopEngine, install Elementor (For the Elementor Builder) OR Blocks for ShopEngine (For Gutenberg Builder).', 'shopengine'),
555 ]
556 );
557 }
558
559
560 public function failed_elementor_version() {
561
562 if(!current_user_can('manage_options')) {
563 return;
564 }
565
566 $btn['label'] = esc_html__('Update Elementor', 'shopengine');
567 $btn['url'] = wp_nonce_url(self_admin_url('update.php?action=upgrade-plugin&plugin=elementor'), 'upgrade-plugin_elementor');
568
569 Utils\Notice::push(
570 [
571 'id' => 'unsupported-elementor-version',
572 'type' => 'error',
573 'dismissible' => true,
574 'btn' => $btn,
575 'message' => sprintf(esc_html__('ShopEngine requires Elementor version %1$s+, which is currently NOT RUNNING.', 'shopengine'), '3.0.0'),
576 ]
577 );
578 }
579
580
581 public function flush_rewrites() {
582 $form_cpt = new Core\Builders\Cpt();
583 $form_cpt->flush_rewrites();
584 }
585
586
587 public static function instance() {
588 if(!self::$instance) {
589 self::$instance = new self();
590 }
591
592 return self::$instance;
593 }
594 }
595