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