PluginProbe
QuadMenu – Mega Menu / 1.8.7
QuadMenu – Mega Menu v1.8.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 / includes / backend / walker / widgets.php

widgets.php in QuadMenu – Mega Menu 1.8.7, at includes/backend/walker/widgets.php

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