PluginProbe ʕ •ᴥ•ʔ
ShopEngine Elementor WooCommerce Builder Addon – All in One WooCommerce Solution / 3.1.1
ShopEngine Elementor WooCommerce Builder Addon – All in One WooCommerce Solution v3.1.1
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 3 years ago base 3 years ago compatibility 3 years ago core 3 years ago languages 3 years ago libs 3 years ago modules 3 years ago traits 3 years ago utils 3 years ago widgets 3 years ago autoloader.php 3 years ago phpcs.xml 3 years ago plugin.php 3 years ago readme.txt 3 years ago shopengine.php 3 years ago
plugin.php
432 lines
1 <?php
2
3 namespace ShopEngine;
4
5 use ShopEngine\Compatibility\Conflicts\Manifest as Conflict_Manifest;
6 use ShopEngine\Core\Builders\Base;
7 use ShopEngine\Compatibility\Migrations\LangMigration;
8 use ShopEngine\Core\Query_Modifier;
9 use ShopEngine\Core\Template_Cpt;
10 use ShopEngine\Libs\License\License_Route;
11 use ShopEngine\Libs\Rating\Rating;
12 use ShopEngine\Libs\Updater\Init as Updater;
13 use ShopEngine\Modules\Manifest as Module_Manifest;
14 use ShopEngine\Widgets\Manifest;
15
16 defined('ABSPATH') || exit;
17
18 /**
19 * Plugin final Class.
20 * Handles dynamically loading classes only when needed. Check Elementor Plugin, Woocomerce Plugin Loaded or Install.
21 *
22 * @since 1.0.0
23 */
24 final class Plugin {
25
26 private static $instance;
27
28 /**
29 * __construct function
30 * @since 1.0.0
31 */
32 public function __construct() {
33 // load autoload method
34 Autoloader::run();
35 }
36
37
38 /**
39 * Public function init.
40 * call function for all
41 *
42 * @since 1.0.0
43 */
44 public function init() {
45
46 $error = false;
47
48 // check woocommerce plugin
49 if(!did_action('woocommerce_loaded')) {
50 add_action('admin_notices', [$this, 'missing_woocommerce']);
51
52 $error = true;
53 }
54
55 $check_elementor_version = false;
56
57 // Check if Elementor installed and activated.
58 if(!did_action('elementor/loaded')) {
59
60 if(!did_action('shopengine-gutenberg-addon/before_loaded')) {
61
62 add_action('admin_notices', [$this, 'missing_elementor']);
63
64 $error = true;
65 }
66 }
67
68 // Check for required Elementor version.
69 if(did_action('elementor/loaded') && defined('ELEMENTOR_VERSION') && !version_compare(ELEMENTOR_VERSION, '3.0.0', '>=')) {
70
71 add_action('admin_notices', [$this, 'failed_elementor_version']);
72
73 $error = true;
74 }
75
76 if($error) {
77 return;
78 }
79
80 add_filter("plugin_action_links_shopengine/shopengine.php", function ($links) {
81 $free = esc_html__("Go To Shopengine","shopengine");
82 $pro = esc_html__("Go To ShopenginePro","shopengine");
83
84 $custom_links[] = '<a title="' . $free . '" href="'.admin_url('edit.php?post_type=shopengine-template#getting-started').'" target="_blank">' . esc_html__('Settings', 'shopengine') . '</a>';
85
86 foreach ($custom_links as $custom_link):
87 array_unshift($links, $custom_link);
88 endforeach;
89
90 if (!is_plugin_active('shopengine-pro/shopengine-pro.php')) {
91 $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>';
92 }
93 return $links;
94 });
95
96
97 /**
98 * Routes initialization
99 *
100 */
101 new License_Route();
102
103 /**
104 * Run pro plugin updater here....
105 *
106 */
107 add_action('admin_init', function () {
108 if(class_exists('ShopEngine_Pro')) {
109 new Updater();
110 }
111 new \ShopEngine\Compatibility\Migrations\Direct_Checkout;
112 });
113
114
115 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 $url = \ShopEngine\Utils\Helper::add_to_url($template['url'], $param);
138
139 wp_safe_redirect($url);
140 exit;
141 }
142 }
143
144 /**
145 * migrate data
146 */
147 LangMigration::instance()->init();
148 });
149
150 // avoid themes for loading woocommerce functions
151 $avoid_themes = ['avada', 'avada child'];
152
153 if(!in_array(strtolower(wp_get_theme()), $avoid_themes)) {
154 /**
155 * Ensuring woocommerce functions are loaded before theme is modifying those
156 *
157 */
158 require_once WC_ABSPATH . '/includes/wc-template-functions.php';
159 }
160
161
162 if(did_action('elementor/loaded')) {
163 // Load custom elementor controls
164 new \ShopEngine\Core\Elementor_Controls\Init();
165
166 //Loading the scripts and styles
167 add_action('elementor/editor/after_enqueue_styles', [$this, 'js_css_elementor']);
168 }
169
170
171 //Loading public scripts and styles
172 add_action('wp_enqueue_scripts', [$this, 'js_css_public']);
173
174 //woocommece theme support
175 if(!current_theme_supports('woocommerce')) {
176 add_theme_support('woocommerce');
177 add_theme_support('wc-product-gallery-zoom');
178 add_theme_support('wc-product-gallery-lightbox');
179 add_theme_support('wc-product-gallery-slider');
180 }
181
182 #Registering new post-type & etc
183 Base::instance()->init();
184
185 Rating::instance('shopengine')
186 ->set_plugin( 'ShopEngine', 'https://wpmet.com/wordpress.org/rating/shopengine' )
187 ->set_plugin_logo( 'https://ps.w.org/shopengine/assets/icon-256x256.gif?rev=2505061', 'width:150px !important' )
188 ->set_priority( 10 )
189 ->set_first_appear_day( 7 )
190 ->set_condition( true )
191 ->call();
192
193 \ShopEngine\Core\MultiLanguage\Language::instance()->init();
194
195 \ShopEngine\Core\Settings\Base::instance()->init();
196
197 new Libs\Select_Api\Base();
198
199 (new Module_Manifest())->init();
200
201 // working get instance of elementor widget
202 (new Manifest())->init();
203
204 Query_Modifier::instance()->init();
205
206 (new Conflict_Manifest())->init();
207
208 // view count
209 add_action('get_header', [$this, 'shopengine_track_product_views']);
210
211 // database migrations
212 // (new \ShopEngine\Compatibility\Migrations\Migration())->init();
213 // (new \ShopEngine\Compatibility\Migrations\Temp_Migration())->init();
214
215
216 // call service providers
217
218 $service_providers = include \ShopEngine::plugin_dir().'core/service-provider-manager.php';
219 $method = 'init';
220 foreach( $service_providers as $service_provider ){
221
222 if(class_exists($service_provider) && method_exists($service_provider, $method)) {
223 $instance = new $service_provider();
224 $instance->$method();
225 }
226
227 }
228
229 add_filter('script_loader_tag', [$this, 'filter_load_type'], 99, 3);
230 }
231
232
233 // add async and defer attributes to enqueued scripts
234 public function filter_load_type($tag, $handle, $src) {
235
236 if(strpos($handle, '-async') !== false) {
237 $tag = str_replace(' src', ' async="async" src', $tag);
238 }
239
240 if(strpos($handle, '-defer') !== false) {
241 $tag = str_replace('<script ', '<script defer ', $tag);
242 }
243
244 return $tag;
245 }
246
247 /**
248 * Public function shopengine_track_product_views
249 * Adding Product Views Count Meta
250 */
251 public function shopengine_track_product_views() {
252
253 if(class_exists('WooCommerce') && !is_product()) {
254 return;
255 }
256
257 $product_id = get_the_id();
258
259 $cookie_name = "shopengine_recent_viewed_product";
260
261 if(isset($_COOKIE[$cookie_name])) {
262
263 $cookie_ids = sanitize_text_field(wp_unslash($_COOKIE[$cookie_name]));
264 $product_ids = explode(',', $cookie_ids);
265
266 if(!is_array($product_ids)) {
267 $product_ids = [$product_ids];
268 }
269
270 $product_ids = array_combine($product_ids, $product_ids);
271 unset($product_ids[$product_id]);
272 $product_ids[] = $product_id;
273
274 $cookie_value = implode(',', $product_ids);
275
276 } else {
277 $cookie_value = $product_id;
278 }
279
280 setcookie($cookie_name, $cookie_value, strtotime('+30 days'), '/' );
281
282 $count_key = 'shopengine_product_views_count';
283 $count = get_post_meta($product_id, $count_key, true);
284
285 if($count == '') {
286 $count = 1;
287 delete_post_meta($product_id, $count_key);
288 add_post_meta($product_id, $count_key, '1');
289 } else {
290 $count++;
291 update_post_meta($product_id, $count_key, $count);
292 }
293 }
294
295 /**
296 * Public function js_css_public .
297 * Include public function
298 *
299 * @since 1.0.0
300 */
301 public function js_css_public() {
302 wp_register_style('shopengine-public', \ShopEngine::plugin_url() . 'assets/css/shopengine-public.css', false, \ShopEngine::version());
303
304 // Modal Stylesheet
305 wp_register_style('shopengine-modal-styles', \ShopEngine::plugin_url() . 'assets/css/shopengine-modal.css', false, \ShopEngine::version());
306
307 // Modal Script
308 wp_register_script('shopengine-modal-script', \ShopEngine::plugin_url() . 'assets/js/shopengine-modal.js', ['jquery'], \ShopEngine::version(), true);
309
310 wp_enqueue_script('shopengine-simple-scrollbar.js-js', \ShopEngine::plugin_url() . 'assets/js/simple-scrollbar.js', [], \ShopEngine::version(), true);
311 wp_enqueue_script('shopengine-filter-js', \ShopEngine::plugin_url() . 'assets/js/filter.js', [], \ShopEngine::version(), true);
312 wp_enqueue_script('shopengine-js', \ShopEngine::plugin_url() . 'assets/js/public.js', [], \ShopEngine::version(), true);
313
314
315 wp_localize_script('shopengine-js', 'shopEngineApiSettings', [
316 'resturl' => get_rest_url(),
317 'rest_nonce' => wp_create_nonce('wp_rest'),
318 ]);
319
320
321 /**
322 * Registering libs css/js
323 *
324 */
325
326 wp_register_style(
327 'lib-sqv-css',
328 \ShopEngine::plugin_url() . '/assets/sqv/smart-quick-view.css',
329 [],
330 \ShopEngine::version()
331 );
332
333 wp_register_script(
334 'lib-sqv-js',
335 \ShopEngine::plugin_url() . 'assets/sqv/smart-quick-view.js',
336 ['jquery', 'wc-single-product'],
337 \ShopEngine::version(),
338 true
339 );
340 }
341
342 public function js_css_elementor() {
343 wp_enqueue_style('shopnegine-panel-icon', \ShopEngine::plugin_url() . 'assets/css/shopengine-icon.css', false, \ShopEngine::version());
344
345 if('shopengine-template' === get_post_type()):
346 wp_enqueue_style('shopnegine-editor-css', \ShopEngine::plugin_url() . 'assets/css/editor.css', false, \ShopEngine::version());
347 endif;
348 }
349
350
351 public function missing_woocommerce() {
352
353 if(file_exists(WP_PLUGIN_DIR . '/woocommerce/woocommerce.php')) {
354
355 $btn['label'] = esc_html__('Activate WooCommerce', 'shopengine');
356 $btn['url'] = wp_nonce_url('plugins.php?action=activate&plugin=woocommerce/woocommerce.php&plugin_status=all&paged=1', 'activate-plugin_woocommerce/woocommerce.php');
357
358 } else {
359
360 $btn['label'] = esc_html__('Install WooCommerce', 'shopengine');
361 $btn['url'] = wp_nonce_url(self_admin_url('update.php?action=install-plugin&plugin=woocommerce'), 'install-plugin_woocommerce');
362 }
363
364 Utils\Notice::push(
365 [
366 'id' => 'missing-woo',
367 'type' => 'error',
368 'dismissible' => true,
369 'btn' => $btn,
370 'message' => sprintf(esc_html__('ShopEngine requires woocommerce Plugin, which is currently NOT RUNNING.', 'shopengine'), '4.1.0'),
371 ]
372 );
373 }
374
375
376 public function missing_elementor() {
377
378 if(file_exists(WP_PLUGIN_DIR . '/elementor/elementor.php')) {
379
380 $btn['label'] = esc_html__('Activate Elementor', 'shopengine');
381 $btn['url'] = wp_nonce_url('plugins.php?action=activate&plugin=elementor/elementor.php&plugin_status=all&paged=1', 'activate-plugin_elementor/elementor.php');
382
383 } else {
384
385 $btn['label'] = esc_html__('Install Elementor', 'shopengine');
386 $btn['url'] = wp_nonce_url(self_admin_url('update.php?action=install-plugin&plugin=elementor'), 'install-plugin_elementor');
387 }
388
389 Utils\Notice::push(
390 [
391 'id' => 'missing-elementor',
392 'type' => 'error',
393 'dismissible' => true,
394 'btn' => $btn,
395 'message' => sprintf(esc_html__('ShopEngine requires Elementor version %1$s+, which is currently NOT RUNNING.', 'shopengine'), '3.0.0'),
396 ]
397 );
398 }
399
400
401 public function failed_elementor_version() {
402
403 $btn['label'] = esc_html__('Update Elementor', 'shopengine');
404 $btn['url'] = wp_nonce_url(self_admin_url('update.php?action=upgrade-plugin&plugin=elementor'), 'upgrade-plugin_elementor');
405
406 Utils\Notice::push(
407 [
408 'id' => 'unsupported-elementor-version',
409 'type' => 'error',
410 'dismissible' => true,
411 'btn' => $btn,
412 'message' => sprintf(esc_html__('ShopEngine requires Elementor version %1$s+, which is currently NOT RUNNING.', 'shopengine'), '3.0.0'),
413 ]
414 );
415 }
416
417
418 public function flush_rewrites() {
419 $form_cpt = new Core\Builders\Cpt();
420 $form_cpt->flush_rewrites();
421 }
422
423
424 public static function instance() {
425 if(!self::$instance) {
426 self::$instance = new self();
427 }
428
429 return self::$instance;
430 }
431 }
432