PluginProbe
ShopEngine Elementor WooCommerce Builder Addon – All in One WooCommerce Solution with eCommerce Templates & Woo Widgets / 4.7.7
ShopEngine Elementor WooCommerce Builder Addon – All in One WooCommerce Solution with eCommerce Templates & Woo Widgets v4.7.7
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 +200 -50 2.3.04.7.7 View file →
@@ -1,11 +1,15 @@
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;
10 14 use ShopEngine\Libs\Rating\Rating;
11 15 use ShopEngine\Libs\Updater\Init as Updater;
@@ -11,9 +15,8 @@
11 15 use ShopEngine\Libs\Updater\Init as Updater;
12 16 use ShopEngine\Modules\Manifest as Module_Manifest;
13 17 use ShopEngine\Widgets\Manifest;
14 18
15 -defined('ABSPATH') || exit;
16 19
17 20 /**
18 21 * Plugin final Class.
19 22 * Handles dynamically loading classes only when needed. Check Elementor Plugin, Woocomerce Plugin Loaded or Install.
@@ -30,11 +33,15 @@
30 33 */
31 34 public function __construct() {
32 35 // load autoload method
33 36 Autoloader::run();
37 + add_action( 'wp_ajax_shopengine_admin_action', [\ShopEngine\Utils\Util::class, 'shopengine_admin_action'] );
34 38 }
35 39
36 -
40 + public function utils_url()
41 + {
42 + return $this->plugin_url() . 'utils/';
43 + }
37 44 /**
38 45 * Public function init.
39 46 * call function for all
40 47 *
@@ -43,8 +50,11 @@
43 50 public function init() {
44 51
45 52 $error = false;
46 53
54 + // init notice class
55 + \Oxaim\Libs\Notice::init();
56 +
47 57 // check woocommerce plugin
48 58 if(!did_action('woocommerce_loaded')) {
49 59 add_action('admin_notices', [$this, 'missing_woocommerce']);
50 60
@@ -74,12 +84,14 @@
74 84
75 85 if($error) {
76 86 return;
77 87 }
78 -
88 +
79 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");
80 92
81 - $custom_links[] = '<a href="'.admin_url('edit.php?post_type=shopengine-template#getting-started').'" target="_blank">' . esc_html__('Settings', 'shopengine') . '</a>';
93 + $custom_links[] = '<a title="' . $free . '" href="'.admin_url('edit.php?post_type=shopengine-template#getting-started').'" target="_blank">' . esc_html__('Settings', 'shopengine') . '</a>';
82 94
83 95 foreach ($custom_links as $custom_link):
84 96 array_unshift($links, $custom_link);
85 97 endforeach;
@@ -84,14 +96,35 @@
84 96 array_unshift($links, $custom_link);
85 97 endforeach;
86 98
87 99 if (!is_plugin_active('shopengine-pro/shopengine-pro.php')) {
88 - $links[] = '<a href="https://wpmet.com/plugin/shopengine/pricing/" style="color:#FCB214;font-weight:700" target="_blank">' . esc_html__('Go Pro', 'shopengine') . '</a>';
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>';
89 101 }
90 102 return $links;
91 103 });
92 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 + }
93 125
126 +
94 127 /**
95 128 * Routes initialization
96 129 *
97 130 */
@@ -104,45 +137,23 @@
104 137 add_action('admin_init', function () {
105 138 if(class_exists('ShopEngine_Pro')) {
106 139 new Updater();
107 140 }
141 + new \ShopEngine\Compatibility\Migrations\Direct_Checkout;
108 142 });
109 143
110 144
111 145 add_action('wp_loaded', function () {
112 -
113 - if(isset($_REQUEST['preview']) && $_REQUEST['preview'] == 'true' && !empty($_REQUEST['preview_id'])) {
114 -
115 - $pid = (int)$_REQUEST['preview_id'];
116 -
117 - $po = get_post($pid);
118 -
119 - if($po->post_type === Template_Cpt::TYPE) {
120 -
121 - $template = \ShopEngine\Core\Builders\Templates::get_registered_template_data($pid);
122 -
123 - if(empty($template) || !isset($template['url'])) {
124 - return;
125 - }
126 -
127 - $param = [
128 - 'shopengine_template_id' => $pid,
129 - 'preview_nonce' => wp_create_nonce('template_preview_' . $pid),
130 - 'change_template' => '1',
131 - ];
132 -
133 - $url = \ShopEngine\Utils\Helper::add_to_url($template['url'], $param);
134 -
135 - wp_safe_redirect($url);
136 - exit;
137 - }
138 - }
146 + /**
147 + * migrate data
148 + */
149 + LangMigration::instance()->init();
139 150 });
140 151
141 152 // avoid themes for loading woocommerce functions
142 - $avoid_themes = ['avada', 'avada child'];
153 + $avoid_themes = ['avada', 'woodmart', 'Avada', 'Woodmart'];
143 154
144 - if(!in_array(strtolower(wp_get_theme()), $avoid_themes)) {
155 + if( !in_array(get_template(), $avoid_themes) ) {
145 156 /**
146 157 * Ensuring woocommerce functions are loaded before theme is modifying those
147 158 *
148 159 */
@@ -169,21 +180,143 @@
169 180 add_theme_support('wc-product-gallery-lightbox');
170 181 add_theme_support('wc-product-gallery-slider');
171 182 }
172 183
184 +
185 + $filter_string = ''; // elementskit,metform-pro
186 + $filter_string .= ((!in_array('elementskit/elementskit.php', apply_filters('active_plugins', get_option('active_plugins')))) ? '' : ',elementskit');
187 + $filter_string .= (!class_exists('\MetForm\Plugin') ? '' : ',metform');
188 + $filter_string .= (!class_exists('\MetForm_Pro\Plugin') ? '' : ',metform-pro');
189 +
173 190 #Registering new post-type & etc
174 191 Base::instance()->init();
192 +
175 193
176 194 Rating::instance('shopengine')
177 195 ->set_plugin( 'ShopEngine', 'https://wpmet.com/wordpress.org/rating/shopengine' )
196 + ->set_rating_url( 'https://wordpress.org/support/plugin/shopengine/reviews/#new-post' )
178 197 ->set_plugin_logo( 'https://ps.w.org/shopengine/assets/icon-256x256.gif?rev=2505061', 'width:150px !important' )
179 - ->set_priority( 10 )
198 + ->set_priority( 11 )
180 199 ->set_first_appear_day( 7 )
181 200 ->set_condition( true )
182 201 ->call();
202 +
203 + if ( is_admin() && \ShopEngine\Utils\Util::get_settings( 'shopengine_user_consent_for_banner', 'true' ) == 'true' ) {
183 204
205 + /**
206 + * Show WPMET stories widget in dashboard
207 + */
208 +
209 + \Wpmet\Libs\Stories::instance('shopengine')
210 +
211 + ->set_filter($filter_string)
212 + ->set_plugin('ShopEngine', 'https://wpmet.com/plugin/shopengine/')
213 + ->set_api_url('https://api.wpmet.com/public/stories/')
214 + ->call();
215 +
216 + // banner
217 + \Wpmet\Libs\Banner::instance('shopengine')
218 + ->set_filter(ltrim($filter_string, ','))
219 + ->set_api_url('https://api.wpmet.com/public/jhanda')
220 + ->set_plugin_screens('edit-shopengine-template')
221 + ->set_plugin_screens('edit-shopengine-template')
222 + ->call();
223 + }
224 +
225 + $apps_img_path = \ShopEngine::plugin_url() . 'assets/images/apps-page/';
226 + /**
227 + * Show our plugins menu for others wpmet plugins
228 + */
229 + \ShopEngine\Wpmet\Libs\Plugins::instance()->init('shopengine')
230 + ->set_parent_menu_slug('shopengine-settings')
231 + ->set_submenu_name('Our Plugins')
232 + ->set_section_title('Get More out of Your WooCommerce Website!')
233 + ->set_section_description('Install other plugins from us and take your WooCommerce site to the next level for absolutely free!')
234 + ->set_items_per_row(4)
235 + ->set_plugins(
236 + [
237 + 'elementskit-lite/elementskit-lite.php' => [
238 + 'name' => esc_html__('ElementsKit', 'shopengine'),
239 + 'url' => 'https://wordpress.org/plugins/elementskit-lite/',
240 + 'icon' => $apps_img_path. 'elementskit.gif',
241 + 'desc' => esc_html__('All-in-one Elementor addon trusted by 1 Million+ users, makes your website builder process easier with ultimate freedom.', 'shopengine'),
242 + 'docs' => 'https://wpmet.com/doc/elementskit/',
243 + ],
244 + 'getgenie/getgenie.php' => [
245 + 'name' => esc_html__('GetGenie', 'shopengine'),
246 + 'url' => 'https://wordpress.org/plugins/getgenie/',
247 + 'icon' => $apps_img_path.'getgenie.gif',
248 + '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'),
249 + 'docs' => 'https://getgenie.ai/docs/',
250 + ],
251 + 'gutenkit-blocks-addon/gutenkit-blocks-addon.php' => [
252 + 'name' => esc_html__('GutenKit', 'shopengine'),
253 + 'url' => 'https://wordpress.org/plugins/gutenkit-blocks-addon/',
254 + 'icon' => $apps_img_path. 'guten-kit.png',
255 + 'desc' => esc_html__('Gutenberg blocks, patterns, and templates that extend the page-building experience using the WordPress block editor.', 'shopengine'),
256 + 'docs' => 'https://wpmet.com/doc/gutenkit/',
257 + ],
258 + 'metform/metform.php' => [
259 + 'name' => esc_html__('MetForm', 'shopengine'),
260 + 'url' => 'https://wordpress.org/plugins/metform/',
261 + 'icon' => $apps_img_path. 'metform.png',
262 + 'desc' => esc_html__('Drag & drop form builder for Elementor to create contact forms, multi-step forms, and more — smoother, faster, and better!', 'shopengine'),
263 + 'docs' => 'https://wpmet.com/doc/metform/',
264 + ],
265 + 'emailkit/EmailKit.php' => [
266 + 'name' => esc_html__('EmailKit', 'shopengine'),
267 + 'url' => 'https://wordpress.org/plugins/emailkit/',
268 + 'icon' => $apps_img_path . 'emailkit.png',
269 + 'desc' => esc_html__('Advanced email customizer for WooCommerce and WordPress. Build, customize, and send emails from WordPress to boost your sales!', 'shopengine'),
270 + 'docs' => 'https://wpmet.com/doc/emailkit/',
271 + ],
272 + 'wp-social/wp-social.php' => [
273 + 'name' => esc_html__('WP Social', 'shopengine'),
274 + 'url' => 'https://wordpress.org/plugins/wp-social/',
275 + 'icon' => $apps_img_path . 'wp-social.png',
276 + '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'),
277 + 'docs' => 'https://wpmet.com/doc/wp-social/',
278 + ],
279 + 'wp-ultimate-review/wp-ultimate-review.php' => [
280 + 'name' => esc_html__('WP Ultimate Review', 'shopengine'),
281 + 'url' => 'https://wordpress.org/plugins/wp-ultimate-review/',
282 + 'icon' => $apps_img_path . 'ultimate-review.png',
283 + 'desc' => esc_html__('Collect and showcase reviews on your website to build brand credibility and social proof with the easiest solution.','shopengine'),
284 + 'docs' => 'https://wpmet.com/doc/wp-ultimate-review/',
285 + ],
286 + 'wp-fundraising-donation/wp-fundraising.php' => [
287 + 'name' => esc_html__('FundEngine', 'shopengine'),
288 + 'url' => 'https://wordpress.org/plugins/wp-fundraising-donation/',
289 + 'icon' => $apps_img_path . 'fundengine.png',
290 + 'desc' => esc_html__('Create fundraising, crowdfunding, and donation websites with PayPal and Stripe payment gateway integration.', 'shopengine'),
291 + 'docs' => 'https://wpmet.com/doc/fundengine/',
292 + ],
293 + 'blocks-for-shopengine/shopengine-gutenberg-addon.php' => [
294 + 'name' => esc_html__('Blocks for ShopEngine', 'shopengine'),
295 + 'url' => 'https://wordpress.org/plugins/blocks-for-shopengine/',
296 + 'icon' => $apps_img_path. 'shopengine.gif',
297 + 'desc' => esc_html__('All in one WooCommerce solution for Gutenberg! Build your WooCommerce pages in a block editor with full customization.', 'shopengine'),
298 + 'docs' => 'https://wpmet.com/doc/shopengine/shopengine-gutenberg/',
299 + ],
300 + 'genie-image-ai/genie-image-ai.php' => [
301 + 'name' => esc_html__('Genie Image', 'shopengine'),
302 + 'url' => 'https://wordpress.org/plugins/genie-image-ai/',
303 + 'icon' => $apps_img_path . 'genie-image.png',
304 + '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.
305 + ', 'shopengine'),
306 + 'docs' => 'https://getgenie.ai/docs/',
307 + ],
308 + ]
309 + )
310 + ->call();
311 +
312 +
313 +
314 + \ShopEngine\Core\MultiLanguage\Language::instance()->init();
315 +
184 316 \ShopEngine\Core\Settings\Base::instance()->init();
185 317
318 +
186 319 new Libs\Select_Api\Base();
187 320
188 321 (new Module_Manifest())->init();
189 322
@@ -198,9 +331,9 @@
198 331 add_action('get_header', [$this, 'shopengine_track_product_views']);
199 332
200 333 // database migrations
201 334 // (new \ShopEngine\Compatibility\Migrations\Migration())->init();
202 - (new \ShopEngine\Compatibility\Migrations\Temp_Migration())->init();
335 + // (new \ShopEngine\Compatibility\Migrations\Temp_Migration())->init();
203 336
204 337
205 338 // call service providers
206 339
@@ -214,11 +347,12 @@
214 347 }
215 348
216 349 }
217 350
351 + add_filter('script_loader_tag', [$this, 'filter_load_type'], 99, 3);
218 352
219 -
220 - add_filter('script_loader_tag', [$this, 'filter_load_type'], 99, 3);
353 + //it will register an option in customizer for woocommerce products catelog. It's related with our Arcive Products widget.
354 + Register_Settings::instance()->init();
221 355 }
222 356
223 357
224 358 // add async and defer attributes to enqueued scripts
@@ -250,9 +384,9 @@
250 384 $cookie_name = "shopengine_recent_viewed_product";
251 385
252 386 if(isset($_COOKIE[$cookie_name])) {
253 387
254 - $cookie_ids = $_COOKIE[$cookie_name];
388 + $cookie_ids = sanitize_text_field(wp_unslash($_COOKIE[$cookie_name]));
255 389 $product_ids = explode(',', $cookie_ids);
256 390
257 391 if(!is_array($product_ids)) {
258 392 $product_ids = [$product_ids];
@@ -288,12 +422,10 @@
288 422 * Include public function
289 423 *
290 424 * @since 1.0.0
291 425 */
292 - public function js_css_public() {
293 - wp_enqueue_style('shopengine-icon', \ShopEngine::plugin_url() . 'assets/css/shopengine-icon.css', false, \ShopEngine::version());
294 - wp_enqueue_style('shopengine-simple-scrollbar-css', \ShopEngine::plugin_url() . 'assets/css/simple-scrollbar.css', false, \ShopEngine::version());
295 - wp_enqueue_style('shopengine-public-css', \ShopEngine::plugin_url() . 'assets/css/public-style.css', false, \ShopEngine::version());
426 + public function js_css_public() {
427 + wp_register_style('shopengine-public', \ShopEngine::plugin_url() . 'assets/css/shopengine-public.css', false, \ShopEngine::version());
296 428
297 429 // Modal Stylesheet
298 430 wp_register_style('shopengine-modal-styles', \ShopEngine::plugin_url() . 'assets/css/shopengine-modal.css', false, \ShopEngine::version());
299 431
@@ -342,11 +474,11 @@
342 474
343 475
344 476 public function missing_woocommerce() {
345 477
346 - if(isset($_GET['activate'])) {
347 - unset($_GET['activate']);
348 - }
478 + if(!current_user_can('manage_options')) {
479 + return;
480 + }
349 481
350 482 if(file_exists(WP_PLUGIN_DIR . '/woocommerce/woocommerce.php')) {
351 483
352 484 $btn['label'] = esc_html__('Activate WooCommerce', 'shopengine');
@@ -362,8 +494,9 @@
362 494 [
363 495 'id' => 'missing-woo',
364 496 'type' => 'error',
365 497 'dismissible' => true,
498 + 'is_required' => true,
366 499 'btn' => $btn,
367 500 'message' => sprintf(esc_html__('ShopEngine requires woocommerce Plugin, which is currently NOT RUNNING.', 'shopengine'), '4.1.0'),
368 501 ]
369 502 );
@@ -371,11 +504,11 @@
371 504
372 505
373 506 public function missing_elementor() {
374 507
375 - if(isset($_GET['activate'])) {
376 - unset($_GET['activate']);
377 - }
508 + if(!current_user_can('manage_options')) {
509 + return;
510 + }
378 511
379 512 if(file_exists(WP_PLUGIN_DIR . '/elementor/elementor.php')) {
380 513
381 514 $btn['label'] = esc_html__('Activate Elementor', 'shopengine');
@@ -386,15 +519,28 @@
386 519 $btn['label'] = esc_html__('Install Elementor', 'shopengine');
387 520 $btn['url'] = wp_nonce_url(self_admin_url('update.php?action=install-plugin&plugin=elementor'), 'install-plugin_elementor');
388 521 }
389 522
523 + if(file_exists(WP_PLUGIN_DIR . '/blocks-for-shopengine/shopengine-gutenberg-addon.php')) {
524 +
525 + $btn2['label'] = esc_html__('Activate Blocks for ShopEngine', 'shopengine');
526 + $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');
527 +
528 + } else {
529 +
530 + $btn2['label'] = esc_html__('Install Blocks for ShopEngine', 'shopengine');
531 + $btn2['url'] = wp_nonce_url(self_admin_url('update.php?action=install-plugin&plugin=blocks-for-shopengine'), 'install-plugin_blocks-for-shopengine');
532 + }
533 +
390 534 Utils\Notice::push(
391 535 [
392 536 'id' => 'missing-elementor',
393 537 'type' => 'error',
538 + 'is_required' => true,
394 539 'dismissible' => true,
395 540 'btn' => $btn,
396 - 'message' => sprintf(esc_html__('ShopEngine requires Elementor version %1$s+, which is currently NOT RUNNING.', 'shopengine'), '3.0.0'),
541 + 'btn2' => $btn2,
542 + 'message' => esc_html__('To use ShopEngine, install Elementor (For the Elementor Builder) OR Blocks for ShopEngine (For Gutenberg Builder).', 'shopengine'),
397 543 ]
398 544 );
399 545 }
400 546
@@ -399,8 +545,12 @@
399 545 }
400 546
401 547
402 548 public function failed_elementor_version() {
549 +
550 + if(!current_user_can('manage_options')) {
551 + return;
552 + }
403 553
404 554 $btn['label'] = esc_html__('Update Elementor', 'shopengine');
405 555 $btn['url'] = wp_nonce_url(self_admin_url('update.php?action=upgrade-plugin&plugin=elementor'), 'upgrade-plugin_elementor');
406 556