get_available_widgets();
?>
widgets)) {
foreach ($wp_widget_factory->widgets as $widget) {
if (isset($widget->id_base) && $widget->id_base != 'quadmenu_widget') {
$disabled_widgets = apply_filters('quadmenu_incompatible_widgets', array());
if (!in_array(sanitize_key($widget->id_base), $disabled_widgets)) {
$widgets[$widget->id_base] = array(
'depth' => 2,
'label' => $widget->name,
'url' => '#widget',
);
if (isset($widget->widget_options['description'])) {
$widgets[$widget->id_base]['desc'] = $widget->widget_options['description'];
}
}
}
}
}
return $widgets;
}
public function update_nav_menu_item_widget($menu_id, $menu_item_db_id, $args) {
if (!empty($args['menu-item-quadmenu-widget'])) {
require_once( ABSPATH . 'wp-admin/includes/widgets.php' );
$saved_settings = array_filter((array) get_post_meta($menu_item_db_id, QUADMENU_DB_KEY, true));
$id_base = sanitize_text_field($args['menu-item-quadmenu-widget']);
$next_id = next_widget_id_number($id_base);
$this->add_widget_instance($id_base, $next_id, $menu_item_db_id);
$widget_id = $this->add_widget_to_sidebar($id_base, $next_id);
$saved_settings['widget'] = $id_base;
$saved_settings['widget_number'] = $next_id;
$saved_settings['widget_id'] = $widget_id;
update_post_meta($menu_item_db_id, QUADMENU_DB_KEY, $saved_settings);
}
}
function add_nav_menu_item_widgets($walker_class_name, $menu_id = null, $menu_obj = null, $menu_items = null) {
if (!empty($menu_obj->menu_item_parent) && !empty($menu_obj->quadmenu) && $menu_obj->quadmenu === 'widget') {
return __CLASS__;
}
return $walker_class_name;
}
public function walk($elements, $max_depth, $args) {
$output = '';
foreach ($elements as $e) {
$output .= $this->widgets($e, (object) $args);
}
return $output;
wp_die();
}
public function widgets($widget_obj, $args) {
global $wp_registered_widgets;
if (!isset($args->doing_ajax) && $widget_obj->_invalid) {
ob_start();
?>
form_widget($widget_id)) {
QuadMenu::send_json_success($form);
} else {
QuadMenu::send_json_error(sprintf(esc_html__('Failed to load widget %s form in %d', 'quadmenu'), $widget_id, $menu_item_id));
}
wp_die();
}
public function form_widget($widget_id) {
global $wp_registered_widget_controls;
$control = $wp_registered_widget_controls[$widget_id];
$id_base = $this->get_id_base_for_widget_id($widget_id);
ob_start();
?>
$menu_item_id
);
update_option('widget_' . $id_base, $current_widgets);
}
private function add_widget_to_sidebar($id_base, $next_id) {
$widget_id = $id_base . '-' . $next_id;
$sidebar_widgets = $this->get_sidebar_widgets();
$sidebar_widgets[] = $widget_id;
$this->set_sidebar_widgets($sidebar_widgets);
return $widget_id;
}
public function get_sidebar_widgets() {
$sidebar_widgets = wp_get_sidebars_widgets();
if (!isset($sidebar_widgets['quadmenu-widgets'])) {
return false;
}
return $sidebar_widgets['quadmenu-widgets'];
}
private function set_sidebar_widgets($widgets) {
$sidebar_widgets = wp_get_sidebars_widgets();
// Remove because is not defined in first init
//if (!isset($sidebar_widgets['quadmenu-widgets'])) {
// return false;
//}
$sidebar_widgets['quadmenu-widgets'] = $widgets;
wp_set_sidebars_widgets($sidebar_widgets);
}
public function ajax_save_widget() {
if (!check_ajax_referer('quadmenu', 'nonce', false)) {
QuadMenu::send_json_error(esc_html__('Please reload page.', 'quadmenu'));
}
$menu_item_id = absint($_REQUEST['menu_item_id']);
$id_base = sanitize_text_field($_REQUEST['id_base']);
$saved = $this->save_widget($id_base);
if ($saved) {
QuadMenu::send_json_success(sprintf(esc_html__('Saved settings of %s Widget', 'quadmenu'), $saved[0]->name));
} else {
QuadMenu::send_json_error(sprintf(esc_html__('Failed to add %s to %d', 'quadmenu'), $id_base, $menu_item_id));
}
wp_die();
}
public function save_widget($id_base) {
global $wp_registered_widget_updates;
$control = $wp_registered_widget_updates[$id_base];
if (isset($control['callback']) && isset($control['params']) && is_callable($control['callback'])) {
call_user_func_array($control['callback'], $control['params']);
return $control['callback'];
}
return false;
}
public function delete_nav_menu_widget($ID, $menu_id) {
$menu_obj = QuadMenu::wp_setup_nav_menu_item($ID);
if (empty($menu_obj->widget_id))
return;
$this->delete_widget($menu_obj->widget_id);
}
function delete_widget($widget_id) {
$this->remove_widget_from_sidebar($widget_id);
$this->remove_widget_instance($widget_id);
return true;
}
private function remove_widget_from_sidebar($widget_id) {
$widgets = $this->get_sidebar_widgets();
$new_quadmenu_widgets = array();
if (count($widgets)) {
foreach ($widgets as $widget) {
if ($widget != $widget_id)
$new_quadmenu_widgets[] = $widget;
}
}
$this->set_sidebar_widgets($new_quadmenu_widgets);
return $widget_id;
}
public function get_id_base_for_widget_id($widget_id) {
global $wp_registered_widget_controls;
if (!isset($wp_registered_widget_controls[$widget_id])) {
return false;
}
$control = $wp_registered_widget_controls[$widget_id];
$id_base = isset($control['id_base']) ? $control['id_base'] : $control['id'];
return $id_base;
}
private function remove_widget_instance($widget_id) {
$id_base = $this->get_id_base_for_widget_id($widget_id);
$widget_number = $this->get_widget_number_for_widget_id($widget_id);
$current_widgets = get_option('widget_' . $id_base);
if (isset($current_widgets[$widget_number])) {
unset($current_widgets[$widget_number]);
update_option('widget_' . $id_base, $current_widgets);
return true;
}
return false;
}
public function get_widget_number_for_widget_id($widget_id) {
$parts = explode("-", $widget_id);
return absint(end($parts));
}
public function admin_print_footer_scripts($hook) {
do_action('admin_footer-widgets.php');
}
public function admin_print_scripts($hook) {
do_action('admin_print_scripts-widgets.php');
}
public function admin_print_styles($hook) {
do_action('admin_print_styles-widgets.php');
}
}
new QuadMenu_Nav_Menu_Widgets();