PluginProbe
ShopEngine Elementor WooCommerce Builder Addon – All in One WooCommerce Solution with eCommerce Templates & Woo Widgets / 4.6.5
ShopEngine Elementor WooCommerce Builder Addon – All in One WooCommerce Solution with eCommerce Templates & Woo Widgets v4.6.5
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 +228 -85 2.0.04.6.5 View file →
@@ -1,18 +1,22 @@
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;
14 +use ShopEngine\Libs\Rating\Rating;
10 15 use ShopEngine\Libs\Updater\Init as Updater;
11 16 use ShopEngine\Modules\Manifest as Module_Manifest;
12 17 use ShopEngine\Widgets\Manifest;
13 18
14 -defined('ABSPATH') || exit;
15 19
16 20 /**
17 21 * Plugin final Class.
18 22 * Handles dynamically loading classes only when needed. Check Elementor Plugin, Woocomerce Plugin Loaded or Install.
@@ -29,11 +33,15 @@
29 33 */
30 34 public function __construct() {
31 35 // load autoload method
32 36 Autoloader::run();
37 + add_action( 'wp_ajax_shopengine_admin_action', [\ShopEngine\Utils\Util::class, 'shopengine_admin_action'] );
33 38 }
34 39
35 -
40 + public function utils_url()
41 + {
42 + return $this->plugin_url() . 'utils/';
43 + }
36 44 /**
37 45 * Public function init.
38 46 * call function for all
39 47 *
@@ -42,8 +50,11 @@
42 50 public function init() {
43 51
44 52 $error = false;
45 53
54 + // init notice class
55 + \Oxaim\Libs\Notice::init();
56 +
46 57 // check woocommerce plugin
47 58 if(!did_action('woocommerce_loaded')) {
48 59 add_action('admin_notices', [$this, 'missing_woocommerce']);
49 60
@@ -49,30 +60,38 @@
49 60
50 61 $error = true;
51 62 }
52 63
64 + $check_elementor_version = false;
65 +
53 66 // Check if Elementor installed and activated.
54 - if(!did_action('elementor/loaded')) {
55 - add_action('admin_notices', [$this, 'missing_elementor']);
67 + if(!did_action('elementor/loaded')) {
56 68
57 - $error = true;
58 - }
69 + if(!did_action('shopengine-gutenberg-addon/before_loaded')) {
59 70
71 + add_action('admin_notices', [$this, 'missing_elementor']);
72 +
73 + $error = true;
74 + }
75 + }
76 +
60 77 // Check for required Elementor version.
61 - if(defined('ELEMENTOR_VERSION') && !version_compare(ELEMENTOR_VERSION, '3.0.0', '>=')) {
62 - add_action('admin_notices', [$this, 'failed_elementor_version']);
78 + if(did_action('elementor/loaded') && defined('ELEMENTOR_VERSION') && !version_compare(ELEMENTOR_VERSION, '3.0.0', '>=')) {
63 79
64 - $error = true;
65 - }
80 + add_action('admin_notices', [$this, 'failed_elementor_version']);
66 81
82 + $error = true;
83 + }
84 +
67 85 if($error) {
68 -
69 86 return;
70 87 }
71 -
88 +
72 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");
73 92
74 - $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>';
75 94
76 95 foreach ($custom_links as $custom_link):
77 96 array_unshift($links, $custom_link);
78 97 endforeach;
@@ -77,14 +96,23 @@
77 96 array_unshift($links, $custom_link);
78 97 endforeach;
79 98
80 99 if (!is_plugin_active('shopengine-pro/shopengine-pro.php')) {
81 - $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>';
82 101 }
83 102 return $links;
84 103 });
85 104
105 + /**
106 + * EmailKit Global Class initialization
107 + *
108 + */
109 + if( !did_action('edit_with_emailkit_loaded') && class_exists('\Wpmet\Libs\Emailkit') && \ShopEngine\Utils\Util::get_settings( 'shopengine_user_consent_for_banner', 'true' ) == 'true' ) {
86 110
111 + new \Wpmet\Libs\Emailkit();
112 + }
113 +
114 +
87 115 /**
88 116 * Routes initialization
89 117 *
90 118 */
@@ -97,62 +125,22 @@
97 125 add_action('admin_init', function () {
98 126 if(class_exists('ShopEngine_Pro')) {
99 127 new Updater();
100 128 }
101 -
129 + new \ShopEngine\Compatibility\Migrations\Direct_Checkout;
102 130 });
103 131
104 - global $pagenow;
105 132
106 - if(is_admin() && $pagenow == 'post.php' && $_REQUEST['action'] === 'edit') {
107 -
108 - $pid = $_REQUEST['post'];
109 - $po = get_post($pid);
110 -
111 - if($po->post_type === Template_Cpt::TYPE) {
112 -
113 - $url = get_admin_url() . 'edit.php?post_type=' . Template_Cpt::TYPE . '#' . Template_Cpt::TYPE;
114 -
115 - wp_safe_redirect($url);
116 - exit;
117 - }
118 - }
119 -
120 133 add_action('wp_loaded', function () {
121 -
122 - if(isset($_REQUEST['preview']) && $_REQUEST['preview'] == 'true' && !empty($_REQUEST['preview_id'])) {
123 -
124 - $pid = (int)$_REQUEST['preview_id'];
125 -
126 - $po = get_post($pid);
127 -
128 - if($po->post_type === Template_Cpt::TYPE) {
129 -
130 - $template = \ShopEngine\Core\Builders\Templates::get_registered_template_data($pid);
131 -
132 - if(empty($template) || !isset($template['url'])) {
133 - return;
134 - }
135 -
136 - $param = [
137 - 'shopengine_template_id' => $pid,
138 - 'preview_nonce' => wp_create_nonce('template_preview_' . $pid),
139 - 'change_template' => '1',
140 - ];
141 -
142 - $url = \ShopEngine\Utils\Helper::add_to_url($template['url'], $param);
143 -
144 - wp_safe_redirect($url);
145 - exit;
146 - }
147 - }
134 + /**
135 + * migrate data
136 + */
137 + LangMigration::instance()->init();
148 138 });
149 139
150 -
151 140 // avoid themes for loading woocommerce functions
152 - $avoid_themes = ['avada'];
153 -
154 - if( !in_array( strtolower(wp_get_theme()), $avoid_themes) ) {
141 + $avoid_themes = ['avada', 'avada child', 'woodmart', 'woodmart child'];
142 + if(!in_array(strtolower(wp_get_theme()), $avoid_themes)) {
155 143 /**
156 144 * Ensuring woocommerce functions are loaded before theme is modifying those
157 145 *
158 146 */
@@ -158,14 +146,20 @@
158 146 */
159 147 require_once WC_ABSPATH . '/includes/wc-template-functions.php';
160 148 }
161 149
162 - // Load custom elementor controls
163 - new \ShopEngine\Core\Elementor_Controls\Init();
164 150
165 - //Loading the scripts and styles
151 + if(did_action('elementor/loaded')) {
152 + // Load custom elementor controls
153 + new \ShopEngine\Core\Elementor_Controls\Init();
154 +
155 + //Loading the scripts and styles
156 + add_action('elementor/editor/after_enqueue_styles', [$this, 'js_css_elementor']);
157 + }
158 +
159 +
160 + //Loading public scripts and styles
166 161 add_action('wp_enqueue_scripts', [$this, 'js_css_public']);
167 - add_action('elementor/editor/after_enqueue_styles', [$this, 'js_css_elementor']);
168 162
169 163 //woocommece theme support
170 164 if(!current_theme_supports('woocommerce')) {
171 165 add_theme_support('woocommerce');
@@ -173,14 +167,142 @@
173 167 add_theme_support('wc-product-gallery-lightbox');
174 168 add_theme_support('wc-product-gallery-slider');
175 169 }
176 170
177 -
171 +
172 + $filter_string = ''; // elementskit,metform-pro
173 + $filter_string .= ((!in_array('elementskit/elementskit.php', apply_filters('active_plugins', get_option('active_plugins')))) ? '' : ',elementskit');
174 + $filter_string .= (!class_exists('\MetForm\Plugin') ? '' : ',metform');
175 + $filter_string .= (!class_exists('\MetForm_Pro\Plugin') ? '' : ',metform-pro');
176 +
178 177 #Registering new post-type & etc
179 178 Base::instance()->init();
180 179
181 - \ShopEngine\Core\Settings\Base::instance()->init();
182 180
181 + Rating::instance('shopengine')
182 + ->set_plugin( 'ShopEngine', 'https://wpmet.com/wordpress.org/rating/shopengine' )
183 + ->set_plugin_logo( 'https://ps.w.org/shopengine/assets/icon-256x256.gif?rev=2505061', 'width:150px !important' )
184 + ->set_priority( 11 )
185 + ->set_first_appear_day( 7 )
186 + ->set_condition( true )
187 + ->call();
188 +
189 + if ( is_admin() && \ShopEngine\Utils\Util::get_settings( 'shopengine_user_consent_for_banner', 'true' ) == 'true' ) {
190 +
191 + /**
192 + * Show WPMET stories widget in dashboard
193 + */
194 +
195 + \Wpmet\Libs\Stories::instance('shopengine')
196 +
197 + ->set_filter($filter_string)
198 + ->set_plugin('ShopEngine', 'https://wpmet.com/plugin/shopengine/')
199 + ->set_api_url('https://api.wpmet.com/public/stories/')
200 + ->call();
201 +
202 + // banner
203 + \Wpmet\Libs\Banner::instance('shopengine')
204 + ->set_filter(ltrim($filter_string, ','))
205 + ->set_api_url('https://api.wpmet.com/public/jhanda')
206 + ->set_plugin_screens('edit-shopengine-template')
207 + ->set_plugin_screens('edit-shopengine-template')
208 + ->call();
209 + }
210 +
211 + $apps_img_path = \ShopEngine::plugin_url() . 'assets/images/apps-page/';
212 + /**
213 + * Show our plugins menu for others wpmet plugins
214 + */
215 + \ShopEngine\Wpmet\Libs\Plugins::instance()->init('shopengine')
216 + ->set_parent_menu_slug('shopengine-settings')
217 + ->set_submenu_name('Our Plugins')
218 + ->set_section_title('Get More out of Your WooCommerce Website!')
219 + ->set_section_description('Install other plugins from us and take your WooCommerce site to the next level for absolutely free!')
220 + ->set_items_per_row(4)
221 + ->set_plugins(
222 + [
223 + 'elementskit-lite/elementskit-lite.php' => [
224 + 'name' => esc_html__('ElementsKit', 'shopengine'),
225 + 'url' => 'https://wordpress.org/plugins/elementskit-lite/',
226 + 'icon' => $apps_img_path. 'elementskit.gif',
227 + 'desc' => esc_html__('All-in-one Elementor addon trusted by 1 Million+ users, makes your website builder process easier with ultimate freedom.', 'shopengine'),
228 + 'docs' => 'https://wpmet.com/doc/elementskit/',
229 + ],
230 + 'getgenie/getgenie.php' => [
231 + 'name' => esc_html__('GetGenie', 'shopengine'),
232 + 'url' => 'https://wordpress.org/plugins/getgenie/',
233 + 'icon' => $apps_img_path.'getgenie.gif',
234 + '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'),
235 + 'docs' => 'https://getgenie.ai/docs/',
236 + ],
237 + 'gutenkit-blocks-addon/gutenkit-blocks-addon.php' => [
238 + 'name' => esc_html__('GutenKit', 'shopengine'),
239 + 'url' => 'https://wordpress.org/plugins/gutenkit-blocks-addon/',
240 + 'icon' => $apps_img_path. 'guten-kit.png',
241 + 'desc' => esc_html__('Gutenberg blocks, patterns, and templates that extend the page-building experience using the WordPress block editor.', 'shopengine'),
242 + 'docs' => 'https://wpmet.com/doc/gutenkit/',
243 + ],
244 + 'metform/metform.php' => [
245 + 'name' => esc_html__('MetForm', 'shopengine'),
246 + 'url' => 'https://wordpress.org/plugins/metform/',
247 + 'icon' => $apps_img_path. 'metform.png',
248 + 'desc' => esc_html__('Drag & drop form builder for Elementor to create contact forms, multi-step forms, and more — smoother, faster, and better!', 'shopengine'),
249 + 'docs' => 'https://wpmet.com/doc/metform/',
250 + ],
251 + 'emailkit/EmailKit.php' => [
252 + 'name' => esc_html__('EmailKit', 'shopengine'),
253 + 'url' => 'https://wordpress.org/plugins/emailkit/',
254 + 'icon' => $apps_img_path . 'emailkit.png',
255 + 'desc' => esc_html__('Advanced email customizer for WooCommerce and WordPress. Build, customize, and send emails from WordPress to boost your sales!', 'shopengine'),
256 + 'docs' => 'https://wpmet.com/doc/emailkit/',
257 + ],
258 + 'wp-social/wp-social.php' => [
259 + 'name' => esc_html__('WP Social', 'shopengine'),
260 + 'url' => 'https://wordpress.org/plugins/wp-social/',
261 + 'icon' => $apps_img_path . 'wp-social.png',
262 + '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'),
263 + 'docs' => 'https://wpmet.com/doc/wp-social/',
264 + ],
265 + 'wp-ultimate-review/wp-ultimate-review.php' => [
266 + 'name' => esc_html__('WP Ultimate Review', 'shopengine'),
267 + 'url' => 'https://wordpress.org/plugins/wp-ultimate-review/',
268 + 'icon' => $apps_img_path . 'ultimate-review.png',
269 + 'desc' => esc_html__('Collect and showcase reviews on your website to build brand credibility and social proof with the easiest solution.','shopengine'),
270 + 'docs' => 'https://wpmet.com/doc/wp-ultimate-review/',
271 + ],
272 + 'wp-fundraising-donation/wp-fundraising.php' => [
273 + 'name' => esc_html__('FundEngine', 'shopengine'),
274 + 'url' => 'https://wordpress.org/plugins/wp-fundraising-donation/',
275 + 'icon' => $apps_img_path . 'fundengine.png',
276 + 'desc' => esc_html__('Create fundraising, crowdfunding, and donation websites with PayPal and Stripe payment gateway integration.', 'shopengine'),
277 + 'docs' => 'https://wpmet.com/doc/fundengine/',
278 + ],
279 + 'blocks-for-shopengine/shopengine-gutenberg-addon.php' => [
280 + 'name' => esc_html__('Blocks for ShopEngine', 'shopengine'),
281 + 'url' => 'https://wordpress.org/plugins/blocks-for-shopengine/',
282 + 'icon' => $apps_img_path. 'shopengine.gif',
283 + 'desc' => esc_html__('All in one WooCommerce solution for Gutenberg! Build your WooCommerce pages in a block editor with full customization.', 'shopengine'),
284 + 'docs' => 'https://wpmet.com/doc/shopengine/shopengine-gutenberg/',
285 + ],
286 + 'genie-image-ai/genie-image-ai.php' => [
287 + 'name' => esc_html__('Genie Image', 'shopengine'),
288 + 'url' => 'https://wordpress.org/plugins/genie-image-ai/',
289 + 'icon' => $apps_img_path . 'genie-image.png',
290 + '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.
291 + ', 'shopengine'),
292 + 'docs' => 'https://getgenie.ai/docs/',
293 + ],
294 + ]
295 + )
296 + ->call();
297 +
298 +
299 +
300 + \ShopEngine\Core\MultiLanguage\Language::instance()->init();
301 +
302 + \ShopEngine\Core\Settings\Base::instance()->init();
303 +
304 +
183 305 new Libs\Select_Api\Base();
184 306
185 307 (new Module_Manifest())->init();
186 308
@@ -195,11 +317,28 @@
195 317 add_action('get_header', [$this, 'shopengine_track_product_views']);
196 318
197 319 // database migrations
198 320 // (new \ShopEngine\Compatibility\Migrations\Migration())->init();
199 - (new \ShopEngine\Compatibility\Migrations\Temp_Migration())->init();
321 + // (new \ShopEngine\Compatibility\Migrations\Temp_Migration())->init();
200 322
323 +
324 + // call service providers
325 +
326 + $service_providers = include \ShopEngine::plugin_dir().'core/service-provider-manager.php';
327 + $method = 'init';
328 + foreach( $service_providers as $service_provider ){
329 +
330 + if(class_exists($service_provider) && method_exists($service_provider, $method)) {
331 + $instance = new $service_provider();
332 + $instance->$method();
333 + }
334 +
335 + }
336 +
201 337 add_filter('script_loader_tag', [$this, 'filter_load_type'], 99, 3);
338 +
339 + //it will register an option in customizer for woocommerce products catelog. It's related with our Arcive Products widget.
340 + Register_Settings::instance()->init();
202 341 }
203 342
204 343
205 344 // add async and defer attributes to enqueued scripts
@@ -228,14 +367,14 @@
228 367
229 368 $product_id = get_the_id();
230 369
231 370 $cookie_name = "shopengine_recent_viewed_product";
232 -
371 +
233 372 if(isset($_COOKIE[$cookie_name])) {
234 -
235 - $cookie_ids = $_COOKIE[$cookie_name];
373 +
374 + $cookie_ids = sanitize_text_field(wp_unslash($_COOKIE[$cookie_name]));
236 375 $product_ids = explode(',', $cookie_ids);
237 -
376 +
238 377 if(!is_array($product_ids)) {
239 378 $product_ids = [$product_ids];
240 379 }
241 380
@@ -243,14 +382,14 @@
243 382 unset($product_ids[$product_id]);
244 383 $product_ids[] = $product_id;
245 384
246 385 $cookie_value = implode(',', $product_ids);
247 -
386 +
248 387 } else {
249 - $cookie_value = $product_id;
388 + $cookie_value = $product_id;
250 389 }
251 390
252 - setcookie($cookie_name, $cookie_value, strtotime('+30 days'), '/');
391 + setcookie($cookie_name, $cookie_value, strtotime('+30 days'), '/' );
253 392
254 393 $count_key = 'shopengine_product_views_count';
255 394 $count = get_post_meta($product_id, $count_key, true);
256 395
@@ -269,12 +408,10 @@
269 408 * Include public function
270 409 *
271 410 * @since 1.0.0
272 411 */
273 - public function js_css_public() {
274 - wp_enqueue_style('shopengine-icon', \ShopEngine::plugin_url() . 'assets/css/shopengine-icon.css', false, \ShopEngine::version());
275 - wp_enqueue_style('shopengine-simple-scrollbar-css', \ShopEngine::plugin_url() . 'assets/css/simple-scrollbar.css', false, \ShopEngine::version());
276 - wp_enqueue_style('shopengine-public-css', \ShopEngine::plugin_url() . 'assets/css/public-style.css', false, \ShopEngine::version());
412 + public function js_css_public() {
413 + wp_register_style('shopengine-public', \ShopEngine::plugin_url() . 'assets/css/shopengine-public.css', false, \ShopEngine::version());
277 414
278 415 // Modal Stylesheet
279 416 wp_register_style('shopengine-modal-styles', \ShopEngine::plugin_url() . 'assets/css/shopengine-modal.css', false, \ShopEngine::version());
280 417
@@ -323,11 +460,11 @@
323 460
324 461
325 462 public function missing_woocommerce() {
326 463
327 - if(isset($_GET['activate'])) {
328 - unset($_GET['activate']);
329 - }
464 + if(!current_user_can('manage_options')) {
465 + return;
466 + }
330 467
331 468 if(file_exists(WP_PLUGIN_DIR . '/woocommerce/woocommerce.php')) {
332 469
333 470 $btn['label'] = esc_html__('Activate WooCommerce', 'shopengine');
@@ -343,8 +480,9 @@
343 480 [
344 481 'id' => 'missing-woo',
345 482 'type' => 'error',
346 483 'dismissible' => true,
484 + 'is_required' => true,
347 485 'btn' => $btn,
348 486 'message' => sprintf(esc_html__('ShopEngine requires woocommerce Plugin, which is currently NOT RUNNING.', 'shopengine'), '4.1.0'),
349 487 ]
350 488 );
@@ -352,11 +490,11 @@
352 490
353 491
354 492 public function missing_elementor() {
355 493
356 - if(isset($_GET['activate'])) {
357 - unset($_GET['activate']);
358 - }
494 + if(!current_user_can('manage_options')) {
495 + return;
496 + }
359 497
360 498 if(file_exists(WP_PLUGIN_DIR . '/elementor/elementor.php')) {
361 499
362 500 $btn['label'] = esc_html__('Activate Elementor', 'shopengine');
@@ -371,8 +509,9 @@
371 509 Utils\Notice::push(
372 510 [
373 511 'id' => 'missing-elementor',
374 512 'type' => 'error',
513 + 'is_required' => true,
375 514 'dismissible' => true,
376 515 'btn' => $btn,
377 516 'message' => sprintf(esc_html__('ShopEngine requires Elementor version %1$s+, which is currently NOT RUNNING.', 'shopengine'), '3.0.0'),
378 517 ]
@@ -380,8 +519,12 @@
380 519 }
381 520
382 521
383 522 public function failed_elementor_version() {
523 +
524 + if(!current_user_can('manage_options')) {
525 + return;
526 + }
384 527
385 528 $btn['label'] = esc_html__('Update Elementor', 'shopengine');
386 529 $btn['url'] = wp_nonce_url(self_admin_url('update.php?action=upgrade-plugin&plugin=elementor'), 'upgrade-plugin_elementor');
387 530