X-Git-Url: https://scripts.mit.edu/gitweb/autoinstalls/wordpress.git/blobdiff_plain/d3b1ea255664edd2deef17f900a655613d20820d..f8ce8fee333796f41d394479265f31b87bd6e436:/wp-includes/widgets.php diff --git a/wp-includes/widgets.php b/wp-includes/widgets.php index dadca24f..02fb6aa3 100644 --- a/wp-includes/widgets.php +++ b/wp-includes/widgets.php @@ -126,20 +126,24 @@ class WP_Widget { function _register() { $settings = $this->get_settings(); + $empty = true; - if ( empty($settings) ) { - // If there are none, we register the widget's existance with a - // generic template - $this->_set(1); - $this->_register_one(); - } elseif ( is_array($settings) ) { + if ( is_array($settings) ) { foreach ( array_keys($settings) as $number ) { if ( is_numeric($number) ) { $this->_set($number); $this->_register_one($number); + $empty = false; } } } + + if ( $empty ) { + // If there are none, we register the widget's existance with a + // generic template + $this->_set(1); + $this->_register_one(); + } } function _set($number) { @@ -457,7 +461,8 @@ function unregister_widget($widget_class) { * The default for the name is "Sidebar #", with '#' being replaced with the * number the sidebar is currently when greater than one. If first sidebar, the * name will be just "Sidebar". The default for id is "sidebar-" followed by the - * number the sidebar creation is currently at. + * number the sidebar creation is currently at. If the id is provided, and mutliple + * sidebars are being defined, the id will have "-2" appended, and so on. * * @since 2.2.0 * @@ -476,25 +481,27 @@ function register_sidebars($number = 1, $args = array()) { if ( is_string($args) ) parse_str($args, $args); - for ( $i=1; $i <= $number; $i++ ) { + for ( $i = 1; $i <= $number; $i++ ) { $_args = $args; - if ( $number > 1 ) { + if ( $number > 1 ) $_args['name'] = isset($args['name']) ? sprintf($args['name'], $i) : sprintf(__('Sidebar %d'), $i); - } else { + else $_args['name'] = isset($args['name']) ? $args['name'] : __('Sidebar'); - } - if (isset($args['id'])) { + // Custom specified ID's are suffixed if they exist already. + // Automatically generated sidebar names need to be suffixed regardless starting at -0 + if ( isset($args['id']) ) { $_args['id'] = $args['id']; + $n = 2; // Start at -2 for conflicting custom ID's + while ( isset($wp_registered_sidebars[$_args['id']]) ) + $_args['id'] = $args['id'] . '-' . $n++; } else { $n = count($wp_registered_sidebars); do { - $n++; - $_args['id'] = "sidebar-$n"; - } while (isset($wp_registered_sidebars[$_args['id']])); + $_args['id'] = 'sidebar-' . ++$n; + } while ( isset($wp_registered_sidebars[$_args['id']]) ); } - register_sidebar($_args); } } @@ -527,8 +534,6 @@ function register_sidebars($number = 1, $args = array()) { * * @since 2.2.0 * @uses $wp_registered_sidebars Stores the new sidebar in this array by sidebar ID. - * @uses parse_str() Converts a string to an array to be used in the rest of the function. - * @usedby register_sidebars() * * @param string|array $args Builds Sidebar based off of 'name' and 'id' values * @return string The sidebar id that was added. @@ -536,24 +541,26 @@ function register_sidebars($number = 1, $args = array()) { function register_sidebar($args = array()) { global $wp_registered_sidebars; - if ( is_string($args) ) - parse_str($args, $args); - $i = count($wp_registered_sidebars) + 1; $defaults = array( 'name' => sprintf(__('Sidebar %d'), $i ), 'id' => "sidebar-$i", + 'description' => '', 'before_widget' => '
  • ', 'after_widget' => "
  • \n", 'before_title' => '

    ', 'after_title' => "

    \n", ); - $sidebar = array_merge($defaults, (array) $args); + $sidebar = wp_parse_args( $args, $defaults ); $wp_registered_sidebars[$sidebar['id']] = $sidebar; + add_theme_support('widgets'); + + do_action( 'register_sidebar', $sidebar ); + return $sidebar['id']; } @@ -624,8 +631,10 @@ function wp_register_sidebar_widget($id, $name, $output_callback, $options = arr ); $widget = array_merge($widget, $options); - if ( is_callable($output_callback) && ( !isset($wp_registered_widgets[$id]) || did_action( 'widgets_init' ) ) ) + if ( is_callable($output_callback) && ( !isset($wp_registered_widgets[$id]) || did_action( 'widgets_init' ) ) ) { + do_action( 'wp_register_sidebar_widget', $widget ); $wp_registered_widgets[$id] = $widget; + } } /** @@ -650,6 +659,28 @@ function wp_widget_description( $id ) { return esc_html( $wp_registered_widgets[$id]['description'] ); } +/** + * Retrieve description for a sidebar. + * + * When registering sidebars a 'description' parameter can be included that + * describes the sidebar for display on the widget administration panel. + * + * @since 2.9.0 + * + * @param int|string $id sidebar ID. + * @return string Sidebar description, if available. Null on failure to retrieve description. + */ +function wp_sidebar_description( $id ) { + if ( !is_scalar($id) ) + return; + + global $wp_registered_sidebars; + + if ( isset($wp_registered_sidebars[$id]['description']) ) + return esc_html( $wp_registered_sidebars[$id]['description'] ); +} + + /** * Remove widget from sidebar. * @@ -658,6 +689,8 @@ function wp_widget_description( $id ) { * @param int|string $id Widget ID. */ function wp_unregister_sidebar_widget($id) { + do_action( 'wp_unregister_sidebar_widget', $id ); + wp_register_sidebar_widget($id, '', ''); wp_unregister_widget_control($id); } @@ -852,6 +885,8 @@ function dynamic_sidebar($index = 1) { $callback = $wp_registered_widgets[$id]['callback']; + do_action( 'dynamic_sidebar', $wp_registered_widgets[$id] ); + if ( is_callable($callback) ) { call_user_func_array($callback, $params); $did_one = true; @@ -885,7 +920,7 @@ function dynamic_sidebar($index = 1) { function is_active_widget($callback = false, $widget_id = false, $id_base = false, $skip_inactive = true) { global $wp_registered_widgets; - $sidebars_widgets = wp_get_sidebars_widgets(false); + $sidebars_widgets = wp_get_sidebars_widgets(); if ( is_array($sidebars_widgets) ) { foreach ( $sidebars_widgets as $sidebar => $widgets ) { @@ -935,8 +970,8 @@ function is_dynamic_sidebar() { */ function is_active_sidebar( $index ) { $index = ( is_int($index) ) ? "sidebar-$index" : sanitize_title($index); - $sidebars_widgets = get_option( 'sidebars_widgets', array() ); - if ( isset($sidebars_widgets[$index]) && !empty($sidebars_widgets[$index]) ) + $sidebars_widgets = wp_get_sidebars_widgets(); + if ( !empty($sidebars_widgets[$index]) ) return true; return false; @@ -953,92 +988,99 @@ function is_active_sidebar( $index ) { * @since 2.2.0 * @access private * - * @param bool $update Optional, default is true. Whether to save upgrade of widget array list. - * @return array Upgraded list of widgets to version 2 array format. + * @param bool $deprecated. Not used. + * @return array Upgraded list of widgets to version 3 array format when called from the admin. */ -function wp_get_sidebars_widgets($update = true) { +function wp_get_sidebars_widgets($deprecated = true) { + if ( $deprecated !== true ) + _deprecated_argument( __FUNCTION__, '2.8.1' ); + global $wp_registered_widgets, $wp_registered_sidebars, $_wp_sidebars_widgets; // If loading from front page, consult $_wp_sidebars_widgets rather than options // to see if wp_convert_widget_settings() has made manipulations in memory. - if ( is_admin() ) { - $sidebars_widgets = get_option('sidebars_widgets', array()); - } else { + if ( !is_admin() ) { if ( empty($_wp_sidebars_widgets) ) - $sidebars_widgets = get_option('sidebars_widgets', array()); - else - $sidebars_widgets = &$_wp_sidebars_widgets; - } - $_sidebars_widgets = array(); - - if ( !isset($sidebars_widgets['array_version']) ) - $sidebars_widgets['array_version'] = 1; - - switch ( $sidebars_widgets['array_version'] ) { - case 1 : - foreach ( (array) $sidebars_widgets as $index => $sidebar ) - if ( is_array($sidebar) ) - foreach ( (array) $sidebar as $i => $name ) { - $id = strtolower($name); - if ( isset($wp_registered_widgets[$id]) ) { - $_sidebars_widgets[$index][$i] = $id; - continue; - } - $id = sanitize_title($name); - if ( isset($wp_registered_widgets[$id]) ) { - $_sidebars_widgets[$index][$i] = $id; - continue; - } + $_wp_sidebars_widgets = get_option('sidebars_widgets', array()); - $found = false; - - foreach ( $wp_registered_widgets as $widget_id => $widget ) { - if ( strtolower($widget['name']) == strtolower($name) ) { - $_sidebars_widgets[$index][$i] = $widget['id']; - $found = true; - break; - } elseif ( sanitize_title($widget['name']) == sanitize_title($name) ) { - $_sidebars_widgets[$index][$i] = $widget['id']; - $found = true; - break; + $sidebars_widgets = $_wp_sidebars_widgets; + } else { + $sidebars_widgets = get_option('sidebars_widgets', array()); + $_sidebars_widgets = array(); + + if ( isset($sidebars_widgets['wp_inactive_widgets']) || empty($sidebars_widgets) ) + $sidebars_widgets['array_version'] = 3; + elseif ( !isset($sidebars_widgets['array_version']) ) + $sidebars_widgets['array_version'] = 1; + + switch ( $sidebars_widgets['array_version'] ) { + case 1 : + foreach ( (array) $sidebars_widgets as $index => $sidebar ) + if ( is_array($sidebar) ) + foreach ( (array) $sidebar as $i => $name ) { + $id = strtolower($name); + if ( isset($wp_registered_widgets[$id]) ) { + $_sidebars_widgets[$index][$i] = $id; + continue; + } + $id = sanitize_title($name); + if ( isset($wp_registered_widgets[$id]) ) { + $_sidebars_widgets[$index][$i] = $id; + continue; } - } - - if ( $found ) - continue; - unset($_sidebars_widgets[$index][$i]); - } - $_sidebars_widgets['array_version'] = 2; - $sidebars_widgets = $_sidebars_widgets; - unset($_sidebars_widgets); - - case 2 : - $sidebars = array_keys( $wp_registered_sidebars ); - if ( !empty( $sidebars ) ) { - // Move the known-good ones first - foreach ( (array) $sidebars as $id ) { - if ( array_key_exists( $id, $sidebars_widgets ) ) { - $_sidebars_widgets[$id] = $sidebars_widgets[$id]; - unset($sidebars_widgets[$id], $sidebars[$id]); + $found = false; + + foreach ( $wp_registered_widgets as $widget_id => $widget ) { + if ( strtolower($widget['name']) == strtolower($name) ) { + $_sidebars_widgets[$index][$i] = $widget['id']; + $found = true; + break; + } elseif ( sanitize_title($widget['name']) == sanitize_title($name) ) { + $_sidebars_widgets[$index][$i] = $widget['id']; + $found = true; + break; + } } - } - // Assign to each unmatched registered sidebar the first available orphan - unset( $sidebars_widgets[ 'array_version' ] ); - while ( ( $sidebar = array_shift( $sidebars ) ) && $widgets = array_shift( $sidebars_widgets ) ) - $_sidebars_widgets[ $sidebar ] = $widgets; + if ( $found ) + continue; - $_sidebars_widgets['array_version'] = 3; + unset($_sidebars_widgets[$index][$i]); + } + $_sidebars_widgets['array_version'] = 2; $sidebars_widgets = $_sidebars_widgets; unset($_sidebars_widgets); - } - if ( $update && is_admin() ) - update_option('sidebars_widgets', $sidebars_widgets); + case 2 : + $sidebars = array_keys( $wp_registered_sidebars ); + if ( !empty( $sidebars ) ) { + // Move the known-good ones first + foreach ( (array) $sidebars as $id ) { + if ( array_key_exists( $id, $sidebars_widgets ) ) { + $_sidebars_widgets[$id] = $sidebars_widgets[$id]; + unset($sidebars_widgets[$id], $sidebars[$id]); + } + } + + // move the rest to wp_inactive_widgets + if ( !isset($_sidebars_widgets['wp_inactive_widgets']) ) + $_sidebars_widgets['wp_inactive_widgets'] = array(); + + 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 ); + } + } + + $sidebars_widgets = $_sidebars_widgets; + unset($_sidebars_widgets); + } + } } - if ( isset($sidebars_widgets['array_version']) ) + if ( is_array( $sidebars_widgets ) && isset($sidebars_widgets['array_version']) ) unset($sidebars_widgets['array_version']); $sidebars_widgets = apply_filters('sidebars_widgets', $sidebars_widgets); @@ -1086,9 +1128,8 @@ function wp_get_widget_defaults() { * @return array */ function wp_convert_widget_settings($base_name, $option_name, $settings) { - global $_wp_sidebars_widgets; // This test may need expanding. - $single = false; + $single = $changed = false; if ( empty($settings) ) { $single = true; } else { @@ -1110,7 +1151,7 @@ function wp_convert_widget_settings($base_name, $option_name, $settings) { $sidebars_widgets = get_option('sidebars_widgets'); } else { if ( empty($GLOBALS['_wp_sidebars_widgets']) ) - $GLOBALS['_wp_sidebars_widgets'] = get_option('sidebars_widgets'); + $GLOBALS['_wp_sidebars_widgets'] = get_option('sidebars_widgets', array()); $sidebars_widgets = &$GLOBALS['_wp_sidebars_widgets']; } @@ -1119,13 +1160,14 @@ function wp_convert_widget_settings($base_name, $option_name, $settings) { foreach ( $sidebar as $i => $name ) { if ( $base_name == $name ) { $sidebars_widgets[$index][$i] = "$name-2"; + $changed = true; break 2; } } } } - if ( is_admin() ) + if ( is_admin() && $changed ) update_option('sidebars_widgets', $sidebars_widgets); } @@ -1136,114 +1178,6 @@ function wp_convert_widget_settings($base_name, $option_name, $settings) { return $settings; } -/** - * Deprecated API - */ - -/** - * Register widget for sidebar with backwards compatibility. - * - * Allows $name to be an array that accepts either three elements to grab the - * first element and the third for the name or just uses the first element of - * the array for the name. - * - * Passes to {@link wp_register_sidebar_widget()} after argument list and - * backwards compatibility is complete. - * - * @since 2.2.0 - * @uses wp_register_sidebar_widget() Passes the compiled arguments. - * - * @param string|int $name Widget ID. - * @param callback $output_callback Run when widget is called. - * @param string $classname Classname widget option. - * @param mixed $params,... Widget parameters. - */ -function register_sidebar_widget($name, $output_callback, $classname = '') { - // Compat - if ( is_array($name) ) { - if ( count($name) == 3 ) - $name = sprintf($name[0], $name[2]); - else - $name = $name[0]; - } - - $id = sanitize_title($name); - $options = array(); - if ( !empty($classname) && is_string($classname) ) - $options['classname'] = $classname; - $params = array_slice(func_get_args(), 2); - $args = array($id, $name, $output_callback, $options); - if ( !empty($params) ) - $args = array_merge($args, $params); - - call_user_func_array('wp_register_sidebar_widget', $args); -} - -/** - * Alias of {@link wp_unregister_sidebar_widget()}. - * - * @see wp_unregister_sidebar_widget() - * - * @since 2.2.0 - * - * @param int|string $id Widget ID. - */ -function unregister_sidebar_widget($id) { - return wp_unregister_sidebar_widget($id); -} - -/** - * Registers widget control callback for customizing options. - * - * Allows $name to be an array that accepts either three elements to grab the - * first element and the third for the name or just uses the first element of - * the array for the name. - * - * Passes to {@link wp_register_widget_control()} after the argument list has - * been compiled. - * - * @since 2.2.0 - * - * @param int|string $name Sidebar ID. - * @param callback $control_callback Widget control callback to display and process form. - * @param int $width Widget width. - * @param int $height Widget height. - */ -function register_widget_control($name, $control_callback, $width = '', $height = '') { - // Compat - if ( is_array($name) ) { - if ( count($name) == 3 ) - $name = sprintf($name[0], $name[2]); - else - $name = $name[0]; - } - - $id = sanitize_title($name); - $options = array(); - if ( !empty($width) ) - $options['width'] = $width; - if ( !empty($height) ) - $options['height'] = $height; - $params = array_slice(func_get_args(), 4); - $args = array($id, $name, $control_callback, $options); - if ( !empty($params) ) - $args = array_merge($args, $params); - - call_user_func_array('wp_register_widget_control', $args); -} - -/** - * Alias of {@link wp_unregister_widget_control()}. - * - * @since 2.2.0 - * @see wp_unregister_widget_control() - * - * @param int|string $id Widget ID. - */ -function unregister_widget_control($id) { - return wp_unregister_widget_control($id); -} - /** * Output an arbitrary widget as a template tag * @@ -1267,6 +1201,8 @@ function the_widget($widget, $instance = array(), $args = array()) { $args = wp_parse_args($args, $default_args); $instance = wp_parse_args($instance); + do_action( 'the_widget', $widget, $instance, $args ); + $widget_obj->_set(-1); $widget_obj->widget($args, $instance); }