diff --git a/wp-includes/default-widgets.php b/wp-includes/default-widgets.php
new file mode 100644
index 000000000..640a37e79
--- /dev/null
+++ b/wp-includes/default-widgets.php
@@ -0,0 +1,1357 @@
+ 'widget_pages', 'description' => __( "Your blog's WordPress Pages") );
+ $this->WP_Widget('pages', __('Pages'), $widget_ops);
+ }
+
+ function widget( $args, $instance ) {
+ extract( $args );
+
+ $title = empty( $instance['title'] ) ? __( 'Pages' ) : apply_filters('widget_title', $instance['title']);
+ $sortby = empty( $instance['sortby'] ) ? 'menu_order' : $instance['sortby'];
+ $exclude = empty( $instance['exclude'] ) ? '' : $instance['exclude'];
+
+ if ( $sortby == 'menu_order' )
+ $sortby = 'menu_order, post_title';
+
+ $out = wp_list_pages( array('title_li' => '', 'echo' => 0, 'sort_column' => $sortby, 'exclude' => $exclude) );
+
+ if ( !empty( $out ) ) {
+ echo $before_widget;
+ echo $before_title . $title . $after_title;
+ ?>
+
+ 'post_title', 'title' => '', 'exclude' => '') );
+ $title = attribute_escape( $instance['title'] );
+ $exclude = attribute_escape( $instance['exclude'] );
+ ?>
+
+
+
+
+ >
+ >
+ >
+
+
+
+
+
+
+
+
+
+ __( "Your blogroll" ) );
+ $this->WP_Widget('links', __('Links'), $widget_ops);
+ }
+
+ function widget( $args, $instance ) {
+ extract($args, EXTR_SKIP);
+
+ $show_description = isset($instance['description']) ? $instance['description'] : false;
+ $show_name = isset($instance['name']) ? $instance['name'] : false;
+ $show_rating = isset($instance['rating']) ? $instance['rating'] : false;
+ $show_images = isset($instance['images']) ? $instance['images'] : true;
+
+ $before_widget = preg_replace('/id="[^"]*"/','id="%id"', $before_widget);
+ wp_list_bookmarks(apply_filters('widget_links_args', array(
+ 'title_before' => $before_title, 'title_after' => $after_title,
+ 'category_before' => $before_widget, 'category_after' => $after_widget,
+ 'show_images' => $show_images, 'show_description' => $show_description,
+ 'show_name' => $show_name, 'show_rating' => $show_rating,
+ 'class' => 'linkcat widget'
+ )));
+ }
+
+ function update( $new_instance, $old_instance ) {
+ if( !isset($new_instance['submit']) ) // user clicked cancel?
+ return false;
+
+ $new_instance = (array) $new_instance;
+ $instance = array( 'images' => 0, 'name' => 0, 'description' => 0, 'rating' => 0);
+ foreach ( $instance as $field => $val ) {
+ if ( isset($new_instance[$field]) )
+ $instance[$field] = 1;
+ }
+
+ return $instance;
+ }
+
+ function form( $instance ) {
+
+ //Defaults
+ $instance = wp_parse_args( (array) $instance, array( 'images' => true, 'name' => true, 'description' => false, 'rating' => false) );
+?>
+
+
+ id="get_field_id('images'); ?>" name="get_field_name('images'); ?>" />
+
+ id="get_field_id('name'); ?>" name="get_field_name('name'); ?>" />
+
+ id="get_field_id('description'); ?>" name="get_field_name('description'); ?>" />
+
+ id="get_field_id('rating'); ?>" name="get_field_name('rating'); ?>" />
+
+
+ 'widget_search', 'description' => __( "A search form for your blog") );
+ $this->WP_Widget('search', __('Search'), $widget_ops);
+ }
+
+ function widget( $args, $instance ) {
+ extract($args);
+ echo $before_widget;
+
+ // Use current theme search form if it exists
+ get_search_form();
+
+ echo $after_widget;
+ }
+}
+
+/**
+ * Archives widget class
+ *
+ * @since 2.8.0
+ */
+class WP_Widget_Archives extends WP_Widget {
+
+ function WP_Widget_Archives() {
+ $widget_ops = array('classname' => 'widget_archive', 'description' => __( "A monthly archive of your blog's posts") );
+ $this->WP_Widget('archives', __('Archives'), $widget_ops);
+ }
+
+ function widget( $args, $instance ) {
+ extract($args);
+ $c = $instance['count'] ? '1' : '0';
+ $d = $instance['dropdown'] ? '1' : '0';
+ $title = empty($instance['title']) ? __('Archives') : apply_filters('widget_title', $instance['title']);
+
+ echo $before_widget;
+ echo $before_title . $title . $after_title;
+
+ if ( $d ) {
+?>
+
+
+
+ '', 'count' => 0, 'dropdown' => '') );
+ $title = strip_tags($instance['title']);
+ $count = $instance['count'] ? 'checked="checked"' : '';
+ $dropdown = $instance['dropdown'] ? 'checked="checked"' : '';
+?>
+
+
+ id="get_field_id('count'); ?>" name="get_field_name('count'); ?>" />
+
+ id="get_field_id('dropdown'); ?>" name="get_field_name('dropdown'); ?>" />
+
+
+
+
+
+
+
+
+
+
+';
+ get_calendar();
+ echo '';
+ echo $after_widget;
+}
+
+/**
+ * Display and process calendar widget options form.
+ *
+ * @since 2.2.0
+ */
+function wp_widget_calendar_control() {
+ $options = $newoptions = get_option('widget_calendar');
+ if ( isset($_POST["calendar-submit"]) ) {
+ $newoptions['title'] = strip_tags(stripslashes($_POST["calendar-title"]));
+ }
+ if ( $options != $newoptions ) {
+ $options = $newoptions;
+ update_option('widget_calendar', $options);
+ }
+ $title = attribute_escape($options['title']);
+?>
+
+
+ $widget_args );
+ $widget_args = wp_parse_args( $widget_args, array( 'number' => -1 ) );
+ extract( $widget_args, EXTR_SKIP );
+
+ $options = get_option('widget_text');
+ if ( !isset($options[$number]) )
+ return;
+
+ $title = apply_filters('widget_title', $options[$number]['title']);
+ $text = apply_filters( 'widget_text', $options[$number]['text'] );
+?>
+
+
+
+
+ $widget_args );
+ $widget_args = wp_parse_args( $widget_args, array( 'number' => -1 ) );
+ extract( $widget_args, EXTR_SKIP );
+
+ $options = get_option('widget_text');
+ if ( !is_array($options) )
+ $options = array();
+
+ if ( !$updated && !empty($_POST['sidebar']) ) {
+ $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 ( (array) $this_sidebar as $_widget_id ) {
+ if ( 'wp_widget_text' == $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( "text-$widget_number", $_POST['widget-id'] ) ) // the widget has been removed.
+ unset($options[$widget_number]);
+ }
+ }
+
+ foreach ( (array) $_POST['widget-text'] as $widget_number => $widget_text ) {
+ if ( !isset($widget_text['text']) && isset($options[$widget_number]) ) // user clicked cancel
+ continue;
+ $title = strip_tags(stripslashes($widget_text['title']));
+ if ( current_user_can('unfiltered_html') )
+ $text = stripslashes( $widget_text['text'] );
+ else
+ $text = stripslashes(wp_filter_post_kses( $widget_text['text'] ));
+ $options[$widget_number] = compact( 'title', 'text' );
+ }
+
+ update_option('widget_text', $options);
+ $updated = true;
+ }
+
+ if ( -1 == $number ) {
+ $title = '';
+ $text = '';
+ $number = '%i%';
+ } else {
+ $title = attribute_escape($options[$number]['title']);
+ $text = format_to_edit($options[$number]['text']);
+ }
+?>
+
+
+
+
+
+ 'widget_text', 'description' => __('Arbitrary text or HTML'));
+ $control_ops = array('width' => 400, 'height' => 350, 'id_base' => 'text');
+ $name = __('Text');
+
+ $id = false;
+ foreach ( (array) array_keys($options) as $o ) {
+ // Old widgets can have null values for some reason
+ if ( !isset($options[$o]['title']) || !isset($options[$o]['text']) )
+ continue;
+ $id = "text-$o"; // Never never never translate an id
+ wp_register_sidebar_widget($id, $name, 'wp_widget_text', $widget_ops, array( 'number' => $o ));
+ wp_register_widget_control($id, $name, 'wp_widget_text_control', $control_ops, array( 'number' => $o ));
+ }
+
+ // If there are none, we register the widget's existance with a generic template
+ if ( !$id ) {
+ wp_register_sidebar_widget( 'text-1', $name, 'wp_widget_text', $widget_ops, array( 'number' => -1 ) );
+ wp_register_widget_control( 'text-1', $name, 'wp_widget_text_control', $control_ops, array( 'number' => -1 ) );
+ }
+}
+
+/**
+ * Display categories widget.
+ *
+ * Allows multiple category widgets.
+ *
+ * @since 2.2.0
+ *
+ * @param array $args Widget arguments.
+ * @param int $number Widget number.
+ */
+function wp_widget_categories($args, $widget_args = 1) {
+ extract($args, EXTR_SKIP);
+ 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);
+
+ $options = get_option('widget_categories');
+ if ( !isset($options[$number]) )
+ return;
+
+ $c = $options[$number]['count'] ? '1' : '0';
+ $h = $options[$number]['hierarchical'] ? '1' : '0';
+ $d = $options[$number]['dropdown'] ? '1' : '0';
+
+ $title = empty($options[$number]['title']) ? __('Categories') : apply_filters('widget_title', $options[$number]['title']);
+
+ echo $before_widget;
+ echo $before_title . $title . $after_title;
+
+ $cat_args = array('orderby' => 'name', 'show_count' => $c, 'hierarchical' => $h);
+
+ if ( $d ) {
+ $cat_args['show_option_none'] = __('Select Category');
+ wp_dropdown_categories($cat_args);
+?>
+
+
+
+
+
+ $widget_args );
+ $widget_args = wp_parse_args( $widget_args, array( 'number' => -1 ) );
+ extract($widget_args, EXTR_SKIP);
+
+ $options = get_option('widget_categories');
+
+ if ( !is_array( $options ) )
+ $options = array();
+
+ if ( !$updated && !empty($_POST['sidebar']) ) {
+ $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 ( (array) $this_sidebar as $_widget_id ) {
+ if ( 'wp_widget_categories' == $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( "categories-$widget_number", $_POST['widget-id'] ) ) // the widget has been removed.
+ unset($options[$widget_number]);
+ }
+ }
+
+ foreach ( (array) $_POST['widget-categories'] as $widget_number => $widget_cat ) {
+ if ( !isset($widget_cat['title']) && isset($options[$widget_number]) ) // user clicked cancel
+ continue;
+ $title = trim(strip_tags(stripslashes($widget_cat['title'])));
+ $count = isset($widget_cat['count']);
+ $hierarchical = isset($widget_cat['hierarchical']);
+ $dropdown = isset($widget_cat['dropdown']);
+ $options[$widget_number] = compact( 'title', 'count', 'hierarchical', 'dropdown' );
+ }
+
+ update_option('widget_categories', $options);
+ $updated = true;
+ }
+
+ if ( -1 == $number ) {
+ $title = '';
+ $count = false;
+ $hierarchical = false;
+ $dropdown = false;
+ $number = '%i%';
+ } else {
+ $title = attribute_escape( $options[$number]['title'] );
+ $count = (bool) $options[$number]['count'];
+ $hierarchical = (bool) $options[$number]['hierarchical'];
+ $dropdown = (bool) $options[$number]['dropdown'];
+ }
+?>
+
+
+
+
+
+
+
+
+
+ />
+
+
+
+
+ />
+
+
+
+
+ />
+
+
+
+
+
+ 'widget_categories', 'description' => __( "A list or dropdown of categories" ) );
+
+ $name = __( 'Categories' );
+
+ $id = false;
+ foreach ( (array) array_keys($options) as $o ) {
+ // Old widgets can have null values for some reason
+ if ( !isset($options[$o]['title']) )
+ continue;
+ $id = "categories-$o";
+ wp_register_sidebar_widget( $id, $name, 'wp_widget_categories', $widget_ops, array( 'number' => $o ) );
+ wp_register_widget_control( $id, $name, 'wp_widget_categories_control', array( 'id_base' => 'categories' ), array( 'number' => $o ) );
+ }
+
+ // If there are none, we register the widget's existance with a generic template
+ if ( !$id ) {
+ wp_register_sidebar_widget( 'categories-1', $name, 'wp_widget_categories', $widget_ops, array( 'number' => -1 ) );
+ wp_register_widget_control( 'categories-1', $name, 'wp_widget_categories_control', array( 'id_base' => 'categories' ), array( 'number' => -1 ) );
+ }
+}
+
+/**
+ * Upgrade previous category widget to current version.
+ *
+ * @since 2.3.0
+ *
+ * @return array
+ */
+function wp_widget_categories_upgrade() {
+ $options = get_option( 'widget_categories' );
+
+ if ( !isset( $options['title'] ) )
+ return $options;
+
+ $newoptions = array( 1 => $options );
+
+ update_option( 'widget_categories', $newoptions );
+
+ $sidebars_widgets = get_option( 'sidebars_widgets' );
+ if ( is_array( $sidebars_widgets ) ) {
+ foreach ( $sidebars_widgets as $sidebar => $widgets ) {
+ if ( is_array( $widgets ) ) {
+ foreach ( $widgets as $widget )
+ $new_widgets[$sidebar][] = ( $widget == 'categories' ) ? 'categories-1' : $widget;
+ } else {
+ $new_widgets[$sidebar] = $widgets;
+ }
+ }
+ if ( $new_widgets != $sidebars_widgets )
+ update_option( 'sidebars_widgets', $new_widgets );
+ }
+
+ return $newoptions;
+}
+
+/**
+ * Display recent entries widget.
+ *
+ * @since 2.2.0
+ *
+ * @param array $args Widget arguments.
+ * @return int Displayed cache.
+ */
+function wp_widget_recent_entries($args) {
+ if ( '%BEG_OF_TITLE%' != $args['before_title'] ) {
+ if ( $output = wp_cache_get('widget_recent_entries', 'widget') )
+ return print($output);
+ ob_start();
+ }
+
+ extract($args);
+ $options = get_option('widget_recent_entries');
+ $title = empty($options['title']) ? __('Recent Posts') : apply_filters('widget_title', $options['title']);
+ if ( !$number = (int) $options['number'] )
+ $number = 10;
+ else if ( $number < 1 )
+ $number = 1;
+ else if ( $number > 15 )
+ $number = 15;
+
+ $r = new WP_Query(array('showposts' => $number, 'what_to_show' => 'posts', 'nopaging' => 0, 'post_status' => 'publish', 'caller_get_posts' => 1));
+ if ($r->have_posts()) :
+?>
+
+
+
+ have_posts()) : $r->the_post(); ?>
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 15 )
+ $number = 15;
+
+ if ( !$comments = wp_cache_get( 'recent_comments', 'widget' ) ) {
+ $comments = $wpdb->get_results("SELECT * FROM $wpdb->comments WHERE comment_approved = '1' ORDER BY comment_date_gmt DESC LIMIT $number");
+ wp_cache_add( 'recent_comments', $comments, 'widget' );
+ }
+?>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 'widget_recent_comments', 'description' => __( 'The most recent comments' ) );
+ wp_register_sidebar_widget('recent-comments', __('Recent Comments'), 'wp_widget_recent_comments', $widget_ops);
+ wp_register_widget_control('recent-comments', __('Recent Comments'), 'wp_widget_recent_comments_control');
+
+ if ( is_active_widget('wp_widget_recent_comments') )
+ add_action('wp_head', 'wp_widget_recent_comments_style');
+}
+
+/**
+ * Display RSS widget.
+ *
+ * Allows for multiple widgets to be displayed.
+ *
+ * @since 2.2.0
+ *
+ * @param array $args Widget arguments.
+ * @param int $number Widget number.
+ */
+function wp_widget_rss($args, $widget_args = 1) {
+ extract($args, EXTR_SKIP);
+ 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);
+
+ $options = get_option('widget_rss');
+
+ if ( !isset($options[$number]) )
+ return;
+
+ if ( isset($options[$number]['error']) && $options[$number]['error'] )
+ return;
+
+ $url = $options[$number]['url'];
+ while ( stristr($url, 'http') != $url )
+ $url = substr($url, 1);
+ if ( empty($url) )
+ return;
+
+ $rss = fetch_feed($url);
+ $title = $options[$number]['title'];
+ $desc = '';
+ $link = '';
+ if ( ! is_wp_error($rss) ) {
+ $desc = attribute_escape(strip_tags(html_entity_decode($rss->get_description(), ENT_QUOTES, get_option('blog_charset'))));
+ if ( empty($title) )
+ $title = htmlentities(strip_tags($rss->get_title()));
+ $link = clean_url(strip_tags($rss->get_permalink()));
+ while ( stristr($link, 'http') != $link )
+ $link = substr($link, 1);
+ }
+ if ( empty($title) )
+ $title = $desc;
+ if ( empty($title) )
+ $title = __('Unknown Feed');
+ $title = apply_filters('widget_title', $title );
+ $url = clean_url(strip_tags($url));
+ $icon = includes_url('images/rss.png');
+ $title = " ";
+
+ echo $before_widget;
+ echo $before_title . $title . $after_title;
+
+ wp_widget_rss_output( $rss, $options[$number] );
+
+ echo $after_widget;
+}
+
+/**
+ * Display the RSS entries in a list.
+ *
+ * @since 2.5.0
+ *
+ * @param string|array|object $rss RSS url.
+ * @param array $args Widget arguments.
+ */
+function wp_widget_rss_output( $rss, $args = array() ) {
+ if ( is_string( $rss ) ) {
+ $rss = fetch_feed($rss);
+ } elseif ( is_array($rss) && isset($rss['url']) ) {
+ $args = $rss;
+ $rss = fetch_feed($rss['url']);
+ } elseif ( !is_object($rss) ) {
+ return;
+ }
+
+ if ( is_wp_error($rss) ) {
+ if ( is_admin() || current_user_can('manage_options') ) {
+ echo '';
+ printf(__('RSS Error : %s'), $rss->get_error_message());
+ echo '
';
+ }
+ return;
+ }
+
+ $default_args = array( 'show_author' => 0, 'show_date' => 0, 'show_summary' => 0 );
+ $args = wp_parse_args( $args, $default_args );
+ extract( $args, EXTR_SKIP );
+
+ $items = (int) $items;
+ if ( $items < 1 || 20 < $items )
+ $items = 10;
+ $show_summary = (int) $show_summary;
+ $show_author = (int) $show_author;
+ $show_date = (int) $show_date;
+
+ if ( !$rss->get_item_quantity() ) {
+ echo '' . __( 'An error has occurred; the feed is probably down. Try again later.' ) . ' ';
+ return;
+ }
+
+ echo '';
+ foreach ( $rss->get_items(0, $items) as $item ) {
+ $link = $item->get_link();
+ while ( stristr($link, 'http') != $link )
+ $link = substr($link, 1);
+ $link = clean_url(strip_tags($link));
+ $title = attribute_escape(strip_tags($item->get_title()));
+ if ( empty($title) )
+ $title = __('Untitled');
+
+ $desc = str_replace(array("\n", "\r"), ' ', attribute_escape(strip_tags(html_entity_decode($item->get_description(), ENT_QUOTES, get_option('blog_charset')))));
+ $desc = wp_html_excerpt( $desc, 360 ) . ' […]';
+ $desc = wp_specialchars( $desc );
+
+ if ( $show_summary ) {
+ $summary = "";
+ } else {
+ $summary = '';
+ }
+
+ $date = '';
+ if ( $show_date ) {
+ $date = $item->get_date();
+
+ if ( $date ) {
+ if ( $date_stamp = strtotime( $date ) )
+ $date = ' ';
+ else
+ $date = '';
+ }
+ }
+
+ $author = '';
+ if ( $show_author ) {
+ $author = $item->get_author();
+ $author = $author->get_name();
+ $author = ' ' . wp_specialchars( strip_tags( $author ) ) . ' ';
+ }
+
+ if ( $link == '' ) {
+ echo "$title{$date}{$summary}{$author} ";
+ } else {
+ echo "{$date}{$summary}{$author} ";
+ }
+ }
+ echo ' ';
+}
+
+/**
+ * Display and process RSS widget control form.
+ *
+ * @since 2.2.0
+ *
+ * @param int $widget_args Widget number.
+ */
+function wp_widget_rss_control($widget_args) {
+ global $wp_registered_widgets;
+ static $updated = false;
+
+ 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);
+
+ $options = get_option('widget_rss');
+ if ( !is_array($options) )
+ $options = array();
+
+ $urls = array();
+ foreach ( (array) $options as $option )
+ if ( isset($option['url']) )
+ $urls[$option['url']] = true;
+
+ if ( !$updated && 'POST' == $_SERVER['REQUEST_METHOD'] && !empty($_POST['sidebar']) ) {
+ $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 ( (array) $this_sidebar as $_widget_id ) {
+ if ( 'wp_widget_rss' == $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( "rss-$widget_number", $_POST['widget-id'] ) ) // the widget has been removed.
+ unset($options[$widget_number]);
+ }
+ }
+
+ foreach( (array) $_POST['widget-rss'] as $widget_number => $widget_rss ) {
+ if ( !isset($widget_rss['url']) && isset($options[$widget_number]) ) // user clicked cancel
+ continue;
+ $widget_rss = stripslashes_deep( $widget_rss );
+ $url = sanitize_url(strip_tags($widget_rss['url']));
+ $options[$widget_number] = wp_widget_rss_process( $widget_rss, !isset($urls[$url]) );
+ }
+
+ update_option('widget_rss', $options);
+ $updated = true;
+ }
+
+ if ( -1 == $number ) {
+ $title = '';
+ $url = '';
+ $items = 10;
+ $error = false;
+ $number = '%i%';
+ $show_summary = 0;
+ $show_author = 0;
+ $show_date = 0;
+ } else {
+ extract( (array) $options[$number] );
+ }
+
+ wp_widget_rss_form( compact( 'number', 'title', 'url', 'items', 'error', 'show_summary', 'show_author', 'show_date' ) );
+}
+
+/**
+ * Display RSS widget options form.
+ *
+ * The options for what fields are displayed for the RSS form are all booleans
+ * and are as follows: 'url', 'title', 'items', 'show_summary', 'show_author',
+ * 'show_date'.
+ *
+ * @since 2.5.0
+ *
+ * @param array|string $args Values for input fields.
+ * @param array $inputs Override default display options.
+ */
+function wp_widget_rss_form( $args, $inputs = null ) {
+
+ $default_inputs = array( 'url' => true, 'title' => true, 'items' => true, 'show_summary' => true, 'show_author' => true, 'show_date' => true );
+ $inputs = wp_parse_args( $inputs, $default_inputs );
+ extract( $args );
+ extract( $inputs, EXTR_SKIP);
+
+ $number = attribute_escape( $number );
+ $title = attribute_escape( $title );
+ $url = attribute_escape( $url );
+ $items = (int) $items;
+ if ( $items < 1 || 20 < $items )
+ $items = 10;
+ $show_summary = (int) $show_summary;
+ $show_author = (int) $show_author;
+ $show_date = (int) $show_date;
+
+ if ( !empty($error) ) {
+ $message = sprintf( __('Error in RSS Widget: %s'), $error);
+ echo "";
+ echo "$message
";
+ }
+
+ if ( $inputs['url'] ) :
+?>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ />
+
+
+
+
+
+
+ />
+
+
+
+
+
+
+ />
+
+
+
+
+
+
+get_error_message();
+ } else {
+ $link = clean_url(strip_tags($rss->get_permalink()));
+ while ( stristr($link, 'http') != $link )
+ $link = substr($link, 1);
+ }
+ }
+
+ return compact( 'title', 'url', 'link', 'items', 'error', 'show_summary', 'show_author', 'show_date' );
+}
+
+/**
+ * Register RSS widget to allow multiple RSS widgets on startup.
+ *
+ * @since 2.2.0
+ */
+function wp_widget_rss_register() {
+ $options = get_option('widget_rss');
+ if ( !is_array($options) )
+ $options = array();
+
+ $widget_ops = array('classname' => 'widget_rss', 'description' => __( 'Entries from any RSS or Atom feed' ));
+ $control_ops = array('width' => 400, 'height' => 200, 'id_base' => 'rss');
+ $name = __('RSS');
+
+ $id = false;
+ foreach ( (array) array_keys($options) as $o ) {
+ // Old widgets can have null values for some reason
+ if ( !isset($options[$o]['url']) || !isset($options[$o]['title']) || !isset($options[$o]['items']) )
+ continue;
+ $id = "rss-$o"; // Never never never translate an id
+ wp_register_sidebar_widget($id, $name, 'wp_widget_rss', $widget_ops, array( 'number' => $o ));
+ wp_register_widget_control($id, $name, 'wp_widget_rss_control', $control_ops, array( 'number' => $o ));
+ }
+
+ // If there are none, we register the widget's existance with a generic template
+ if ( !$id ) {
+ wp_register_sidebar_widget( 'rss-1', $name, 'wp_widget_rss', $widget_ops, array( 'number' => -1 ) );
+ wp_register_widget_control( 'rss-1', $name, 'wp_widget_rss_control', $control_ops, array( 'number' => -1 ) );
+ }
+}
+
+/**
+ * Display tag cloud widget.
+ *
+ * @since 2.3.0
+ *
+ * @param array $args Widget arguments.
+ */
+function wp_widget_tag_cloud($args) {
+ extract($args);
+ $options = get_option('widget_tag_cloud');
+ $title = empty($options['title']) ? __('Tags') : apply_filters('widget_title', $options['title']);
+
+ echo $before_widget;
+ echo $before_title . $title . $after_title;
+ wp_tag_cloud();
+ echo $after_widget;
+}
+
+/**
+ * Manage WordPress Tag Cloud widget options.
+ *
+ * Displays management form for changing the tag cloud widget title.
+ *
+ * @since 2.3.0
+ */
+function wp_widget_tag_cloud_control() {
+ $options = $newoptions = get_option('widget_tag_cloud');
+
+ if ( isset($_POST['tag-cloud-submit']) ) {
+ $newoptions['title'] = strip_tags(stripslashes($_POST['tag-cloud-title']));
+ }
+
+ if ( $options != $newoptions ) {
+ $options = $newoptions;
+ update_option('widget_tag_cloud', $options);
+ }
+
+ $title = attribute_escape( $options['title'] );
+?>
+
+
+
+
+ 'widget_calendar', 'description' => __( "A calendar of your blog's posts") );
+ wp_register_sidebar_widget('calendar', __('Calendar'), 'wp_widget_calendar', $widget_ops);
+ wp_register_widget_control('calendar', __('Calendar'), 'wp_widget_calendar_control' );
+
+ new WP_Widget_Archives();
+
+ new WP_Widget_Links();
+
+ $widget_ops = array('classname' => 'widget_meta', 'description' => __( "Log in/out, admin, feed and WordPress links") );
+ wp_register_sidebar_widget('meta', __('Meta'), 'wp_widget_meta', $widget_ops);
+ wp_register_widget_control('meta', __('Meta'), 'wp_widget_meta_control' );
+
+ new WP_Widget_Search();
+
+ $widget_ops = array('classname' => 'widget_recent_entries', 'description' => __( "The most recent posts on your blog") );
+ wp_register_sidebar_widget('recent-posts', __('Recent Posts'), 'wp_widget_recent_entries', $widget_ops);
+ wp_register_widget_control('recent-posts', __('Recent Posts'), 'wp_widget_recent_entries_control' );
+
+ $widget_ops = array('classname' => 'widget_tag_cloud', 'description' => __( "Your most used tags in cloud format") );
+ wp_register_sidebar_widget('tag_cloud', __('Tag Cloud'), 'wp_widget_tag_cloud', $widget_ops);
+ wp_register_widget_control('tag_cloud', __('Tag Cloud'), 'wp_widget_tag_cloud_control' );
+
+ wp_widget_categories_register();
+ wp_widget_text_register();
+ wp_widget_rss_register();
+ wp_widget_recent_comments_register();
+
+ do_action('widgets_init');
+}
+
+add_action('init', 'wp_widgets_init', 1);
diff --git a/wp-includes/functions.php b/wp-includes/functions.php
index 40fe5c1d9..f6e9b43e4 100644
--- a/wp-includes/functions.php
+++ b/wp-includes/functions.php
@@ -2614,10 +2614,10 @@ function wp_parse_args( $args, $defaults = '' ) {
* @uses add_action() Calls '_admin_menu' hook with 'wp_widgets_add_menu' value.
*/
function wp_maybe_load_widgets() {
- if ( !function_exists( 'dynamic_sidebar' ) ) {
- require_once( ABSPATH . WPINC . '/widgets.php' );
- add_action( '_admin_menu', 'wp_widgets_add_menu' );
- }
+ if ( ! apply_filters('load_default_widgets', true) )
+ return;
+ require_once( ABSPATH . WPINC . '/default-widgets.php' );
+ add_action( '_admin_menu', 'wp_widgets_add_menu' );
}
/**
diff --git a/wp-includes/widgets.php b/wp-includes/widgets.php
index f82ed3017..5feeae225 100644
--- a/wp-includes/widgets.php
+++ b/wp-includes/widgets.php
@@ -392,45 +392,6 @@ function unregister_sidebar( $name ) {
unset( $wp_registered_sidebars[$name] );
}
-/**
- * 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);
-}
-
/**
* Register widget for use in sidebars.
*
@@ -497,19 +458,6 @@ function wp_widget_description( $id ) {
return wp_specialchars( $wp_registered_widgets[$id]['description'] );
}
-/**
- * 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);
-}
-
/**
* Remove widget from sidebar.
*
@@ -522,46 +470,6 @@ function wp_unregister_sidebar_widget($id) {
wp_unregister_widget_control($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);
-}
-
/**
* Registers widget control callback for customizing options.
*
@@ -609,18 +517,6 @@ function wp_register_widget_control($id, $name, $control_callback, $options = ar
$wp_registered_widget_controls[$id] = $widget;
}
-/**
- * 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);
-}
-
/**
* Remove control callback for widget.
*
@@ -924,1497 +820,110 @@ function wp_convert_widget_settings($base_name, $option_name, $settings) {
return $settings;
}
-/* Default Widgets */
-
/**
- * Pages widget class
- *
- * @since 2.8.0
+ * Deprecated API
*/
-class WP_Widget_Pages extends WP_Widget {
-
- function WP_Widget_Pages() {
- $widget_ops = array('classname' => 'widget_pages', 'description' => __( "Your blog's WordPress Pages") );
- $this->WP_Widget('pages', __('Pages'), $widget_ops);
- }
-
- function widget( $args, $instance ) {
- extract( $args );
-
- $title = empty( $instance['title'] ) ? __( 'Pages' ) : apply_filters('widget_title', $instance['title']);
- $sortby = empty( $instance['sortby'] ) ? 'menu_order' : $instance['sortby'];
- $exclude = empty( $instance['exclude'] ) ? '' : $instance['exclude'];
-
- if ( $sortby == 'menu_order' )
- $sortby = 'menu_order, post_title';
-
- $out = wp_list_pages( array('title_li' => '', 'echo' => 0, 'sort_column' => $sortby, 'exclude' => $exclude) );
-
- if ( !empty( $out ) ) {
- echo $before_widget;
- echo $before_title . $title . $after_title;
- ?>
-
- 'post_title', 'title' => '', 'exclude' => '') );
- $title = attribute_escape( $instance['title'] );
- $exclude = attribute_escape( $instance['exclude'] );
- ?>
-
-
-
-
- >
- >
- >
-
-
-
-
-
-
-
-
-
- __( "Your blogroll" ) );
- $this->WP_Widget('links', __('Links'), $widget_ops);
- }
-
- function widget( $args, $instance ) {
- extract($args, EXTR_SKIP);
-
- $show_description = isset($instance['description']) ? $instance['description'] : false;
- $show_name = isset($instance['name']) ? $instance['name'] : false;
- $show_rating = isset($instance['rating']) ? $instance['rating'] : false;
- $show_images = isset($instance['images']) ? $instance['images'] : true;
-
- $before_widget = preg_replace('/id="[^"]*"/','id="%id"', $before_widget);
- wp_list_bookmarks(apply_filters('widget_links_args', array(
- 'title_before' => $before_title, 'title_after' => $after_title,
- 'category_before' => $before_widget, 'category_after' => $after_widget,
- 'show_images' => $show_images, 'show_description' => $show_description,
- 'show_name' => $show_name, 'show_rating' => $show_rating,
- 'class' => 'linkcat widget'
- )));
- }
-
- function update( $new_instance, $old_instance ) {
- if( !isset($new_instance['submit']) ) // user clicked cancel?
- return false;
-
- $new_instance = (array) $new_instance;
- $instance = array( 'images' => 0, 'name' => 0, 'description' => 0, 'rating' => 0);
- foreach ( $instance as $field => $val ) {
- if ( isset($new_instance[$field]) )
- $instance[$field] = 1;
- }
-
- return $instance;
- }
-
- function form( $instance ) {
-
- //Defaults
- $instance = wp_parse_args( (array) $instance, array( 'images' => true, 'name' => true, 'description' => false, 'rating' => false) );
-?>
-
-
- id="get_field_id('images'); ?>" name="get_field_name('images'); ?>" />
-
- id="get_field_id('name'); ?>" name="get_field_name('name'); ?>" />
-
- id="get_field_id('description'); ?>" name="get_field_name('description'); ?>" />
-
- id="get_field_id('rating'); ?>" name="get_field_name('rating'); ?>" />
-
-
- 'widget_search', 'description' => __( "A search form for your blog") );
- $this->WP_Widget('search', __('Search'), $widget_ops);
- }
-
- function widget( $args, $instance ) {
- extract($args);
- echo $before_widget;
-
- // Use current theme search form if it exists
- get_search_form();
-
- echo $after_widget;
- }
-}
-
-/**
- * Archives widget class
- *
- * @since 2.8.0
- */
-class WP_Widget_Archives extends WP_Widget {
-
- function WP_Widget_Archives() {
- $widget_ops = array('classname' => 'widget_archive', 'description' => __( "A monthly archive of your blog's posts") );
- $this->WP_Widget('archives', __('Archives'), $widget_ops);
- }
-
- function widget( $args, $instance ) {
- extract($args);
- $c = $instance['count'] ? '1' : '0';
- $d = $instance['dropdown'] ? '1' : '0';
- $title = empty($instance['title']) ? __('Archives') : apply_filters('widget_title', $instance['title']);
-
- echo $before_widget;
- echo $before_title . $title . $after_title;
-
- if ( $d ) {
-?>
-
-
-
- '', 'count' => 0, 'dropdown' => '') );
- $title = strip_tags($instance['title']);
- $count = $instance['count'] ? 'checked="checked"' : '';
- $dropdown = $instance['dropdown'] ? 'checked="checked"' : '';
-?>
-
-
- id="get_field_id('count'); ?>" name="get_field_name('count'); ?>" />
-
- id="get_field_id('dropdown'); ?>" name="get_field_name('dropdown'); ?>" />
-
-
-
-
-
-
-
-
-
-
-';
- get_calendar();
- echo '';
- echo $after_widget;
-}
-
-/**
- * Display and process calendar widget options form.
- *
- * @since 2.2.0
- */
-function wp_widget_calendar_control() {
- $options = $newoptions = get_option('widget_calendar');
- if ( isset($_POST["calendar-submit"]) ) {
- $newoptions['title'] = strip_tags(stripslashes($_POST["calendar-title"]));
- }
- if ( $options != $newoptions ) {
- $options = $newoptions;
- update_option('widget_calendar', $options);
- }
- $title = attribute_escape($options['title']);
-?>
-
-
- $widget_args );
- $widget_args = wp_parse_args( $widget_args, array( 'number' => -1 ) );
- extract( $widget_args, EXTR_SKIP );
-
- $options = get_option('widget_text');
- if ( !isset($options[$number]) )
- return;
-
- $title = apply_filters('widget_title', $options[$number]['title']);
- $text = apply_filters( 'widget_text', $options[$number]['text'] );
-?>
-
-
-
-
- $widget_args );
- $widget_args = wp_parse_args( $widget_args, array( 'number' => -1 ) );
- extract( $widget_args, EXTR_SKIP );
-
- $options = get_option('widget_text');
- if ( !is_array($options) )
- $options = array();
-
- if ( !$updated && !empty($_POST['sidebar']) ) {
- $sidebar = (string) $_POST['sidebar'];
-
- $sidebars_widgets = wp_get_sidebars_widgets();
- if ( isset($sidebars_widgets[$sidebar]) )
- $this_sidebar =& $sidebars_widgets[$sidebar];
+function register_sidebar_widget($name, $output_callback, $classname = '') {
+ // Compat
+ if ( is_array($name) ) {
+ if ( count($name) == 3 )
+ $name = sprintf($name[0], $name[2]);
else
- $this_sidebar = array();
-
- foreach ( (array) $this_sidebar as $_widget_id ) {
- if ( 'wp_widget_text' == $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( "text-$widget_number", $_POST['widget-id'] ) ) // the widget has been removed.
- unset($options[$widget_number]);
- }
- }
-
- foreach ( (array) $_POST['widget-text'] as $widget_number => $widget_text ) {
- if ( !isset($widget_text['text']) && isset($options[$widget_number]) ) // user clicked cancel
- continue;
- $title = strip_tags(stripslashes($widget_text['title']));
- if ( current_user_can('unfiltered_html') )
- $text = stripslashes( $widget_text['text'] );
- else
- $text = stripslashes(wp_filter_post_kses( $widget_text['text'] ));
- $options[$widget_number] = compact( 'title', 'text' );
- }
-
- update_option('widget_text', $options);
- $updated = true;
+ $name = $name[0];
}
- if ( -1 == $number ) {
- $title = '';
- $text = '';
- $number = '%i%';
- } else {
- $title = attribute_escape($options[$number]['title']);
- $text = format_to_edit($options[$number]['text']);
- }
-?>
-
-
-
-
-
- 'widget_text', 'description' => __('Arbitrary text or HTML'));
- $control_ops = array('width' => 400, 'height' => 350, 'id_base' => 'text');
- $name = __('Text');
-
- $id = false;
- foreach ( (array) array_keys($options) as $o ) {
- // Old widgets can have null values for some reason
- if ( !isset($options[$o]['title']) || !isset($options[$o]['text']) )
- continue;
- $id = "text-$o"; // Never never never translate an id
- wp_register_sidebar_widget($id, $name, 'wp_widget_text', $widget_ops, array( 'number' => $o ));
- wp_register_widget_control($id, $name, 'wp_widget_text_control', $control_ops, array( 'number' => $o ));
- }
-
- // If there are none, we register the widget's existance with a generic template
- if ( !$id ) {
- wp_register_sidebar_widget( 'text-1', $name, 'wp_widget_text', $widget_ops, array( 'number' => -1 ) );
- wp_register_widget_control( 'text-1', $name, 'wp_widget_text_control', $control_ops, array( 'number' => -1 ) );
- }
+function unregister_sidebar_widget($id) {
+ return wp_unregister_sidebar_widget($id);
}
/**
- * Display categories widget.
+ * Registers widget control callback for customizing options.
*
- * Allows multiple category widgets.
+ * 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 array $args Widget arguments.
- * @param int $number Widget number.
+ * @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 wp_widget_categories($args, $widget_args = 1) {
- extract($args, EXTR_SKIP);
- 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);
-
- $options = get_option('widget_categories');
- if ( !isset($options[$number]) )
- return;
-
- $c = $options[$number]['count'] ? '1' : '0';
- $h = $options[$number]['hierarchical'] ? '1' : '0';
- $d = $options[$number]['dropdown'] ? '1' : '0';
-
- $title = empty($options[$number]['title']) ? __('Categories') : apply_filters('widget_title', $options[$number]['title']);
-
- echo $before_widget;
- echo $before_title . $title . $after_title;
-
- $cat_args = array('orderby' => 'name', 'show_count' => $c, 'hierarchical' => $h);
-
- if ( $d ) {
- $cat_args['show_option_none'] = __('Select Category');
- wp_dropdown_categories($cat_args);
-?>
-
-
-
-
-
- $widget_args );
- $widget_args = wp_parse_args( $widget_args, array( 'number' => -1 ) );
- extract($widget_args, EXTR_SKIP);
-
- $options = get_option('widget_categories');
-
- if ( !is_array( $options ) )
- $options = array();
-
- if ( !$updated && !empty($_POST['sidebar']) ) {
- $sidebar = (string) $_POST['sidebar'];
-
- $sidebars_widgets = wp_get_sidebars_widgets();
- if ( isset($sidebars_widgets[$sidebar]) )
- $this_sidebar =& $sidebars_widgets[$sidebar];
+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
- $this_sidebar = array();
-
- foreach ( (array) $this_sidebar as $_widget_id ) {
- if ( 'wp_widget_categories' == $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( "categories-$widget_number", $_POST['widget-id'] ) ) // the widget has been removed.
- unset($options[$widget_number]);
- }
- }
-
- foreach ( (array) $_POST['widget-categories'] as $widget_number => $widget_cat ) {
- if ( !isset($widget_cat['title']) && isset($options[$widget_number]) ) // user clicked cancel
- continue;
- $title = trim(strip_tags(stripslashes($widget_cat['title'])));
- $count = isset($widget_cat['count']);
- $hierarchical = isset($widget_cat['hierarchical']);
- $dropdown = isset($widget_cat['dropdown']);
- $options[$widget_number] = compact( 'title', 'count', 'hierarchical', 'dropdown' );
- }
-
- update_option('widget_categories', $options);
- $updated = true;
+ $name = $name[0];
}
- if ( -1 == $number ) {
- $title = '';
- $count = false;
- $hierarchical = false;
- $dropdown = false;
- $number = '%i%';
- } else {
- $title = attribute_escape( $options[$number]['title'] );
- $count = (bool) $options[$number]['count'];
- $hierarchical = (bool) $options[$number]['hierarchical'];
- $dropdown = (bool) $options[$number]['dropdown'];
- }
-?>
-
-
-
-
-
-
+ $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);
-
-
- />
-
-
-
-
- />
-
-
-
-
- />
-
-
-
-
-
- 'widget_categories', 'description' => __( "A list or dropdown of categories" ) );
-
- $name = __( 'Categories' );
-
- $id = false;
- foreach ( (array) array_keys($options) as $o ) {
- // Old widgets can have null values for some reason
- if ( !isset($options[$o]['title']) )
- continue;
- $id = "categories-$o";
- wp_register_sidebar_widget( $id, $name, 'wp_widget_categories', $widget_ops, array( 'number' => $o ) );
- wp_register_widget_control( $id, $name, 'wp_widget_categories_control', array( 'id_base' => 'categories' ), array( 'number' => $o ) );
- }
-
- // If there are none, we register the widget's existance with a generic template
- if ( !$id ) {
- wp_register_sidebar_widget( 'categories-1', $name, 'wp_widget_categories', $widget_ops, array( 'number' => -1 ) );
- wp_register_widget_control( 'categories-1', $name, 'wp_widget_categories_control', array( 'id_base' => 'categories' ), array( 'number' => -1 ) );
- }
-}
-
-/**
- * Upgrade previous category widget to current version.
- *
- * @since 2.3.0
- *
- * @return array
- */
-function wp_widget_categories_upgrade() {
- $options = get_option( 'widget_categories' );
-
- if ( !isset( $options['title'] ) )
- return $options;
-
- $newoptions = array( 1 => $options );
-
- update_option( 'widget_categories', $newoptions );
-
- $sidebars_widgets = get_option( 'sidebars_widgets' );
- if ( is_array( $sidebars_widgets ) ) {
- foreach ( $sidebars_widgets as $sidebar => $widgets ) {
- if ( is_array( $widgets ) ) {
- foreach ( $widgets as $widget )
- $new_widgets[$sidebar][] = ( $widget == 'categories' ) ? 'categories-1' : $widget;
- } else {
- $new_widgets[$sidebar] = $widgets;
- }
- }
- if ( $new_widgets != $sidebars_widgets )
- update_option( 'sidebars_widgets', $new_widgets );
- }
-
- return $newoptions;
-}
-
-/**
- * Display recent entries widget.
+ * Alias of {@link wp_unregister_widget_control()}.
*
* @since 2.2.0
+ * @see wp_unregister_widget_control()
*
- * @param array $args Widget arguments.
- * @return int Displayed cache.
+ * @param int|string $id Widget ID.
*/
-function wp_widget_recent_entries($args) {
- if ( '%BEG_OF_TITLE%' != $args['before_title'] ) {
- if ( $output = wp_cache_get('widget_recent_entries', 'widget') )
- return print($output);
- ob_start();
- }
-
- extract($args);
- $options = get_option('widget_recent_entries');
- $title = empty($options['title']) ? __('Recent Posts') : apply_filters('widget_title', $options['title']);
- if ( !$number = (int) $options['number'] )
- $number = 10;
- else if ( $number < 1 )
- $number = 1;
- else if ( $number > 15 )
- $number = 15;
-
- $r = new WP_Query(array('showposts' => $number, 'what_to_show' => 'posts', 'nopaging' => 0, 'post_status' => 'publish', 'caller_get_posts' => 1));
- if ($r->have_posts()) :
-?>
-
-
-
- have_posts()) : $r->the_post(); ?>
-
-
-
-
-
-
-
-
-
-
-
-
-
- 15 )
- $number = 15;
-
- if ( !$comments = wp_cache_get( 'recent_comments', 'widget' ) ) {
- $comments = $wpdb->get_results("SELECT * FROM $wpdb->comments WHERE comment_approved = '1' ORDER BY comment_date_gmt DESC LIMIT $number");
- wp_cache_add( 'recent_comments', $comments, 'widget' );
- }
-?>
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 'widget_recent_comments', 'description' => __( 'The most recent comments' ) );
- wp_register_sidebar_widget('recent-comments', __('Recent Comments'), 'wp_widget_recent_comments', $widget_ops);
- wp_register_widget_control('recent-comments', __('Recent Comments'), 'wp_widget_recent_comments_control');
-
- if ( is_active_widget('wp_widget_recent_comments') )
- add_action('wp_head', 'wp_widget_recent_comments_style');
-}
-
-/**
- * Display RSS widget.
- *
- * Allows for multiple widgets to be displayed.
- *
- * @since 2.2.0
- *
- * @param array $args Widget arguments.
- * @param int $number Widget number.
- */
-function wp_widget_rss($args, $widget_args = 1) {
- extract($args, EXTR_SKIP);
- 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);
-
- $options = get_option('widget_rss');
-
- if ( !isset($options[$number]) )
- return;
-
- if ( isset($options[$number]['error']) && $options[$number]['error'] )
- return;
-
- $url = $options[$number]['url'];
- while ( stristr($url, 'http') != $url )
- $url = substr($url, 1);
- if ( empty($url) )
- return;
-
- $rss = fetch_feed($url);
- $title = $options[$number]['title'];
- $desc = '';
- $link = '';
- if ( ! is_wp_error($rss) ) {
- $desc = attribute_escape(strip_tags(html_entity_decode($rss->get_description(), ENT_QUOTES, get_option('blog_charset'))));
- if ( empty($title) )
- $title = htmlentities(strip_tags($rss->get_title()));
- $link = clean_url(strip_tags($rss->get_permalink()));
- while ( stristr($link, 'http') != $link )
- $link = substr($link, 1);
- }
- if ( empty($title) )
- $title = $desc;
- if ( empty($title) )
- $title = __('Unknown Feed');
- $title = apply_filters('widget_title', $title );
- $url = clean_url(strip_tags($url));
- $icon = includes_url('images/rss.png');
- $title = " ";
-
- echo $before_widget;
- echo $before_title . $title . $after_title;
-
- wp_widget_rss_output( $rss, $options[$number] );
-
- echo $after_widget;
-}
-
-/**
- * Display the RSS entries in a list.
- *
- * @since 2.5.0
- *
- * @param string|array|object $rss RSS url.
- * @param array $args Widget arguments.
- */
-function wp_widget_rss_output( $rss, $args = array() ) {
- if ( is_string( $rss ) ) {
- $rss = fetch_feed($rss);
- } elseif ( is_array($rss) && isset($rss['url']) ) {
- $args = $rss;
- $rss = fetch_feed($rss['url']);
- } elseif ( !is_object($rss) ) {
- return;
- }
-
- if ( is_wp_error($rss) ) {
- if ( is_admin() || current_user_can('manage_options') ) {
- echo '';
- printf(__('RSS Error : %s'), $rss->get_error_message());
- echo '
';
- }
- return;
- }
-
- $default_args = array( 'show_author' => 0, 'show_date' => 0, 'show_summary' => 0 );
- $args = wp_parse_args( $args, $default_args );
- extract( $args, EXTR_SKIP );
-
- $items = (int) $items;
- if ( $items < 1 || 20 < $items )
- $items = 10;
- $show_summary = (int) $show_summary;
- $show_author = (int) $show_author;
- $show_date = (int) $show_date;
-
- if ( !$rss->get_item_quantity() ) {
- echo '' . __( 'An error has occurred; the feed is probably down. Try again later.' ) . ' ';
- return;
- }
-
- echo '';
- foreach ( $rss->get_items(0, $items) as $item ) {
- $link = $item->get_link();
- while ( stristr($link, 'http') != $link )
- $link = substr($link, 1);
- $link = clean_url(strip_tags($link));
- $title = attribute_escape(strip_tags($item->get_title()));
- if ( empty($title) )
- $title = __('Untitled');
-
- $desc = str_replace(array("\n", "\r"), ' ', attribute_escape(strip_tags(html_entity_decode($item->get_description(), ENT_QUOTES, get_option('blog_charset')))));
- $desc = wp_html_excerpt( $desc, 360 ) . ' […]';
- $desc = wp_specialchars( $desc );
-
- if ( $show_summary ) {
- $summary = "";
- } else {
- $summary = '';
- }
-
- $date = '';
- if ( $show_date ) {
- $date = $item->get_date();
-
- if ( $date ) {
- if ( $date_stamp = strtotime( $date ) )
- $date = ' ';
- else
- $date = '';
- }
- }
-
- $author = '';
- if ( $show_author ) {
- $author = $item->get_author();
- $author = $author->get_name();
- $author = ' ' . wp_specialchars( strip_tags( $author ) ) . ' ';
- }
-
- if ( $link == '' ) {
- echo "$title{$date}{$summary}{$author} ";
- } else {
- echo "{$date}{$summary}{$author} ";
- }
- }
- echo ' ';
-}
-
-/**
- * Display and process RSS widget control form.
- *
- * @since 2.2.0
- *
- * @param int $widget_args Widget number.
- */
-function wp_widget_rss_control($widget_args) {
- global $wp_registered_widgets;
- static $updated = false;
-
- 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);
-
- $options = get_option('widget_rss');
- if ( !is_array($options) )
- $options = array();
-
- $urls = array();
- foreach ( (array) $options as $option )
- if ( isset($option['url']) )
- $urls[$option['url']] = true;
-
- if ( !$updated && 'POST' == $_SERVER['REQUEST_METHOD'] && !empty($_POST['sidebar']) ) {
- $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 ( (array) $this_sidebar as $_widget_id ) {
- if ( 'wp_widget_rss' == $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( "rss-$widget_number", $_POST['widget-id'] ) ) // the widget has been removed.
- unset($options[$widget_number]);
- }
- }
-
- foreach( (array) $_POST['widget-rss'] as $widget_number => $widget_rss ) {
- if ( !isset($widget_rss['url']) && isset($options[$widget_number]) ) // user clicked cancel
- continue;
- $widget_rss = stripslashes_deep( $widget_rss );
- $url = sanitize_url(strip_tags($widget_rss['url']));
- $options[$widget_number] = wp_widget_rss_process( $widget_rss, !isset($urls[$url]) );
- }
-
- update_option('widget_rss', $options);
- $updated = true;
- }
-
- if ( -1 == $number ) {
- $title = '';
- $url = '';
- $items = 10;
- $error = false;
- $number = '%i%';
- $show_summary = 0;
- $show_author = 0;
- $show_date = 0;
- } else {
- extract( (array) $options[$number] );
- }
-
- wp_widget_rss_form( compact( 'number', 'title', 'url', 'items', 'error', 'show_summary', 'show_author', 'show_date' ) );
-}
-
-/**
- * Display RSS widget options form.
- *
- * The options for what fields are displayed for the RSS form are all booleans
- * and are as follows: 'url', 'title', 'items', 'show_summary', 'show_author',
- * 'show_date'.
- *
- * @since 2.5.0
- *
- * @param array|string $args Values for input fields.
- * @param array $inputs Override default display options.
- */
-function wp_widget_rss_form( $args, $inputs = null ) {
-
- $default_inputs = array( 'url' => true, 'title' => true, 'items' => true, 'show_summary' => true, 'show_author' => true, 'show_date' => true );
- $inputs = wp_parse_args( $inputs, $default_inputs );
- extract( $args );
- extract( $inputs, EXTR_SKIP);
-
- $number = attribute_escape( $number );
- $title = attribute_escape( $title );
- $url = attribute_escape( $url );
- $items = (int) $items;
- if ( $items < 1 || 20 < $items )
- $items = 10;
- $show_summary = (int) $show_summary;
- $show_author = (int) $show_author;
- $show_date = (int) $show_date;
-
- if ( !empty($error) ) {
- $message = sprintf( __('Error in RSS Widget: %s'), $error);
- echo "";
- echo "$message
";
- }
-
- if ( $inputs['url'] ) :
-?>
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- />
-
-
-
-
-
-
- />
-
-
-
-
-
-
- />
-
-
-
-
-
-
-get_error_message();
- } else {
- $link = clean_url(strip_tags($rss->get_permalink()));
- while ( stristr($link, 'http') != $link )
- $link = substr($link, 1);
- }
- }
-
- return compact( 'title', 'url', 'link', 'items', 'error', 'show_summary', 'show_author', 'show_date' );
-}
-
-/**
- * Register RSS widget to allow multiple RSS widgets on startup.
- *
- * @since 2.2.0
- */
-function wp_widget_rss_register() {
- $options = get_option('widget_rss');
- if ( !is_array($options) )
- $options = array();
-
- $widget_ops = array('classname' => 'widget_rss', 'description' => __( 'Entries from any RSS or Atom feed' ));
- $control_ops = array('width' => 400, 'height' => 200, 'id_base' => 'rss');
- $name = __('RSS');
-
- $id = false;
- foreach ( (array) array_keys($options) as $o ) {
- // Old widgets can have null values for some reason
- if ( !isset($options[$o]['url']) || !isset($options[$o]['title']) || !isset($options[$o]['items']) )
- continue;
- $id = "rss-$o"; // Never never never translate an id
- wp_register_sidebar_widget($id, $name, 'wp_widget_rss', $widget_ops, array( 'number' => $o ));
- wp_register_widget_control($id, $name, 'wp_widget_rss_control', $control_ops, array( 'number' => $o ));
- }
-
- // If there are none, we register the widget's existance with a generic template
- if ( !$id ) {
- wp_register_sidebar_widget( 'rss-1', $name, 'wp_widget_rss', $widget_ops, array( 'number' => -1 ) );
- wp_register_widget_control( 'rss-1', $name, 'wp_widget_rss_control', $control_ops, array( 'number' => -1 ) );
- }
-}
-
-/**
- * Display tag cloud widget.
- *
- * @since 2.3.0
- *
- * @param array $args Widget arguments.
- */
-function wp_widget_tag_cloud($args) {
- extract($args);
- $options = get_option('widget_tag_cloud');
- $title = empty($options['title']) ? __('Tags') : apply_filters('widget_title', $options['title']);
-
- echo $before_widget;
- echo $before_title . $title . $after_title;
- wp_tag_cloud();
- echo $after_widget;
-}
-
-/**
- * Manage WordPress Tag Cloud widget options.
- *
- * Displays management form for changing the tag cloud widget title.
- *
- * @since 2.3.0
- */
-function wp_widget_tag_cloud_control() {
- $options = $newoptions = get_option('widget_tag_cloud');
-
- if ( isset($_POST['tag-cloud-submit']) ) {
- $newoptions['title'] = strip_tags(stripslashes($_POST['tag-cloud-title']));
- }
-
- if ( $options != $newoptions ) {
- $options = $newoptions;
- update_option('widget_tag_cloud', $options);
- }
-
- $title = attribute_escape( $options['title'] );
-?>
-
-
-
-
- 'widget_calendar', 'description' => __( "A calendar of your blog's posts") );
- wp_register_sidebar_widget('calendar', __('Calendar'), 'wp_widget_calendar', $widget_ops);
- wp_register_widget_control('calendar', __('Calendar'), 'wp_widget_calendar_control' );
-
- new WP_Widget_Archives();
-
- new WP_Widget_Links();
-
- $widget_ops = array('classname' => 'widget_meta', 'description' => __( "Log in/out, admin, feed and WordPress links") );
- wp_register_sidebar_widget('meta', __('Meta'), 'wp_widget_meta', $widget_ops);
- wp_register_widget_control('meta', __('Meta'), 'wp_widget_meta_control' );
-
- new WP_Widget_Search();
-
- $widget_ops = array('classname' => 'widget_recent_entries', 'description' => __( "The most recent posts on your blog") );
- wp_register_sidebar_widget('recent-posts', __('Recent Posts'), 'wp_widget_recent_entries', $widget_ops);
- wp_register_widget_control('recent-posts', __('Recent Posts'), 'wp_widget_recent_entries_control' );
-
- $widget_ops = array('classname' => 'widget_tag_cloud', 'description' => __( "Your most used tags in cloud format") );
- wp_register_sidebar_widget('tag_cloud', __('Tag Cloud'), 'wp_widget_tag_cloud', $widget_ops);
- wp_register_widget_control('tag_cloud', __('Tag Cloud'), 'wp_widget_tag_cloud_control' );
-
- wp_widget_categories_register();
- wp_widget_text_register();
- wp_widget_rss_register();
- wp_widget_recent_comments_register();
-
- do_action('widgets_init');
-}
-
-add_action('init', 'wp_widgets_init', 1);
-
-/*
- * Pattern for multi-widget (allows multiple instances such as the text widget).
- *
- * Make sure to close the comments after copying.
-
-/**
- * Displays widget.
- *
- * Supports multiple widgets.
- *
- * @param array $args Widget arguments.
- * @param array|int $widget_args Widget number. Which of the several widgets of this type do we mean.
- * /
-function widget_many( $args, $widget_args = 1 ) {
- extract( $args, EXTR_SKIP );
- 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 ( !isset($options[$number]) )
- return;
-
- echo $before_widget;
-
- // Do stuff for this widget, drawing data from $options[$number]
-
- echo $after_widget;
-}
-
-/**
- * Displays form for a particular instance of the widget.
- *
- * Also updates the data after a POST submit.
- *
- * @param array|int $widget_args Widget 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]
-?>
-
-
-
-
- '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' );
-
-*/
-
-?>
+function unregister_widget_control($id) {
+ return wp_unregister_widget_control($id);
+}
\ No newline at end of file
diff --git a/wp-settings.php b/wp-settings.php
index 082ef00b8..a77a4e383 100644
--- a/wp-settings.php
+++ b/wp-settings.php
@@ -327,6 +327,7 @@ require (ABSPATH . WPINC . '/canonical.php');
require (ABSPATH . WPINC . '/shortcodes.php');
require (ABSPATH . WPINC . '/media.php');
require (ABSPATH . WPINC . '/http.php');
+require (ABSPATH . WPINC . '/widgets.php');
if ( !defined('WP_CONTENT_URL') )
define( 'WP_CONTENT_URL', get_option('siteurl') . '/wp-content'); // full url - WP_CONTENT_DIR is defined further up