Changeset 6958
- Timestamp:
- 02/21/2008 09:20:09 PM (17 years ago)
- Location:
- trunk/wp-admin
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/wp-admin/css/dashboard.css
r6928 r6958 255 255 margin: 0 0 1em; 256 256 } 257 258 .widget-loading { 259 } -
trunk/wp-admin/includes/dashboard.php
r6810 r6958 33 33 ); 34 34 35 36 35 // Incoming Links Widget 37 36 if ( !isset( $widget_options['dashboard_incoming_links'] ) ) { … … 45 44 } 46 45 wp_register_sidebar_widget( 'dashboard_incoming_links', __( 'Incoming Links' ), 'wp_dashboard_empty', 47 array( 'all_link' => $widget_options['dashboard_incoming_links']['link'], 'feed_link' => $widget_options['dashboard_incoming_links']['url'], 'width' => 'half' ) 46 array( 'all_link' => $widget_options['dashboard_incoming_links']['link'], 'feed_link' => $widget_options['dashboard_incoming_links']['url'], 'width' => 'half' ), 47 'wp_dashboard_cached_rss_widget', 'wp_dashboard_incoming_links_output' 48 48 ); 49 49 wp_register_widget_control( 'dashboard_incoming_links', __( 'Incoming Links' ), 'wp_dashboard_rss_control', array(), … … 54 54 // WP Plugins Widget 55 55 wp_register_sidebar_widget( 'dashboard_plugins', __( 'Plugins' ), 'wp_dashboard_empty', 56 array( 'all_link' => 'http://wordpress.org/extend/plugins/', 'feed_link' => 'http://wordpress.org/extend/plugins/rss/', 'width' => 'half' ) 57 ); 58 wp_register_widget_control( 'dashboard_plugins', __( 'Plugins' ), 'wp_dashboard_empty', array(), 59 array( 'widget_id' => 'dashboard_plugins' ) 60 ); 61 56 array( 'all_link' => 'http://wordpress.org/extend/plugins/', 'feed_link' => 'http://wordpress.org/extend/plugins/rss/', 'width' => 'half' ), 57 'wp_dashboard_cached_rss_widget', 'wp_dashboard_plugins_output', 58 array( 'http://wordpress.org/extend/plugins/rss/browse/popular/', 'http://wordpress.org/extend/plugins/rss/browse/new/', 'http://wordpress.org/extend/plugins/rss/browse/updated/' ) 59 ); 62 60 63 61 // Primary feed (Dev Blog) Widget … … 75 73 } 76 74 wp_register_sidebar_widget( 'dashboard_primary', $widget_options['dashboard_primary']['title'], 'wp_dashboard_empty', 77 array( 'all_link' => $widget_options['dashboard_primary']['link'], 'feed_link' => $widget_options['dashboard_primary']['url'], 'width' => 'half', 'class' => 'widget_rss' ) 75 array( 'all_link' => $widget_options['dashboard_primary']['link'], 'feed_link' => $widget_options['dashboard_primary']['url'], 'width' => 'half', 'class' => 'widget_rss' ), 76 'wp_dashboard_cached_rss_widget', 'wp_dashboard_rss_output' 78 77 ); 79 78 wp_register_widget_control( 'dashboard_primary', __( 'Primary Feed' ), 'wp_dashboard_rss_control', array(), … … 93 92 } 94 93 wp_register_sidebar_widget( 'dashboard_secondary', $widget_options['dashboard_secondary']['title'], 'wp_dashboard_empty', 95 array( 'all_link' => $widget_options['dashboard_secondary']['link'], 'feed_link' => $widget_options['dashboard_secondary']['url'], 'width' => 'full' ) 94 array( 'all_link' => $widget_options['dashboard_secondary']['link'], 'feed_link' => $widget_options['dashboard_secondary']['url'], 'width' => 'full' ), 95 'wp_dashboard_cached_rss_widget', 'wp_dashboard_secondary_output' 96 96 ); 97 97 wp_register_widget_control( 'dashboard_secondary', __( 'Secondary Feed' ), 'wp_dashboard_rss_control', array(), … … 99 99 ); 100 100 101 102 /* Dashboard Widget Template 103 wp_register_sidebar_widget( $widget_id (unique slug) , $widget_title, $output_callback, 104 array( 105 'all_link' => full url for "See All" link, 106 'feed_link' => full url for "RSS" link, 107 'width' => 'fourth', 'third', 'half', 'full' (defaults to 'half'), 108 'height' => 'single', 'double' (defaults to 'single'), 109 ), 110 $wp_dashboard_empty_callback (only needed if using 'wp_dashboard_empty' as your $output_callback), 111 $arg, $arg, $arg... (further args passed to callbacks) 112 ); 113 114 // optional: if you want users to be able to edit the settings of your widget, you need to register a widget_control 115 wp_register_widget_control( $widget_id, $widget_control_title, $control_output_callback, 116 array(), // leave an empty array here: oddity in widget code 117 array( 118 'widget_id' => $widget_id, // Yes - again. This is required: oddity in widget code 119 'arg' => an arg to pass to the $control_output_callback, 120 'another' => another arg to pass to the $control_output_callback, 121 ... 122 ) 123 ); 124 */ 101 125 102 126 // Hook to register new widgets … … 175 199 $wp_registered_widgets[$widget_id]['callback'] = 'wp_dashboard_empty'; 176 200 $sidebar_widget_name = $wp_registered_widget_controls[$widget_id]['name']; 177 $params[1] = $widget_id;201 $params[1] = 'wp_dashbaord_trigger_widget_control'; 178 202 $sidebar_before_widget .= '<form action="' . remove_query_arg( 'edit' ) . '" method="post">'; 179 203 $sidebar_after_widget = "<div class='dashboard-widget-submit'><input type='hidden' name='sidebar' value='wp_dashboard' /><input type='hidden' name='widget_id' value='$widget_id' /><input type='submit' value='" . __( 'Save' ) . "' /></div></form>$sidebar_after_widget"; … … 219 243 function wp_dashboard_recent_comments( $sidebar_args ) { 220 244 global $comment; 221 222 245 extract( $sidebar_args, EXTR_SKIP ); 223 246 … … 269 292 } 270 293 271 // Empty widget used for JS/AJAX created output. Also used when widget is in edit mode. 272 function wp_dashboard_empty( $sidebar_args, $widget_control_id = false ) { 294 // $sidebar_args are handled by wp_dashboard_empty() 295 function wp_dashboard_incoming_links_output() { 296 $widgets = get_option( 'dashboard_widget_options' ); 297 @extract( @$widgets['dashboard_incoming_links'], EXTR_SKIP ); 298 $rss = @fetch_rss( $url ); 299 if ( isset($rss->items) && 1 < count($rss->items) ) {// Technorati returns a 1-item feed when it has no results 300 301 echo "<ul>\n"; 302 303 $rss->items = array_slice($rss->items, 0, $items); 304 foreach ( $rss->items as $item ) { 305 $publisher = ''; 306 $site_link = ''; 307 $link = ''; 308 $content = ''; 309 $date = ''; 310 $link = clean_url( strip_tags( $item['link'] ) ); 311 312 if ( isset( $item['author_uri'] ) ) 313 $site_link = clean_url( strip_tags( $item['author_uri'] ) ); 314 315 if ( !$publisher = wp_specialchars( strip_tags( isset($item['dc']['publisher']) ? $item['dc']['publisher'] : $item['author_name'] ) ) ) 316 $publisher = __( 'Somebody' ); 317 if ( $site_link ) 318 $publisher = "<a href='$site_link'>$publisher</a>"; 319 else 320 $publisher = "<strong>$publisher</strong>"; 321 322 if ( isset($item['description']) ) 323 $content = $item['description']; 324 elseif ( isset($item['summary']) ) 325 $content = $item['summary']; 326 elseif ( isset($item['atom_content']) ) 327 $content = $item['atom_content']; 328 else 329 $content = __( 'something' ); 330 $content = strip_tags( $content ); 331 if ( 50 < strlen($content) ) 332 $content = substr($content, 0, 50) . ' ...'; 333 $content = wp_specialchars( $content ); 334 if ( $link ) 335 $text = _c( '%1$s linked here <a href="%2$s">saying</a>, "%3$s"|feed_display' ); 336 else 337 $text = _c( '%1$s linked here saying, "%3$s"|feed_display' ); 338 339 if ( $show_date ) { 340 if ( $show_author || $show_summary ) 341 $text .= _c( ' on %4$s|feed_display' ); 342 $date = wp_specialchars( strip_tags( isset($item['pubdate']) ? $item['pubdate'] : $item['published'] ) ); 343 $date = strtotime( $date ); 344 $date = gmdate( get_option( 'date_format' ), $date ); 345 } 346 347 echo "\t<li>" . sprintf( _c( "$text|feed_display" ), $publisher, $link, $content, $date ) . "</li>\n"; 348 } 349 350 echo "</ul>\n"; 351 352 } else { 353 echo '<p>' . __('No incoming links found... yet.') . "</p>\n"; 354 } 355 } 356 357 // $sidebar_args are handled by wp_dashboard_empty() 358 function wp_dashboard_rss_output( $widget_id ) { 359 $widgets = get_option( 'dashboard_widget_options' ); 360 wp_widget_rss_output( $widgets[$widget_id] ); 361 } 362 363 // $sidebar_args are handled by wp_dashboard_empty() 364 function wp_dashboard_secondary_output() { 365 $widgets = get_option( 'dashboard_widget_options' ); 366 @extract( @$widgets['dashboard_secondary'], EXTR_SKIP ); 367 $rss = @fetch_rss( $url ); 368 if ( !isset($rss->items) || 0 == count($rss->items) ) 369 return false; 370 371 echo "<ul>\n"; 372 373 $rss->items = array_slice($rss->items, 0, $items); 374 foreach ($rss->items as $item ) { 375 $title = wp_specialchars($item['title']); 376 $author = preg_replace( '|(.+?):.+|s', '$1', $item['title'] ); 377 $post = preg_replace( '|.+?:(.+)|s', '$1', $item['title'] ); 378 $link = clean_url($item['link']); 379 380 echo "\t<li><a href='$link'><span class='post'>$post</span><span class='hidden'> - </span><cite>$author</cite></a></li>\n"; 381 } 382 383 echo "</ul>\n<br class='clear' />\n"; 384 } 385 386 // $sidebar_args are handled by wp_dashboard_empty() 387 function wp_dashboard_plugins_output() { 388 $popular = @fetch_rss( 'http://wordpress.org/extend/plugins/rss/browse/popular/' ); 389 $new = @fetch_rss( 'http://wordpress.org/extend/plugins/rss/browse/new/' ); 390 $updated = @fetch_rss( 'http://wordpress.org/extend/plugins/rss/browse/updated/' ); 391 392 foreach ( array( 'popular' => __('Most Popular'), 'new' => __('Newest Plugins'), 'updated' => __('Recently Updated') ) as $feed => $label ) { 393 if ( !isset($$feed->items) || 0 == count($$feed->items) ) 394 continue; 395 396 $$feed->items = array_slice($$feed->items, 0, 5); 397 $item_key = array_rand($$feed->items); 398 399 // Eliminate some common badly formed plugin descriptions 400 while ( ( null !== $item_key = array_rand($$feed->items) ) && false !== strpos( $$feed->items[$item_key]['description'], 'Plugin Name:' ) ) 401 unset($$feed->items[$item_key]); 402 403 if ( !isset($$feed->items[$item_key]) ) 404 continue; 405 406 $item = $$feed->items[$item_key]; 407 408 // current bbPress feed item titles are: user on "topic title" 409 if ( preg_match( '/"(.*)"/s', $item['title'], $matches ) ) 410 $title = $matches[1]; 411 else // but let's make it forward compatible if things change 412 $title = $item['title']; 413 $title = wp_specialchars( $title ); 414 415 $description = wp_specialchars( strip_tags(html_entity_decode($item['description'], ENT_QUOTES)) ); 416 417 list($link, $frag) = explode( '#', $item['link'] ); 418 419 $link = clean_url($link); 420 $dlink = rtrim($link, '/') . '/download/'; 421 422 echo "<h4>$label</h4>\n"; 423 echo "<h5><a href='$link'>$title</a></h5> <span>(<a href='$dlink'>" . __( 'Download' ) . "</a>)</span>\n"; 424 echo "<p>$description</p>\n"; 425 } 426 } 427 428 // Checks to see if all of the feed url in $check_urls are cached. 429 // If $check_urls is empty, look for the rss feed url found in the dashboard widget optios of $widget_id. 430 // If cached, call $callback, a function that echoes out output for this widget. 431 // If not cache, echo a "Loading..." stub which is later replaced by AJAX call (see top of /wp-admin/index.php) 432 function wp_dashboard_cached_rss_widget( $widget_id, $callback, $check_urls = array() ) { 433 $loading = '<p class="widget-loading">' . __( 'Loading…' ) . '</p>'; 434 435 if ( empty($check_urls) ) { 436 $widgets = get_option( 'dashboard_widget_options' ); 437 if ( empty($widgets[$widget_id]['url']) ) { 438 echo $loading; 439 return false; 440 } 441 $check_urls = array( $widgets[$widget_id]['url'] ); 442 } 443 444 445 require_once( ABSPATH . WPINC . '/rss.php' ); 446 init(); // initialize rss constants 447 448 $cache = new RSSCache( MAGPIE_CACHE_DIR, MAGPIE_CACHE_AGE ); 449 450 foreach ( $check_urls as $check_url ) { 451 $status = $cache->check_cache( $check_url ); 452 if ( 'HIT' !== $status ) { 453 echo $loading; 454 return false; 455 } 456 } 457 458 if ( $callback && is_callable( $callback ) ) { 459 $args = array_slice( func_get_args(), 2 ); 460 array_unshift( $args, $widget_id ); 461 call_user_func_array( $callback, $args ); 462 } 463 464 return true; 465 } 466 467 // Empty widget used for JS/AJAX created output. 468 // Callback inserts content between before_widget and after_widget. Used when widget is in edit mode. Can also be used for custom widgets. 469 function wp_dashboard_empty( $sidebar_args, $callback = false ) { 273 470 extract( $sidebar_args, EXTR_SKIP ); 274 471 … … 279 476 echo $after_title; 280 477 281 if ( $widget_control_id ) // If in edit mode 282 wp_dashbaord_trigger_widget_control( $widget_control_id ); 478 // When in edit mode, the callback passed to this function is the widget_control callback 479 if ( $callback && is_callable( $callback ) ) { 480 $args = array_slice( func_get_args(), 2 ); 481 array_unshift( $args, $widget_id ); 482 call_user_func_array( $callback, $args ); 483 } 283 484 284 485 echo $after_widget; -
trunk/wp-admin/index-extra.php
r6928 r6958 1 1 <?php 2 2 require_once('admin.php'); 3 require( 'includes/dashboard.php' ); 3 4 require_once (ABSPATH . WPINC . '/rss.php'); 4 5 5 6 @header('Content-Type: ' . get_option('html_type') . '; charset=' . get_option('blog_charset')); 6 7 7 $widgets = get_option( 'dashboard_widget_options' );8 9 10 8 switch ( $_GET['jax'] ) { 11 9 12 10 case 'incominglinks' : 13 @extract( @$widgets['dashboard_incoming_links'], EXTR_SKIP ); 14 $rss = @fetch_rss( $url ); 15 if ( isset($rss->items) && 1 < count($rss->items) ) { // Technorati returns a 1-item feed when it has no results 16 ?> 17 18 <ul> 19 <?php 20 $rss->items = array_slice($rss->items, 0, $items); 21 foreach ($rss->items as $item ) { 22 $publisher = ''; 23 $site_link = ''; 24 $link = ''; 25 $content = ''; 26 $date = ''; 27 $link = clean_url( strip_tags( $item['link'] ) ); 28 29 if ( isset( $item['author_uri'] ) ) 30 $site_link = clean_url( strip_tags( $item['author_uri'] ) ); 31 32 if ( !$publisher = wp_specialchars( strip_tags( isset($item['dc']['publisher']) ? $item['dc']['publisher'] : $item['author_name'] ) ) ) 33 $publisher = __( 'Somebody' ); 34 if ( $site_link ) 35 $publisher = "<a href='$site_link'>$publisher</a>"; 36 else 37 $publisher = "<strong>$publisher</strong>"; 38 39 if ( isset($item['description']) ) 40 $content = $item['description']; 41 elseif ( isset($item['summary']) ) 42 $content = $item['summary']; 43 elseif ( isset($item['atom_content']) ) 44 $content = $item['atom_content']; 45 else 46 $content = __( 'something' ); 47 $content = strip_tags( $content ); 48 if ( 50 < strlen($content) ) 49 $content = substr($content, 0, 50) . ' ...'; 50 $content = wp_specialchars( $content ); 51 if ( $link ) 52 $text = _c( '%1$s linked here <a href="%2$s">saying</a>, "%3$s"|feed_display' ); 53 else 54 $text = _c( '%1$s linked here saying, "%3$s"|feed_display' ); 55 56 if ( $show_date ) { 57 if ( $show_author || $show_summary ) 58 $text .= _c( ' on %4$s|feed_display' ); 59 $date = wp_specialchars( strip_tags( isset($item['pubdate']) ? $item['pubdate'] : $item['published'] ) ); 60 $date = strtotime( $date ); 61 $date = gmdate( get_option( 'date_format' ), $date ); 62 } 63 64 ?> 65 <li><?php printf( _c( "$text|feed_display" ), $publisher, $link, $content, $date ); ?></li> 66 <?php } ?> 67 </ul> 68 <?php 69 } else { 70 ?> 71 <p><?php _e('No incoming links found... yet.'); ?></p> 72 <?php 73 } 74 break; 11 wp_dashboard_incoming_links_output(); 12 break; 75 13 76 14 case 'devnews' : 77 wp_widget_rss_output( $widgets['dashboard_primary']);78 break;15 wp_dashboard_rss_output( 'dashboard_primary' ); 16 break; 79 17 80 18 case 'planetnews' : 81 extract( $widgets['dashboard_secondary'], EXTR_SKIP ); 82 $rss = @fetch_rss( $url ); 83 if ( isset($rss->items) && 0 != count($rss->items) ) { 84 ?> 85 <ul> 86 <?php 87 $rss->items = array_slice($rss->items, 0, $items); 88 foreach ($rss->items as $item ) { 89 $title = wp_specialchars($item['title']); 90 $author = preg_replace( '|(.+?):.+|s', '$1', $item['title'] ); 91 $post = preg_replace( '|.+?:(.+)|s', '$1', $item['title'] ); 92 ?> 93 <li><a href='<?php echo wp_filter_kses($item['link']); ?>'><span class="post"><?php echo $post; ?></span><span class="hidden"> - </span><cite><?php echo $author; ?></cite></a></li> 94 <?php 95 } 96 ?> 97 </ul> 98 <br class="clear" /> 99 <?php 100 } 101 break; 19 wp_dashboard_secondary_output(); 20 break; 102 21 103 22 case 'plugins' : 104 $popular = @fetch_rss( 'http://wordpress.org/extend/plugins/rss/browse/popular/' ); 105 $new = @fetch_rss( 'http://wordpress.org/extend/plugins/rss/browse/new/' ); 106 $updated = @fetch_rss( 'http://wordpress.org/extend/plugins/rss/browse/updated/' ); 107 108 foreach ( array( 'popular' => __('Most Popular'), 'new' => __('Newest Plugins'), 'updated' => __('Recently Updated') ) as $feed => $label ) : 109 if ( !isset($$feed->items) || 0 == count($$feed->items) ) 110 continue; 111 112 $$feed->items = array_slice($$feed->items, 0, 5); 113 $item_key = array_rand($$feed->items); 114 115 // Eliminate some common badly formed plugin descriptions 116 while ( ( null !== $item_key = array_rand($$feed->items) ) && false !== strpos( $$feed->items[$item_key]['description'], 'Plugin Name:' ) ) 117 unset($$feed->items[$item_key]); 118 119 if ( !isset($$feed->items[$item_key]) ) 120 continue; 121 122 $item = $$feed->items[$item_key]; 123 124 // current bbPress feed item titles are: user on "topic title" 125 if ( preg_match( '/"(.*)"/s', $item['title'], $matches ) ) 126 $title = $matches[1]; 127 else // but let's make it forward compatible if things change 128 $title = $item['title']; 129 $title = wp_specialchars( $title ); 130 131 $description = wp_specialchars( strip_tags(html_entity_decode($item['description'], ENT_QUOTES)) ); 132 133 list($link, $frag) = explode( '#', $item['link'] ); 134 135 $link = clean_url($link); 136 $dlink = rtrim($link, '/') . '/download/'; 137 138 ?> 139 140 <h4><?php echo $label; ?></h4> 141 <h5><a href="<?php echo $link; ?>"><?php echo $title; ?></a></h5> <span>(<a href="<?php echo $dlink; ?>"><?php _e( 'Download' ); ?></a>)</span> 142 143 <p><?php echo $description; ?></p> 144 145 <?php 146 147 endforeach; 148 break; 23 wp_dashboard_plugins_output(); 24 break; 149 25 150 26 } -
trunk/wp-admin/index.php
r6928 r6958 11 11 <script type="text/javascript"> 12 12 jQuery(function() { 13 jQuery('#dashboard_incoming_links div.dashboard-widget-content').not( '.dashboard-widget-control' ). load('index-extra.php?jax=incominglinks');14 jQuery('#dashboard_primary div.dashboard-widget-content').not( '.dashboard-widget-control' ). load('index-extra.php?jax=devnews');15 jQuery('#dashboard_secondary div.dashboard-widget-content').not( '.dashboard-widget-control' ). load('index-extra.php?jax=planetnews');16 jQuery('#dashboard_plugins div.dashboard-widget-content').not( '.dashboard-widget-control' ). load('index-extra.php?jax=plugins');13 jQuery('#dashboard_incoming_links div.dashboard-widget-content').not( '.dashboard-widget-control' ).find( '.widget-loading' ).parent().load('index-extra.php?jax=incominglinks'); 14 jQuery('#dashboard_primary div.dashboard-widget-content').not( '.dashboard-widget-control' ).find( '.widget-loading' ).parent().load('index-extra.php?jax=devnews'); 15 jQuery('#dashboard_secondary div.dashboard-widget-content').not( '.dashboard-widget-control' ).find( '.widget-loading' ).parent().load('index-extra.php?jax=planetnews'); 16 jQuery('#dashboard_plugins div.dashboard-widget-content').not( '.dashboard-widget-control' ).find( '.widget-loading' ).parent().load('index-extra.php?jax=plugins'); 17 17 }); 18 18 </script>
Note: See TracChangeset
for help on using the changeset viewer.