diff --git a/wp-admin/admin-ajax.php b/wp-admin/admin-ajax.php
index a29489b1b..dcbd639f2 100644
--- a/wp-admin/admin-ajax.php
+++ b/wp-admin/admin-ajax.php
@@ -784,7 +784,7 @@ case 'add-meta' :
) );
$x->send();
}
- if ( !$mid = add_meta( $pid ) )
+ if ( !$mid = add_meta( $pid ) )
die(__('Please provide a custom field value.'));
} else {
die('0');
@@ -813,7 +813,7 @@ case 'add-meta' :
die('-1');
if ( !$u = update_meta( $mid, $key, $value ) )
die('0'); // We know meta exists; we also know it's unchanged (or DB error, in which case there are bigger problems).
-
+
$key = stripslashes($key);
$value = stripslashes($value);
$x = new WP_Ajax_Response( array(
@@ -1288,22 +1288,24 @@ case 'save-widget' :
$del_id = $_POST['widget-id'];
$widget = isset($wp_registered_widgets[$del_id]) ? $wp_registered_widgets[$del_id] : false;
- if ( !in_array($del_id, $sidebar, true) || !$widget )
+ if ( !in_array($del_id, $sidebar, true) )
die('-1');
- $option = str_replace( '-', '_', 'widget_' . $id_base );
- $data = get_option($option);
+ if ( $widget ) {
+ $option = str_replace( '-', '_', 'widget_' . $id_base );
+ $data = get_option($option);
- if ( isset($widget['params'][0]['number']) ) {
- $number = $widget['params'][0]['number'];
- if ( is_array($data) && isset($data[$number]) ) {
- unset( $data[$number] );
- update_option($option, $data);
- }
- } else {
- if ( $data ) {
- $data = array();
- update_option($option, $data);
+ if ( isset($widget['params'][0]['number']) ) {
+ $number = $widget['params'][0]['number'];
+ if ( is_array($data) && isset($data[$number]) ) {
+ unset( $data[$number] );
+ update_option($option, $data);
+ }
+ } else {
+ if ( $data ) {
+ $data = array();
+ update_option($option, $data);
+ }
}
}
diff --git a/wp-admin/css/colors-classic.css b/wp-admin/css/colors-classic.css
index d5c793ce0..0b5f55cbb 100644
--- a/wp-admin/css/colors-classic.css
+++ b/wp-admin/css/colors-classic.css
@@ -950,7 +950,8 @@ abbr.required,
#editorcontainer,
#post-status-info,
-#titlediv #title {
+#titlediv #title,
+.editwidget .widget-control {
border-color: #dfdfdf;
}
diff --git a/wp-admin/css/colors-fresh.css b/wp-admin/css/colors-fresh.css
index 3e5700d08..eff946754 100644
--- a/wp-admin/css/colors-fresh.css
+++ b/wp-admin/css/colors-fresh.css
@@ -950,7 +950,8 @@ abbr.required,
#editorcontainer,
#post-status-info,
-#titlediv #title {
+#titlediv #title,
+.editwidget .widget-control {
border-color: #dfdfdf;
}
diff --git a/wp-admin/css/widgets.css b/wp-admin/css/widgets.css
index 3d5a449f6..7be92c0f9 100644
--- a/wp-admin/css/widgets.css
+++ b/wp-admin/css/widgets.css
@@ -152,4 +152,24 @@ div#sidebar-info {
font-weight: normal;
}
+.editwidget .widget-control {
+ display: block;
+ border-width: 1px;
+ border-style: solid;
+ padding: 10px;
+ -moz-border-radius: 6px;
+ -khtml-border-radius: 6px;
+ -webkit-border-radius: 6px;
+ border-radius: 6px;
+}
+.widget-position table {
+ width: 100%;
+ margin-top: 12px;
+}
+
+.widget-position table td {
+ height: 3em;
+ line-height: 3em;
+ vertical-align: middle;
+}
diff --git a/wp-admin/includes/widgets.php b/wp-admin/includes/widgets.php
index c0d25381a..19c8dc702 100644
--- a/wp-admin/includes/widgets.php
+++ b/wp-admin/includes/widgets.php
@@ -19,7 +19,7 @@
function wp_list_widgets( $show = 'all', $_search = false ) {
global $wp_registered_widgets, $sidebars_widgets, $wp_registered_widget_controls;
- if ( $_search ) {
+ if ( $_search ) {
// sanitize
$search = preg_replace( '/[^\w\s]/', '', $_search );
// array of terms
@@ -68,7 +68,7 @@ function wp_list_widgets( $show = 'all', $_search = false ) {
$already_shown[] = $widget['callback'];
$no_widgets_shown = false;
- $args = array( 'widget_id' => $widget['id'], 'widget_name' => $widget['name'], '_display' => 'template' );
+ $args = array( 'widget_id' => $widget['id'], 'widget_name' => $widget['name'], '_display' => 'template' );
if ( isset($wp_registered_widget_controls[$widget['id']]['id_base']) && isset($widget['params'][0]['number']) ) {
$id_base = $wp_registered_widget_controls[$widget['id']]['id_base'];
@@ -82,10 +82,10 @@ function wp_list_widgets( $show = 'all', $_search = false ) {
}
$args = wp_list_widget_controls_dynamic_sidebar( array( 0 => $args, 1 => $widget['params'][0] ) );
- call_user_func_array( 'wp_widget_control', $args );
+ call_user_func_array( 'wp_widget_control', $args );
}
- if ( $no_widgets_shown )
+ if ( $no_widgets_shown )
echo '
' . __( 'No matching widgets' ) . "\n";
?>
@@ -132,7 +132,7 @@ function wp_list_widget_controls_dynamic_sidebar( $params ) {
$params[0]['before_title'] = "%BEG_OF_TITLE%"; // deprecated
$params[0]['after_title'] = "%END_OF_TITLE%"; // deprecated
if ( is_callable( $wp_registered_widgets[$widget_id]['callback'] ) ) {
- $wp_registered_widgets[$widget_id]['_callback'] = $wp_registered_widgets[$widget_id]['callback'];
+ $wp_registered_widgets[$widget_id]['_callback'] = $wp_registered_widgets[$widget_id]['callback'];
$wp_registered_widgets[$widget_id]['callback'] = 'wp_widget_control';
}
@@ -164,27 +164,33 @@ function wp_widget_control( $sidebar_args ) {
$widget_id = $sidebar_args['widget_id'];
$sidebar_id = isset($sidebar_args['id']) ? $sidebar_args['id'] : false;
-
+ $key = $sidebar_id ? array_search( $widget_id, $sidebars_widgets[$sidebar_id] ) : '-1'; // position of widget in sidebar
$control = isset($wp_registered_widget_controls[$widget_id]) ? $wp_registered_widget_controls[$widget_id] : array();
- $widget = $wp_registered_widgets[$widget_id];
-
- $key = $sidebar_id ? array_search( $widget_id, $sidebars_widgets[$sidebar_id] ) : 'no-key'; // position of widget in sidebar
-
- $edit = isset($_GET['editwidget']); // editing without js
- $nonce = $edit ? wp_create_nonce("edit-widget_$widget_id") : '';
+ $widget = $wp_registered_widgets[$widget_id];
$id_format = $widget['id'];
-
$widget_number = isset($control['params'][0]['number']) ? $control['params'][0]['number'] : '';
$id_base = isset($control['id_base']) ? $control['id_base'] : $widget_id;
$multi_number = isset($sidebar_args['_multi_num']) ? $sidebar_args['_multi_num'] : '';
$add_new = isset($sidebar_args['_add']) ? $sidebar_args['_add'] : '';
+ $query_arg = array( 'editwidget' => $widget['id'] );
+ if ( $add_new ) {
+ $query_arg['addnew'] = 1;
+ if ( $multi_number ) {
+ $query_arg['num'] = $multi_number;
+ $query_arg['base'] = $id_base;
+ }
+ } else {
+ $query_arg['sidebar'] = $sidebar_id;
+ $query_arg['key'] = $key;
+ }
+
// We aren't showing a widget control, we're outputing a template for a mult-widget control
if ( isset($sidebar_args['_display']) && 'template' == $sidebar_args['_display'] && $widget_number ) {
// number == -1 implies a template where id numbers are replaced by a generic '__i__'
$control['params'][0]['number'] = -1;
- // if given, id_base means widget id's should be constructed like {$id_base}-{$id_number}
+ // with id_base widget id's are constructed like {$id_base}-{$id_number}
if ( isset($control['id_base']) )
$id_format = $control['id_base'] . '-__i__';
}
@@ -193,50 +199,49 @@ function wp_widget_control( $sidebar_args ) {
unset($wp_registered_widgets[$widget_id]['_callback']);
$widget_title = wp_specialchars( strip_tags( $sidebar_args['widget_name'] ) );
+ $has_form = 0;
echo $sidebar_args['before_widget']; ?>
-
+
-
'',
+ 'name' => __('Inactive Widgets'),
'id' => 'wp_inactive_widgets',
'before_widget' => '',
'after_widget' => '',
@@ -38,7 +38,7 @@ $sidebars_widgets = wp_get_sidebars_widgets();
if ( empty( $sidebars_widgets ) )
$sidebars_widgets = wp_get_widget_defaults();
-// look for "lost" widgets, this has to run at each theme change
+// look for "lost" widgets, this has to run at least on each theme change
function retrieve_widgets() {
global $wp_registered_widget_updates, $wp_registered_sidebars, $sidebars_widgets;
@@ -111,7 +111,7 @@ function retrieve_widgets() {
retrieve_widgets();
if ( count($wp_registered_sidebars) == 1 ) {
- // If only the "wp_inactive_widgets" is defined the theme has no sidebars, die.
+ // If only "wp_inactive_widgets" is defined the theme has no sidebars, die.
require_once( 'admin-header.php' );
?>
@@ -129,22 +129,209 @@ if ( count($wp_registered_sidebars) == 1 ) {
exit;
}
+// We're saving a widget without js
+if ( isset($_POST['savewidget']) || isset($_POST['removewidget']) ) {
+ $widget_id = $_POST['widget-id'];
+ check_admin_referer("save-delete-widget-$widget_id");
+
+ $sidebar_id = $_POST['insidebar'];
+ $position = isset($_POST[$sidebar_id . '_position']) ? (int) $_POST[$sidebar_id . '_position'] - 1 : 0;
+ $_POST['sidebar'] = $sidebar_id;
+
+ $id_base = $_POST['id_base'];
+ $number = isset($_POST['multi_number']) ? $_POST['multi_number'] : '';
+ $sidebar = isset($sidebars_widgets[$sidebar_id]) ? $sidebars_widgets[$sidebar_id] : array();
+
+ // delete
+ if ( isset($_POST['removewidget']) && $_POST['removewidget'] ) {
+ $widget = isset($wp_registered_widgets[$widget_id]) ? $wp_registered_widgets[$widget_id] : false;
+
+ if ( !in_array($widget_id, $sidebar, true) || !$widget ) {
+ wp_redirect('widgets.php?error=0');
+ exit;
+ }
+
+ $option = str_replace( '-', '_', 'widget_' . $id_base );
+ $data = get_option($option);
+
+ if ( isset($widget['params'][0]['number']) ) {
+ $number = $widget['params'][0]['number'];
+ if ( is_array($data) && isset($data[$number]) ) {
+ unset( $data[$number] );
+ update_option($option, $data);
+ }
+ } else {
+ if ( $data ) {
+ $data = array();
+ update_option($option, $data);
+ }
+ }
+
+ $sidebar = array_diff( $sidebar, array($widget_id) );
+ } else {
+ // save
+ foreach ( (array) $wp_registered_widget_updates as $name => $control ) {
+ if ( $name != $id_base || !is_callable($control['callback']) )
+ continue;
+
+ if ( $number ) {
+ // don't delete other instances of the same multi-widget
+ foreach ( $sidebar as $_widget_id ) {
+ if ( isset($wp_registered_widgets[$_widget_id]['params'][0]['number']) )
+ unset($wp_registered_widgets[$_widget_id]['params'][0]['number']);
+ }
+ $widget_id = "$id_base-$number";
+ }
+
+ ob_start();
+ call_user_func_array( $control['callback'], $control['params'] );
+ ob_end_clean();
+
+ // remove old position
+ $sidebar = array_diff( $sidebar, array($widget_id) );
+ foreach ( $sidebars_widgets as $key => $sb ) {
+ if ( is_array($sb) && in_array($widget_id, $sb, true) )
+ $sidebars_widgets[$key] = array_diff( $sb, array($widget_id) );
+ }
+
+ array_splice( $sidebar, $position, 0, $widget_id );
+ break;
+ }
+ }
+
+ $sidebars_widgets[$sidebar_id] = $sidebar;
+ wp_set_sidebars_widgets($sidebars_widgets);
+
+ wp_redirect('widgets.php?message=0');
+ exit;
+}
+
+// Output the widget form without js
+if ( isset($_GET['editwidget']) && $_GET['editwidget'] ) {
+ $widget_id = $_GET['editwidget'];
+
+ if ( isset($_GET['addnew']) ) {
+ // Default to the first sidebar
+ $sidebar = array_shift( $keys = array_keys($wp_registered_sidebars) );
+
+ if ( isset($_GET['base']) && isset($_GET['num']) ) { // multi-widget
+ // Copy minimal info from an existing instance of this widget to a new instance
+ foreach ( $wp_registered_widget_controls as $control ) {
+ if ( $_GET['base'] === $control['id_base'] ) {
+ $control_callback = $control['callback'];
+ $multi_number = (int) $_GET['num'];
+ $control['params'][0]['number'] = $multi_number;
+ $control['id'] = $control['id_base'] . '-' . $multi_number;
+ $wp_registered_widget_controls[$control['id']] = $control;
+ break;
+ }
+ }
+ }
+ }
+
+ if ( isset($wp_registered_widget_controls[$widget_id]) && !isset($control) ) {
+ $control = $wp_registered_widget_controls[$widget_id];
+ $control_callback = $control['callback'];
+ }
+
+ if ( !isset($sidebar) )
+ $sidebar = isset($_GET['sidebar']) ? $_GET['sidebar'] : 'wp_inactive_widgets';
+
+ if ( !isset($multi_number) )
+ $multi_number = isset($control['params'][0]['number']) ? $control['params'][0]['number'] : '';
+
+ $id_base = isset($control['id_base']) ? $control['id_base'] : $control['id'];
+
+ // show the widget form
+ if ( is_callable( $control_callback ) ) {
+ $width = ' style="width:' . max($control['width'], 350) . 'px"';
+ $key = isset($_GET['key']) ? (int) $_GET['key'] : 0;
+
+ require_once( 'admin-header.php' ); ?>
+
+ $widget_search ? __( 'Show any widgets' ) : __( 'Show all widgets' ),
+ '' => $widget_search ? __( 'Show any widgets' ) : __( 'Show all widgets' ),
'unused' => __( 'Show unused widgets' ),
- 'used' => __( 'Show used widgets' )
+ 'used' => __( 'Show used widgets' )
);
-*/
$show = isset($_GET['show']) && isset($show_values[$_GET['show']]) ? attribute_escape( $_GET['show'] ) : false;
+*/
$messages = array(
- 'updated' => __('Changes saved.')
+ __('Changes saved.')
+);
+
+$errors = array(
+ __('Error while saving.'),
+ __('Error in displaying the widget settings form.')
);
require_once( 'admin-header.php' ); ?>
@@ -153,95 +340,49 @@ require_once( 'admin-header.php' ); ?>
-
+
-
+
+
+
+
-
-
-
-
-
-
-
- $registered_sidebar ) {
- if ( 'wp_inactive_widgets' == $sidebar )
- continue;
- ?>
-
-
-
+
+
+
+
+ $registered_sidebar ) {
+ if ( 'wp_inactive_widgets' == $sidebar )
+ continue; ?>
+
+
+
+
+
-
-add( 'ie', '/wp-admin/css/ie.css', array(), '20090415' );
$styles->add_data( 'ie', 'conditional', 'lte IE 7' );
- $styles->add( 'colors', true, array(), '20090415' ); // Register "meta" stylesheet for admin colors
+ $styles->add( 'colors', true, array(), '20090419' ); // Register "meta" stylesheet for admin colors
$styles->add( 'colors-fresh', '/wp-admin/css/colors-fresh.css', array(), '20081210'); // for login.php. Is there a better way?
$styles->add_data( 'colors-fresh', 'rtl', true );
$styles->add( 'colors-classic', '/wp-admin/css/colors-classic.css', array(), '20081210');
@@ -432,7 +432,7 @@ function wp_default_styles( &$styles ) {
$styles->add( 'global', '/wp-admin/css/global.css', array(), '20090415' );
$styles->add( 'media', '/wp-admin/css/media.css', array(), '20090325' );
- $styles->add( 'widgets', '/wp-admin/css/widgets.css', array(), '20090411' );
+ $styles->add( 'widgets', '/wp-admin/css/widgets.css', array(), '20090419' );
$styles->add( 'dashboard', '/wp-admin/css/dashboard.css', array(), '20090305' );
$styles->add( 'install', '/wp-admin/css/install.css', array(), '20081210' );
$styles->add( 'theme-editor', '/wp-admin/css/theme-editor.css', array(), '20081210' );
diff --git a/wp-includes/widgets.php b/wp-includes/widgets.php
index 5ee1761fc..fbb8e4ca5 100644
--- a/wp-includes/widgets.php
+++ b/wp-includes/widgets.php
@@ -23,7 +23,7 @@
*/
class WP_Widget {
- var $id_base; // Root id for all widgets of this type.
+ var $id_base; // Root id for all widgets of this type.
var $name; // Name for this widget type.
var $widget_options; // Option array passed to wp_register_sidebar_widget()
var $control_options; // Option array passed to wp_register_widget_control()
@@ -61,10 +61,11 @@ class WP_Widget {
/** Echo the settings update form
*
- * @param array $instance Current settings
+ * @param array $instance Current settings
*/
function form($instance) {
echo '' . __('There are no options for this widget.') . '
';
+ return false;
}
// Functions you'll need to call.
@@ -87,12 +88,11 @@ class WP_Widget {
*/
function __construct( $id_base, $name, $widget_options = array(), $control_options = array() ) {
$this->id_base = $id_base;
+ // $this->id_base = str_replace( 'wp_widget_', '', strtolower(get_class($this)) );
$this->name = $name;
$this->option_name = 'widget_' . $id_base;
$this->widget_options = wp_parse_args( $widget_options, array('classname' => $this->option_name) );
$this->control_options = wp_parse_args( $control_options, array('id_base' => $this->id_base) );
-
- //add_action( 'widgets_init', array( &$this, '_register' ) );
}
/** Constructs name attributes for use in form() fields
@@ -207,7 +207,14 @@ class WP_Widget {
}
}
} else {
- foreach ( (array) $_POST['widget-' . $this->id_base] as $number => $new_instance ) {
+ if ( isset($_POST['widget-' . $this->id_base]) && is_array($_POST['widget-' . $this->id_base]) ) {
+ $settings = $_POST['widget-' . $this->id_base];
+ } else {
+ $num = $_POST['multi_number'] ? (int) $_POST['multi_number'] : (int) $_POST['widget_number'];
+ $settings = array( $num => array() );
+ }
+
+ foreach ( $settings as $number => $new_instance ) {
$new_instance = stripslashes_deep($new_instance);
$this->_set($number);
@@ -244,7 +251,7 @@ class WP_Widget {
$instance = $all_instances[ $widget_args['number'] ];
}
- $this->form($instance);
+ return $this->form($instance);
}
/** Helper function: Registers a single instance. */