PluginProbe ʕ •ᴥ•ʔ
ShopEngine Elementor WooCommerce Builder Addon – All in One WooCommerce Solution / 3.0.0
ShopEngine Elementor WooCommerce Builder Addon – All in One WooCommerce Solution v3.0.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
439 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 });
112
113
114 add_action('wp_loaded', function () {
115
116 if(isset($_REQUEST['preview']) && $_REQUEST['preview'] == 'true' && !empty($_REQUEST['preview_id'])) {
117
118 $pid = (int)$_REQUEST['preview_id'];
119
120 $po = get_post($pid);
121
122 if($po->post_type === Template_Cpt::TYPE) {
123
124 $template = \ShopEngine\Core\Builders\Templates::get_registered_template_data($pid);
125
126 if(empty($template) || !isset($template['url'])) {
127 return;
128 }
129
130 $param = [
131 'shopengine_template_id' => $pid,
132 'preview_nonce' => wp_create_nonce('template_preview_' . $pid),
133 'change_template' => '1',
134 ];
135
136 $url = \ShopEngine\Utils\Helper::add_to_url($template['url'], $param);
137
138 wp_safe_redirect($url);
139 exit;
140 }
141 }
142
143 /**
144 * migrate data
145 */
146 LangMigration::instance()->init();
147 });
148
149 // avoid themes for loading woocommerce functions
150 $avoid_themes = ['avada', 'avada child'];
151
152 if(!in_array(strtolower(wp_get_theme()), $avoid_themes)) {
153 /**
154 * Ensuring woocommerce functions are loaded before theme is modifying those
155 *
156 */
157 require_once WC_ABSPATH . '/includes/wc-template-functions.php';
158 }
159
160
161 if(did_action('elementor/loaded')) {
162 // Load custom elementor controls
163 new \ShopEngine\Core\Elementor_Controls\Init();
164
165 //Loading the scripts and styles
166 add_action('elementor/editor/after_enqueue_styles', [$this, 'js_css_elementor']);
167 }
168
169
170 //Loading public scripts and styles
171 add_action('wp_enqueue_scripts', [$this, 'js_css_public']);
172
173 //woocommece theme support
174 if(!current_theme_supports('woocommerce')) {
175 add_theme_support('woocommerce');
176 add_theme_support('wc-product-gallery-zoom');
177 add_theme_support('wc-product-gallery-lightbox');
178 add_theme_support('wc-product-gallery-slider');
179 }
180
181 #Registering new post-type & etc
182 Base::instance()->init();
183
184 Rating::instance('shopengine')
185 ->set_plugin( 'ShopEngine', 'https://wpmet.com/wordpress.org/rating/shopengine' )
186 ->set_plugin_logo( 'https://ps.w.org/shopengine/assets/icon-256x256.gif?rev=2505061', 'width:150px !important' )
187 ->set_priority( 10 )
188 ->set_first_appear_day( 7 )
189 ->set_condition( true )
190 ->call();
191
192 \ShopEngine\Core\MultiLanguage\Language::instance()->init();
193
194 \ShopEngine\Core\Settings\Base::instance()->init();
195
196 new Libs\Select_Api\Base();
197
198 (new Module_Manifest())->init();
199
200 // working get instance of elementor widget
201 (new Manifest())->init();
202
203 Query_Modifier::instance()->init();
204
205 (new Conflict_Manifest())->init();
206
207 // view count
208 add_action('get_header', [$this, 'shopengine_track_product_views']);
209
210 // database migrations
211 // (new \ShopEngine\Compatibility\Migrations\Migration())->init();
212 // (new \ShopEngine\Compatibility\Migrations\Temp_Migration())->init();
213
214
215 // call service providers
216
217 $service_providers = include \ShopEngine::plugin_dir().'core/service-provider-manager.php';
218 $method = 'init';
219 foreach( $service_providers as $service_provider ){
220
221 if(class_exists($service_provider) && method_exists($service_provider, $method)) {
222 $instance = new $service_provider();
223 $instance->$method();
224 }
225
226 }
227
228 add_filter('script_loader_tag', [$this, 'filter_load_type'], 99, 3);
229 }
230
231
232 // add async and defer attributes to enqueued scripts
233 public function filter_load_type($tag, $handle, $src) {
234
235 if(strpos($handle, '-async') !== false) {
236 $tag = str_replace(' src', ' async="async" src', $tag);
237 }
238
239 if(strpos($handle, '-defer') !== false) {
240 $tag = str_replace('<script ', '<script defer ', $tag);
241 }
242
243 return $tag;
244 }
245
246 /**
247 * Public function shopengine_track_product_views
248 * Adding Product Views Count Meta
249 */
250 public function shopengine_track_product_views() {
251
252 if(class_exists('WooCommerce') && !is_product()) {
253 return;
254 }
255
256 $product_id = get_the_id();
257
258 $cookie_name = "shopengine_recent_viewed_product";
259
260 if(isset($_COOKIE[$cookie_name])) {
261
262 $cookie_ids = $_COOKIE[$cookie_name];
263 $product_ids = explode(',', $cookie_ids);
264
265 if(!is_array($product_ids)) {
266 $product_ids = [$product_ids];
267 }
268
269 $product_ids = array_combine($product_ids, $product_ids);
270 unset($product_ids[$product_id]);
271 $product_ids[] = $product_id;
272
273 $cookie_value = implode(',', $product_ids);
274
275 } else {
276 $cookie_value = $product_id;
277 }
278
279 setcookie($cookie_name, $cookie_value, strtotime('+30 days'), '/' );
280
281 $count_key = 'shopengine_product_views_count';
282 $count = get_post_meta($product_id, $count_key, true);
283
284 if($count == '') {
285 $count = 1;
286 delete_post_meta($product_id, $count_key);
287 add_post_meta($product_id, $count_key, '1');
288 } else {
289 $count++;
290 update_post_meta($product_id, $count_key, $count);
291 }
292 }
293
294 /**
295 * Public function js_css_public .
296 * Include public function
297 *
298 * @since 1.0.0
299 */
300 public function js_css_public() {
301 wp_register_style('shopengine-public', \ShopEngine::plugin_url() . 'assets/css/shopengine-public.css', false, \ShopEngine::version());
302
303 // Modal Stylesheet
304 wp_register_style('shopengine-modal-styles', \ShopEngine::plugin_url() . 'assets/css/shopengine-modal.css', false, \ShopEngine::version());
305
306 // Modal Script
307 wp_register_script('shopengine-modal-script', \ShopEngine::plugin_url() . 'assets/js/shopengine-modal.js', ['jquery'], \ShopEngine::version(), true);
308
309 wp_enqueue_script('shopengine-simple-scrollbar.js-js', \ShopEngine::plugin_url() . 'assets/js/simple-scrollbar.js', [], \ShopEngine::version(), true);
310 wp_enqueue_script('shopengine-filter-js', \ShopEngine::plugin_url() . 'assets/js/filter.js', [], \ShopEngine::version(), true);
311 wp_enqueue_script('shopengine-js', \ShopEngine::plugin_url() . 'assets/js/public.js', [], \ShopEngine::version(), true);
312
313
314 wp_localize_script('shopengine-js', 'shopEngineApiSettings', [
315 'resturl' => get_rest_url(),
316 'rest_nonce' => wp_create_nonce('wp_rest'),
317 ]);
318
319
320 /**
321 * Registering libs css/js
322 *
323 */
324
325 wp_register_style(
326 'lib-sqv-css',
327 \ShopEngine::plugin_url() . '/assets/sqv/smart-quick-view.css',
328 [],
329 \ShopEngine::version()
330 );
331
332 wp_register_script(
333 'lib-sqv-js',
334 \ShopEngine::plugin_url() . 'assets/sqv/smart-quick-view.js',
335 ['jquery', 'wc-single-product'],
336 \ShopEngine::version(),
337 true
338 );
339 }
340
341 public function js_css_elementor() {
342 wp_enqueue_style('shopnegine-panel-icon', \ShopEngine::plugin_url() . 'assets/css/shopengine-icon.css', false, \ShopEngine::version());
343
344 if('shopengine-template' === get_post_type()):
345 wp_enqueue_style('shopnegine-editor-css', \ShopEngine::plugin_url() . 'assets/css/editor.css', false, \ShopEngine::version());
346 endif;
347 }
348
349
350 public function missing_woocommerce() {
351
352 if(isset($_GET['activate'])) {
353 unset($_GET['activate']);
354 }
355
356 if(file_exists(WP_PLUGIN_DIR . '/woocommerce/woocommerce.php')) {
357
358 $btn['label'] = esc_html__('Activate WooCommerce', 'shopengine');
359 $btn['url'] = wp_nonce_url('plugins.php?action=activate&plugin=woocommerce/woocommerce.php&plugin_status=all&paged=1', 'activate-plugin_woocommerce/woocommerce.php');
360
361 } else {
362
363 $btn['label'] = esc_html__('Install WooCommerce', 'shopengine');
364 $btn['url'] = wp_nonce_url(self_admin_url('update.php?action=install-plugin&plugin=woocommerce'), 'install-plugin_woocommerce');
365 }
366
367 Utils\Notice::push(
368 [
369 'id' => 'missing-woo',
370 'type' => 'error',
371 'dismissible' => true,
372 'btn' => $btn,
373 'message' => sprintf(esc_html__('ShopEngine requires woocommerce Plugin, which is currently NOT RUNNING.', 'shopengine'), '4.1.0'),
374 ]
375 );
376 }
377
378
379 public function missing_elementor() {
380
381 if(isset($_GET['activate'])) {
382 unset($_GET['activate']);
383 }
384
385 if(file_exists(WP_PLUGIN_DIR . '/elementor/elementor.php')) {
386
387 $btn['label'] = esc_html__('Activate Elementor', 'shopengine');
388 $btn['url'] = wp_nonce_url('plugins.php?action=activate&plugin=elementor/elementor.php&plugin_status=all&paged=1', 'activate-plugin_elementor/elementor.php');
389
390 } else {
391
392 $btn['label'] = esc_html__('Install Elementor', 'shopengine');
393 $btn['url'] = wp_nonce_url(self_admin_url('update.php?action=install-plugin&plugin=elementor'), 'install-plugin_elementor');
394 }
395
396 Utils\Notice::push(
397 [
398 'id' => 'missing-elementor',
399 'type' => 'error',
400 'dismissible' => true,
401 'btn' => $btn,
402 'message' => sprintf(esc_html__('ShopEngine requires Elementor version %1$s+, which is currently NOT RUNNING.', 'shopengine'), '3.0.0'),
403 ]
404 );
405 }
406
407
408 public function failed_elementor_version() {
409
410 $btn['label'] = esc_html__('Update Elementor', 'shopengine');
411 $btn['url'] = wp_nonce_url(self_admin_url('update.php?action=upgrade-plugin&plugin=elementor'), 'upgrade-plugin_elementor');
412
413 Utils\Notice::push(
414 [
415 'id' => 'unsupported-elementor-version',
416 'type' => 'error',
417 'dismissible' => true,
418 'btn' => $btn,
419 'message' => sprintf(esc_html__('ShopEngine requires Elementor version %1$s+, which is currently NOT RUNNING.', 'shopengine'), '3.0.0'),
420 ]
421 );
422 }
423
424
425 public function flush_rewrites() {
426 $form_cpt = new Core\Builders\Cpt();
427 $form_cpt->flush_rewrites();
428 }
429
430
431 public static function instance() {
432 if(!self::$instance) {
433 self::$instance = new self();
434 }
435
436 return self::$instance;
437 }
438 }
439