PluginProbe ʕ •ᴥ•ʔ
ShopEngine Elementor WooCommerce Builder Addon – All in One WooCommerce Solution / 1.8.1
ShopEngine Elementor WooCommerce Builder Addon – All in One WooCommerce Solution v1.8.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 5 years ago utils 4 years ago widgets 4 years ago autoloader.php 5 years ago plugin.php 4 years ago readme.txt 4 years ago shopengine.php 4 years ago
plugin.php
394 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 if Elementor installed and activated.
54 if(!did_action('elementor/loaded')) {
55 add_action('admin_notices', [$this, 'missing_elementor']);
56
57 $error = true;
58 }
59
60 // 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']);
63
64 $error = true;
65 }
66
67 if($error) {
68
69 return;
70 }
71
72
73 /**
74 * Routes initialization
75 *
76 */
77 new License_Route();
78
79 /**
80 * Run pro plugin updater here....
81 *
82 */
83 add_action('admin_init', function () {
84 if(class_exists('ShopEngine_Pro')) {
85 new Updater();
86 }
87
88 });
89
90 global $pagenow;
91
92 if(is_admin() && $pagenow == 'post.php' && $_REQUEST['action'] === 'edit') {
93
94 $pid = $_REQUEST['post'];
95 $po = get_post($pid);
96
97 if($po->post_type === Template_Cpt::TYPE) {
98
99 $url = get_admin_url() . 'edit.php?post_type=' . Template_Cpt::TYPE . '#' . Template_Cpt::TYPE;
100
101 wp_safe_redirect($url);
102 exit;
103 }
104 }
105
106 add_action('wp_loaded', function () {
107
108 if(isset($_REQUEST['preview']) && $_REQUEST['preview'] == 'true' && !empty($_REQUEST['preview_id'])) {
109
110 $pid = (int)$_REQUEST['preview_id'];
111
112 $po = get_post($pid);
113
114 if($po->post_type === Template_Cpt::TYPE) {
115
116 $template = \ShopEngine\Core\Builders\Templates::get_registered_template_data($pid);
117
118 if(empty($template) || !isset($template['url'])) {
119 return;
120 }
121
122 $param = [
123 'shopengine_template_id' => $pid,
124 'preview_nonce' => wp_create_nonce('template_preview_' . $pid),
125 'change_template' => '1',
126 ];
127
128 $url = \ShopEngine\Utils\Helper::add_to_url($template['url'], $param);
129
130 wp_safe_redirect($url);
131 exit;
132 }
133 }
134 });
135
136
137 /**
138 * Ensuring woocommerce functions are loaded before theme is modifying those
139 *
140 */
141 require_once WC_ABSPATH . '/includes/wc-template-functions.php';
142
143
144 // Load custom elementor controls
145 new \ShopEngine\Core\Elementor_Controls\Init();
146
147 //Loading the scripts and styles
148 add_action('wp_enqueue_scripts', [$this, 'js_css_public']);
149 add_action('elementor/editor/after_enqueue_styles', [$this, 'js_css_elementor']);
150
151 //woocommece theme support
152 if(!current_theme_supports('woocommerce')) {
153 add_theme_support('woocommerce');
154 add_theme_support('wc-product-gallery-zoom');
155 add_theme_support('wc-product-gallery-lightbox');
156 add_theme_support('wc-product-gallery-slider');
157 }
158
159
160 #Registering new post-type & etc
161 Base::instance()->init();
162
163 \ShopEngine\Core\Settings\Base::instance()->init();
164
165 (new Module_Manifest)->init();
166
167 // working get instance of elementor widget
168 (new Manifest)->init();
169
170 Query_Modifier::instance()->init();
171
172 (new Conflict_Manifest)->init();
173
174 // view count
175 add_action('get_header', [$this, 'shopengine_track_product_views']);
176
177 // database migrations
178 // (new \ShopEngine\Compatibility\Migrations\Migration())->init();
179 (new \ShopEngine\Compatibility\Migrations\Temp_Migration())->init();
180
181 add_filter('script_loader_tag', [$this, 'filter_load_type'], 99, 3);
182 }
183
184
185 // add async and defer attributes to enqueued scripts
186 public function filter_load_type($tag, $handle, $src) {
187
188 if(strpos($handle, '-async') !== false) {
189 $tag = str_replace(' src', ' async="async" src', $tag);
190 }
191
192 if(strpos($handle, '-defer') !== false) {
193 $tag = str_replace('<script ', '<script defer ', $tag);
194 }
195
196 return $tag;
197 }
198
199 /**
200 * Public function shopengine_track_product_views
201 * Adding Product Views Count Meta
202 */
203 public function shopengine_track_product_views() {
204
205 if(class_exists('WooCommerce') && !is_product()) {
206 return;
207 }
208
209 $product_id = get_the_id();
210
211 $cookie_name = "shopengine_recent_viewed_product";
212
213 if(isset($_COOKIE[$cookie_name])) {
214
215 $cookie_ids = $_COOKIE[$cookie_name];
216 $product_ids = explode(',', $cookie_ids);
217
218 if(!is_array($product_ids)) {
219 $product_ids = [$product_ids];
220 }
221
222 $product_ids = array_combine($product_ids, $product_ids);
223 unset($product_ids[$product_id]);
224 $product_ids[] = $product_id;
225
226 $cookie_value = implode(',', $product_ids);
227
228 } else {
229 $cookie_value = $product_id;
230 }
231
232 setcookie($cookie_name, $cookie_value, strtotime('+30 days'), '/');
233
234 $count_key = 'shopengine_product_views_count';
235 $count = get_post_meta($product_id, $count_key, true);
236
237 if($count == '') {
238 $count = 1;
239 delete_post_meta($product_id, $count_key);
240 add_post_meta($product_id, $count_key, '1');
241 } else {
242 $count++;
243 update_post_meta($product_id, $count_key, $count);
244 }
245 }
246
247 /**
248 * Public function js_css_public .
249 * Include public function
250 *
251 * @since 1.0.0
252 */
253 public function js_css_public() {
254 wp_enqueue_style('shopengine-icon', \ShopEngine::plugin_url() . 'assets/css/shopengine-icon.css', false, \ShopEngine::version());
255 wp_enqueue_style('shopengine-simple-scrollbar-css', \ShopEngine::plugin_url() . 'assets/css/simple-scrollbar.css', false, \ShopEngine::version());
256 wp_enqueue_style('shopengine-public-css', \ShopEngine::plugin_url() . 'assets/css/public-style.css', false, \ShopEngine::version());
257
258 // Modal Stylesheet
259 wp_register_style('shopengine-modal-styles', \ShopEngine::plugin_url() . 'assets/css/shopengine-modal.css', false, \ShopEngine::version());
260
261 // Modal Script
262 wp_register_script('shopengine-modal-script', \ShopEngine::plugin_url() . 'assets/js/shopengine-modal.js', ['jquery'], \ShopEngine::version(), true);
263
264 wp_enqueue_script('shopengine-simple-scrollbar.js-js', \ShopEngine::plugin_url() . 'assets/js/simple-scrollbar.js', [], \ShopEngine::version(), true);
265 wp_enqueue_script('shopengine-filter-js', \ShopEngine::plugin_url() . 'assets/js/filter.js', [], \ShopEngine::version(), true);
266 wp_enqueue_script('shopengine-js', \ShopEngine::plugin_url() . 'assets/js/public.js', [], \ShopEngine::version(), true);
267
268
269 wp_localize_script('shopengine-js', 'shopEngineApiSettings', [
270 'resturl' => get_rest_url(),
271 'rest_nonce' => wp_create_nonce('wp_rest'),
272 ]);
273
274
275 /**
276 * Registering libs css/js
277 *
278 */
279
280 wp_register_style(
281 'lib-sqv-css',
282 \ShopEngine::plugin_url() . '/assets/sqv/smart-quick-view.css',
283 [],
284 \ShopEngine::version()
285 );
286
287 wp_register_script(
288 'lib-sqv-js',
289 \ShopEngine::plugin_url() . 'assets/sqv/smart-quick-view.js',
290 ['jquery', 'wc-single-product'],
291 \ShopEngine::version(),
292 true
293 );
294 }
295
296 public function js_css_elementor() {
297 wp_enqueue_style('shopnegine-panel-icon', \ShopEngine::plugin_url() . 'assets/css/shopengine-icon.css', false, \ShopEngine::version());
298
299 if('shopengine-template' === get_post_type()):
300 wp_enqueue_style('shopnegine-editor-css', \ShopEngine::plugin_url() . 'assets/css/editor.css', false, \ShopEngine::version());
301 endif;
302 }
303
304
305 public function missing_woocommerce() {
306
307 if(isset($_GET['activate'])) {
308 unset($_GET['activate']);
309 }
310
311 if(file_exists(WP_PLUGIN_DIR . '/woocommerce/woocommerce.php')) {
312
313 $btn['label'] = esc_html__('Activate WooCommerce', 'shopengine');
314 $btn['url'] = wp_nonce_url('plugins.php?action=activate&plugin=woocommerce/woocommerce.php&plugin_status=all&paged=1', 'activate-plugin_woocommerce/woocommerce.php');
315
316 } else {
317
318 $btn['label'] = esc_html__('Install WooCommerce', 'shopengine');
319 $btn['url'] = wp_nonce_url(self_admin_url('update.php?action=install-plugin&plugin=woocommerce'), 'install-plugin_woocommerce');
320 }
321
322 Utils\Notice::push(
323 [
324 'id' => 'missing-woo',
325 'type' => 'error',
326 'dismissible' => true,
327 'btn' => $btn,
328 'message' => sprintf(esc_html__('ShopEngine requires woocommerce Plugin, which is currently NOT RUNNING.', 'shopengine'), '4.1.0'),
329 ]
330 );
331 }
332
333
334 public function missing_elementor() {
335
336 if(isset($_GET['activate'])) {
337 unset($_GET['activate']);
338 }
339
340 if(file_exists(WP_PLUGIN_DIR . '/elementor/elementor.php')) {
341
342 $btn['label'] = esc_html__('Activate Elementor', 'shopengine');
343 $btn['url'] = wp_nonce_url('plugins.php?action=activate&plugin=elementor/elementor.php&plugin_status=all&paged=1', 'activate-plugin_elementor/elementor.php');
344
345 } else {
346
347 $btn['label'] = esc_html__('Install Elementor', 'shopengine');
348 $btn['url'] = wp_nonce_url(self_admin_url('update.php?action=install-plugin&plugin=elementor'), 'install-plugin_elementor');
349 }
350
351 Utils\Notice::push(
352 [
353 'id' => 'missing-elementor',
354 'type' => 'error',
355 'dismissible' => true,
356 'btn' => $btn,
357 'message' => sprintf(esc_html__('ShopEngine requires Elementor version %1$s+, which is currently NOT RUNNING.', 'shopengine'), '3.0.0'),
358 ]
359 );
360 }
361
362
363 public function failed_elementor_version() {
364
365 $btn['label'] = esc_html__('Update Elementor', 'shopengine');
366 $btn['url'] = wp_nonce_url(self_admin_url('update.php?action=upgrade-plugin&plugin=elementor'), 'upgrade-plugin_elementor');
367
368 Utils\Notice::push(
369 [
370 'id' => 'unsupported-elementor-version',
371 'type' => 'error',
372 'dismissible' => true,
373 'btn' => $btn,
374 'message' => sprintf(esc_html__('ShopEngine requires Elementor version %1$s+, which is currently NOT RUNNING.', 'shopengine'), '3.0.0'),
375 ]
376 );
377 }
378
379
380 public function flush_rewrites() {
381 $form_cpt = new Core\Builders\Cpt();
382 $form_cpt->flush_rewrites();
383 }
384
385
386 public static function instance() {
387 if(!self::$instance) {
388 self::$instance = new self();
389 }
390
391 return self::$instance;
392 }
393 }
394