-
-// Displays form for a particular instance of the widget. Also updates the data after a POST submit
-// $widget_args: number
-// number: which of the several widgets of this type do we mean
-function widget_many_control( $widget_args = 1 ) {
- global $wp_registered_widgets;
- static $updated = false; // Whether or not we have already updated the data after a POST submit
-
- if ( is_numeric($widget_args) )
- $widget_args = array( 'number' => $widget_args );
- $widget_args = wp_parse_args( $widget_args, array( 'number' => -1 ) );
- extract( $widget_args, EXTR_SKIP );
-
- // Data should be stored as array: array( number => data for that instance of the widget, ... )
- $options = get_option('widget_many');
- if ( !is_array($options) )
- $options = array();
-
- // We need to update the data
- if ( !$updated && !empty($_POST['sidebar']) ) {
- // Tells us what sidebar to put the data in
- $sidebar = (string) $_POST['sidebar'];
-
- $sidebars_widgets = wp_get_sidebars_widgets();
- if ( isset($sidebars_widgets[$sidebar]) )
- $this_sidebar =& $sidebars_widgets[$sidebar];
- else
- $this_sidebar = array();
-
- foreach ( $this_sidebar as $_widget_id ) {
- // Remove all widgets of this type from the sidebar. We'll add the new data in a second. This makes sure we don't get any duplicate data
- // since widget ids aren't necessarily persistent across multiple updates
- if ( 'widget_many' == $wp_registered_widgets[$_widget_id]['callback'] && isset($wp_registered_widgets[$_widget_id]['params'][0]['number']) ) {
- $widget_number = $wp_registered_widgets[$_widget_id]['params'][0]['number'];
- if ( !in_array( "many-$widget_number", $_POST['widget-id'] ) ) // the widget has been removed. "many-$widget_number" is "{id_base}-{widget_number}
- unset($options[$widget_number]);
- }
- }
-
- foreach ( (array) $_POST['widget-many'] as $widget_number => $widget_many_instance ) {
- // compile data from $widget_many_instance
- if ( !isset($widget_many_instance['something']) && isset($options[$widget_number]) ) // user clicked cancel
- continue;
- $something = wp_specialchars( $widget_many_instance['something'] );
- $options[$widget_number] = array( 'something' => $something ); // Even simple widgets should store stuff in array, rather than in scalar
- }
-
- update_option('widget_many', $options);
-
- $updated = true; // So that we don't go through this more than once
- }
-
-
- // Here we echo out the form
- if ( -1 == $number ) { // We echo out a template for a form which can be converted to a specific form later via JS
- $something = '';
- $number = '%i%';
- } else {
- $something = attribute_escape($options[$number]['something']);
- }
-
- // The form has inputs with names like widget-many[$number][something] so that all data for that instance of
- // the widget are stored in one $_POST variable: $_POST['widget-many'][$number]
-?>
- <p>
- <input class="widefat" id="widget-many-something-<?php echo $number; ?>" name="widget-many[<?php echo $number; ?>][something]" type="text" value="<?php echo $data; ?>" />
- <input type="hidden" id="widget-many-submit-<?php echo $number; ?>" name="widget-many[<?php echo $number; ?>][submit]" value="1" />
- </p>
-<?php
-}
-
-// Registers each instance of our widget on startup
-function widget_many_register() {
- if ( !$options = get_option('widget_many') )
- $options = array();
-
- $widget_ops = array('classname' => 'widget_many', 'description' => __('Widget which allows multiple instances'));
- $control_ops = array('width' => 400, 'height' => 350, 'id_base' => 'many');
- $name = __('Many');
-
- $registered = false;
- foreach ( array_keys($options) as $o ) {
- // Old widgets can have null values for some reason
- if ( !isset($options[$o]['something']) ) // we used 'something' above in our exampple. Replace with with whatever your real data are.
- continue;
-
- // $id should look like {$id_base}-{$o}
- $id = "many-$o"; // Never never never translate an id
- $registered = true;
- wp_register_sidebar_widget( $id, $name, 'widget_many', $widget_ops, array( 'number' => $o ) );
- wp_register_widget_control( $id, $name, 'widget_many_control', $control_ops, array( 'number' => $o ) );
- }
-
- // If there are none, we register the widget's existance with a generic template
- if ( !$registered ) {
- wp_register_sidebar_widget( 'many-1', $name, 'widget_many', $widget_ops, array( 'number' => -1 ) );
- wp_register_widget_control( 'many-1', $name, 'widget_many_control', $control_ops, array( 'number' => -1 ) );
- }
-}
-
-// This is important
-add_action( 'widgets_init', 'widget_many_register' )
-
-*/
-
-?>