PluginProbe
ShopEngine Elementor WooCommerce Builder Addon – All in One WooCommerce Solution with eCommerce Templates & Woo Widgets / 4.8.8
ShopEngine Elementor WooCommerce Builder Addon – All in One WooCommerce Solution with eCommerce Templates & Woo Widgets v4.8.8
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 -38 4.1.14.8.8 View file →
@@ -1,12 +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;
7 9 use ShopEngine\Compatibility\Migrations\LangMigration;
8 10 use ShopEngine\Core\Query_Modifier;
11 +use ShopEngine\Core\Wc_Customizer\Register_Settings;
9 12 use ShopEngine\Core\Template_Cpt;
10 13 use ShopEngine\Libs\License\License_Route;
11 14 use ShopEngine\Libs\Rating\Rating;
12 15 use ShopEngine\Libs\Updater\Init as Updater;
@@ -12,9 +15,8 @@
12 15 use ShopEngine\Libs\Updater\Init as Updater;
13 16 use ShopEngine\Modules\Manifest as Module_Manifest;
14 17 use ShopEngine\Widgets\Manifest;
15 18
16 -defined('ABSPATH') || exit;
17 19
18 20 /**
19 21 * Plugin final Class.
20 22 * Handles dynamically loading classes only when needed. Check Elementor Plugin, Woocomerce Plugin Loaded or Install.
@@ -31,11 +33,15 @@
31 33 */
32 34 public function __construct() {
33 35 // load autoload method
34 36 Autoloader::run();
37 + add_action( 'wp_ajax_shopengine_admin_action', [\ShopEngine\Utils\Util::class, 'shopengine_admin_action'] );
35 38 }
36 39
37 -
40 + public function utils_url()
41 + {
42 + return $this->plugin_url() . 'utils/';
43 + }
38 44 /**
39 45 * Public function init.
40 46 * call function for all
41 47 *
@@ -44,8 +50,11 @@
44 50 public function init() {
45 51
46 52 $error = false;
47 53
54 + // init notice class
55 + \Oxaim\Libs\Notice::init();
56 +
48 57 // check woocommerce plugin
49 58 if(!did_action('woocommerce_loaded')) {
50 59 add_action('admin_notices', [$this, 'missing_woocommerce']);
51 60
@@ -92,9 +101,30 @@
92 101 }
93 102 return $links;
94 103 });
95 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 + }
96 125
126 +
97 127 /**
98 128 * Routes initialization
99 129 *
100 130 */
@@ -112,47 +142,18 @@
112 142 });
113 143
114 144
115 145 add_action('wp_loaded', function () {
116 - //phpcs:ignore WordPress.Security.NonceVerification.Recommended --It's a fronted user part, not possible to verify nonce here
117 - if(isset($_REQUEST['preview']) && $_REQUEST['preview'] == 'true' && !empty($_REQUEST['preview_id'])) {
118 -
119 - $pid = (int)$_REQUEST['preview_id']; //phpcs:ignore WordPress.Security.NonceVerification.Recommended -- It's a fronted user part, not possible to verify nonce here
120 -
121 - $po = get_post($pid);
122 -
123 - if($po->post_type === Template_Cpt::TYPE) {
124 -
125 - $template = \ShopEngine\Core\Builders\Templates::get_registered_template_data($pid);
126 -
127 - if(empty($template) || !isset($template['url'])) {
128 - return;
129 - }
130 -
131 - $param = [
132 - 'shopengine_template_id' => $pid,
133 - 'preview_nonce' => wp_create_nonce('template_preview_' . $pid),
134 - 'change_template' => '1',
135 - ];
136 -
137 - $tem_url = (get_post_meta($pid, 'shopengine_template__post_meta__type' , true) == 'order') ? $po->guid : $template['url'];
138 - $url = \ShopEngine\Utils\Helper::add_to_url($tem_url, $param);
139 -
140 - wp_safe_redirect($url);
141 - exit;
142 - }
143 - }
144 -
145 146 /**
146 147 * migrate data
147 - */
148 + */
148 149 LangMigration::instance()->init();
149 150 });
150 151
151 152 // avoid themes for loading woocommerce functions
152 - $avoid_themes = ['avada', 'avada child'];
153 + $avoid_themes = ['avada', 'woodmart', 'Avada', 'Woodmart'];
153 154
154 - if(!in_array(strtolower(wp_get_theme()), $avoid_themes)) {
155 + if( !in_array(get_template(), $avoid_themes) ) {
155 156 /**
156 157 * Ensuring woocommerce functions are loaded before theme is modifying those
157 158 *
158 159 */
@@ -165,8 +166,17 @@
165 166 new \ShopEngine\Core\Elementor_Controls\Init();
166 167
167 168 //Loading the scripts and styles
168 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 +
169 179 }
170 180
171 181
172 182 //Loading public scripts and styles
@@ -179,29 +189,152 @@
179 189 add_theme_support('wc-product-gallery-lightbox');
180 190 add_theme_support('wc-product-gallery-slider');
181 191 }
182 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 +
183 199 #Registering new post-type & etc
184 200 Base::instance()->init();
201 +
185 202
186 203 Rating::instance('shopengine')
187 204 ->set_plugin( 'ShopEngine', 'https://wpmet.com/wordpress.org/rating/shopengine' )
205 + ->set_rating_url( 'https://wordpress.org/support/plugin/shopengine/reviews/#new-post' )
188 206 ->set_plugin_logo( 'https://ps.w.org/shopengine/assets/icon-256x256.gif?rev=2505061', 'width:150px !important' )
189 - ->set_priority( 10 )
207 + ->set_priority( 11 )
190 208 ->set_first_appear_day( 7 )
191 209 ->set_condition( true )
192 210 ->call();
211 +
212 + if ( is_admin() && \ShopEngine\Utils\Util::get_settings( 'shopengine_user_consent_for_banner', 'true' ) == 'true' ) {
193 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 +
194 328 \ShopEngine\Core\MultiLanguage\Language::instance()->init();
195 329
196 330 \ShopEngine\Core\Settings\Base::instance()->init();
197 331
332 +
198 333 new Libs\Select_Api\Base();
199 334
200 335 (new Module_Manifest())->init();
201 336
202 - // working get instance of elementor widget
203 - (new Manifest())->init();
204 337
205 338 Query_Modifier::instance()->init();
206 339
207 340 (new Conflict_Manifest())->init();
@@ -227,8 +360,11 @@
227 360
228 361 }
229 362
230 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();
231 367 }
232 368
233 369
234 370 // add async and defer attributes to enqueued scripts
@@ -350,8 +486,12 @@
350 486
351 487
352 488 public function missing_woocommerce() {
353 489
490 + if(!current_user_can('manage_options')) {
491 + return;
492 + }
493 +
354 494 if(file_exists(WP_PLUGIN_DIR . '/woocommerce/woocommerce.php')) {
355 495
356 496 $btn['label'] = esc_html__('Activate WooCommerce', 'shopengine');
357 497 $btn['url'] = wp_nonce_url('plugins.php?action=activate&plugin=woocommerce/woocommerce.php&plugin_status=all&paged=1', 'activate-plugin_woocommerce/woocommerce.php');
@@ -366,8 +506,9 @@
366 506 [
367 507 'id' => 'missing-woo',
368 508 'type' => 'error',
369 509 'dismissible' => true,
510 + 'is_required' => true,
370 511 'btn' => $btn,
371 512 'message' => sprintf(esc_html__('ShopEngine requires woocommerce Plugin, which is currently NOT RUNNING.', 'shopengine'), '4.1.0'),
372 513 ]
373 514 );
@@ -375,8 +516,12 @@
375 516
376 517
377 518 public function missing_elementor() {
378 519
520 + if(!current_user_can('manage_options')) {
521 + return;
522 + }
523 +
379 524 if(file_exists(WP_PLUGIN_DIR . '/elementor/elementor.php')) {
380 525
381 526 $btn['label'] = esc_html__('Activate Elementor', 'shopengine');
382 527 $btn['url'] = wp_nonce_url('plugins.php?action=activate&plugin=elementor/elementor.php&plugin_status=all&paged=1', 'activate-plugin_elementor/elementor.php');
@@ -386,15 +531,28 @@
386 531 $btn['label'] = esc_html__('Install Elementor', 'shopengine');
387 532 $btn['url'] = wp_nonce_url(self_admin_url('update.php?action=install-plugin&plugin=elementor'), 'install-plugin_elementor');
388 533 }
389 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 +
390 546 Utils\Notice::push(
391 547 [
392 548 'id' => 'missing-elementor',
393 549 'type' => 'error',
550 + 'is_required' => true,
394 551 'dismissible' => true,
395 552 'btn' => $btn,
396 - 'message' => sprintf(esc_html__('ShopEngine requires Elementor version %1$s+, which is currently NOT RUNNING.', 'shopengine'), '3.0.0'),
553 + 'btn2' => $btn2,
554 + 'message' => esc_html__('To use ShopEngine, install Elementor (For the Elementor Builder) OR Blocks for ShopEngine (For Gutenberg Builder).', 'shopengine'),
397 555 ]
398 556 );
399 557 }
400 558
@@ -399,8 +557,12 @@
399 557 }
400 558
401 559
402 560 public function failed_elementor_version() {
561 +
562 + if(!current_user_can('manage_options')) {
563 + return;
564 + }
403 565
404 566 $btn['label'] = esc_html__('Update Elementor', 'shopengine');
405 567 $btn['url'] = wp_nonce_url(self_admin_url('update.php?action=upgrade-plugin&plugin=elementor'), 'upgrade-plugin_elementor');
406 568