PluginProbe
QuadMenu – Mega Menu / trunk
QuadMenu – Mega Menu vtrunk
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
← All changes | quadmenu.php +69 -568 2.0.2trunk View file →
@@ -1,577 +1,78 @@
1 1 <?php
2 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
3 +/**
4 + * Plugin Name: QuadMenu
5 + * Plugin URI: https://quadmenu.com
6 + * Description: The best drag & drop WordPress Mega Menu plugin which allow you to create Tabs Menus & Carousel Menus.
7 + * Version: 3.3.7
8 + * Text Domain: quadmenu
9 + * Author: QuadLayers
10 + * Author URI: https://quadlayers.com
11 + * License: GPLv3
12 + * Domain Path: /languages
13 + * Request at least: 4.7.0
14 + * Tested up to: 7.1
15 + * Requires PHP: 5.6
16 + * WC requires at least: 4.0
17 + * WC tested up to: 11.0
12 18 */
13 19
14 -if (!defined('ABSPATH')) {
15 - die('-1');
20 +if ( ! defined( 'ABSPATH' ) ) {
21 + die( '-1' );
16 22 }
17 23
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);
24 +define( 'QUADMENU_PLUGIN_NAME', 'QuadMenu' );
25 +define( 'QUADMENU_PLUGIN_VERSION', '3.3.7' );
26 +define( 'QUADMENU_PLUGIN_FILE', __FILE__ );
27 +define( 'QUADMENU_PLUGIN_DIR', __DIR__ . DIRECTORY_SEPARATOR );
28 +define( 'QUADMENU_PLUGIN_URL', plugin_dir_url( QUADMENU_PLUGIN_FILE ) );
29 +define( 'QUADMENU_PLUGIN_BASENAME', plugin_basename( QUADMENU_PLUGIN_FILE ) );
30 +define( 'QUADMENU_PREFIX', 'quadmenu' );
31 +define( 'QUADMENU_WORDPRESS_URL', 'https://wordpress.org/plugins/quadmenu/' );
32 +define( 'QUADMENU_REVIEW_URL', 'https://wordpress.org/support/plugin/quadmenu/reviews/?filter=5#new-post' );
33 +define( 'QUADMENU_GROUP_URL', 'https://www.facebook.com/groups/quadlayers' );
34 +define( 'QUADMENU_DB_THEME', '_quadmenu_theme' );
35 +define( 'QUADMENU_DB_ITEM', '_menu_item_quadmenu' );
36 +define( 'QUADMENU_DEV', true );
37 +define( 'QUADMENU_COMPILE', true );
38 +// Pro compatibility
39 +define( 'QUADMENU_DOMAIN', 'quadmenu' );
40 +define( 'QUADMENU_PATH', QUADMENU_PLUGIN_DIR );
41 +define( 'QUADMENU_DEMO', 'https://quadmenu.com/demo-corporate/' );
40 42
41 -if (!class_exists('QuadMenu')) :
43 +/**
44 + * Load composer autoload
45 + */
46 +require_once __DIR__ . '/vendor/autoload.php';
47 +/**
48 + * Load compatibility
49 + */
50 +require_once __DIR__ . '/compatibility/old.php';
51 +/**
52 + * Load vendor_packages packages
53 + */
54 +require_once __DIR__ . '/vendor_packages/wp-i18n-map.php';
55 +require_once __DIR__ . '/vendor_packages/wp-dashboard-widget-news.php';
56 +require_once __DIR__ . '/vendor_packages/wp-plugin-table-links.php';
57 +require_once __DIR__ . '/vendor_packages/wp-notice-plugin-promote.php';
58 +require_once __DIR__ . '/vendor_packages/wp-plugin-suggestions.php';
59 +require_once __DIR__ . '/vendor_packages/wp-plugin-install-tab.php';
60 +require_once __DIR__ . '/vendor_packages/wp-plugin-feedback.php';
61 +/**
62 + * Load plugin classes
63 + */
64 +require_once __DIR__ . '/lib/class-plugin.php';
42 65
43 - final class QuadMenu {
66 +register_activation_hook( __FILE__, array( 'QuadLayers\\QuadMenu\\Activation', 'activation' ) );
44 67
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'));
68 +/**
69 + * Declarate compatibility with WooCommerce Custom Order Tables
70 + */
71 +add_action(
72 + 'before_woocommerce_init',
73 + function () {
74 + if ( class_exists( '\Automattic\WooCommerce\Utilities\FeaturesUtil' ) ) {
75 + \Automattic\WooCommerce\Utilities\FeaturesUtil::declare_compatibility( 'custom_order_tables', __FILE__, true );
76 + }
77 + }
78 +);