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