PluginProbe ʕ •ᴥ•ʔ
ShopEngine Elementor WooCommerce Builder Addon – All in One WooCommerce Solution / 4.7.4
ShopEngine Elementor WooCommerce Builder Addon – All in One WooCommerce Solution v4.7.4
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
570 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_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
306 new Libs\Select_Api\Base();
307
308 (new Module_Manifest())->init();
309
310 // working get instance of elementor widget
311 (new Manifest())->init();
312
313 Query_Modifier::instance()->init();
314
315 (new Conflict_Manifest())->init();
316
317 // view count
318 add_action('get_header', [$this, 'shopengine_track_product_views']);
319
320 // database migrations
321 // (new \ShopEngine\Compatibility\Migrations\Migration())->init();
322 // (new \ShopEngine\Compatibility\Migrations\Temp_Migration())->init();
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
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();
342 }
343
344
345 // add async and defer attributes to enqueued scripts
346 public function filter_load_type($tag, $handle, $src) {
347
348 if(strpos($handle, '-async') !== false) {
349 $tag = str_replace(' src', ' async="async" src', $tag);
350 }
351
352 if(strpos($handle, '-defer') !== false) {
353 $tag = str_replace('<script ', '<script defer ', $tag);
354 }
355
356 return $tag;
357 }
358
359 /**
360 * Public function shopengine_track_product_views
361 * Adding Product Views Count Meta
362 */
363 public function shopengine_track_product_views() {
364
365 if(class_exists('WooCommerce') && !is_product()) {
366 return;
367 }
368
369 $product_id = get_the_id();
370
371 $cookie_name = "shopengine_recent_viewed_product";
372
373 if(isset($_COOKIE[$cookie_name])) {
374
375 $cookie_ids = sanitize_text_field(wp_unslash($_COOKIE[$cookie_name]));
376 $product_ids = explode(',', $cookie_ids);
377
378 if(!is_array($product_ids)) {
379 $product_ids = [$product_ids];
380 }
381
382 $product_ids = array_combine($product_ids, $product_ids);
383 unset($product_ids[$product_id]);
384 $product_ids[] = $product_id;
385
386 $cookie_value = implode(',', $product_ids);
387
388 } else {
389 $cookie_value = $product_id;
390 }
391
392 setcookie($cookie_name, $cookie_value, strtotime('+30 days'), '/' );
393
394 $count_key = 'shopengine_product_views_count';
395 $count = get_post_meta($product_id, $count_key, true);
396
397 if($count == '') {
398 $count = 1;
399 delete_post_meta($product_id, $count_key);
400 add_post_meta($product_id, $count_key, '1');
401 } else {
402 $count++;
403 update_post_meta($product_id, $count_key, $count);
404 }
405 }
406
407 /**
408 * Public function js_css_public .
409 * Include public function
410 *
411 * @since 1.0.0
412 */
413 public function js_css_public() {
414 wp_register_style('shopengine-public', \ShopEngine::plugin_url() . 'assets/css/shopengine-public.css', false, \ShopEngine::version());
415
416 // Modal Stylesheet
417 wp_register_style('shopengine-modal-styles', \ShopEngine::plugin_url() . 'assets/css/shopengine-modal.css', false, \ShopEngine::version());
418
419 // Modal Script
420 wp_register_script('shopengine-modal-script', \ShopEngine::plugin_url() . 'assets/js/shopengine-modal.js', ['jquery'], \ShopEngine::version(), true);
421
422 wp_enqueue_script('shopengine-simple-scrollbar.js-js', \ShopEngine::plugin_url() . 'assets/js/simple-scrollbar.js', [], \ShopEngine::version(), true);
423 wp_enqueue_script('shopengine-filter-js', \ShopEngine::plugin_url() . 'assets/js/filter.js', [], \ShopEngine::version(), true);
424 wp_enqueue_script('shopengine-js', \ShopEngine::plugin_url() . 'assets/js/public.js', [], \ShopEngine::version(), true);
425
426
427 wp_localize_script('shopengine-js', 'shopEngineApiSettings', [
428 'resturl' => get_rest_url(),
429 'rest_nonce' => wp_create_nonce('wp_rest'),
430 ]);
431
432
433 /**
434 * Registering libs css/js
435 *
436 */
437
438 wp_register_style(
439 'lib-sqv-css',
440 \ShopEngine::plugin_url() . '/assets/sqv/smart-quick-view.css',
441 [],
442 \ShopEngine::version()
443 );
444
445 wp_register_script(
446 'lib-sqv-js',
447 \ShopEngine::plugin_url() . 'assets/sqv/smart-quick-view.js',
448 ['jquery', 'wc-single-product'],
449 \ShopEngine::version(),
450 true
451 );
452 }
453
454 public function js_css_elementor() {
455 wp_enqueue_style('shopnegine-panel-icon', \ShopEngine::plugin_url() . 'assets/css/shopengine-icon.css', false, \ShopEngine::version());
456
457 if('shopengine-template' === get_post_type()):
458 wp_enqueue_style('shopnegine-editor-css', \ShopEngine::plugin_url() . 'assets/css/editor.css', false, \ShopEngine::version());
459 endif;
460 }
461
462
463 public function missing_woocommerce() {
464
465 if(!current_user_can('manage_options')) {
466 return;
467 }
468
469 if(file_exists(WP_PLUGIN_DIR . '/woocommerce/woocommerce.php')) {
470
471 $btn['label'] = esc_html__('Activate WooCommerce', 'shopengine');
472 $btn['url'] = wp_nonce_url('plugins.php?action=activate&plugin=woocommerce/woocommerce.php&plugin_status=all&paged=1', 'activate-plugin_woocommerce/woocommerce.php');
473
474 } else {
475
476 $btn['label'] = esc_html__('Install WooCommerce', 'shopengine');
477 $btn['url'] = wp_nonce_url(self_admin_url('update.php?action=install-plugin&plugin=woocommerce'), 'install-plugin_woocommerce');
478 }
479
480 Utils\Notice::push(
481 [
482 'id' => 'missing-woo',
483 'type' => 'error',
484 'dismissible' => true,
485 'is_required' => true,
486 'btn' => $btn,
487 'message' => sprintf(esc_html__('ShopEngine requires woocommerce Plugin, which is currently NOT RUNNING.', 'shopengine'), '4.1.0'),
488 ]
489 );
490 }
491
492
493 public function missing_elementor() {
494
495 if(!current_user_can('manage_options')) {
496 return;
497 }
498
499 if(file_exists(WP_PLUGIN_DIR . '/elementor/elementor.php')) {
500
501 $btn['label'] = esc_html__('Activate Elementor', 'shopengine');
502 $btn['url'] = wp_nonce_url('plugins.php?action=activate&plugin=elementor/elementor.php&plugin_status=all&paged=1', 'activate-plugin_elementor/elementor.php');
503
504 } else {
505
506 $btn['label'] = esc_html__('Install Elementor', 'shopengine');
507 $btn['url'] = wp_nonce_url(self_admin_url('update.php?action=install-plugin&plugin=elementor'), 'install-plugin_elementor');
508 }
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
521 Utils\Notice::push(
522 [
523 'id' => 'missing-elementor',
524 'type' => 'error',
525 'is_required' => true,
526 'dismissible' => true,
527 'btn' => $btn,
528 'btn2' => $btn2,
529 'message' => esc_html__('To use ShopEngine, install Elementor (For the Elementor Builder) OR Blocks for ShopEngine (For Gutenberg Builder).', 'shopengine'),
530 ]
531 );
532 }
533
534
535 public function failed_elementor_version() {
536
537 if(!current_user_can('manage_options')) {
538 return;
539 }
540
541 $btn['label'] = esc_html__('Update Elementor', 'shopengine');
542 $btn['url'] = wp_nonce_url(self_admin_url('update.php?action=upgrade-plugin&plugin=elementor'), 'upgrade-plugin_elementor');
543
544 Utils\Notice::push(
545 [
546 'id' => 'unsupported-elementor-version',
547 'type' => 'error',
548 'dismissible' => true,
549 'btn' => $btn,
550 'message' => sprintf(esc_html__('ShopEngine requires Elementor version %1$s+, which is currently NOT RUNNING.', 'shopengine'), '3.0.0'),
551 ]
552 );
553 }
554
555
556 public function flush_rewrites() {
557 $form_cpt = new Core\Builders\Cpt();
558 $form_cpt->flush_rewrites();
559 }
560
561
562 public static function instance() {
563 if(!self::$instance) {
564 self::$instance = new self();
565 }
566
567 return self::$instance;
568 }
569 }
570