PluginProbe
QuadMenu – Mega Menu / 3.3.8
QuadMenu – Mega Menu v3.3.8
3.3.8 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 All 88 releases
quadmenu / lib / backend / walker / class-nav-menu-widgets.php

class-nav-menu-widgets.php in QuadMenu – Mega Menu 3.3.8, at lib/backend/walker/class-nav-menu-widgets.php

462 lines 13.8 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 namespace QuadLayers\QuadMenu\Backend\Walker;
3
4 if ( ! defined( 'ABSPATH' ) ) {
5 die( '-1' );
6 }
7 use QuadLayers\QuadMenu\Plugin;
8 use QuadLayers\QuadMenu\Backend\Settings;
9
10 /**
11 * Nav_Menu_Widgets class ex QuadMenu_Nav_Menu_Widgets
12 */
13 class Nav_Menu_Widgets extends Settings {
14
15 public static $instance;
16
17 public function __construct() {
18
19 add_meta_box( 'quadmenu_custom_nav_widgets', esc_html__( 'QuadMenu Widgets', 'quadmenu' ), array( $this, 'nav_widgets' ), 'nav-menus', 'side', 'high' );
20
21 add_filter( 'quadmenu_edit_nav_menu_walker', array( $this, 'add_nav_menu_item_widgets' ), 10, 3 );
22
23 add_action( 'quadmenu_delete_nav_menu_item', array( $this, 'delete_nav_menu_widget' ), 10, 2 );
24
25 add_action( 'wp_ajax_quadmenu_form_widget', array( $this, 'ajax_form_widget' ) );
26
27 add_action( 'wp_ajax_quadmenu_save_widget', array( $this, 'ajax_save_widget' ) );
28
29 add_action( 'wp_update_nav_menu_item', array( $this, 'update_nav_menu_item_widget' ), 20, 3 );
30
31 add_action( 'admin_print_footer_scripts-nav-menus.php', array( $this, 'admin_print_footer_scripts' ) );
32
33 add_action( 'admin_print_scripts-nav-menus.php', array( $this, 'admin_print_scripts' ) );
34
35 add_action( 'admin_print_styles-nav-menus.php', array( $this, 'admin_print_styles' ) );
36 }
37
38 public function nav_widgets() {
39
40 global $_nav_menu_placeholder;
41
42 $widgets = $this->get_available_widgets();
43 ?>
44 <div id="posttype-quadmenu-widget" class="posttypediv">
45 <div id="tabs-panel-quadmenu-widget" class="tabs-panel tabs-panel-active">
46 <ul id ="quadmenu-widget-checklist" class="categorychecklist form-no-clear">
47 <?php
48 if ( count( $widgets ) ) :
49
50 foreach ( $widgets as $id => $widget ) :
51
52 $title = esc_html__( 'Widget', 'quadmenu' );
53
54 if ( isset( $widget['label'] ) ) {
55 $title = $widget['label'];
56 }
57
58 $_nav_menu_placeholder = ( 0 > $_nav_menu_placeholder ) ? intval( $_nav_menu_placeholder ) - 1 : -1;
59 ?>
60
61 <li class="quadmenu-type-depth-<?php echo esc_attr( $widget['depth'] ); ?>">
62 <label class="menu-item-title">
63 <input type="checkbox" class="menu-item-checkbox" name="menu-item[<?php echo esc_attr( $_nav_menu_placeholder ); ?>][menu-item-label]" value="0">
64 <?php echo esc_html( $title ); ?>
65 <?php if ( ! empty( $widget['desc'] ) ) : ?>
66 <small><?php echo $widget['desc']; ?></small>
67 <?php endif; ?>
68 </label>
69 <input type="hidden" class="menu-item-type" name="menu-item[<?php echo esc_attr( $_nav_menu_placeholder ); ?>][menu-item-type]" value="custom">
70 <input type="hidden" class="menu-item-title" name="menu-item[<?php echo esc_attr( $_nav_menu_placeholder ); ?>][menu-item-title]" value="<?php echo esc_attr( $title ); ?>">
71 <input type="hidden" class="menu-item-quadmenu" name="menu-item[<?php echo esc_attr( $_nav_menu_placeholder ); ?>][menu-item-quadmenu]" value="widget">
72 <input type="hidden" class="menu-item-quadmenu-widget" name="menu-item[<?php echo esc_attr( $_nav_menu_placeholder ); ?>][menu-item-quadmenu-widget]" value="<?php echo esc_attr( $id ); ?>">
73 </li>
74 <?php endforeach; ?>
75 <?php endif; ?>
76 </ul>
77 </div>
78 <p class="button-controls">
79 <span class="add-to-menu">
80 <input type="submit" class="button-secondary submit-add-to-quadmenu right" value="<?php esc_html_e( 'Add to Menu' ); ?>" name="submit-posttype-quadmenu-widget" id="submit-posttype-quadmenu-widget">
81 <span class="spinner"></span>
82 </span>
83 </p>
84 </div>
85 <?php
86 }
87
88 public function get_available_widgets() {
89
90 global $wp_widget_factory;
91
92 $widgets = array();
93
94 if ( count( $wp_widget_factory->widgets ) ) {
95
96 foreach ( $wp_widget_factory->widgets as $widget ) {
97
98 if ( isset( $widget->id_base ) && $widget->id_base != 'quadmenu_widget' ) {
99
100 $disabled_widgets = apply_filters( 'quadmenu_incompatible_widgets', array() );
101
102 if ( ! in_array( sanitize_key( $widget->id_base ), $disabled_widgets ) ) {
103
104 $widgets[ $widget->id_base ] = array(
105 'depth' => 2,
106 'label' => $widget->name,
107 'url' => '#widget',
108 );
109
110 if ( isset( $widget->widget_options['description'] ) ) {
111 $widgets[ $widget->id_base ]['desc'] = $widget->widget_options['description'];
112 }
113 }
114 }
115 }
116 }
117
118 return $widgets;
119 }
120
121 public function update_nav_menu_item_widget( $menu_id, $menu_item_db_id, $args ) {
122
123 if ( ! empty( $args['menu-item-quadmenu-widget'] ) ) {
124
125 require_once ABSPATH . 'wp-admin/includes/widgets.php';
126
127 $saved_settings = array_filter( (array) get_post_meta( $menu_item_db_id, QUADMENU_DB_ITEM, true ) );
128
129 $id_base = sanitize_text_field( $args['menu-item-quadmenu-widget'] );
130
131 $next_id = next_widget_id_number( $id_base );
132
133 $this->add_widget_instance( $id_base, $next_id, $menu_item_db_id );
134
135 $widget_id = $this->add_widget_to_sidebar( $id_base, $next_id );
136
137 $saved_settings['widget'] = $id_base;
138
139 $saved_settings['widget_number'] = $next_id;
140
141 $saved_settings['widget_id'] = $widget_id;
142
143 update_post_meta( $menu_item_db_id, QUADMENU_DB_ITEM, $saved_settings );
144 }
145 }
146
147 function add_nav_menu_item_widgets( $walker_class_name, $menu_id = null, $menu_obj = null, $menu_items = null ) {
148
149 if ( ! empty( $menu_obj->menu_item_parent ) && ! empty( $menu_obj->quadmenu ) && $menu_obj->quadmenu === 'widget' ) {
150 return __CLASS__;
151 }
152
153 return $walker_class_name;
154 }
155
156 public function walk( $elements, $max_depth, $args ) {
157
158 $output = '';
159
160 foreach ( $elements as $e ) {
161
162 $output .= $this->widgets( $e, (object) $args );
163 }
164
165 return $output;
166
167 wp_die();
168 }
169
170 public function widgets( $widget_obj, $args ) {
171
172 global $wp_registered_widgets;
173
174 if ( ! isset( $args->doing_ajax ) && $widget_obj->_invalid ) {
175 ob_start();
176 ?>
177 <li id="item-<?php echo esc_attr( $widget_obj->ID ); ?>" class="quadmenu-column-item quadmenu-invalid sortable-item" title="<?php echo esc_attr( $widget_obj->title ); ?>" data-menu_item_type="<?php echo esc_attr( $widget_obj->quadmenu ); ?>" data-menu_item_id="<?php echo esc_attr( $widget_obj->ID ); ?>" data-menu_item_position="<?php echo esc_attr( $widget_obj->menu_order ); ?>">
178 <div class="inner">
179 <div class="action-top clearfix">
180 <div class="actions">
181 <a class="option remove" title="<?php echo esc_html__( 'Remove', 'quadmenu' ); ?>"></a>
182 <span class="spinner active"></span>
183 </div>
184 <div class="item-title">
185 <span class="quadmenu-title"><?php echo esc_html( $widget_obj->title ); ?> <?php esc_html_e( '(Invalid)', 'quadmenu' ); ?></span>
186 </div>
187 </div>
188 <div class="settings">
189 <form class="form-widget" method="post" data-menu_item_id="<?php echo esc_attr( $widget_obj->ID ); ?>">
190 </form>
191 </div>
192 </div>
193 </li>
194 <?php
195 return ob_get_clean();
196 }
197
198 ob_start();
199 ?>
200
201 <li id="item-<?php echo esc_attr( $widget_obj->ID ); ?>" class="quadmenu-column-item quadmenu-widget sortable-item" title="<?php echo esc_html( $widget_obj->title ); ?>" data-menu_item_type="<?php echo esc_attr( $widget_obj->quadmenu ); ?>" data-menu_item_id="<?php echo esc_attr( $widget_obj->ID ); ?>" data-menu_item_position="<?php echo esc_attr( $widget_obj->menu_order ); ?>" data-widget="<?php echo esc_attr( $widget_obj->widget ); ?>" data-widget_id="<?php echo esc_attr( $widget_obj->widget_id ); ?>">
202 <div class="inner">
203 <div class="action-top clearfix">
204 <div class="actions">
205 <a class="option edit" title="<?php echo esc_html__( 'Edit', 'quadmenu' ); ?>"></a>
206 <a class="option remove" title="<?php echo esc_html__( 'Remove', 'quadmenu' ); ?>"></a>
207 <span class="spinner active"></span>
208 </div>
209 <div class="item-title">
210 <span class="quadmenu-title"><?php echo esc_html( $widget_obj->title ); ?></span>
211 </div>
212 </div>
213 <div class="settings">
214 <div class="widget" title="<?php echo esc_attr( $widget_obj->title ); ?>" id="<?php echo esc_attr( $widget_obj->widget_id ); ?>" data-type="widget" data-id="<?php echo esc_attr( $widget_obj->widget_id ); ?>">
215 <div class="widget-inner widget-inside">
216 <form method="post" data-menu_item_id="<?php echo esc_attr( $widget_obj->ID ); ?>">
217 </form>
218 </div>
219 </div>
220 </div>
221 </div>
222 </li>
223 <?php
224 return ob_get_clean();
225 }
226
227 public function ajax_form_widget() {
228
229 if ( ! check_ajax_referer( 'quadmenu', 'nonce', false ) ) {
230 Plugin::send_json_error( esc_html__( 'Please reload the page.', 'quadmenu' ) );
231 }
232
233 $widget_id = sanitize_text_field( $_REQUEST['widget_id'] );
234 $menu_item_id = absint( $_REQUEST['menu_item_id'] );
235
236 if ( ob_get_contents() ) {
237 ob_clean();
238 }
239
240 if ( $form = $this->form_widget( $widget_id ) ) {
241 Plugin::send_json_success( $form );
242 } else {
243 Plugin::send_json_error( sprintf( esc_html__( 'Failed to load widget %1$s form in %2$d', 'quadmenu' ), $widget_id, $menu_item_id ) );
244 }
245
246 wp_die();
247 }
248
249 public function form_widget( $widget_id ) {
250
251 global $wp_registered_widget_controls;
252
253 $control = $wp_registered_widget_controls[ $widget_id ];
254
255 $id_base = $this->get_id_base_for_widget_id( $widget_id );
256
257 ob_start();
258 ?>
259 <input type="hidden" name="widget-id" class="widget-id" value="<?php echo esc_attr( $widget_id ); ?>" />
260 <input type="hidden" name="id_base" class="id_base" value="<?php echo esc_attr( $id_base ); ?>" />
261 <input type="hidden" name="widget_id" class="widget_id" value="<?php echo esc_attr( $widget_id ); ?>" />
262 <div class="widget-content">
263 <?php
264 if ( is_callable( $control['callback'] ) ) {
265 call_user_func_array( $control['callback'], $control['params'] );
266 }
267 ?>
268 <?php submit_button( esc_html__( 'Save' ), 'button button-primary alignright', 'savewidget', false ); ?>
269 </div>
270 <div class="clearfix"></div>
271 <?php
272 return ob_get_clean();
273 }
274
275 private function add_widget_instance( $id_base, $next_id, $menu_item_id ) {
276
277 $current_widgets = get_option( 'widget_' . $id_base );
278
279 $current_widgets[ $next_id ] = array(
280 'quadmenu_parent_menu_id' => $menu_item_id,
281 );
282
283 update_option( 'widget_' . $id_base, $current_widgets );
284 }
285
286 private function add_widget_to_sidebar( $id_base, $next_id ) {
287
288 $widget_id = $id_base . '-' . $next_id;
289
290 $sidebar_widgets = $this->get_sidebar_widgets();
291
292 $sidebar_widgets[] = $widget_id;
293
294 $this->set_sidebar_widgets( $sidebar_widgets );
295
296 return $widget_id;
297 }
298
299 public function get_sidebar_widgets() {
300
301 $sidebar_widgets = wp_get_sidebars_widgets();
302
303 if ( ! isset( $sidebar_widgets['quadmenu-widgets'] ) ) {
304 return false;
305 }
306
307 return $sidebar_widgets['quadmenu-widgets'];
308 }
309
310 private function set_sidebar_widgets( $widgets ) {
311
312 $sidebar_widgets = wp_get_sidebars_widgets();
313
314 // Remove because is not defined in first init
315 // if (!isset($sidebar_widgets['quadmenu-widgets'])) {
316 // return false;
317 // }
318
319 $sidebar_widgets['quadmenu-widgets'] = $widgets;
320
321 wp_set_sidebars_widgets( $sidebar_widgets );
322 }
323
324 public function ajax_save_widget() {
325
326 if ( ! check_ajax_referer( 'quadmenu', 'nonce', false ) ) {
327 Plugin::send_json_error( esc_html__( 'Please reload the page.', 'quadmenu' ) );
328 }
329
330 $menu_item_id = absint( $_REQUEST['menu_item_id'] );
331
332 $id_base = sanitize_text_field( $_REQUEST['id_base'] );
333
334 $saved = $this->save_widget( $id_base );
335
336 if ( $saved ) {
337 Plugin::send_json_success( sprintf( esc_html__( 'Saved settings of %s Widget', 'quadmenu' ), $saved[0]->name ) );
338 } else {
339 Plugin::send_json_error( sprintf( esc_html__( 'Failed to add %1$s to %2$d', 'quadmenu' ), $id_base, $menu_item_id ) );
340 }
341
342 wp_die();
343 }
344
345 public function save_widget( $id_base ) {
346
347 global $wp_registered_widget_updates;
348
349 $control = $wp_registered_widget_updates[ $id_base ];
350
351 if ( isset( $control['callback'] ) && isset( $control['params'] ) && is_callable( $control['callback'] ) ) {
352
353 call_user_func_array( $control['callback'], $control['params'] );
354
355 return $control['callback'];
356 }
357
358 return false;
359 }
360
361 public function delete_nav_menu_widget( $ID, $menu_id ) {
362
363 $menu_obj = Plugin::wp_setup_nav_menu_item( $ID );
364
365 if ( empty( $menu_obj->widget_id ) ) {
366 return;
367 }
368
369 $this->delete_widget( $menu_obj->widget_id );
370 }
371
372 function delete_widget( $widget_id ) {
373
374 $this->remove_widget_from_sidebar( $widget_id );
375 $this->remove_widget_instance( $widget_id );
376
377 return true;
378 }
379
380 private function remove_widget_from_sidebar( $widget_id ) {
381
382 $widgets = $this->get_sidebar_widgets();
383
384 $new_quadmenu_widgets = array();
385
386 if ( count( $widgets ) ) {
387 foreach ( $widgets as $widget ) {
388
389 if ( $widget != $widget_id ) {
390 $new_quadmenu_widgets[] = $widget;
391 }
392 }
393 }
394 $this->set_sidebar_widgets( $new_quadmenu_widgets );
395
396 return $widget_id;
397 }
398
399 public function get_id_base_for_widget_id( $widget_id ) {
400 global $wp_registered_widget_controls;
401
402 if ( ! isset( $wp_registered_widget_controls[ $widget_id ] ) ) {
403 return false;
404 }
405
406 $control = $wp_registered_widget_controls[ $widget_id ];
407
408 $id_base = isset( $control['id_base'] ) ? $control['id_base'] : $control['id'];
409
410 return $id_base;
411 }
412
413 private function remove_widget_instance( $widget_id ) {
414
415 $id_base = $this->get_id_base_for_widget_id( $widget_id );
416
417 $widget_number = $this->get_widget_number_for_widget_id( $widget_id );
418
419 $current_widgets = get_option( 'widget_' . $id_base );
420
421 if ( isset( $current_widgets[ $widget_number ] ) ) {
422
423 unset( $current_widgets[ $widget_number ] );
424
425 update_option( 'widget_' . $id_base, $current_widgets );
426
427 return true;
428 }
429
430 return false;
431 }
432
433 public function get_widget_number_for_widget_id( $widget_id ) {
434
435 $parts = explode( '-', $widget_id );
436
437 return absint( end( $parts ) );
438 }
439
440 public function admin_print_footer_scripts( $hook ) {
441
442 do_action( 'admin_footer-widgets.php' );
443 }
444
445 public function admin_print_scripts( $hook ) {
446
447 do_action( 'admin_print_scripts-widgets.php' );
448 }
449
450 public function admin_print_styles( $hook ) {
451
452 do_action( 'admin_print_styles-widgets.php' );
453 }
454
455 public static function instance() {
456 if ( ! isset( self::$instance ) ) {
457 self::$instance = new self();
458 }
459 return self::$instance;
460 }
461 }
462