function _admin_init()
{
    #$a=hw_wie_available_widgets();
    #hw_wie_remove_all_widgets();return;
    $available_widgets = hw_wie_available_widgets();
    // Get all existing widget instances
    $widget_instances = array();
    foreach ($available_widgets as $widget_data) {
        if (1 || 'hw_taxonomy_post_list_widget' == $widget_data['id_base']) {
            $widget_instances[$widget_data['id_base']] = get_option('widget_' . $widget_data['id_base']);
        }
    }
    #__print($widget_instances);
}
 /**
  * Import widget JSON data
  *
  * @since 0.4
  * @global array $wp_registered_sidebars
  * @param object $data JSON widget data from .wie file
  * @return array Results array
  */
 function hw_wie_import_data($data)
 {
     global $wp_registered_sidebars;
     // Have valid data?
     // If no data or could not decode
     if (empty($data) || !is_object($data) && !is_array($data)) {
         wp_die(__('Import data could not be read. Please try a different file.', 'widget-importer-exporter'), '', array('back_link' => true));
     }
     // Hook before import
     do_action('hw_wie_before_import');
     $data = apply_filters('hw_wie_import_data', $data);
     // Get all available widgets site supports
     $available_widgets = hw_wie_available_widgets();
     // Get all existing widget instances
     $widget_instances = array();
     foreach ($available_widgets as $widget_data) {
         $widget_instances[$widget_data['id_base']] = get_option('widget_' . $widget_data['id_base']);
     }
     // Begin results
     $results = array();
     // Loop import data's sidebars
     foreach ($data as $sidebar_id => $widgets) {
         // Skip inactive widgets
         // (should not be in export file)
         if ('wp_inactive_widgets' == $sidebar_id || $sidebar_id == 'hw-sidebar-data') {
             continue;
         }
         // Check if sidebar is available on this site
         // Otherwise add widgets to inactive, and say so
         if (isset($wp_registered_sidebars[$sidebar_id])) {
             $sidebar_available = true;
             $use_sidebar_id = $sidebar_id;
             $sidebar_message_type = 'success';
             $sidebar_message = '';
         } else {
             $sidebar_available = false;
             $use_sidebar_id = 'wp_inactive_widgets';
             // add to inactive if sidebar does not exist in theme
             $sidebar_message_type = 'error';
             $sidebar_message = __('Sidebar does not exist in theme (using Inactive)', 'widget-importer-exporter');
         }
         // Result for sidebar
         $results[$sidebar_id]['name'] = !empty($wp_registered_sidebars[$sidebar_id]['name']) ? $wp_registered_sidebars[$sidebar_id]['name'] : $sidebar_id;
         // sidebar name if theme supports it; otherwise ID
         $results[$sidebar_id]['message_type'] = $sidebar_message_type;
         $results[$sidebar_id]['message'] = $sidebar_message;
         $results[$sidebar_id]['widgets'] = array();
         // Loop widgets
         foreach ($widgets as $widget_instance_id => $widget) {
             $fail = false;
             // Get id_base (remove -# from end) and instance ID number
             $id_base = preg_replace('/-[0-9]+$/', '', $widget_instance_id);
             $instance_id_number = str_replace($id_base . '-', '', $widget_instance_id);
             // Does site support this widget?
             if (!$fail && !isset($available_widgets[$id_base])) {
                 $fail = true;
                 $widget_message_type = 'error';
                 $widget_message = __('Site does not support widget', 'widget-importer-exporter');
                 // explain why widget not imported
             }
             $delete_old = array();
             // Does widget with identical settings already exist in same sidebar?
             if (!$fail && isset($widget_instances[$id_base])) {
                 // Get existing widgets in this sidebar
                 $sidebars_widgets = get_option('sidebars_widgets');
                 $sidebar_widgets = isset($sidebars_widgets[$use_sidebar_id]) ? $sidebars_widgets[$use_sidebar_id] : array();
                 // check Inactive if that's where will go
                 // Loop widgets with ID base
                 $single_widget_instances = !empty($widget_instances[$id_base]) ? $widget_instances[$id_base] : array();
                 foreach ($single_widget_instances as $check_id => $check_widget) {
                     // Is widget in same sidebar and has identical settings?
                     if (in_array("{$id_base}-{$check_id}", $sidebar_widgets) && (array) $widget['instance'] == $check_widget) {
                         if ($widget['args']['update']) {
                             $delete_old[] = array_search("{$id_base}-{$check_id}", $sidebar_widgets);
                         } else {
                             $fail = true;
                         }
                         //not allow to override widget
                         $widget_message_type = 'warning';
                         $widget_message = __('Widget already exists', 'widget-importer-exporter');
                         // explain why widget not imported
                         break;
                     }
                 }
             }
             // Filter to modify settings object before conversion to array and import
             // Leave this filter here for backwards compatibility with manipulating objects (before conversion to array below)
             // Ideally the newer wie_widget_settings_array below will be used instead of this
             $widget = apply_filters('hw_wie_widget_settings', $widget['instance']);
             // object
             // Convert multidimensional objects to multidimensional arrays
             // Some plugins like Jetpack Widget Visibility store settings as multidimensional arrays
             // Without this, they are imported as objects and cause fatal error on Widgets page
             // If this creates problems for plugins that do actually intend settings in objects then may need to consider other approach: https://wordpress.org/support/topic/problem-with-array-of-arrays
             // It is probably much more likely that arrays are used than objects, however
             $widget = json_decode(json_encode($widget), true);
             // Filter to modify settings array
             // This is preferred over the older wie_widget_settings filter above
             // Do before identical check because changes may make it identical to end result (such as URL replacements)
             $widget = apply_filters('hw_wie_widget_settings_array', $widget);
             // No failure
             if (!$fail) {
                 // Add widget instance
                 $single_widget_instances = get_option('widget_' . $id_base);
                 // all instances for that widget ID base, get fresh every time
                 $single_widget_instances = !empty($single_widget_instances) ? $single_widget_instances : array('_multiwidget' => 1);
                 // start fresh if have to
                 $single_widget_instances[] = $widget;
                 // add it
                 // Get the key it was given
                 end($single_widget_instances);
                 $new_instance_id_number = key($single_widget_instances);
                 // If key is 0, make it 1
                 // When 0, an issue can occur where adding a widget causes data from other widget to load, and the widget doesn't stick (reload wipes it)
                 if ('0' === strval($new_instance_id_number)) {
                     $new_instance_id_number = 1;
                     $single_widget_instances[$new_instance_id_number] = $single_widget_instances[0];
                     unset($single_widget_instances[0]);
                 }
                 // Move _multiwidget to end of array for uniformity
                 if (isset($single_widget_instances['_multiwidget'])) {
                     $multiwidget = $single_widget_instances['_multiwidget'];
                     unset($single_widget_instances['_multiwidget']);
                     $single_widget_instances['_multiwidget'] = $multiwidget;
                 }
                 // Update option with new widget
                 update_option('widget_' . $id_base, $single_widget_instances);
                 // Assign widget instance to sidebar
                 $sidebars_widgets = get_option('sidebars_widgets');
                 // which sidebars have which widgets, get fresh every time
                 //delete exists old widgets in sidebar
                 if (count($delete_old)) {
                     foreach ($delete_old as $path) {
                         unset($sidebars_widgets[$use_sidebar_id][$path]);
                     }
                 }
                 $new_instance_id = $id_base . '-' . $new_instance_id_number;
                 // use ID number from new widget instance
                 $sidebars_widgets[$use_sidebar_id][] = $new_instance_id;
                 // add new instance to sidebar
                 update_option('sidebars_widgets', $sidebars_widgets);
                 // save the amended data
                 // After widget import action
                 $after_widget_import = array('sidebar' => $use_sidebar_id, 'sidebar_old' => $sidebar_id, 'widget' => $widget, 'widget_type' => $id_base, 'widget_id' => $new_instance_id, 'widget_id_old' => $widget_instance_id, 'widget_id_num' => $new_instance_id_number, 'widget_id_num_old' => $instance_id_number);
                 do_action('hw_wie_after_widget_import', $after_widget_import);
                 // Success message
                 if ($sidebar_available) {
                     $widget_message_type = 'success';
                     $widget_message = __('Imported', 'widget-importer-exporter');
                 } else {
                     $widget_message_type = 'warning';
                     $widget_message = __('Imported to Inactive', 'widget-importer-exporter');
                 }
             }
             // Result for widget instance
             $results[$sidebar_id]['widgets'][$widget_instance_id]['name'] = isset($available_widgets[$id_base]['name']) ? $available_widgets[$id_base]['name'] : $id_base;
             // widget name or ID if name not available (not supported by site)
             //get widget title
             if (!empty($widget['title'])) {
                 $title = $widget['title'];
             } elseif (!empty($widget['widget_title'])) {
                 $title = $widget['widget_title'];
             } else {
                 $title = __('No Title', 'widget-importer-exporter');
             }
             $results[$sidebar_id]['widgets'][$widget_instance_id]['title'] = $title;
             // show "No Title" if widget instance is untitled
             $results[$sidebar_id]['widgets'][$widget_instance_id]['message_type'] = $widget_message_type;
             $results[$sidebar_id]['widgets'][$widget_instance_id]['message'] = $widget_message;
         }
     }
     // Hook after import
     do_action('hw_wie_after_import');
     // Return results
     return apply_filters('hw_wie_import_results', $results);
 }
 /**
  * grab widgets data
  * @param $xml
  * @param null $namespaces
  */
 protected function grab_widgets($xml, $namespaces = null)
 {
     if (empty($namespaces)) {
         $namespaces = $this->namespaces;
     }
     global $wp_registered_sidebars;
     $widgets = array();
     $widgets_id = array();
     // Get all available widgets site supports
     $available_widgets = hw_wie_available_widgets();
     // Get existing widgets in this sidebar
     $sidebars_widgets = get_option('sidebars_widgets');
     $sidebar_widgets = null;
     $available_instance_ids = array();
     foreach ($sidebars_widgets as $ids) {
         if (is_array($ids)) {
             foreach ($ids as $id) {
                 $id_base = hw_wie_get_widget_id_base($id);
                 if (!isset($available_instance_ids[$id_base])) {
                     $available_instance_ids[$id_base] = array();
                 }
                 $available_instance_ids[$id_base][] = str_replace($id_base . '-', '', $id);
             }
         }
     }
     if ($xml->xpath('widgets/hw:widget')) {
         foreach ($xml->xpath('widgets/hw:widget') as $item) {
             $args = array();
             $atts = $item->attributes();
             $args['update'] = isset($atts['update']) ? (string) $atts['update'] : 0;
             //whether allow to update widget or add new
             $sidebar_id = !isset($atts['sidebar']) ? 'hw-sidebar-data' : (string) $atts['sidebar'];
             if (!isset($wp_registered_sidebars[$sidebar_id]) || !isset($atts['id_base'])) {
                 continue;
             }
             $id_base = (string) $atts['id_base'];
             // Does site support this widget?
             if (!isset($available_widgets[$id_base])) {
                 //Site does not support widget, explain why widget not imported
                 continue;
             }
             // check Inactive if that's where will go
             $sidebar_widgets = isset($sidebars_widgets[$sidebar_id]) ? $sidebars_widgets[$sidebar_id] : array();
             if (!isset($widgets_id[$id_base])) {
                 $widgets_id[$id_base] = 0;
             }
             do {
                 $widgets_id[$id_base]++;
                 //set next widget instance id
             } while (isset($available_instance_ids[$id_base]) && in_array($widgets_id[$id_base], $available_instance_ids[$id_base]));
             $hw = $item->children($namespaces['hw']);
             //widget id
             $widget_id = $id_base . '-' . $widgets_id[$id_base];
             //widget instance
             if ($hw->params) {
                 $options = $this->recursive_option_data($hw->params[0]->children(), $namespaces)->option;
             } else {
                 $options = array();
             }
             //init sidebar holder for widgets data
             if (!isset($widgets[$sidebar_id])) {
                 $widgets[$sidebar_id] = array();
             }
             //add widget to sidebar
             $widgets[$sidebar_id][$widget_id] = array('instance' => $options, 'args' => $args);
         }
     }
     return $widgets;
 }