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