-
+ $searchform_template = get_template_directory() . '/searchform.php';
+
+ echo $before_widget;
+
+ // Use current theme search form if it exists
+ if ( file_exists($searchform_template) ) {
+ include_once($searchform_template);
+ } else { ?>
+
-
-
+
-
-
-
+
+
+
+
+
+
@@ -494,7 +558,7 @@ function wp_widget_meta_control() {
}
$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');
- $title = $options[$number]['title'];
+ if ( !isset($options[$number]) )
+ return;
+
+ $title = apply_filters('widget_title', $options[$number]['title']);
$text = apply_filters( 'widget_text', $options[$number]['text'] );
?>
@@ -540,97 +613,122 @@ function wp_widget_text($args, $number = 1) {
$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 = $newoptions = array();
- if ( $_POST["text-submit-$number"] ) {
- $newoptions[$number]['title'] = strip_tags(stripslashes($_POST["text-title-$number"]));
- $newoptions[$number]['text'] = stripslashes($_POST["text-text-$number"]);
- if ( !current_user_can('unfiltered_html') )
- $newoptions[$number]['text'] = stripslashes(wp_filter_post_kses($newoptions[$number]['text']));
- }
- if ( $options != $newoptions ) {
- $options = $newoptions;
- update_option('widget_text', $options);
- }
- $title = attribute_escape($options[$number]['title']);
- $text = format_to_edit($options[$number]['text']);
-?>
-
-
-
" name="text-submit-" value="1" />
- $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' );
+ }
-function wp_widget_text_setup() {
- $options = $newoptions = get_option('widget_text');
- if ( isset($_POST['text-number-submit']) ) {
- $number = (int) $_POST['text-number'];
- if ( $number > 9 ) $number = 9;
- if ( $number < 1 ) $number = 1;
- $newoptions['number'] = $number;
- }
- if ( $options != $newoptions ) {
- $options = $newoptions;
update_option('widget_text', $options);
- wp_widget_text_register($options['number']);
+ $updated = true;
}
-}
-function wp_widget_text_page() {
- $options = $newoptions = get_option('widget_text');
+ if ( -1 == $number ) {
+ $title = '';
+ $text = '';
+ $number = '%i%';
+ } else {
+ $title = attribute_escape($options[$number]['title']);
+ $text = format_to_edit($options[$number]['text']);
+ }
?>
-
+
+
+
+
+
9 ) $number = 9;
- $dims = array('width' => 460, 'height' => 350);
- $class = array('classname' => 'widget_text');
- for ($i = 1; $i <= 9; $i++) {
- $name = sprintf(__('Text %d'), $i);
- $id = "text-$i"; // Never never never translate an id
- wp_register_sidebar_widget($id, $name, $i <= $number ? 'wp_widget_text' : /* unregister */ '', $class, $i);
- wp_register_widget_control($id, $name, $i <= $number ? 'wp_widget_text_control' : /* unregister */ '', $dims, $i);
+ if ( !$options = get_option('widget_text') )
+ $options = array();
+ $widget_ops = array('classname' => 'widget_text', 'description' => __('Arbitrary text or HTML'));
+ $control_ops = array('width' => 400, 'height' => 350, 'id_base' => 'text');
+ $name = __('Text');
+
+ $id = false;
+ foreach ( 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 ) );
}
- add_action('sidebar_admin_setup', 'wp_widget_text_setup');
- add_action('sidebar_admin_page', 'wp_widget_text_page');
}
-function wp_widget_categories($args, $number = 1) {
- extract($args);
+// See large comment section at end of this file
+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') : $options[$number]['title'];
+ $title = empty($options[$number]['title']) ? __('Categories') : apply_filters('widget_title', $options[$number]['title']);
echo $before_widget;
echo $before_title . $title . $after_title;
- $cat_args = "orderby=name&show_count={$c}&hierarchical={$h}";
+ $cat_args = array('orderby' => 'name', 'show_count' => $c, 'hierarchical' => $h);
if ( $d ) {
- wp_dropdown_categories($cat_args . '&show_option_none= ' . __('Select Category'));
+ $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);
- if ( $_POST['categories-submit-' . $number] ) {
- $newoptions[$number]['count'] = isset($_POST['categories-count-' . $number]);
- $newoptions[$number]['hierarchical'] = isset($_POST['categories-hierarchical-' . $number]);
- $newoptions[$number]['dropdown'] = isset($_POST['categories-dropdown-' . $number]);
- $newoptions[$number]['title'] = strip_tags(stripslashes($_POST['categories-title-' . $number]));
- }
+ $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 ( $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' );
+ }
- if ( $options != $newoptions ) {
- $options = $newoptions;
update_option('widget_categories', $options);
+ $updated = true;
}
- $title = attribute_escape( $options[$number]['title'] );
+ 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'];
+ }
?>
-
-
-
-
-
+
+
+
-
+
+
+
+
+
+
+
-
+
9 ) {
- $number = 9;
- } elseif ( $number < 1 ) {
- $number = 1;
- }
+ $widget_ops = array( 'classname' => 'widget_categories', 'description' => __( "A list or dropdown of categories" ) );
- $newoptions['number'] = $number;
- }
+ $name = __( 'Categories' );
- if ( $newoptions != $options ) {
- $options = $newoptions;
- update_option( 'widget_categories', $options );
- wp_widget_categories_register( $options['number'] );
+ $id = false;
+ foreach ( 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 ) );
}
-}
-function wp_widget_categories_page() {
- $options = get_option( 'widget_categories' );
-?>
-
- -1 ) );
+ wp_register_widget_control( 'categories-1', $name, 'wp_widget_categories_control', array( 'id_base' => 'categories' ), array( 'number' => -1 ) );
+ }
}
function wp_widget_categories_upgrade() {
$options = get_option( 'widget_categories' );
- $newoptions = array( 'number' => 1, 1 => $options );
+ if ( !isset( $options['title'] ) )
+ return $options;
+
+ $newoptions = array( 1 => $options );
update_option( 'widget_categories', $newoptions );
@@ -759,58 +892,19 @@ function wp_widget_categories_upgrade() {
update_option( 'sidebars_widgets', $new_widgets );
}
- if ( isset( $_POST['categories-submit'] ) ) {
- $_POST['categories-submit-1'] = $_POST['categories-submit'];
- $_POST['categories-count-1'] = $_POST['categories-count'];
- $_POST['categories-hierarchical-1'] = $_POST['categories-hierarchical'];
- $_POST['categories-dropdown-1'] = $_POST['categories-dropdown'];
- $_POST['categories-title-1'] = $_POST['categories-title'];
- foreach ( $_POST as $k => $v )
- if ( substr($k, -5) == 'order' )
- $_POST[$k] = str_replace('categories', 'categories-1', $v);
- }
-
return $newoptions;
}
-function wp_widget_categories_register() {
- $options = get_option( 'widget_categories' );
- if ( !isset($options['number']) )
- $options = wp_widget_categories_upgrade();
- $number = (int) $options['number'];
-
- if ( $number > 9 ) {
- $number = 9;
- } elseif ( $number < 1 ) {
- $number = 1;
- }
-
- $dims = array( 'width' => 350, 'height' => 170 );
- $class = array( 'classname' => 'widget_categories' );
-
- for ( $i = 1; $i <= 9; $i++ ) {
- $name = sprintf( __( 'Categories %d' ), $i );
- $id = 'categories-' . $i;
-
- $widget_callback = ( $i <= $number ) ? 'wp_widget_categories' : '';
- $control_callback = ( $i <= $number ) ? 'wp_widget_categories_control' : '';
-
- wp_register_sidebar_widget( $id, $name, $widget_callback, $class, $i );
- wp_register_widget_control( $id, $name, $control_callback, $dims, $i );
- }
-
- add_action( 'sidebar_admin_setup', 'wp_widget_categories_setup' );
- add_action( 'sidebar_admin_page', 'wp_widget_categories_page' );
-}
-
function wp_widget_recent_entries($args) {
- if ( $output = wp_cache_get('widget_recent_entries') )
- return print($output);
+ if ( '%BEG_OF_TITLE%' != $args['before_title'] ) {
+ if ( $output = wp_cache_get('widget_recent_entries', 'widget') )
+ return print($output);
+ ob_start();
+ }
- ob_start();
extract($args);
$options = get_option('widget_recent_entries');
- $title = empty($options['title']) ? __('Recent Posts') : $options['title'];
+ $title = empty($options['title']) ? __('Recent Posts') : apply_filters('widget_title', $options['title']);
if ( !$number = (int) $options['number'] )
$number = 10;
else if ( $number < 1 )
@@ -818,7 +912,7 @@ function wp_widget_recent_entries($args) {
else if ( $number > 15 )
$number = 15;
- $r = new WP_Query("showposts=$number&what_to_show=posts&nopaging=0&post_status=publish");
+ $r = new WP_Query(array('showposts' => $number, 'what_to_show' => 'posts', 'nopaging' => 0, 'post_status' => 'publish'));
if ($r->have_posts()) :
?>
@@ -830,16 +924,20 @@ function wp_widget_recent_entries($args) {
-
-
+
+
+
+
+
+
+
-
-
+
+
+
+
+
+
320, 'height' => 90);
- $class = array('classname' => 'widget_recent_comments');
- wp_register_sidebar_widget('recent-comments', __('Recent Comments'), 'wp_widget_recent_comments', $class);
- wp_register_widget_control('recent-comments', __('Recent Comments'), 'wp_widget_recent_comments_control', $dims);
+ $widget_ops = array('classname' => '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');
}
-function wp_widget_rss($args, $number = 1) {
- require_once(ABSPATH . WPINC . '/rss.php');
- extract($args);
+// See large comment section at end of this file
+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['error']) && $options['error'] )
+
+ if ( !isset($options[$number]) )
+ return;
+
+ if ( isset($options[$number]['error']) && $options[$number]['error'] )
return;
- $num_items = (int) $options[$number]['items'];
- $show_summary = $options[$number]['show_summary'];
- if ( empty($num_items) || $num_items < 1 || $num_items > 10 ) $num_items = 10;
+
$url = $options[$number]['url'];
while ( strstr($url, 'http') != $url )
$url = substr($url, 1);
if ( empty($url) )
return;
+
+ require_once(ABSPATH . WPINC . '/rss.php');
+
$rss = fetch_rss($url);
$link = clean_url(strip_tags($rss->channel['link']));
while ( strstr($link, 'http') != $link )
@@ -959,18 +1075,47 @@ function wp_widget_rss($args, $number = 1) {
$title = $desc;
if ( empty($title) )
$title = __('Unknown Feed');
+ $title = apply_filters('widget_title', $title );
$url = clean_url(strip_tags($url));
if ( file_exists(dirname(__FILE__) . '/rss.png') )
- $icon = str_replace(ABSPATH, get_option('siteurl').'/', dirname(__FILE__)) . '/rss.png';
+ $icon = str_replace(ABSPATH, site_url() . '/', dirname(__FILE__)) . '/rss.png';
else
- $icon = get_option('siteurl').'/wp-includes/images/rss.png';
+ $icon = includes_url('images/rss.png');
$title = " ";
-?>
-
-
-items ) && !empty( $rss->items ) ) {
- $rss->items = array_slice($rss->items, 0, $num_items);
+ $rss->items = array_slice($rss->items, 0, $items);
echo '
';
foreach ($rss->items as $item ) {
while ( strstr($item['link'], 'http') != $item['link'] )
@@ -980,112 +1125,247 @@ function wp_widget_rss($args, $number = 1) {
if ( empty($title) )
$title = __('Untitled');
$desc = '';
+ $summary = '';
+ if ( isset( $item['description'] ) && is_string( $item['description'] ) )
+ $desc = $summary = str_replace(array("\n", "\r"), ' ', attribute_escape(strip_tags(html_entity_decode($item['description'], ENT_QUOTES))));
+ elseif ( isset( $item['summary'] ) && is_string( $item['summary'] ) )
+ $desc = $summary = str_replace(array("\n", "\r"), ' ', attribute_escape(strip_tags(html_entity_decode($item['summary'], ENT_QUOTES))));
+
if ( $show_summary ) {
- $summary = '';
+ $desc = '';
+ $summary = wp_specialchars( $summary );
+ $summary = "";
} else {
- if ( isset( $item['description'] ) && is_string( $item['description'] ) )
- $desc = str_replace(array("\n", "\r"), ' ', attribute_escape(strip_tags(html_entity_decode($item['description'], ENT_QUOTES))));
$summary = '';
}
- echo "- $summary
";
- }
+
+ $date = '';
+ if ( $show_date ) {
+ if ( isset($item['pubdate']) )
+ $date = $item['pubdate'];
+ elseif ( isset($item['published']) )
+ $date = $item['published'];
+
+ if ( $date ) {
+ if ( $date_stamp = strtotime( $date ) )
+ $date = ' ';
+ else
+ $date = '';
+ }
+ }
+
+ $author = '';
+ if ( $show_author ) {
+ if ( isset($item['dc']['creator']) )
+ $author = ' ' . wp_specialchars( strip_tags( $item['dc']['creator'] ) ) . '';
+ elseif ( isset($item['author_name']) )
+ $author = ' ' . wp_specialchars( strip_tags( $item['author_name'] ) ) . '';
+ }
+
+ if ( $link == '' ) {
+ echo "- $title{$date}{$summary}{$author}
";
+ } else {
+ echo "- {$date}{$summary}{$author}
";
+ }
+}
echo '
';
} else {
echo '
- ' . __( 'An error has occurred; the feed is probably down. Try again later.' ) . '
';
}
-
- echo $after_widget;
}
-function wp_widget_rss_control($number) {
- $options = $newoptions = get_option('widget_rss');
- if ( $_POST["rss-submit-$number"] ) {
- $newoptions[$number]['items'] = (int) $_POST["rss-items-$number"];
- $url = sanitize_url(strip_tags(stripslashes($_POST["rss-url-$number"])));
- $newoptions[$number]['title'] = trim(strip_tags(stripslashes($_POST["rss-title-$number"])));
- if ( $url !== $options[$number]['url'] ) {
- require_once(ABSPATH . WPINC . '/rss.php');
- $rss = fetch_rss($url);
- if ( is_object($rss) ) {
- $newoptions[$number]['url'] = $url;
- $newoptions[$number]['error'] = false;
- } else {
- $newoptions[$number]['error'] = true;
- $newoptions[$number]['url'] = wp_specialchars(__('Error: could not find an RSS or ATOM feed at that URL.'), 1);
- $error = sprintf(__('Error in RSS %1$d: %2$s'), $number, $newoptions[$number]['error']);
+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 ( $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 ( $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]);
}
}
- }
- if ( $options != $newoptions ) {
- $options = $newoptions;
+
+ 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;
}
- $url = attribute_escape($options[$number]['url']);
- $items = (int) $options[$number]['items'];
- $title = attribute_escape($options[$number]['title']);
- if ( empty($items) || $items < 1 ) $items = 10;
-?>
-
- " name="rss-url-" type="text" value="" />
-
- " name="rss-title-" type="text" value="" />
-
- " name="rss-submit-" value="1" />
- 9 ) $number = 9;
- if ( $number < 1 ) $number = 1;
- $newoptions['number'] = $number;
- }
- if ( $options != $newoptions ) {
- $options = $newoptions;
- update_option('widget_rss', $options);
- wp_widget_rss_register($options['number']);
+ 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' ) );
}
-function wp_widget_rss_page() {
- $options = $newoptions = get_option('widget_rss');
+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 );
+ $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 ( $inputs['url'] ) :
?>
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
channel['link']));
+ while ( strstr($link, 'http') != $link )
+ $link = substr($link, 1);
+ }
+ }
+
+ return compact( 'title', 'url', 'link', 'items', 'error', 'show_summary', 'show_author', 'show_date' );
}
function wp_widget_rss_register() {
- $options = get_option('widget_rss');
- $number = $options['number'];
- if ( $number < 1 ) $number = 1;
- if ( $number > 9 ) $number = 9;
- $dims = array('width' => 410, 'height' => 200);
- $class = array('classname' => 'widget_rss');
- for ($i = 1; $i <= 9; $i++) {
- $name = sprintf(__('RSS %d'), $i);
- $id = "rss-$i"; // Never never never translate an id
- wp_register_sidebar_widget($id, $name, $i <= $number ? 'wp_widget_rss' : /* unregister */ '', $class, $i);
- wp_register_widget_control($id, $name, $i <= $number ? 'wp_widget_rss_control' : /* unregister */ '', $dims, $i);
+ if ( !$options = get_option('widget_rss') )
+ $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_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 ) );
}
- add_action('sidebar_admin_setup', 'wp_widget_rss_setup');
- add_action('sidebar_admin_page', 'wp_widget_rss_page');
}
function wp_widget_tag_cloud($args) {
extract($args);
$options = get_option('widget_tag_cloud');
- $title = empty($options['title']) ? __('Tags') : $options['title'];
+ $title = empty($options['title']) ? __('Tags') : apply_filters('widget_title', $options['title']);
echo $before_widget;
echo $before_title . $title . $after_title;
@@ -1108,7 +1388,7 @@ function wp_widget_tag_cloud_control() {
$title = attribute_escape( $options['title'] );
?>
+
90, 'width' => 300 );
- $dims100 = array( 'height' => 100, 'width' => 300 );
- $dims150 = array( 'height' => 150, 'width' => 300 );
+ $widget_ops = array('classname' => 'widget_pages', 'description' => __( "Your blog's WordPress Pages") );
+ wp_register_sidebar_widget('pages', __('Pages'), 'wp_widget_pages', $widget_ops);
+ wp_register_widget_control('pages', __('Pages'), 'wp_widget_pages_control' );
- $class = array('classname' => 'widget_pages');
- wp_register_sidebar_widget('pages', __('Pages'), 'wp_widget_pages', $class);
- wp_register_widget_control('pages', __('Pages'), 'wp_widget_pages_control', $dims150);
+ $widget_ops = array('classname' => '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' );
- $class['classname'] = 'widget_calendar';
- wp_register_sidebar_widget('calendar', __('Calendar'), 'wp_widget_calendar', $class);
- wp_register_widget_control('calendar', __('Calendar'), 'wp_widget_calendar_control', $dims90);
+ $widget_ops = array('classname' => 'widget_archive', 'description' => __( "A monthly archive of your blog's posts") );
+ wp_register_sidebar_widget('archives', __('Archives'), 'wp_widget_archives', $widget_ops);
+ wp_register_widget_control('archives', __('Archives'), 'wp_widget_archives_control' );
- $class['classname'] = 'widget_archives';
- wp_register_sidebar_widget('archives', __('Archives'), 'wp_widget_archives', $class);
- wp_register_widget_control('archives', __('Archives'), 'wp_widget_archives_control', $dims100);
+ $widget_ops = array('classname' => 'widget_links', 'description' => __( "Your blogroll") );
+ wp_register_sidebar_widget('links', __('Links'), 'wp_widget_links', $widget_ops);
- $class['classname'] = 'widget_links';
- wp_register_sidebar_widget('links', __('Links'), 'wp_widget_links', $class);
+ $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' );
- $class['classname'] = 'widget_meta';
- wp_register_sidebar_widget('meta', __('Meta'), 'wp_widget_meta', $class);
- wp_register_widget_control('meta', __('Meta'), 'wp_widget_meta_control', $dims90);
+ $widget_ops = array('classname' => 'widget_search', 'description' => __( "A search form for your blog") );
+ wp_register_sidebar_widget('search', __('Search'), 'wp_widget_search', $widget_ops);
- $class['classname'] = 'widget_search';
- wp_register_sidebar_widget('search', __('Search'), 'wp_widget_search', $class);
+ $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' );
- $class['classname'] = 'widget_recent_entries';
- wp_register_sidebar_widget('recent-posts', __('Recent Posts'), 'wp_widget_recent_entries', $class);
- wp_register_widget_control('recent-posts', __('Recent Posts'), 'wp_widget_recent_entries_control', $dims90);
-
- $class['classname'] = 'widget_tag_cloud';
- wp_register_sidebar_widget('tag_cloud', __('Tag Cloud'), 'wp_widget_tag_cloud', $class);
- wp_register_widget_control('tag_cloud', __('Tag Cloud'), 'wp_widget_tag_cloud_control', 'width=300&height=160');
+ $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();
- $GLOBALS['wp_register_widget_defaults'] = false;
-
do_action('widgets_init');
}
add_action('init', 'wp_widgets_init', 1);
+/* Pattern for multi-widget (allows multiple instances such as the text widget).
+
+// Displays widget on blag
+// $widget_args: number
+// 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
+// $widget_args: number
+// number: which of the several widgets of this type do we mean
+function widget_many_control( $widget_args = 1 ) {
+ global $wp_registered_widgets;
+ static $updated = false; // Whether or not we have already updated the data after a POST submit
+
+ if ( is_numeric($widget_args) )
+ $widget_args = array( 'number' => $widget_args );
+ $widget_args = wp_parse_args( $widget_args, array( 'number' => -1 ) );
+ extract( $widget_args, EXTR_SKIP );
+
+ // Data should be stored as array: array( number => data for that instance of the widget, ... )
+ $options = get_option('widget_many');
+ if ( !is_array($options) )
+ $options = array();
+
+ // We need to update the data
+ if ( !$updated && !empty($_POST['sidebar']) ) {
+ // Tells us what sidebar to put the data in
+ $sidebar = (string) $_POST['sidebar'];
+
+ $sidebars_widgets = wp_get_sidebars_widgets();
+ if ( isset($sidebars_widgets[$sidebar]) )
+ $this_sidebar =& $sidebars_widgets[$sidebar];
+ else
+ $this_sidebar = array();
+
+ foreach ( $this_sidebar as $_widget_id ) {
+ // Remove all widgets of this type from the sidebar. We'll add the new data in a second. This makes sure we don't get any duplicate data
+ // since widget ids aren't necessarily persistent across multiple updates
+ if ( 'widget_many' == $wp_registered_widgets[$_widget_id]['callback'] && isset($wp_registered_widgets[$_widget_id]['params'][0]['number']) ) {
+ $widget_number = $wp_registered_widgets[$_widget_id]['params'][0]['number'];
+ if ( !in_array( "many-$widget_number", $_POST['widget-id'] ) ) // the widget has been removed. "many-$widget_number" is "{id_base}-{widget_number}
+ unset($options[$widget_number]);
+ }
+ }
+
+ foreach ( (array) $_POST['widget-many'] as $widget_number => $widget_many_instance ) {
+ // compile data from $widget_many_instance
+ if ( !isset($widget_many_instance['something']) && isset($options[$widget_number]) ) // user clicked cancel
+ continue;
+ $something = wp_specialchars( $widget_many_instance['something'] );
+ $options[$widget_number] = array( 'something' => $something ); // Even simple widgets should store stuff in array, rather than in scalar
+ }
+
+ update_option('widget_many', $options);
+
+ $updated = true; // So that we don't go through this more than once
+ }
+
+
+ // Here we echo out the form
+ if ( -1 == $number ) { // We echo out a template for a form which can be converted to a specific form later via JS
+ $something = '';
+ $number = '%i%';
+ } else {
+ $something = attribute_escape($options[$number]['something']);
+ }
+
+ // The form has inputs with names like widget-many[$number][something] so that all data for that instance of
+ // the widget are stored in one $_POST variable: $_POST['widget-many'][$number]
+?>
+
+
+
+
+ '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' )
+
+*/
+
?>