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