X-Git-Url: https://scripts.mit.edu/gitweb/autoinstalls/wordpress.git/blobdiff_plain/177fd6fefd2e3d5a0ea6591c71d660cabdb3c1a4..672d6bc6da735e745275ef7a86341dc1178da8d2:/wp-admin/widgets.php diff --git a/wp-admin/widgets.php b/wp-admin/widgets.php index 83264e43..4ead317a 100644 --- a/wp-admin/widgets.php +++ b/wp-admin/widgets.php @@ -1,323 +1,392 @@ - -
-

-
- -
-

follow these instructions.' ); /* TODO: article on codex */; ?>

-
- - __('Inactive Widgets'), + 'id' => 'wp_inactive_widgets', + 'before_widget' => '', + 'after_widget' => '', + 'before_title' => '', + 'after_title' => '', +)); // These are the widgets grouped by sidebar $sidebars_widgets = wp_get_sidebars_widgets(); if ( empty( $sidebars_widgets ) ) $sidebars_widgets = wp_get_widget_defaults(); -// for the sake of PHP warnings -if ( empty( $sidebars_widgets[$sidebar] ) ) - $sidebars_widgets[$sidebar] = array(); - -$http_post = 'post' == strtolower($_SERVER['REQUEST_METHOD']); - -// We're updating a sidebar -if ( $http_post && isset($sidebars_widgets[$_POST['sidebar']]) ) { - check_admin_referer( 'edit-sidebar_' . $_POST['sidebar'] ); - - /* Hack #1 - * The widget_control is overloaded. It updates the widget's options AND echoes out the widget's HTML form. - * Since we want to update before sending out any headers, we have to catch it with an output buffer, - */ - ob_start(); - /* There can be multiple widgets of the same type, but the widget_control for that - * widget type needs only be called once if it's a multi-widget. - */ - $already_done = array(); - - foreach ( $wp_registered_widget_controls as $name => $control ) { - if ( in_array( $control['callback'], $already_done ) ) - continue; - - if ( is_callable( $control['callback'] ) ) { - call_user_func_array( $control['callback'], $control['params'] ); - $control_output = ob_get_contents(); - if ( false !== strpos( $control_output, '%i%' ) ) // if it's a multi-widget, only call control function once. - $already_done[] = $control['callback']; - } +// 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, $wp_registered_widgets; + + $_sidebars_widgets = array(); + $sidebars = array_keys($wp_registered_sidebars); + + unset( $sidebars_widgets['array_version'] ); - ob_clean(); + $old = array_keys($sidebars_widgets); + sort($old); + sort($sidebars); + + if ( $old == $sidebars ) + return; + + // Move the known-good ones first + foreach ( $sidebars as $id ) { + if ( array_key_exists( $id, $sidebars_widgets ) ) { + $_sidebars_widgets[$id] = $sidebars_widgets[$id]; + unset($sidebars_widgets[$id], $sidebars[$id]); } - ob_end_clean(); + } - // Prophylactic. Take out empty ids. - foreach ( (array) $_POST['widget-id'] as $key => $val ) - if ( !$val ) - unset($_POST['widget-id'][$key]); + // if new theme has less sidebars than the old theme + if ( !empty($sidebars_widgets) ) { + foreach ( $sidebars_widgets as $lost => $val ) { + if ( is_array($val) ) + $_sidebars_widgets['wp_inactive_widgets'] = array_merge( (array) $_sidebars_widgets['wp_inactive_widgets'], $val ); + } + } - // Reset the key numbering and store - $new_sidebar = isset( $_POST['widget-id'] ) && is_array( $_POST['widget-id'] ) ? array_values( $_POST['widget-id'] ) : array(); - $sidebars_widgets[$_POST['sidebar']] = $new_sidebar; - wp_set_sidebars_widgets( $sidebars_widgets ); + // discard invalid, theme-specific widgets from sidebars + $shown_widgets = array(); + foreach ( $_sidebars_widgets as $sidebar => $widgets ) { + if ( !is_array($widgets) ) + continue; - wp_redirect( add_query_arg( 'message', 'updated' ) ); - exit; -} + $_widgets = array(); + foreach ( $widgets as $widget ) { + if ( isset($wp_registered_widgets[$widget]) ) + $_widgets[] = $widget; + } + $_sidebars_widgets[$sidebar] = $_widgets; + $shown_widgets = array_merge($shown_widgets, $_widgets); + } + $sidebars_widgets = $_sidebars_widgets; + unset($_sidebars_widgets, $_widgets); + // find hidden/lost multi-widget instances + $lost_widgets = array(); + foreach ( $wp_registered_widgets as $key => $val ) { + if ( in_array($key, $shown_widgets, true) ) + continue; + $number = preg_replace('/.+?-([0-9]+)$/', '$1', $key); -// What widget (if any) are we editing -$edit_widget = -1; + if ( 2 > (int) $number ) + continue; -$query_args = array('add', 'remove', 'key', 'edit', '_wpnonce', 'message', 'base' ); + $lost_widgets[] = $key; + } -if ( isset($_GET['add']) && $_GET['add'] ) { - // Add to the end of the sidebar - $control_callback; - if ( isset($wp_registered_widgets[$_GET['add']]) ) { - check_admin_referer( "add-widget_$_GET[add]" ); - $sidebars_widgets[$sidebar][] = $_GET['add']; - wp_set_sidebars_widgets( $sidebars_widgets ); - } elseif ( isset($_GET['base']) && isset($_GET['key']) ) { // It's a multi-widget - check_admin_referer( "add-widget_$_GET[add]" ); - // 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']; - $num = (int) $_GET['key']; - $control['params'][0]['number'] = $num; - $control['id'] = $control['id_base'] . '-' . $num; - $wp_registered_widget_controls[$control['id']] = $control; - $sidebars_widgets[$sidebar][] = $control['id']; + $sidebars_widgets['wp_inactive_widgets'] = array_merge($lost_widgets, (array) $sidebars_widgets['wp_inactive_widgets']); + wp_set_sidebars_widgets($sidebars_widgets); +} +retrieve_widgets(); + +if ( count($wp_registered_sidebars) == 1 ) { + // If only "wp_inactive_widgets" is defined the theme has no sidebars, die. + require_once( 'admin-header.php' ); +?> + +
+ +

