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_ITEM, 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_ITEM, $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 ) ) {
Plugin::send_json_success( $form );
} else {
Plugin::send_json_error( sprintf( esc_html__( 'Failed to load widget %1$s form in %2$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 ) ) {
Plugin::send_json_error( esc_html__( 'Please reload the 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 ) {
Plugin::send_json_success( sprintf( esc_html__( 'Saved settings of %s Widget', 'quadmenu' ), $saved[0]->name ) );
} else {
Plugin::send_json_error( sprintf( esc_html__( 'Failed to add %1$s to %2$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 = Plugin::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' );
}
public static function instance() {
if ( ! isset( self::$instance ) ) {
self::$instance = new self();
}
return self::$instance;
}
}