PluginProbe
QuadMenu – Mega Menu / 3.3.4
QuadMenu – Mega Menu v3.3.4
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 / lib / class-plugin.php

class-plugin.php in QuadMenu – Mega Menu 3.3.4, at lib/class-plugin.php

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