From 95871c8e519f364cda25a7cb7a46d3cfe2a9697e Mon Sep 17 00:00:00 2001 From: Andrew Ozz Date: Mon, 27 Apr 2009 08:46:47 +0000 Subject: [PATCH] Move RSS widget to WP_Widget, see #8441 git-svn-id: https://develop.svn.wordpress.org/trunk@11093 602fd350-edb4-49c9-b593-d223f7449a82 --- wp-admin/js/widgets.dev.js | 1 + wp-admin/js/widgets.js | 2 +- wp-includes/default-widgets.php | 244 ++++++++++---------------------- wp-includes/script-loader.php | 2 +- 4 files changed, 79 insertions(+), 170 deletions(-) diff --git a/wp-admin/js/widgets.dev.js b/wp-admin/js/widgets.dev.js index 73f28914cb..6c7f8fcd29 100644 --- a/wp-admin/js/widgets.dev.js +++ b/wp-admin/js/widgets.dev.js @@ -15,6 +15,7 @@ wpWidgets = { $(this).siblings('#widget-list').toggle(); }); this.addEvents(); + $('.widget-error').parents('.widget').find('a.widget-action').click(); $('#widget-list .widget').draggable({ connectToSortable: '.widgets-sortables', diff --git a/wp-admin/js/widgets.js b/wp-admin/js/widgets.js index a375f1d17e..11c68829e3 100644 --- a/wp-admin/js/widgets.js +++ b/wp-admin/js/widgets.js @@ -1 +1 @@ -var wpWidgets;(function(a){wpWidgets={init:function(){var b;a("h3.sidebar-name").click(function(){var d=a(this).siblings(".widgets-sortables");if(d.is(":visible")){d.hide().sortable("disable")}else{d.show().sortable("enable").sortable("refresh")}a(this).siblings("#widget-list").toggle()});this.addEvents();a("#widget-list .widget").draggable({connectToSortable:".widgets-sortables",handle:".widget-title",distance:2,helper:"clone",zIndex:5,start:function(){wpWidgets.fixWebkit(1)},stop:function(d,c){if(b){a(b).hide()}b="";wpWidgets.fixWebkit()}});a(".widgets-sortables").sortable({placeholder:"widget-placeholder",connectWith:".widgets-sortables",items:".widget",handle:".widget-title",cursor:"move",distance:2,opacity:0.65,start:function(d,c){wpWidgets.fixWebkit(1);c.item.find(".widget-inside").hide();c.item.css({marginLeft:"",width:""})},stop:function(f,c){var d=c.item.find("input.add_new").val(),i=c.item.find("input.multi_number").val(),h=c.item.attr("id"),g=a(this).parent().attr("id");c.item.css({marginLeft:"",width:""});if(d){if("multi"==d){c.item.html(c.item.html().replace(/<[^<>]+>/g,function(e){return e.replace(/__i__/g,i)}));c.item.attr("id",h.replace(/__i__/g,i));i++;a("li#"+h).find("input.multi_number").val(i)}else{if("single"==d){c.item.attr("id","new-"+h);b="li#"+h}}wpWidgets.addEvents(c.item);wpWidgets.save(c.item.find("form").serializeArray(),g,0,0);c.item.find("input.add_new").val("");c.item.find("a.widget-action").click()}wpWidgets.saveOrder(g);wpWidgets.fixWebkit()},receive:function(d,c){if(!a(this).is(":visible")){a(this).sortable("cancel")}}}).not(":visible").sortable("disable")},saveOrder:function(c){a("#"+c+" .ajax-feedback").css("visibility","visible");var b={action:"widgets-order",savewidgets:a("#_wpnonce_widgets").val(),sidebars:[]};a(".widgets-sortables").each(function(){b["sidebars["+a(this).parent().attr("id")+"]"]=a(this).sortable("toArray").join(",")});a.post(ajaxurl,b,function(){a(".ajax-feedback").css("visibility","hidden")})},save:function(e,f,c,d){a("#"+f+" .ajax-feedback").css("visibility","visible");var b={action:"save-widget",savewidgets:a("#_wpnonce_widgets").val(),sidebar:f};if(c){b.delete_widget=1}a.map(e,function(h,g){b[h.name]=h.value});a.post(ajaxurl,b,function(g){var h;a(".ajax-feedback").css("visibility","hidden");if(!d){return}if(c){a(d).parents("li.widget").slideUp("normal",function(){a(this).remove()});if(!b.widget_number){h=b["widget-id"];a("#available-widgets .widget-id").each(function(){if(a(this).val()==h){a(this).parents("li.widget").show()}})}}else{a(d).parents(".widget-inside").slideUp("normal",function(){a(this).parents("li.widget").css({width:"",marginLeft:""})})}})},fixWebkit:function(b){b=b?"none":"";a("body").css({WebkitUserSelect:b,KhtmlUserSelect:b})},addEvents:function(b){b=b||document;a("a.widget-action",b).click(function(){var d=parseInt(a(this).parents(".widget").find(".widget-width").val(),10),e={},c=a(this).parents(".widget-top").siblings(".widget-inside");if(c.is(":hidden")){if(d>270&&c.parents(".widgets-sortables").length){e.width=d+30+"px";if(c.parents(".widget-liquid-right").length){e.marginLeft=270-d+"px"}c.parents(".widget").css(e)}c.slideDown("normal")}else{c.slideUp("normal",function(){c.parents(".widget").css({width:"",marginLeft:""})})}return false});a(".widget-control-save",b).click(function(){wpWidgets.save(a(this).parents("form").serializeArray(),a(this).parents(".widgets-holder-wrap").attr("id"),0,this);return false});a(".widget-control-remove",b).click(function(){wpWidgets.save(a(this).parents("form").serializeArray(),a(this).parents(".widgets-holder-wrap").attr("id"),1,this);return false})}};a(document).ready(function(){wpWidgets.init()})})(jQuery); \ No newline at end of file +var wpWidgets;(function(a){wpWidgets={init:function(){var b;a("h3.sidebar-name").click(function(){var d=a(this).siblings(".widgets-sortables");if(d.is(":visible")){d.hide().sortable("disable")}else{d.show().sortable("enable").sortable("refresh")}a(this).siblings("#widget-list").toggle()});this.addEvents();a(".widget-error").parents(".widget").find("a.widget-action").click();a("#widget-list .widget").draggable({connectToSortable:".widgets-sortables",handle:".widget-title",distance:2,helper:"clone",zIndex:5,start:function(){wpWidgets.fixWebkit(1)},stop:function(d,c){if(b){a(b).hide()}b="";wpWidgets.fixWebkit()}});a(".widgets-sortables").sortable({placeholder:"widget-placeholder",connectWith:".widgets-sortables",items:".widget",handle:".widget-title",cursor:"move",distance:2,opacity:0.65,start:function(d,c){wpWidgets.fixWebkit(1);c.item.find(".widget-inside").hide();c.item.css({marginLeft:"",width:""})},stop:function(f,c){var d=c.item.find("input.add_new").val(),i=c.item.find("input.multi_number").val(),h=c.item.attr("id"),g=a(this).parent().attr("id");c.item.css({marginLeft:"",width:""});if(d){if("multi"==d){c.item.html(c.item.html().replace(/<[^<>]+>/g,function(e){return e.replace(/__i__/g,i)}));c.item.attr("id",h.replace(/__i__/g,i));i++;a("li#"+h).find("input.multi_number").val(i)}else{if("single"==d){c.item.attr("id","new-"+h);b="li#"+h}}wpWidgets.addEvents(c.item);wpWidgets.save(c.item.find("form").serializeArray(),g,0,0);c.item.find("input.add_new").val("");c.item.find("a.widget-action").click()}wpWidgets.saveOrder(g);wpWidgets.fixWebkit()},receive:function(d,c){if(!a(this).is(":visible")){a(this).sortable("cancel")}}}).not(":visible").sortable("disable")},saveOrder:function(c){a("#"+c+" .ajax-feedback").css("visibility","visible");var b={action:"widgets-order",savewidgets:a("#_wpnonce_widgets").val(),sidebars:[]};a(".widgets-sortables").each(function(){b["sidebars["+a(this).parent().attr("id")+"]"]=a(this).sortable("toArray").join(",")});a.post(ajaxurl,b,function(){a(".ajax-feedback").css("visibility","hidden")})},save:function(e,f,c,d){a("#"+f+" .ajax-feedback").css("visibility","visible");var b={action:"save-widget",savewidgets:a("#_wpnonce_widgets").val(),sidebar:f};if(c){b.delete_widget=1}a.map(e,function(h,g){b[h.name]=h.value});a.post(ajaxurl,b,function(g){var h;a(".ajax-feedback").css("visibility","hidden");if(!d){return}if(c){a(d).parents("li.widget").slideUp("normal",function(){a(this).remove()});if(!b.widget_number){h=b["widget-id"];a("#available-widgets .widget-id").each(function(){if(a(this).val()==h){a(this).parents("li.widget").show()}})}}else{a(d).parents(".widget-inside").slideUp("normal",function(){a(this).parents("li.widget").css({width:"",marginLeft:""})})}})},fixWebkit:function(b){b=b?"none":"";a("body").css({WebkitUserSelect:b,KhtmlUserSelect:b})},addEvents:function(b){b=b||document;a("a.widget-action",b).click(function(){var d=parseInt(a(this).parents(".widget").find(".widget-width").val(),10),e={},c=a(this).parents(".widget-top").siblings(".widget-inside");if(c.is(":hidden")){if(d>270&&c.parents(".widgets-sortables").length){e.width=d+30+"px";if(c.parents(".widget-liquid-right").length){e.marginLeft=270-d+"px"}c.parents(".widget").css(e)}c.slideDown("normal")}else{c.slideUp("normal",function(){c.parents(".widget").css({width:"",marginLeft:""})})}return false});a(".widget-control-save",b).click(function(){wpWidgets.save(a(this).parents("form").serializeArray(),a(this).parents(".widgets-holder-wrap").attr("id"),0,this);return false});a(".widget-control-remove",b).click(function(){wpWidgets.save(a(this).parents("form").serializeArray(),a(this).parents(".widgets-holder-wrap").attr("id"),1,this);return false})}};a(document).ready(function(){wpWidgets.init()})})(jQuery); \ No newline at end of file diff --git a/wp-includes/default-widgets.php b/wp-includes/default-widgets.php index e4a5dcb4d7..19f13fe2a2 100644 --- a/wp-includes/default-widgets.php +++ b/wp-includes/default-widgets.php @@ -505,10 +505,10 @@ class WP_Widget_Recent_Posts extends WP_Widget { function widget($args, $instance) { $cache = wp_cache_get('widget_recent_posts', 'widget'); - + if ( !is_array($cache) ) $cache = array(); - + if ( isset($cache[$args['widget_id']]) ) return $cache[$args['widget_id']]; @@ -547,7 +547,7 @@ class WP_Widget_Recent_Posts extends WP_Widget { $instance['title'] = strip_tags($new_instance['title']); $instance['number'] = (int) $new_instance['number']; $this->flush_widget_cache(); - + $alloptions = wp_cache_get( 'alloptions', 'options' ); if ( isset($alloptions['widget_recent_entries']) ) delete_option('widget_recent_entries'); @@ -594,7 +594,7 @@ class WP_Widget_Recent_Comments extends WP_Widget { add_action( 'comment_post', array(&$this, 'flush_widget_cache') ); add_action( 'wp_set_comment_status', array(&$this, 'flush_widget_cache') ); } - + function recent_comments_style() { ?> 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 15"); wp_cache_add( 'recent_comments', $comments, 'widget' ); } - + $comments = array_slice( (array) $comments, 0, $number ); ?> @@ -664,63 +664,74 @@ class WP_Widget_Recent_Comments extends WP_Widget { } /** - * Display RSS widget. + * RSS widget class * - * Allows for multiple widgets to be displayed. - * - * @since 2.2.0 - * - * @param array $args Widget arguments. - * @param int $number Widget number. + * @since 2.8.0 */ -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); +class WP_Widget_RSS extends WP_Widget { - $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); + function WP_Widget_RSS() { + $widget_ops = array( 'description' => __('Entries from any RSS or Atom feed') ); + $control_ops = array( 'width' => 400, 'height' => 200 ); + $this->WP_Widget( 'rss', __('RSS'), $widget_ops, $control_ops ); } - 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 = "RSS $title"; - echo $before_widget; - echo $before_title . $title . $after_title; + function widget($args, $instance) { - wp_widget_rss_output( $rss, $options[$number] ); + if ( isset($instance['error']) && $instance['error'] ) + return; - echo $after_widget; + extract($args, EXTR_SKIP); + + $url = $instance['url']; + while ( stristr($url, 'http') != $url ) + $url = substr($url, 1); + + if ( empty($url) ) + return; + + $rss = fetch_feed($url); + $title = $instance['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 = empty($desc) ? __('Unknown Feed') : $desc; + + $title = apply_filters('widget_title', $title ); + $url = clean_url(strip_tags($url)); + $icon = includes_url('images/rss.png'); + $title = "RSS $title"; + + echo $before_widget; + echo $before_title . $title . $after_title; + wp_widget_rss_output( $rss, $instance ); + echo $after_widget; + } + + function update($new_instance, $old_instance) { + $testurl = $new_instance['url'] != $old_instance['url']; + return wp_widget_rss_process( $new_instance, $testurl ); + } + + function form($instance) { + + if ( empty($instance) ) + $instance = array( 'number' => '__i__', 'title' => '', 'url' => '', 'items' => 10, 'error' => false, 'show_summary' => 0, 'show_author' => 0, 'show_date' => 0 ); + else + $instance['number'] = $this->number; + + wp_widget_rss_form( $instance ); + } } /** @@ -742,11 +753,9 @@ function wp_widget_rss_output( $rss, $args = array() ) { } if ( is_wp_error($rss) ) { - if ( is_admin() || current_user_can('manage_options') ) { - echo '

