PluginProbe
QuadMenu – Mega Menu / 1.9.7
QuadMenu – Mega Menu v1.9.7
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 1.9.7, at quadmenu.php

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