PluginProbe
QuadMenu – Mega Menu / 2.0.1
QuadMenu – Mega Menu v2.0.1
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.1, at quadmenu.php

571 lines 17.8 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.1
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.1');
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_OPTIONS', "quadmenu_{$this->theme()}");
167
168 define('QUADMENU_THEMES', "quadmenu_{$this->theme()}_themes");
169
170 define('QUADMENU_LOCATIONS', "quadmenu_{$this->theme()}_locations");
171
172 define('QUADMENU_PLUGIN_DIR_CSS', trailingslashit("{$upload_dir['basedir']}/{$this->theme()}"));
173
174 define('QUADMENU_PLUGIN_URL_CSS', set_url_scheme(trailingslashit("{$upload_dir['baseurl']}/{$this->theme()}")));
175
176 define('QUADMENU_PANEL', apply_filters('quadmenu_hook_menu_panel', 'quadmenu_options'));
177 }
178
179 private function includes() {
180
181 require_once QUADMENU_PLUGIN_DIR . 'includes/functions.php';
182
183 require_once QUADMENU_PLUGIN_DIR . 'includes/import.php';
184
185 require_once QUADMENU_PLUGIN_DIR . 'includes/activation.php';
186
187 require_once QUADMENU_PLUGIN_DIR . 'includes/panel.php';
188 }
189
190 public function admin() {
191 require_once QUADMENU_PLUGIN_DIR . 'includes/admin.php';
192 require_once QUADMENU_PLUGIN_DIR . 'includes/panel/welcome.php';
193 require_once QUADMENU_PLUGIN_DIR . 'includes/panel/system.php';
194 require_once QUADMENU_PLUGIN_DIR . 'includes/panel/options.php';
195 require_once QUADMENU_PLUGIN_DIR . 'includes/panel/suggestions.php';
196 require_once QUADMENU_PLUGIN_DIR . 'includes/panel/premium.php';
197 }
198
199 public function locations() {
200 require_once QUADMENU_PLUGIN_DIR . 'includes/locations.php';
201 }
202
203 public function init() {
204 require_once QUADMENU_PLUGIN_DIR . 'includes/themes.php';
205 require_once QUADMENU_PLUGIN_DIR . 'includes/options.php';
206 require_once QUADMENU_PLUGIN_DIR . 'includes/redux.php';
207 require_once QUADMENU_PLUGIN_DIR . 'includes/icons.php';
208 }
209
210 public function compiler() {
211
212 if (!is_admin() && !is_customize_preview())
213 return;
214
215 require_once QUADMENU_PLUGIN_DIR . 'includes/compiler.php';
216 }
217
218 function nav_menu_selected_id() {
219
220 if (wp_doing_ajax() && isset($_REQUEST['menu_id'])) {
221 return (int) $_REQUEST['menu_id'];
222 }
223
224 $nav_menus = wp_get_nav_menus(array('orderby' => 'name'));
225
226 $menu_count = count($nav_menus);
227
228 // Get recently edited nav menu
229 $recently_edited = (int) get_user_option('nav_menu_recently_edited');
230
231 $nav_menu_selected_id = isset($_REQUEST['menu']) ? (int) $_REQUEST['menu'] : 0;
232
233 // Are we on the add new screen?
234 $add_new_screen = ( isset($_REQUEST['menu']) && 0 == $_REQUEST['menu'] ) ? true : false;
235
236 $page_count = wp_count_posts('page');
237
238 $one_theme_location_no_menus = ( 1 == count(get_registered_nav_menus()) && !$add_new_screen && empty($nav_menus) && !empty($page_count->publish) ) ? true : false;
239
240 if (empty($recently_edited) && is_nav_menu($nav_menu_selected_id))
241 $recently_edited = $nav_menu_selected_id;
242
243 // Use $recently_edited if none are selected.
244 if (empty($nav_menu_selected_id) && !isset($_REQUEST['menu']) && is_nav_menu($recently_edited))
245 $nav_menu_selected_id = $recently_edited;
246
247 // On deletion of menu, if another menu exists, show it.
248 if (!$add_new_screen && 0 < $menu_count && isset($_REQUEST['action']) && 'delete' == $_REQUEST['action'])
249 $nav_menu_selected_id = $nav_menus[0]->term_id;
250
251 // Set $nav_menu_selected_id to 0 if no menus.
252 if ($one_theme_location_no_menus) {
253 $nav_menu_selected_id = 0;
254 } elseif (empty($nav_menu_selected_id) && !empty($nav_menus) && !$add_new_screen) {
255 // if we have no selection yet, and we have menus, set to the first one in the list.
256 $nav_menu_selected_id = $nav_menus[0]->term_id;
257 }
258
259 return $nav_menu_selected_id;
260 }
261
262 function is_quadmenu($nav_menu_selected_id = false) {
263
264 global $quadmenu_active_locations;
265
266 if (!$menu_locations = isset($_REQUEST['menu-locations']) && is_array($_REQUEST['menu-locations']) ? $_REQUEST['menu-locations'] : get_nav_menu_locations()) {
267 return false;
268 }
269
270 if (!$nav_menu_selected_id = $this->nav_menu_selected_id()) {
271 return false;
272 }
273
274 // chek if this menu id is in the theme locations
275 if (!in_array(sanitize_key($nav_menu_selected_id), $menu_locations)) {
276 return false;
277 }
278
279 if (count(array_intersect(array_keys($menu_locations, $nav_menu_selected_id), array_keys((array) $quadmenu_active_locations))) > 0) {
280 return true;
281 }
282
283 return false;
284 }
285
286 function is_quadmenu_location($location = false) {
287
288 global $quadmenu_active_locations;
289
290 if (!empty($quadmenu_active_locations[$location])) {
291 return true;
292 }
293
294 return false;
295 }
296
297 public function navmenu() {
298
299 if (is_quadmenu()) {
300
301 require_once QUADMENU_PLUGIN_DIR . 'includes/backend/settings.php';
302 require_once QUADMENU_PLUGIN_DIR . 'includes/backend/walker/widgets.php';
303 require_once QUADMENU_PLUGIN_DIR . 'includes/backend/walker/columns.php';
304 require_once QUADMENU_PLUGIN_DIR . 'includes/backend/walker/mega.php';
305 require_once QUADMENU_PLUGIN_DIR . 'includes/backend/walker/defaults.php';
306 require_once QUADMENU_PLUGIN_DIR . 'includes/backend/ajax.php';
307 }
308 }
309
310 public function frontend() {
311
312 //if (is_admin())
313 // return;
314
315 require_once QUADMENU_PLUGIN_DIR . 'includes/frontend/frontend.php';
316 require_once QUADMENU_PLUGIN_DIR . 'includes/frontend/integration.php';
317 require_once QUADMENU_PLUGIN_DIR . 'includes/frontend/items.php';
318 }
319
320 public function setup_nav_menu_item_options($item) {
321
322 //if (empty($item->quadmenu)) {
323 if (isset($item->ID)) {
324
325 $saved_settings = (array) get_post_meta($item->ID, QUADMENU_DB_ITEM, true);
326
327 foreach ($saved_settings as $key => $value) {
328 $item->{$key} = $value;
329 }
330
331 return apply_filters('quadmenu_setup_nav_menu_item', $item);
332 }
333 //}
334
335 return $item;
336 }
337
338 public function setup_nav_menu_item_parents($item) {
339
340 global $wp_registered_widgets;
341
342 $items = QuadMenu_Configuration::custom_nav_menu_items();
343
344 // Quadmenu
345 // -----------------------------------------------------------------
346
347 if (strpos($item->url, $this->prefix) !== false) {
348 $item->quadmenu = str_replace($this->prefix, '', $item->url);
349 }
350
351 if (isset($item->quadmenu)) {
352 if (!empty($items->{$item->quadmenu}->label)) {
353 $item->type_label = '[' . $items->{$item->quadmenu}->label . ']';
354 }
355 }
356
357 if (isset($item->quadmenu) && $item->object == 'custom') {
358 $item->object = $item->quadmenu;
359 }
360
361 if (!isset($item->quadmenu)) {
362 $item->quadmenu = $item->type;
363 }
364
365 // Replace quadmenu with object if defined
366 // -----------------------------------------------------------------
367
368 if (isset($items->{$item->object})) {
369 $item->quadmenu = $item->object;
370 }
371
372 // Replace quadmenu with object post_archive
373 // -----------------------------------------------------------------
374 if ($item->type === 'post_type_archive' && isset($items->{$item->object . '_archive'})) {
375 $item->quadmenu = $item->object . '_archive';
376 }
377
378 // Parent
379 // -----------------------------------------------------------------
380 if (empty($item->quadmenu_menu_item_parent)) {
381 if (!empty($item->menu_item_parent)) {
382
383 $parent_obj = QuadMenu::wp_setup_nav_menu_item($item->menu_item_parent);
384
385 if (isset($parent_obj->type)) {
386 //brokes the subitems
387 //if (!empty($parent_obj->quadmenu)) {
388 if (isset($parent_obj->quadmenu) && $parent_obj->type === 'custom') {
389 $item->quadmenu_menu_item_parent = $parent_obj->quadmenu;
390 } else {
391 // post_type taxonomy post_type_archive parents
392 $item->quadmenu_menu_item_parent = $parent_obj->type;
393 }
394 }
395 } else {
396 $item->quadmenu_menu_item_parent = 'main';
397 }
398 }
399
400 // Validation
401 // -----------------------------------------------------------------
402
403 if (!empty($items->{$item->quadmenu}->parent)) {
404
405 $item->quadmenu_allowed_parents = $items->{$item->quadmenu}->parent;
406
407 // Main
408 // -----------------------------------------------------------------
409 if (!is_array($item->quadmenu_allowed_parents) && $item->quadmenu_allowed_parents === 'main') {
410 $item->menu_item_parent = 0;
411 $item->quadmenu_menu_item_parent = 'main';
412 }
413
414 // Invalid
415 // -----------------------------------------------------------------
416 if (is_array($item->quadmenu_allowed_parents) && !in_array($item->quadmenu_menu_item_parent, $item->quadmenu_allowed_parents)) {
417 $item->_invalid = true;
418 }
419
420 // Invalid
421 // -----------------------------------------------------------------
422 if (!is_array($item->quadmenu_allowed_parents) && $item->quadmenu_allowed_parents != $item->quadmenu_menu_item_parent) {
423 $item->_invalid = true;
424 }
425 } else {
426 $item->quadmenu_allowed_parents = 'all';
427 }
428
429 if ($item->quadmenu == 'widget' && (empty($item->widget_id) || !isset($wp_registered_widgets[$item->widget_id]))) {
430 $item->_invalid = true;
431 }
432
433 return $item;
434 }
435
436 static function wp_setup_nav_menu_item($ID) {
437
438 $item_obj = wp_cache_get("wp_setup_nav_menu_item_{$ID}", 'quadmenu');
439
440 if ($item_obj === false) {
441
442 $item_obj = get_post($ID);
443
444 if (!empty($item_obj->ID)) {
445 $item_obj = wp_setup_nav_menu_item($item_obj);
446 }
447
448 wp_cache_set("wp_setup_nav_menu_item_{$ID}", $item_obj, 'quadmenu');
449 }
450
451 return $item_obj;
452 }
453
454 function setup_nav_menu_item_validation($item) {
455
456 if (isset($item->target) && $item->target === 'on') {
457 $item->target = '_blank';
458 }
459
460 if (isset($item->target) && $item->target === 'off') {
461 $item->target = '';
462 }
463
464 if (isset($item->columns)) {
465
466 //var_dump($item->columns);
467
468 $item->columns = array_diff(array_filter((array) $item->columns), array('off'));
469 }
470
471 return $item;
472 }
473
474 public function remove_nav_menu_item($items, $menu, $args) {
475
476 if (is_quadmenu()) {
477
478 foreach ($items as $key => $item) {
479
480 if (!wp_doing_ajax()) {
481
482 // Remove invalid items in frontend
483 if (!is_admin() && $item->_invalid) {
484 unset($items[$key]);
485 }
486
487 // Remove valid quadmenu items
488 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')))) {
489 unset($items[$key]);
490 }
491
492 // Remove invalid items without parent
493 if (is_admin() && $item->_invalid && !$item->quadmenu_menu_item_parent) {
494 unset($items[$key]);
495 }
496 }
497 }
498 }
499
500 return $items;
501 }
502
503 public function edit_nav_menu_walker($menu_id) {
504 return 'QuadMenu_Walker_Nav_Menu_Edit';
505 }
506
507 function i18n() {
508 load_plugin_textdomain('quadmenu', false, QUADMENU_PLUGIN_DIR . '/languages');
509 }
510
511 public static function taburl($id = 0) {
512 return admin_url('admin.php?page=' . QUADMENU_PANEL . '&tab=' . $id);
513 }
514
515 public static function isMin() {
516 $min = '';
517
518 if (false == QUADMENU_DEV) {
519 $min = '.min';
520 }
521
522 return $min;
523 }
524
525 public static function send_json_success($json) {
526 if (ob_get_contents())
527 ob_clean();
528
529 wp_send_json_success($json);
530 }
531
532 public static function send_json_error($json) {
533 if (ob_get_contents())
534 ob_clean();
535
536 wp_send_json_error($json);
537 }
538
539 private function errors() {
540
541 if (!QUADMENU_DEV)
542 return;
543
544 ini_set('error_reporting', E_ALL);
545 ini_set('display_errors', 1);
546 ini_set('display_startup_errors', 1);
547 }
548
549 }
550
551 endif; // End if class_exists check
552
553 if (!function_exists('_QuadMenu')) {
554
555 function _QuadMenu() {
556 return QuadMenu::instance();
557 }
558
559 _QuadMenu();
560 }
561
562 if (!function_exists('is_quadmenu_location')) {
563
564 function is_quadmenu_location($location = false) {
565 return QuadMenu::instance()->is_quadmenu_location($location);
566 }
567
568 }
569
570 register_activation_hook(__FILE__, array('QuadMenu_Activation', 'activation'));
571