'; - printf(__('RSS Error: %s'), $rss->get_error_message()); - echo '

'; - } + if ( is_admin() || current_user_can('manage_options') ) + echo '

' . sprintf( __('RSS Error: %s'), $rss->get_error_message() ) . '

'; + return; } @@ -814,75 +823,7 @@ function wp_widget_rss_output( $rss, $args = array() ) { 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. @@ -913,11 +854,8 @@ function wp_widget_rss_form( $args, $inputs = null ) { $show_author = (int) $show_author; $show_date = (int) $show_date; - if ( !empty($error) ) { - $message = sprintf( __('Error in RSS Widget: %s'), $error); - echo "

$message

"; - echo "

$message

"; - } + if ( !empty($error) ) + echo '

' . sprintf( __('RSS Error: %s'), $error) . '

'; if ( $inputs['url'] ) : ?> @@ -964,7 +902,6 @@ function wp_widget_rss_form( $args, $inputs = null ) {

- '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. @@ -1125,15 +1033,15 @@ function wp_widgets_init() { register_widget('WP_Widget_Categories'); register_widget('WP_Widget_Recent_Posts'); - + register_widget('WP_Widget_Recent_Comments'); + register_widget('WP_Widget_RSS'); + $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_rss_register(); - do_action('widgets_init'); } diff --git a/wp-includes/script-loader.php b/wp-includes/script-loader.php index a125f40c4f..f4db56fcb7 100644 --- a/wp-includes/script-loader.php +++ b/wp-includes/script-loader.php @@ -330,7 +330,7 @@ function wp_default_scripts( &$scripts ) { $scripts->add( 'media-upload', "/wp-admin/js/media-upload$suffix.js", array( 'thickbox' ), '20090114' ); $scripts->add_data( 'media-upload', 'group', 1 ); - $scripts->add( 'admin-widgets', "/wp-admin/js/widgets$suffix.js", array( 'jquery-ui-sortable', 'jquery-ui-draggable' ), '20090413a' ); + $scripts->add( 'admin-widgets', "/wp-admin/js/widgets$suffix.js", array( 'jquery-ui-sortable', 'jquery-ui-draggable' ), '20090426' ); $scripts->add_data( 'admin-widgets', 'group', 1 ); $scripts->add( 'word-count', "/wp-admin/js/word-count$suffix.js", array( 'jquery' ), '20090422' );