PluginProbe
QuadMenu – Mega Menu / 2.0.2
QuadMenu – Mega Menu v2.0.2
3.3.7 3.3.6 trunk 1.8.4 1.8.5 1.8.7 1.8.8 1.8.9 1.9.0 1.9.2 1.9.3 1.9.4 1.9.5 1.9.6 1.9.7 1.9.8 1.9.9 2.0.0 2.0.1 2.0.2 2.0.3 2.0.4 2.0.5 2.0.6 2.0.7 All 87 releases
quadmenu / quadmenu.php

quadmenu.php in QuadMenu – Mega Menu 2.0.2, at quadmenu.php

578 lines 18.1 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 /*
4 * Plugin Name: QuadMenu
5 * Plugin URI: https://www.quadmenu.com
6 * Description: The best drag & drop WordPress Mega Menu plugin which allow you to create Tabs Menus & Carousel Menus.
7 * Version: 2.0.2
8 * Author: Mega Menu
9 * Author URI: https://www.quadmenu.com
10 * Copyright: 2018 QuadMenu (https://www.quadmenu.com)
11 * Text Domain: quadmenu
12 */
13
14 if (!defined('ABSPATH')) {
15 die('-1');
16 }
17
18 define('QUADMENU_PLUGIN_NAME', 'QuadMenu');
19 define('QUADMENU_PLUGIN_VERSION', '2.0.2');
20 define('QUADMENU_PLUGIN_FILE', __FILE__);
21 define('QUADMENU_PLUGIN_DIR', __DIR__ . DIRECTORY_SEPARATOR);
22 define('QUADMENU_PLUGIN_URL', plugin_dir_url(QUADMENU_PLUGIN_FILE));
23 define('QUADMENU_PLUGIN_BASENAME', plugin_basename(QUADMENU_PLUGIN_FILE));
24 define('QUADMENU_PREFIX', 'quadmenu');
25 define('QUADMENU_WORDPRESS_URL', 'https://wordpress.org/plugins/quadmenu/');
26 define('QUADMENU_REVIEW_URL', 'https://wordpress.org/support/plugin/quadmenu/reviews/?filter=5#new-post');
27 define('QUADMENU_DEMO_URL', 'https://quadmenu.com/?utm_source=quadmenu_admin');
28 define('QUADMENU_PURCHASE_URL', QUADMENU_DEMO_URL);
29 define('QUADMENU_SUPPORT_URL', 'https://quadmenu.com/account/support/?utm_source=quadmenu_admin');
30 define('QUADMENU_DOCUMENTATION_URL', 'https://quadmenu.com/documentation/?utm_source=quadmenu_admin');
31 define('QUADMENU_GROUP_URL', 'https://www.facebook.com/groups/quadlayers');
32 define('QUADMENU_DB_THEME', '_quadmenu_theme');
33 define('QUADMENU_DB_ITEM', '_menu_item_quadmenu');
34 define('QUADMENU_DEV', false);
35 define('QUADMENU_COMPILE', true);
36 //Pro compatibility
37 define('QUADMENU_DOMAIN', 'quadmenu');
38 define('QUADMENU_PATH', QUADMENU_PLUGIN_DIR);
39 define('QUADMENU_DEMO', QUADMENU_DEMO_URL);
40
41 if (!class_exists('QuadMenu')) :
42
43 final class QuadMenu {
44
45 private $prefix = '#quadmenu-';
46 private static $instance;
47 private static $registered_icons;
48 private static $registered_icons_names;
49 public static $selected_icons;
50
51 public static function instance() {
52 if (!isset(self::$instance)) {
53 self::$instance = new QuadMenu;
54 self::$instance->constants();
55 self::$instance->config();
56 self::$instance->includes();
57 self::$instance->compatibility();
58 self::$instance->hooks();
59 self::$instance->errors();
60 }
61 return self::$instance;
62 }
63
64 private function config() {
65 require_once QUADMENU_PLUGIN_DIR . 'includes/configuration.php';
66 }
67
68 private function compatibility() {
69 require_once QUADMENU_PLUGIN_DIR . 'includes/3rd/woocommerce.php';
70 require_once QUADMENU_PLUGIN_DIR . 'includes/3rd/polylang.php';
71 require_once QUADMENU_PLUGIN_DIR . 'includes/3rd/vc.php';
72 require_once QUADMENU_PLUGIN_DIR . 'includes/3rd/elementor.php';
73 require_once QUADMENU_PLUGIN_DIR . 'includes/3rd/beaver.php';
74 require_once QUADMENU_PLUGIN_DIR . 'includes/3rd/divi.php';
75 require_once QUADMENU_PLUGIN_DIR . 'includes/widget.php';
76 }
77
78 private function hooks() {
79
80 add_filter('wp_get_nav_menu_items', array($this, 'remove_nav_menu_item'), 20, 3);
81 add_filter('wp_setup_nav_menu_item', array($this, 'setup_nav_menu_item_options'), 90);
82 add_filter('quadmenu_setup_nav_menu_item', array($this, 'setup_nav_menu_item_parents'), 5);
83 add_filter('quadmenu_setup_nav_menu_item', array($this, 'setup_nav_menu_item_validation'), 10);
84
85 add_action('init', array($this, 'register_sidebar'));
86 add_action('init', array($this, 'register_icons'), -35);
87 add_action('init', array($this, 'admin'), -25);
88 add_action('init', array($this, 'compiler'), -20);
89 add_action('init', array($this, 'locations'), -15);
90 add_action('init', array($this, 'init'), -10);
91 add_action('init', array($this, 'frontend'), -5);
92 add_action('admin_init', array($this, 'navmenu'));
93
94 add_action('plugins_loaded', array($this, 'i18n'));
95 }
96
97 public function register_sidebar() {
98
99 register_sidebar(
100 array(
101 'id' => 'quadmenu-widgets',
102 'name' => esc_html__('QuadMenu Widgets', 'quadmenu'),
103 'description' => esc_html__('Do not manually edit this sidebar.', 'quadmenu')
104 )
105 );
106 }
107
108 function register_icons() {
109
110 foreach (apply_filters('quadmenu_register_icons', array()) as $id => $settings) {
111
112 //if (!wp_style_is($id, $list = 'registered')) {
113 // wp_register_style($id, $settings['url']);
114 // }
115
116 $settings['ID'] = $id;
117
118 self::$registered_icons[$id] = (object) $settings;
119
120 self::$registered_icons_names[$id] = $settings['name'];
121 }
122 }
123
124 function registered_icons() {
125 return (object) self::$registered_icons;
126 }
127
128 function registered_icons_names() {
129 return self::$registered_icons_names;
130 }
131
132 function selected_icons() {
133
134 global $quadmenu;
135
136 if (empty($quadmenu['styles_icons'])) {
137 self::$selected_icons = $this->registered_icons()->dashicons;
138 }
139
140 if (empty($this->registered_icons()->{$quadmenu['styles_icons']})) {
141 self::$selected_icons = $this->registered_icons()->dashicons;
142 }
143
144 self::$selected_icons = $this->registered_icons()->{$quadmenu['styles_icons']};
145
146 if (!wp_style_is(self::$selected_icons->ID, $list = 'registered')) {
147 wp_register_style(self::$selected_icons->ID, self::$selected_icons->url);
148 }
149
150 return self::$selected_icons;
151 }
152
153 private function theme() {
154
155 $theme = get_stylesheet();
156
157 $theme = preg_replace('/[^a-zA-Z0-9_\-]/', '', $theme);
158
159 return $theme;
160 }
161
162 private function constants() {
163
164 $upload_dir = wp_upload_dir();
165
166 define('QUADMENU_DB_OPTIONS', "quadmenu_{$this->theme()}");
167
168 define('QUADMENU_DB_THEMES', "quadmenu_{$this->theme()}_themes");
169
170 define('QUADMENU_DB_LOCATIONS', "quadmenu_{$this->theme()}_locations");
171
172 define('QUADMENU_UPLOAD_DIR', trailingslashit("{$upload_dir['basedir']}/{$this->theme()}"));
173
174 define('QUADMENU_UPLOAD_URL', set_url_scheme(trailingslashit("{$upload_dir['baseurl']}/{$this->theme()}")));
175
176 define('QUADMENU_PANEL', apply_filters('quadmenu_hook_menu_panel', 'quadmenu_options'));
177
178 // Compatibility
179 define('QUADMENU_PATH_CSS', QUADMENU_UPLOAD_DIR);
180 define('QUADMENU_URL_CSS', QUADMENU_UPLOAD_URL);
181 define('QUADMENU_OPTIONS', QUADMENU_DB_OPTIONS);
182 define('QUADMENU_THEMES', QUADMENU_DB_THEMES);
183 define('QUADMENU_LOCATIONS', QUADMENU_DB_LOCATIONS);
184 }
185
186 private function includes() {
187
188 require_once QUADMENU_PLUGIN_DIR . 'includes/functions.php';
189
190 require_once QUADMENU_PLUGIN_DIR . 'includes/import.php';
191
192 require_once QUADMENU_PLUGIN_DIR . 'includes/activation.php';
193
194 require_once QUADMENU_PLUGIN_DIR . 'includes/panel.php';
195 }
196
197 public function admin() {
198 require_once QUADMENU_PLUGIN_DIR . 'includes/admin.php';
199 require_once QUADMENU_PLUGIN_DIR . 'includes/panel/welcome.php';
200 require_once QUADMENU_PLUGIN_DIR . 'includes/panel/system.php';
201 require_once QUADMENU_PLUGIN_DIR . 'includes/panel/options.php';
202 require_once QUADMENU_PLUGIN_DIR . 'includes/panel/suggestions.php';
203 require_once QUADMENU_PLUGIN_DIR . 'includes/panel/premium.php';
204 }
205
206 public function locations() {
207 require_once QUADMENU_PLUGIN_DIR . 'includes/locations.php';
208 }
209
210 public function init() {
211 require_once QUADMENU_PLUGIN_DIR . 'includes/themes.php';
212 require_once QUADMENU_PLUGIN_DIR . 'includes/options.php';
213 require_once QUADMENU_PLUGIN_DIR . 'includes/redux.php';
214 require_once QUADMENU_PLUGIN_DIR . 'includes/icons.php';
215 }
216
217 public function compiler() {
218
219 if (!is_admin() && !is_customize_preview())
220 return;
221
222 require_once QUADMENU_PLUGIN_DIR . 'includes/compiler.php';
223 }
224
225 function nav_menu_selected_id() {
226
227 if (wp_doing_ajax() && isset($_REQUEST['menu_id'])) {
228 return (int) $_REQUEST['menu_id'];
229 }
230
231 $nav_menus = wp_get_nav_menus(array('orderby' => 'name'));
232
233 $menu_count = count($nav_menus);
234
235 // Get recently edited nav menu
236 $recently_edited = (int) get_user_option('nav_menu_recently_edited');
237
238 $nav_menu_selected_id = isset($_REQUEST['menu']) ? (int) $_REQUEST['menu'] : 0;
239
240 // Are we on the add new screen?
241 $add_new_screen = ( isset($_REQUEST['menu']) && 0 == $_REQUEST['menu'] ) ? true : false;
242
243 $page_count = wp_count_posts('page');
244
245 $one_theme_location_no_menus = ( 1 == count(get_registered_nav_menus()) && !$add_new_screen && empty($nav_menus) && !empty($page_count->publish) ) ? true : false;
246
247 if (empty($recently_edited) && is_nav_menu($nav_menu_selected_id))
248 $recently_edited = $nav_menu_selected_id;
249
250 // Use $recently_edited if none are selected.
251 if (empty($nav_menu_selected_id) && !isset($_REQUEST['menu']) && is_nav_menu($recently_edited))
252 $nav_menu_selected_id = $recently_edited;
253
254 // On deletion of menu, if another menu exists, show it.
255 if (!$add_new_screen && 0 < $menu_count && isset($_REQUEST['action']) && 'delete' == $_REQUEST['action'])
256 $nav_menu_selected_id = $nav_menus[0]->term_id;
257
258 // Set $nav_menu_selected_id to 0 if no menus.
259 if ($one_theme_location_no_menus) {
260 $nav_menu_selected_id = 0;
261 } elseif (empty($nav_menu_selected_id) && !empty($nav_menus) && !$add_new_screen) {
262 // if we have no selection yet, and we have menus, set to the first one in the list.
263 $nav_menu_selected_id = $nav_menus[0]->term_id;
264 }
265
266 return $nav_menu_selected_id;
267 }
268
269 function is_quadmenu($nav_menu_selected_id = false) {
270
271 global $quadmenu_active_locations;
272
273 if (!$menu_locations = isset($_REQUEST['menu-locations']) && is_array($_REQUEST['menu-locations']) ? $_REQUEST['menu-locations'] : get_nav_menu_locations()) {
274 return false;
275 }
276
277 if (!$nav_menu_selected_id = $this->nav_menu_selected_id()) {
278 return false;
279 }
280
281 // chek if this menu id is in the theme locations
282 if (!in_array(sanitize_key($nav_menu_selected_id), $menu_locations)) {
283 return false;
284 }
285
286 if (count(array_intersect(array_keys($menu_locations, $nav_menu_selected_id), array_keys((array) $quadmenu_active_locations))) > 0) {
287 return true;
288 }
289
290 return false;
291 }
292
293 function is_quadmenu_location($location = false) {
294
295 global $quadmenu_active_locations;
296
297 if (!empty($quadmenu_active_locations[$location])) {
298 return true;
299 }
300
301 return false;
302 }
303
304 public function navmenu() {
305
306 if (is_quadmenu()) {
307
308 require_once QUADMENU_PLUGIN_DIR . 'includes/backend/settings.php';
309 require_once QUADMENU_PLUGIN_DIR . 'includes/backend/walker/widgets.php';
310 require_once QUADMENU_PLUGIN_DIR . 'includes/backend/walker/columns.php';
311 require_once QUADMENU_PLUGIN_DIR . 'includes/backend/walker/mega.php';
312 require_once QUADMENU_PLUGIN_DIR . 'includes/backend/walker/defaults.php';
313 require_once QUADMENU_PLUGIN_DIR . 'includes/backend/ajax.php';
314 }
315 }
316
317 public function frontend() {
318
319 //if (is_admin())
320 // return;
321
322 require_once QUADMENU_PLUGIN_DIR . 'includes/frontend/frontend.php';
323 require_once QUADMENU_PLUGIN_DIR . 'includes/frontend/integration.php';
324 require_once QUADMENU_PLUGIN_DIR . 'includes/frontend/items.php';
325 }
326
327 public function setup_nav_menu_item_options($item) {
328
329 //if (empty($item->quadmenu)) {
330 if (isset($item->ID)) {
331
332 $saved_settings = (array) get_post_meta($item->ID, QUADMENU_DB_ITEM, true);
333
334 foreach ($saved_settings as $key => $value) {
335 $item->{$key} = $value;
336 }
337
338 return apply_filters('quadmenu_setup_nav_menu_item', $item);
339 }
340 //}
341
342 return $item;
343 }
344
345 public function setup_nav_menu_item_parents($item) {
346
347 global $wp_registered_widgets;
348
349 $items = QuadMenu_Configuration::custom_nav_menu_items();
350
351 // Quadmenu
352 // -----------------------------------------------------------------
353
354 if (strpos($item->url, $this->prefix) !== false) {
355 $item->quadmenu = str_replace($this->prefix, '', $item->url);
356 }
357
358 if (isset($item->quadmenu)) {
359 if (!empty($items->{$item->quadmenu}->label)) {
360 $item->type_label = '[' . $items->{$item->quadmenu}->label . ']';
361 }
362 }
363
364 if (isset($item->quadmenu) && $item->object == 'custom') {
365 $item->object = $item->quadmenu;
366 }
367
368 if (!isset($item->quadmenu)) {
369 $item->quadmenu = $item->type;
370 }
371
372 // Replace quadmenu with object if defined
373 // -----------------------------------------------------------------
374
375 if (isset($items->{$item->object})) {
376 $item->quadmenu = $item->object;
377 }
378
379 // Replace quadmenu with object post_archive
380 // -----------------------------------------------------------------
381 if ($item->type === 'post_type_archive' && isset($items->{$item->object . '_archive'})) {
382 $item->quadmenu = $item->object . '_archive';
383 }
384
385 // Parent
386 // -----------------------------------------------------------------
387 if (empty($item->quadmenu_menu_item_parent)) {
388 if (!empty($item->menu_item_parent)) {
389
390 $parent_obj = QuadMenu::wp_setup_nav_menu_item($item->menu_item_parent);
391
392 if (isset($parent_obj->type)) {
393 //brokes the subitems
394 //if (!empty($parent_obj->quadmenu)) {
395 if (isset($parent_obj->quadmenu) && $parent_obj->type === 'custom') {
396 $item->quadmenu_menu_item_parent = $parent_obj->quadmenu;
397 } else {
398 // post_type taxonomy post_type_archive parents
399 $item->quadmenu_menu_item_parent = $parent_obj->type;
400 }
401 }
402 } else {
403 $item->quadmenu_menu_item_parent = 'main';
404 }
405 }
406
407 // Validation
408 // -----------------------------------------------------------------
409
410 if (!empty($items->{$item->quadmenu}->parent)) {
411
412 $item->quadmenu_allowed_parents = $items->{$item->quadmenu}->parent;
413
414 // Main
415 // -----------------------------------------------------------------
416 if (!is_array($item->quadmenu_allowed_parents) && $item->quadmenu_allowed_parents === 'main') {
417 $item->menu_item_parent = 0;
418 $item->quadmenu_menu_item_parent = 'main';
419 }
420
421 // Invalid
422 // -----------------------------------------------------------------
423 if (is_array($item->quadmenu_allowed_parents) && !in_array($item->quadmenu_menu_item_parent, $item->quadmenu_allowed_parents)) {
424 $item->_invalid = true;
425 }
426
427 // Invalid
428 // -----------------------------------------------------------------
429 if (!is_array($item->quadmenu_allowed_parents) && $item->quadmenu_allowed_parents != $item->quadmenu_menu_item_parent) {
430 $item->_invalid = true;
431 }
432 } else {
433 $item->quadmenu_allowed_parents = 'all';
434 }
435
436 if ($item->quadmenu == 'widget' && (empty($item->widget_id) || !isset($wp_registered_widgets[$item->widget_id]))) {
437 $item->_invalid = true;
438 }
439
440 return $item;
441 }
442
443 static function wp_setup_nav_menu_item($ID) {
444
445 $item_obj = wp_cache_get("wp_setup_nav_menu_item_{$ID}", 'quadmenu');
446
447 if ($item_obj === false) {
448
449 $item_obj = get_post($ID);
450
451 if (!empty($item_obj->ID)) {
452 $item_obj = wp_setup_nav_menu_item($item_obj);
453 }
454
455 wp_cache_set("wp_setup_nav_menu_item_{$ID}", $item_obj, 'quadmenu');
456 }
457
458 return $item_obj;
459 }
460
461 function setup_nav_menu_item_validation($item) {
462
463 if (isset($item->target) && $item->target === 'on') {
464 $item->target = '_blank';
465 }
466
467 if (isset($item->target) && $item->target === 'off') {
468 $item->target = '';
469 }
470
471 if (isset($item->columns)) {
472
473 //var_dump($item->columns);
474
475 $item->columns = array_diff(array_filter((array) $item->columns), array('off'));
476 }
477
478 return $item;
479 }
480
481 public function remove_nav_menu_item($items, $menu, $args) {
482
483 if (is_quadmenu()) {
484
485 foreach ($items as $key => $item) {
486
487 if (!wp_doing_ajax()) {
488
489 // Remove invalid items in frontend
490 if (!is_admin() && $item->_invalid) {
491 unset($items[$key]);
492 }
493
494 // Remove valid quadmenu items
495 if (is_admin() && !$item->_invalid && in_array(sanitize_key($item->quadmenu_menu_item_parent), apply_filters('quadmenu_remove_nav_menu_item', array('column', 'mega', 'login')))) {
496 unset($items[$key]);
497 }
498
499 // Remove invalid items without parent
500 if (is_admin() && $item->_invalid && !$item->quadmenu_menu_item_parent) {
501 unset($items[$key]);
502 }
503 }
504 }
505 }
506
507 return $items;
508 }
509
510 public function edit_nav_menu_walker($menu_id) {
511 return 'QuadMenu_Walker_Nav_Menu_Edit';
512 }
513
514 function i18n() {
515 load_plugin_textdomain('quadmenu', false, QUADMENU_PLUGIN_DIR . '/languages');
516 }
517
518 public static function taburl($id = 0) {
519 return admin_url('admin.php?page=' . QUADMENU_PANEL . '&tab=' . $id);
520 }
521
522 public static function isMin() {
523 $min = '';
524
525 if (false == QUADMENU_DEV) {
526 $min = '.min';
527 }
528
529 return $min;
530 }
531
532 public static function send_json_success($json) {
533 if (ob_get_contents())
534 ob_clean();
535
536 wp_send_json_success($json);
537 }
538
539 public static function send_json_error($json) {
540 if (ob_get_contents())
541 ob_clean();
542
543 wp_send_json_error($json);
544 }
545
546 private function errors() {
547
548 if (!QUADMENU_DEV)
549 return;
550
551 ini_set('error_reporting', E_ALL);
552 ini_set('display_errors', 1);
553 ini_set('display_startup_errors', 1);
554 }
555
556 }
557
558 endif; // End if class_exists check
559
560 if (!function_exists('_QuadMenu')) {
561
562 function _QuadMenu() {
563 return QuadMenu::instance();
564 }
565
566 _QuadMenu();
567 }
568
569 if (!function_exists('is_quadmenu_location')) {
570
571 function is_quadmenu_location($location = false) {
572 return QuadMenu::instance()->is_quadmenu_location($location);
573 }
574
575 }
576
577 register_activation_hook(__FILE__, array('QuadMenu_Activation', 'activation'));
578