+
+

+
+

follow these instructions.' ); ?>

+
+ + $val ) { + if ( is_array($val) && preg_match('/__i__|%i%/', key($val)) ) { + $_POST[$key] = array( $number => array_shift($val) ); break; } } } - // it's a multi-widget. The only way to add multi-widgets without JS is to actually submit POST content... - // so here we go - if ( is_callable( $control_callback ) ) { - require_once( 'admin-header.php' ); - ?> -
-

-
-
- - -
-
- $sidebar_id, 'widget-' . $id_base => array(), 'the-widget-id' => $widget_id, 'delete_widget' => '1'); + } -$sidebar_info_text = sprintf( wp_specialchars( $sidebar_info_text ), "$sidebar_widget_count", $wp_registered_sidebars[$sidebar]['name'] ); + $_POST['widget-id'] = $sidebar; -$page = isset($_GET['apage']) ? abs( (int) $_GET['apage'] ) : 1; + foreach ( (array) $wp_registered_widget_updates as $name => $control ) { + if ( $name != $id_base || !is_callable($control['callback']) ) + continue; -/* TODO: Paginate widgets list -$page_links = paginate_links( array( - 'base' => add_query_arg( 'apage', '%#%' ), - 'format' => '', - 'total' => ceil(($total = 105 )/ 10), - 'current' => $page -)); -*/ -$page_links = ' '; + ob_start(); + call_user_func_array( $control['callback'], $control['params'] ); + ob_end_clean(); -// Unsanitized! -$widget_search = isset($_GET['s']) ? $_GET['s'] : false; + break; + } -// Not entirely sure what all should be here -$show_values = array( - '' => $widget_search ? __( 'Show any widgets' ) : __( 'Show all widgets' ), - 'unused' => __( 'Show unused widgets' ), - 'used' => __( 'Show used widgets' ) -); + $sidebars_widgets[$sidebar_id] = $sidebar; -$show = isset($_GET['show']) && isset($show_values[$_GET['show']]) ? attribute_escape( $_GET['show'] ) : false; + // remove old position + if ( !isset($_POST['delete_widget']) ) { + foreach ( $sidebars_widgets as $key => $sb ) { + if ( is_array($sb) ) + $sidebars_widgets[$key] = array_diff( $sb, array($widget_id) ); + } + array_splice( $sidebars_widgets[$sidebar_id], $position, 0, $widget_id ); + } + wp_set_sidebars_widgets($sidebars_widgets); + wp_redirect('widgets.php?message=0'); + exit; +} -$messages = array( - 'updated' => __('Changes saved.') -); +// 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'] = -1; + $widget_id = $control['id'] = $control['id_base'] . '-' . $multi_number; + $wp_registered_widget_controls[$control['id']] = $control; + break; + } + } + } + } -require_once( 'admin-header.php' ); + if ( isset($wp_registered_widget_controls[$widget_id]) && !isset($control) ) { + $control = $wp_registered_widget_controls[$widget_id]; + $control_callback = $control['callback']; + } elseif ( !isset($wp_registered_widget_controls[$widget_id]) && isset($wp_registered_widgets[$widget_id]) ) { + $name = esc_html( strip_tags($wp_registered_widgets[$widget_id]['name']) ); + } -if ( isset($_GET['message']) && isset($messages[$_GET['message']]) ) : ?> + if ( !isset($name) ) + $name = esc_html( strip_tags($control['name']) ); -

+ 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 + $width = ' style="width:' . max($control['width'], 350) . 'px"'; + $key = isset($_GET['key']) ? (int) $_GET['key'] : 0; -
-

+ require_once( 'admin-header.php' ); ?> +
+ +

+
> +

- + +
+' . __('There are no options for this widget.') . "

\n"; ?> +
+

+
+ + $sbvalue ) { + echo "\t\t\n"; + } ?> +
"; + if ( 'wp_inactive_widgets' == $sbname ) { + echo ' '; + } else { + if ( !isset($sidebars_widgets[$sbname]) || !is_array($sidebars_widgets[$sbname]) ) { + $j = 1; + } else { + $j = count($sidebars_widgets[$sbname]); + if ( isset($_GET['addnew']) || !in_array($widget_id, $sidebars_widgets[$sbname], true) ) + $j++; + } + $selected = ''; + echo "\t\t\n"; + } + echo "
+
+ + + + + + + + + + +
+
+
+
+ +$widgets_access = get_user_setting( 'widgets_access' ); +if ( isset($_GET['widgets-access']) ) { + $widgets_access = 'on' == $_GET['widgets-access'] ? 'on' : 'off'; + set_user_setting( 'widgets_access', $widgets_access ); +} -
+if ( 'on' == $widgets_access ) + add_filter( 'admin_body_class', create_function('', '{return " widgets_access ";}') ); - +$messages = array( + __('Changes saved.') +); - -
-
+$errors = array( + __('Error while saving.'), + __('Error in displaying the widget settings form.') +); -
+require_once( 'admin-header.php' ); ?> -
+
+ +

-