| [ Index ] |
PHP Cross Reference of WordPress |
[Summary view] [Print] [Text view]
1 <?php 2 /** 3 * WordPress Dashboard Widget Administration Screen API 4 * 5 * @package WordPress 6 * @subpackage Administration 7 */ 8 9 /** 10 * Registers dashboard widgets. 11 * 12 * Handles POST data, sets up filters. 13 * 14 * @since 2.5.0 15 */ 16 function wp_dashboard_setup() { 17 global $wp_registered_widgets, $wp_registered_widget_controls, $wp_dashboard_control_callbacks; 18 $wp_dashboard_control_callbacks = array(); 19 $screen = get_current_screen(); 20 21 $update = false; 22 $widget_options = get_option( 'dashboard_widget_options' ); 23 if ( !$widget_options || !is_array($widget_options) ) 24 $widget_options = array(); 25 26 /* Register Widgets and Controls */ 27 28 $response = wp_check_browser_version(); 29 30 if ( $response && $response['upgrade'] ) { 31 add_filter( 'postbox_classes_dashboard_dashboard_browser_nag', 'dashboard_browser_nag_class' ); 32 if ( $response['insecure'] ) 33 wp_add_dashboard_widget( 'dashboard_browser_nag', __( 'You are using an insecure browser!' ), 'wp_dashboard_browser_nag' ); 34 else 35 wp_add_dashboard_widget( 'dashboard_browser_nag', __( 'Your browser is out of date!' ), 'wp_dashboard_browser_nag' ); 36 } 37 38 // Right Now 39 if ( is_blog_admin() && current_user_can('edit_posts') ) 40 wp_add_dashboard_widget( 'dashboard_right_now', __( 'Right Now' ), 'wp_dashboard_right_now' ); 41 42 if ( is_network_admin() ) 43 wp_add_dashboard_widget( 'network_dashboard_right_now', __( 'Right Now' ), 'wp_network_dashboard_right_now' ); 44 45 // Recent Comments Widget 46 if ( is_blog_admin() && current_user_can('moderate_comments') ) { 47 if ( !isset( $widget_options['dashboard_recent_comments'] ) || !isset( $widget_options['dashboard_recent_comments']['items'] ) ) { 48 $update = true; 49 $widget_options['dashboard_recent_comments'] = array( 50 'items' => 5, 51 ); 52 } 53 $recent_comments_title = __( 'Recent Comments' ); 54 wp_add_dashboard_widget( 'dashboard_recent_comments', $recent_comments_title, 'wp_dashboard_recent_comments', 'wp_dashboard_recent_comments_control' ); 55 } 56 57 // Incoming Links Widget 58 if ( is_blog_admin() && current_user_can('publish_posts') ) { 59 if ( !isset( $widget_options['dashboard_incoming_links'] ) || !isset( $widget_options['dashboard_incoming_links']['home'] ) || $widget_options['dashboard_incoming_links']['home'] != get_option('home') ) { 60 $update = true; 61 $num_items = isset($widget_options['dashboard_incoming_links']['items']) ? $widget_options['dashboard_incoming_links']['items'] : 10; 62 $widget_options['dashboard_incoming_links'] = array( 63 'home' => get_option('home'), 64 'link' => apply_filters( 'dashboard_incoming_links_link', 'http://blogsearch.google.com/blogsearch?scoring=d&partner=wordpress&q=link:' . trailingslashit( get_option('home') ) ), 65 'url' => isset($widget_options['dashboard_incoming_links']['url']) ? apply_filters( 'dashboard_incoming_links_feed', $widget_options['dashboard_incoming_links']['url'] ) : apply_filters( 'dashboard_incoming_links_feed', 'http://blogsearch.google.com/blogsearch_feeds?scoring=d&ie=utf-8&num=' . $num_items . '&output=rss&partner=wordpress&q=link:' . trailingslashit( get_option('home') ) ), 66 'items' => $num_items, 67 'show_date' => isset($widget_options['dashboard_incoming_links']['show_date']) ? $widget_options['dashboard_incoming_links']['show_date'] : false 68 ); 69 } 70 wp_add_dashboard_widget( 'dashboard_incoming_links', __( 'Incoming Links' ), 'wp_dashboard_incoming_links', 'wp_dashboard_incoming_links_control' ); 71 } 72 73 // WP Plugins Widget 74 if ( ( ! is_multisite() && is_blog_admin() && current_user_can( 'install_plugins' ) ) || ( is_network_admin() && current_user_can( 'manage_network_plugins' ) && current_user_can( 'install_plugins' ) ) ) 75 wp_add_dashboard_widget( 'dashboard_plugins', __( 'Plugins' ), 'wp_dashboard_plugins' ); 76 77 // QuickPress Widget 78 if ( is_blog_admin() && current_user_can('edit_posts') ) 79 wp_add_dashboard_widget( 'dashboard_quick_press', __( 'QuickPress' ), 'wp_dashboard_quick_press' ); 80 81 // Recent Drafts 82 if ( is_blog_admin() && current_user_can('edit_posts') ) 83 wp_add_dashboard_widget( 'dashboard_recent_drafts', __('Recent Drafts'), 'wp_dashboard_recent_drafts' ); 84 85 // Primary feed (Dev Blog) Widget 86 if ( !isset( $widget_options['dashboard_primary'] ) ) { 87 $update = true; 88 $widget_options['dashboard_primary'] = array( 89 'link' => apply_filters( 'dashboard_primary_link', __( 'http://wordpress.org/news/' ) ), 90 'url' => apply_filters( 'dashboard_primary_feed', __( 'http://wordpress.org/news/feed/' ) ), 91 'title' => apply_filters( 'dashboard_primary_title', __( 'WordPress Blog' ) ), 92 'items' => 2, 93 'show_summary' => 1, 94 'show_author' => 0, 95 'show_date' => 1, 96 ); 97 } 98 wp_add_dashboard_widget( 'dashboard_primary', $widget_options['dashboard_primary']['title'], 'wp_dashboard_primary', 'wp_dashboard_primary_control' ); 99 100 // Secondary Feed (Planet) Widget 101 if ( !isset( $widget_options['dashboard_secondary'] ) ) { 102 $update = true; 103 $widget_options['dashboard_secondary'] = array( 104 'link' => apply_filters( 'dashboard_secondary_link', __( 'http://planet.wordpress.org/' ) ), 105 'url' => apply_filters( 'dashboard_secondary_feed', __( 'http://planet.wordpress.org/feed/' ) ), 106 'title' => apply_filters( 'dashboard_secondary_title', __( 'Other WordPress News' ) ), 107 'items' => 5, 108 'show_summary' => 0, 109 'show_author' => 0, 110 'show_date' => 0, 111 ); 112 } 113 wp_add_dashboard_widget( 'dashboard_secondary', $widget_options['dashboard_secondary']['title'], 'wp_dashboard_secondary', 'wp_dashboard_secondary_control' ); 114 115 // Hook to register new widgets 116 // Filter widget order 117 if ( is_network_admin() ) { 118 do_action( 'wp_network_dashboard_setup' ); 119 $dashboard_widgets = apply_filters( 'wp_network_dashboard_widgets', array() ); 120 } elseif ( is_user_admin() ) { 121 do_action( 'wp_user_dashboard_setup' ); 122 $dashboard_widgets = apply_filters( 'wp_user_dashboard_widgets', array() ); 123 } else { 124 do_action( 'wp_dashboard_setup' ); 125 $dashboard_widgets = apply_filters( 'wp_dashboard_widgets', array() ); 126 } 127 128 foreach ( $dashboard_widgets as $widget_id ) { 129 $name = empty( $wp_registered_widgets[$widget_id]['all_link'] ) ? $wp_registered_widgets[$widget_id]['name'] : $wp_registered_widgets[$widget_id]['name'] . " <a href='{$wp_registered_widgets[$widget_id]['all_link']}' class='edit-box open-box'>" . __('View all') . '</a>'; 130 wp_add_dashboard_widget( $widget_id, $name, $wp_registered_widgets[$widget_id]['callback'], $wp_registered_widget_controls[$widget_id]['callback'] ); 131 } 132 133 if ( 'POST' == $_SERVER['REQUEST_METHOD'] && isset($_POST['widget_id']) ) { 134 ob_start(); // hack - but the same hack wp-admin/widgets.php uses 135 wp_dashboard_trigger_widget_control( $_POST['widget_id'] ); 136 ob_end_clean(); 137 wp_redirect( remove_query_arg( 'edit' ) ); 138 exit; 139 } 140 141 if ( $update ) 142 update_option( 'dashboard_widget_options', $widget_options ); 143 144 do_action('do_meta_boxes', $screen->id, 'normal', ''); 145 do_action('do_meta_boxes', $screen->id, 'side', ''); 146 } 147 148 function wp_add_dashboard_widget( $widget_id, $widget_name, $callback, $control_callback = null ) { 149 $screen = get_current_screen(); 150 global $wp_dashboard_control_callbacks; 151 152 if ( $control_callback && current_user_can( 'edit_dashboard' ) && is_callable( $control_callback ) ) { 153 $wp_dashboard_control_callbacks[$widget_id] = $control_callback; 154 if ( isset( $_GET['edit'] ) && $widget_id == $_GET['edit'] ) { 155 list($url) = explode( '#', add_query_arg( 'edit', false ), 2 ); 156 $widget_name .= ' <span class="postbox-title-action"><a href="' . esc_url( $url ) . '">' . __( 'Cancel' ) . '</a></span>'; 157 $callback = '_wp_dashboard_control_callback'; 158 } else { 159 list($url) = explode( '#', add_query_arg( 'edit', $widget_id ), 2 ); 160 $widget_name .= ' <span class="postbox-title-action"><a href="' . esc_url( "$url#$widget_id" ) . '" class="edit-box open-box">' . __( 'Configure' ) . '</a></span>'; 161 } 162 } 163 164 if ( is_blog_admin () ) 165 $side_widgets = array('dashboard_quick_press', 'dashboard_recent_drafts', 'dashboard_primary', 'dashboard_secondary'); 166 else if (is_network_admin() ) 167 $side_widgets = array('dashboard_primary', 'dashboard_secondary'); 168 else 169 $side_widgets = array(); 170 171 $location = 'normal'; 172 if ( in_array($widget_id, $side_widgets) ) 173 $location = 'side'; 174 175 $priority = 'core'; 176 if ( 'dashboard_browser_nag' === $widget_id ) 177 $priority = 'high'; 178 179 add_meta_box( $widget_id, $widget_name, $callback, $screen, $location, $priority ); 180 } 181 182 function _wp_dashboard_control_callback( $dashboard, $meta_box ) { 183 echo '<form action="" method="post" class="dashboard-widget-control-form">'; 184 wp_dashboard_trigger_widget_control( $meta_box['id'] ); 185 echo '<input type="hidden" name="widget_id" value="' . esc_attr($meta_box['id']) . '" />'; 186 submit_button( __('Submit') ); 187 echo '</form>'; 188 } 189 190 /** 191 * Displays the dashboard. 192 * 193 * @since 2.5.0 194 */ 195 function wp_dashboard() { 196 $screen = get_current_screen(); 197 $class = 'columns-' . get_current_screen()->get_columns(); 198 199 ?> 200 <div id="dashboard-widgets" class="metabox-holder <?php echo $class; ?>"> 201 <div id='postbox-container-1' class='postbox-container'> 202 <?php do_meta_boxes( $screen->id, 'normal', '' ); ?> 203 </div> 204 <div id='postbox-container-2' class='postbox-container'> 205 <?php do_meta_boxes( $screen->id, 'side', '' ); ?> 206 </div> 207 <div id='postbox-container-3' class='postbox-container'> 208 <?php do_meta_boxes( $screen->id, 'column3', '' ); ?> 209 </div> 210 <div id='postbox-container-4' class='postbox-container'> 211 <?php do_meta_boxes( $screen->id, 'column4', '' ); ?> 212 </div> 213 </div> 214 215 <?php 216 wp_nonce_field( 'closedpostboxes', 'closedpostboxesnonce', false ); 217 wp_nonce_field( 'meta-box-order', 'meta-box-order-nonce', false ); 218 219 } 220 221 /* Dashboard Widgets */ 222 223 function wp_dashboard_right_now() { 224 global $wp_registered_sidebars; 225 226 $num_posts = wp_count_posts( 'post' ); 227 $num_pages = wp_count_posts( 'page' ); 228 229 $num_cats = wp_count_terms('category'); 230 231 $num_tags = wp_count_terms('post_tag'); 232 233 $num_comm = wp_count_comments( ); 234 235 echo "\n\t".'<div class="table table_content">'; 236 echo "\n\t".'<p class="sub">' . __('Content') . '</p>'."\n\t".'<table>'; 237 echo "\n\t".'<tr class="first">'; 238 239 // Posts 240 $num = number_format_i18n( $num_posts->publish ); 241 $text = _n( 'Post', 'Posts', intval($num_posts->publish) ); 242 if ( current_user_can( 'edit_posts' ) ) { 243 $num = "<a href='edit.php'>$num</a>"; 244 $text = "<a href='edit.php'>$text</a>"; 245 } 246 echo '<td class="first b b-posts">' . $num . '</td>'; 247 echo '<td class="t posts">' . $text . '</td>'; 248 249 echo '</tr><tr>'; 250 /* TODO: Show status breakdown on hover 251 if ( $can_edit_pages && !empty($num_pages->publish) ) { // how many pages is not exposed in feeds. Don't show if !current_user_can 252 $post_type_texts[] = '<a href="edit-pages.php">'.sprintf( _n( '%s page', '%s pages', $num_pages->publish ), number_format_i18n( $num_pages->publish ) ).'</a>'; 253 } 254 if ( $can_edit_posts && !empty($num_posts->draft) ) { 255 $post_type_texts[] = '<a href="edit.php?post_status=draft">'.sprintf( _n( '%s draft', '%s drafts', $num_posts->draft ), number_format_i18n( $num_posts->draft ) ).'</a>'; 256 } 257 if ( $can_edit_posts && !empty($num_posts->future) ) { 258 $post_type_texts[] = '<a href="edit.php?post_status=future">'.sprintf( _n( '%s scheduled post', '%s scheduled posts', $num_posts->future ), number_format_i18n( $num_posts->future ) ).'</a>'; 259 } 260 if ( current_user_can('publish_posts') && !empty($num_posts->pending) ) { 261 $pending_text = sprintf( _n( 'There is <a href="%1$s">%2$s post</a> pending your review.', 'There are <a href="%1$s">%2$s posts</a> pending your review.', $num_posts->pending ), 'edit.php?post_status=pending', number_format_i18n( $num_posts->pending ) ); 262 } else { 263 $pending_text = ''; 264 } 265 */ 266 267 // Pages 268 $num = number_format_i18n( $num_pages->publish ); 269 $text = _n( 'Page', 'Pages', $num_pages->publish ); 270 if ( current_user_can( 'edit_pages' ) ) { 271 $num = "<a href='edit.php?post_type=page'>$num</a>"; 272 $text = "<a href='edit.php?post_type=page'>$text</a>"; 273 } 274 echo '<td class="first b b_pages">' . $num . '</td>'; 275 echo '<td class="t pages">' . $text . '</td>'; 276 277 echo '</tr><tr>'; 278 279 // Categories 280 $num = number_format_i18n( $num_cats ); 281 $text = _n( 'Category', 'Categories', $num_cats ); 282 if ( current_user_can( 'manage_categories' ) ) { 283 $num = "<a href='edit-tags.php?taxonomy=category'>$num</a>"; 284 $text = "<a href='edit-tags.php?taxonomy=category'>$text</a>"; 285 } 286 echo '<td class="first b b-cats">' . $num . '</td>'; 287 echo '<td class="t cats">' . $text . '</td>'; 288 289 echo '</tr><tr>'; 290 291 // Tags 292 $num = number_format_i18n( $num_tags ); 293 $text = _n( 'Tag', 'Tags', $num_tags ); 294 if ( current_user_can( 'manage_categories' ) ) { 295 $num = "<a href='edit-tags.php'>$num</a>"; 296 $text = "<a href='edit-tags.php'>$text</a>"; 297 } 298 echo '<td class="first b b-tags">' . $num . '</td>'; 299 echo '<td class="t tags">' . $text . '</td>'; 300 301 echo "</tr>"; 302 do_action('right_now_content_table_end'); 303 echo "\n\t</table>\n\t</div>"; 304 305 echo "\n\t".'<div class="table table_discussion">'; 306 echo "\n\t".'<p class="sub">' . __('Discussion') . '</p>'."\n\t".'<table>'; 307 echo "\n\t".'<tr class="first">'; 308 309 // Total Comments 310 $num = '<span class="total-count">' . number_format_i18n($num_comm->total_comments) . '</span>'; 311 $text = _n( 'Comment', 'Comments', $num_comm->total_comments ); 312 if ( current_user_can( 'moderate_comments' ) ) { 313 $num = '<a href="edit-comments.php">' . $num . '</a>'; 314 $text = '<a href="edit-comments.php">' . $text . '</a>'; 315 } 316 echo '<td class="b b-comments">' . $num . '</td>'; 317 echo '<td class="last t comments">' . $text . '</td>'; 318 319 echo '</tr><tr>'; 320 321 // Approved Comments 322 $num = '<span class="approved-count">' . number_format_i18n($num_comm->approved) . '</span>'; 323 $text = _nx( 'Approved', 'Approved', $num_comm->approved, 'Right Now' ); 324 if ( current_user_can( 'moderate_comments' ) ) { 325 $num = "<a href='edit-comments.php?comment_status=approved'>$num</a>"; 326 $text = "<a class='approved' href='edit-comments.php?comment_status=approved'>$text</a>"; 327 } 328 echo '<td class="b b_approved">' . $num . '</td>'; 329 echo '<td class="last t">' . $text . '</td>'; 330 331 echo "</tr>\n\t<tr>"; 332 333 // Pending Comments 334 $num = '<span class="pending-count">' . number_format_i18n($num_comm->moderated) . '</span>'; 335 $text = _n( 'Pending', 'Pending', $num_comm->moderated ); 336 if ( current_user_can( 'moderate_comments' ) ) { 337 $num = "<a href='edit-comments.php?comment_status=moderated'>$num</a>"; 338 $text = "<a class='waiting' href='edit-comments.php?comment_status=moderated'>$text</a>"; 339 } 340 echo '<td class="b b-waiting">' . $num . '</td>'; 341 echo '<td class="last t">' . $text . '</td>'; 342 343 echo "</tr>\n\t<tr>"; 344 345 // Spam Comments 346 $num = number_format_i18n($num_comm->spam); 347 $text = _nx( 'Spam', 'Spam', $num_comm->spam, 'comment' ); 348 if ( current_user_can( 'moderate_comments' ) ) { 349 $num = "<a href='edit-comments.php?comment_status=spam'><span class='spam-count'>$num</span></a>"; 350 $text = "<a class='spam' href='edit-comments.php?comment_status=spam'>$text</a>"; 351 } 352 echo '<td class="b b-spam">' . $num . '</td>'; 353 echo '<td class="last t">' . $text . '</td>'; 354 355 echo "</tr>"; 356 do_action('right_now_table_end'); 357 do_action('right_now_discussion_table_end'); 358 echo "\n\t</table>\n\t</div>"; 359 360 echo "\n\t".'<div class="versions">'; 361 $theme = wp_get_theme(); 362 363 echo "\n\t<p>"; 364 365 if ( $theme->errors() ) { 366 if ( ! is_multisite() || is_super_admin() ) 367 echo '<span class="error-message">' . __('ERROR: The themes directory is either empty or doesn’t exist. Please check your installation.') . '</span>'; 368 } elseif ( ! empty($wp_registered_sidebars) ) { 369 $sidebars_widgets = wp_get_sidebars_widgets(); 370 $num_widgets = 0; 371 foreach ( (array) $sidebars_widgets as $k => $v ) { 372 if ( 'wp_inactive_widgets' == $k || 'orphaned_widgets' == substr( $k, 0, 16 ) ) 373 continue; 374 if ( is_array($v) ) 375 $num_widgets = $num_widgets + count($v); 376 } 377 $num = number_format_i18n( $num_widgets ); 378 379 $switch_themes = $theme->display('Name'); 380 if ( current_user_can( 'switch_themes') ) 381 $switch_themes = '<a href="themes.php">' . $switch_themes . '</a>'; 382 if ( current_user_can( 'edit_theme_options' ) ) { 383 printf(_n('Theme <span class="b">%1$s</span> with <span class="b"><a href="widgets.php">%2$s Widget</a></span>', 'Theme <span class="b">%1$s</span> with <span class="b"><a href="widgets.php">%2$s Widgets</a></span>', $num_widgets), $switch_themes, $num); 384 } else { 385 printf(_n('Theme <span class="b">%1$s</span> with <span class="b">%2$s Widget</span>', 'Theme <span class="b">%1$s</span> with <span class="b">%2$s Widgets</span>', $num_widgets), $switch_themes, $num); 386 } 387 } else { 388 if ( current_user_can( 'switch_themes' ) ) 389 printf( __('Theme <span class="b"><a href="themes.php">%1$s</a></span>'), $theme->display('Name') ); 390 else 391 printf( __('Theme <span class="b">%1$s</span>'), $theme->display('Name') ); 392 } 393 echo '</p>'; 394 395 // Check if search engines are blocked. 396 if ( !is_network_admin() && !is_user_admin() && current_user_can('manage_options') && '1' != get_option('blog_public') ) { 397 $title = apply_filters('privacy_on_link_title', __('Your site is asking search engines not to index its content') ); 398 $content = apply_filters('privacy_on_link_text', __('Search Engines Blocked') ); 399 400 echo "<p><a href='options-privacy.php' title='$title'>$content</a></p>"; 401 } 402 403 update_right_now_message(); 404 405 echo "\n\t".'<br class="clear" /></div>'; 406 do_action( 'rightnow_end' ); 407 do_action( 'activity_box_end' ); 408 } 409 410 function wp_network_dashboard_right_now() { 411 $actions = array(); 412 if ( current_user_can('create_sites') ) 413 $actions['create-site'] = '<a href="' . network_admin_url('site-new.php') . '">' . __( 'Create a New Site' ) . '</a>'; 414 if ( current_user_can('create_users') ) 415 $actions['create-user'] = '<a href="' . network_admin_url('user-new.php') . '">' . __( 'Create a New User' ) . '</a>'; 416 417 if ( ! wp_is_large_network( 'users' ) ) 418 wp_enqueue_script( 'user-search' ); 419 420 if ( ! wp_is_large_network( 'sites' ) ) 421 wp_enqueue_script( 'site-search' ); 422 423 $c_users = get_user_count(); 424 $c_blogs = get_blog_count(); 425 426 $user_text = sprintf( _n( '%s user', '%s users', $c_users ), number_format_i18n( $c_users ) ); 427 $blog_text = sprintf( _n( '%s site', '%s sites', $c_blogs ), number_format_i18n( $c_blogs ) ); 428 429 $sentence = sprintf( __( 'You have %1$s and %2$s.' ), $blog_text, $user_text ); 430 431 if ( $actions ) { 432 echo '<ul class="subsubsub">'; 433 foreach ( $actions as $class => $action ) { 434 $actions[ $class ] = "\t<li class='$class'>$action"; 435 } 436 echo implode( " |</li>\n", $actions ) . "</li>\n"; 437 echo '</ul>'; 438 } 439 ?> 440 <br class="clear" /> 441 442 <p class="youhave"><?php echo $sentence; ?></p> 443 <?php do_action( 'wpmuadminresult', '' ); ?> 444 445 <form name="searchform" action="<?php echo network_admin_url('users.php'); ?>" method="get"> 446 <p> 447 <input type="search" name="s" value="" size="17" id="all-user-search-input" /> 448 <?php submit_button( __( 'Search Users' ), 'button', 'submit', false, array( 'id' => 'submit_users' ) ); ?> 449 </p> 450 </form> 451 452 <form name="searchform" action="<?php echo network_admin_url('sites.php'); ?>" method="get"> 453 <p> 454 <input type="search" name="s" value="" size="17" id="site-search-input" /> 455 <?php submit_button( __( 'Search Sites' ), 'button', 'submit', false, array( 'id' => 'submit_sites' ) ); ?> 456 </p> 457 </form> 458 <?php 459 do_action( 'mu_rightnow_end' ); 460 do_action( 'mu_activity_box_end' ); 461 } 462 463 function wp_dashboard_quick_press() { 464 global $post_ID; 465 466 $drafts = false; 467 if ( 'post' === strtolower( $_SERVER['REQUEST_METHOD'] ) && isset( $_POST['action'] ) && 0 === strpos( $_POST['action'], 'post-quickpress' ) && (int) $_POST['post_ID'] ) { 468 $view = get_permalink( $_POST['post_ID'] ); 469 $edit = esc_url( get_edit_post_link( $_POST['post_ID'] ) ); 470 if ( 'post-quickpress-publish' == $_POST['action'] ) { 471 if ( current_user_can('publish_posts') ) 472 printf( '<div class="updated"><p>' . __( 'Post published. <a href="%s">View post</a> | <a href="%s">Edit post</a>' ) . '</p></div>', esc_url( $view ), $edit ); 473 else 474 printf( '<div class="updated"><p>' . __( 'Post submitted. <a href="%s">Preview post</a> | <a href="%s">Edit post</a>' ) . '</p></div>', esc_url( add_query_arg( 'preview', 1, $view ) ), $edit ); 475 } else { 476 printf( '<div class="updated"><p>' . __( 'Draft saved. <a href="%s">Preview post</a> | <a href="%s">Edit post</a>' ) . '</p></div>', esc_url( add_query_arg( 'preview', 1, $view ) ), $edit ); 477 $drafts_query = new WP_Query( array( 478 'post_type' => 'post', 479 'post_status' => 'draft', 480 'author' => $GLOBALS['current_user']->ID, 481 'posts_per_page' => 1, 482 'orderby' => 'modified', 483 'order' => 'DESC' 484 ) ); 485 486 if ( $drafts_query->posts ) 487 $drafts =& $drafts_query->posts; 488 } 489 printf('<p class="textright">' . __('You can also try %s, easy blogging from anywhere on the Web.') . '</p>', '<a href="' . esc_url( admin_url( 'tools.php' ) ) . '">' . __('Press This') . '</a>' ); 490 $_REQUEST = array(); // hack for get_default_post_to_edit() 491 } 492 493 /* Check if a new auto-draft (= no new post_ID) is needed or if the old can be used */ 494 $last_post_id = (int) get_user_option( 'dashboard_quick_press_last_post_id' ); // Get the last post_ID 495 if ( $last_post_id ) { 496 $post = get_post( $last_post_id ); 497 if ( empty( $post ) || $post->post_status != 'auto-draft' ) { // auto-draft doesn't exists anymore 498 $post = get_default_post_to_edit('post', true); 499 update_user_option( (int) $GLOBALS['current_user']->ID, 'dashboard_quick_press_last_post_id', (int) $post->ID ); // Save post_ID 500 } else { 501 $post->post_title = ''; // Remove the auto draft title 502 } 503 } else { 504 $post = get_default_post_to_edit('post', true); 505 update_user_option( (int) $GLOBALS['current_user']->ID, 'dashboard_quick_press_last_post_id', (int) $post->ID ); // Save post_ID 506 } 507 508 $post_ID = (int) $post->ID; 509 ?> 510 511 <form name="post" action="<?php echo esc_url( admin_url( 'post.php' ) ); ?>" method="post" id="quick-press"> 512 <h4 id="quick-post-title"><label for="title"><?php _e('Title') ?></label></h4> 513 <div class="input-text-wrap"> 514 <input type="text" name="post_title" id="title" tabindex="1" autocomplete="off" value="<?php echo esc_attr( $post->post_title ); ?>" /> 515 </div> 516 517 <?php if ( current_user_can( 'upload_files' ) ) : ?> 518 <div id="wp-content-wrap" class="wp-editor-wrap hide-if-no-js wp-media-buttons"> 519 <?php do_action( 'media_buttons', 'content' ); ?> 520 </div> 521 <?php endif; ?> 522 523 <h4 id="content-label"><label for="content"><?php _e('Content') ?></label></h4> 524 <div class="textarea-wrap"> 525 <textarea name="content" id="content" class="mceEditor" rows="3" cols="15" tabindex="2"><?php echo esc_textarea( $post->post_content ); ?></textarea> 526 </div> 527 528 <script type="text/javascript">edCanvas = document.getElementById('content');edInsertContent = null;</script> 529 530 <h4><label for="tags-input"><?php _e('Tags') ?></label></h4> 531 <div class="input-text-wrap"> 532 <input type="text" name="tags_input" id="tags-input" tabindex="3" value="<?php echo get_tags_to_edit( $post->ID ); ?>" /> 533 </div> 534 535 <p class="submit"> 536 <input type="hidden" name="action" id="quickpost-action" value="post-quickpress-save" /> 537 <input type="hidden" name="post_ID" value="<?php echo $post_ID; ?>" /> 538 <input type="hidden" name="post_type" value="post" /> 539 <?php wp_nonce_field('add-post'); ?> 540 <?php submit_button( __( 'Save Draft' ), 'button', 'save', false, array( 'id' => 'save-post', 'tabindex'=> 4 ) ); ?> 541 <input type="reset" value="<?php esc_attr_e( 'Reset' ); ?>" class="button" /> 542 <span id="publishing-action"> 543 <input type="submit" name="publish" id="publish" accesskey="p" tabindex="5" class="button-primary" value="<?php current_user_can('publish_posts') ? esc_attr_e('Publish') : esc_attr_e('Submit for Review'); ?>" /> 544 <img class="waiting" src="<?php echo esc_url( admin_url( 'images/wpspin_light.gif' ) ); ?>" alt="" /> 545 </span> 546 <br class="clear" /> 547 </p> 548 549 </form> 550 551 <?php 552 if ( $drafts ) 553 wp_dashboard_recent_drafts( $drafts ); 554 } 555 556 function wp_dashboard_recent_drafts( $drafts = false ) { 557 if ( !$drafts ) { 558 $drafts_query = new WP_Query( array( 559 'post_type' => 'post', 560 'post_status' => 'draft', 561 'author' => $GLOBALS['current_user']->ID, 562 'posts_per_page' => 5, 563 'orderby' => 'modified', 564 'order' => 'DESC' 565 ) ); 566 $drafts =& $drafts_query->posts; 567 } 568 569 if ( $drafts && is_array( $drafts ) ) { 570 $list = array(); 571 foreach ( $drafts as $draft ) { 572 $url = get_edit_post_link( $draft->ID ); 573 $title = _draft_or_post_title( $draft->ID ); 574 $item = "<h4><a href='$url' title='" . sprintf( __( 'Edit “%s”' ), esc_attr( $title ) ) . "'>" . esc_html($title) . "</a> <abbr title='" . get_the_time(__('Y/m/d g:i:s A'), $draft) . "'>" . get_the_time( get_option( 'date_format' ), $draft ) . '</abbr></h4>'; 575 if ( $the_content = preg_split( '#\s#', strip_tags( $draft->post_content ), 11, PREG_SPLIT_NO_EMPTY ) ) 576 $item .= '<p>' . join( ' ', array_slice( $the_content, 0, 10 ) ) . ( 10 < count( $the_content ) ? '…' : '' ) . '</p>'; 577 $list[] = $item; 578 } 579 ?> 580 <ul> 581 <li><?php echo join( "</li>\n<li>", $list ); ?></li> 582 </ul> 583 <p class="textright"><a href="edit.php?post_status=draft" ><?php _e('View all'); ?></a></p> 584 <?php 585 } else { 586 _e('There are no drafts at the moment'); 587 } 588 } 589 590 /** 591 * Display recent comments dashboard widget content. 592 * 593 * @since 2.5.0 594 */ 595 function wp_dashboard_recent_comments() { 596 global $wpdb; 597 598 // Select all comment types and filter out spam later for better query performance. 599 $comments = array(); 600 $start = 0; 601 602 $widgets = get_option( 'dashboard_widget_options' ); 603 $total_items = isset( $widgets['dashboard_recent_comments'] ) && isset( $widgets['dashboard_recent_comments']['items'] ) 604 ? absint( $widgets['dashboard_recent_comments']['items'] ) : 5; 605 606 $comments_query = array( 'number' => $total_items * 5, 'offset' => 0 ); 607 if ( ! current_user_can( 'edit_posts' ) ) 608 $comments_query['status'] = 'approve'; 609 610 while ( count( $comments ) < $total_items && $possible = get_comments( $comments_query ) ) { 611 foreach ( $possible as $comment ) { 612 if ( ! current_user_can( 'read_post', $comment->comment_post_ID ) ) 613 continue; 614 $comments[] = $comment; 615 if ( count( $comments ) == $total_items ) 616 break 2; 617 } 618 $comments_query['offset'] += $comments_query['number']; 619 $comments_query['number'] = $total_items * 10; 620 } 621 622 if ( $comments ) { 623 echo '<div id="the-comment-list" class="list:comment">'; 624 foreach ( $comments as $comment ) 625 _wp_dashboard_recent_comments_row( $comment ); 626 echo '</div>'; 627 628 if ( current_user_can('edit_posts') ) 629 _get_list_table('WP_Comments_List_Table')->views(); 630 631 wp_comment_reply( -1, false, 'dashboard', false ); 632 wp_comment_trashnotice(); 633 } else { 634 echo '<p>' . __( 'No comments yet.' ) . '</p>'; 635 } 636 } 637 638 function _wp_dashboard_recent_comments_row( &$comment, $show_date = true ) { 639 $GLOBALS['comment'] =& $comment; 640 641 $comment_post_url = get_edit_post_link( $comment->comment_post_ID ); 642 $comment_post_title = strip_tags(get_the_title( $comment->comment_post_ID )); 643 $comment_post_link = "<a href='$comment_post_url'>$comment_post_title</a>"; 644 $comment_link = '<a class="comment-link" href="' . esc_url(get_comment_link()) . '">#</a>'; 645 646 $actions_string = ''; 647 if ( current_user_can( 'edit_comment', $comment->comment_ID ) ) { 648 // preorder it: Approve | Reply | Edit | Spam | Trash 649 $actions = array( 650 'approve' => '', 'unapprove' => '', 651 'reply' => '', 652 'edit' => '', 653 'spam' => '', 654 'trash' => '', 'delete' => '' 655 ); 656 657 $del_nonce = esc_html( '_wpnonce=' . wp_create_nonce( "delete-comment_$comment->comment_ID" ) ); 658 $approve_nonce = esc_html( '_wpnonce=' . wp_create_nonce( "approve-comment_$comment->comment_ID" ) ); 659 660 $approve_url = esc_url( "comment.php?action=approvecomment&p=$comment->comment_post_ID&c=$comment->comment_ID&$approve_nonce" ); 661 $unapprove_url = esc_url( "comment.php?action=unapprovecomment&p=$comment->comment_post_ID&c=$comment->comment_ID&$approve_nonce" ); 662 $spam_url = esc_url( "comment.php?action=spamcomment&p=$comment->comment_post_ID&c=$comment->comment_ID&$del_nonce" ); 663 $trash_url = esc_url( "comment.php?action=trashcomment&p=$comment->comment_post_ID&c=$comment->comment_ID&$del_nonce" ); 664 $delete_url = esc_url( "comment.php?action=deletecomment&p=$comment->comment_post_ID&c=$comment->comment_ID&$del_nonce" ); 665 666 $actions['approve'] = "<a href='$approve_url' class='dim:the-comment-list:comment-$comment->comment_ID:unapproved:e7e7d3:e7e7d3:new=approved vim-a' title='" . esc_attr__( 'Approve this comment' ) . "'>" . __( 'Approve' ) . '</a>'; 667 $actions['unapprove'] = "<a href='$unapprove_url' class='dim:the-comment-list:comment-$comment->comment_ID:unapproved:e7e7d3:e7e7d3:new=unapproved vim-u' title='" . esc_attr__( 'Unapprove this comment' ) . "'>" . __( 'Unapprove' ) . '</a>'; 668 $actions['edit'] = "<a href='comment.php?action=editcomment&c={$comment->comment_ID}' title='" . esc_attr__('Edit comment') . "'>". __('Edit') . '</a>'; 669 $actions['reply'] = '<a onclick="commentReply.open(\''.$comment->comment_ID.'\',\''.$comment->comment_post_ID.'\');return false;" class="vim-r hide-if-no-js" title="'.esc_attr__('Reply to this comment').'" href="#">' . __('Reply') . '</a>'; 670 $actions['spam'] = "<a href='$spam_url' class='delete:the-comment-list:comment-$comment->comment_ID::spam=1 vim-s vim-destructive' title='" . esc_attr__( 'Mark this comment as spam' ) . "'>" . /* translators: mark as spam link */ _x( 'Spam', 'verb' ) . '</a>'; 671 if ( !EMPTY_TRASH_DAYS ) 672 $actions['delete'] = "<a href='$delete_url' class='delete:the-comment-list:comment-$comment->comment_ID::trash=1 delete vim-d vim-destructive'>" . __('Delete Permanently') . '</a>'; 673 else 674 $actions['trash'] = "<a href='$trash_url' class='delete:the-comment-list:comment-$comment->comment_ID::trash=1 delete vim-d vim-destructive' title='" . esc_attr__( 'Move this comment to the trash' ) . "'>" . _x('Trash', 'verb') . '</a>'; 675 676 $actions = apply_filters( 'comment_row_actions', array_filter($actions), $comment ); 677 678 $i = 0; 679 foreach ( $actions as $action => $link ) { 680 ++$i; 681 ( ( ('approve' == $action || 'unapprove' == $action) && 2 === $i ) || 1 === $i ) ? $sep = '' : $sep = ' | '; 682 683 // Reply and quickedit need a hide-if-no-js span 684 if ( 'reply' == $action || 'quickedit' == $action ) 685 $action .= ' hide-if-no-js'; 686 687 $actions_string .= "<span class='$action'>$sep$link</span>"; 688 } 689 } 690 691 ?> 692 693 <div id="comment-<?php echo $comment->comment_ID; ?>" <?php comment_class( array( 'comment-item', wp_get_comment_status($comment->comment_ID) ) ); ?>> 694 <?php if ( !$comment->comment_type || 'comment' == $comment->comment_type ) : ?> 695 696 <?php echo get_avatar( $comment, 50 ); ?> 697 698 <div class="dashboard-comment-wrap"> 699 <h4 class="comment-meta"> 700 <?php printf( /* translators: 1: comment author, 2: post link, 3: notification if the comment is pending */__( 'From %1$s on %2$s%3$s' ), 701 '<cite class="comment-author">' . get_comment_author_link() . '</cite>', $comment_post_link.' '.$comment_link, ' <span class="approve">' . __( '[Pending]' ) . '</span>' ); ?> 702 </h4> 703 704 <?php 705 else : 706 switch ( $comment->comment_type ) : 707 case 'pingback' : 708 $type = __( 'Pingback' ); 709 break; 710 case 'trackback' : 711 $type = __( 'Trackback' ); 712 break; 713 default : 714 $type = ucwords( $comment->comment_type ); 715 endswitch; 716 $type = esc_html( $type ); 717 ?> 718 <div class="dashboard-comment-wrap"> 719 <?php /* translators: %1$s is type of comment, %2$s is link to the post */ ?> 720 <h4 class="comment-meta"><?php printf( _x( '%1$s on %2$s', 'dashboard' ), "<strong>$type</strong>", $comment_post_link." ".$comment_link ); ?></h4> 721 <p class="comment-author"><?php comment_author_link(); ?></p> 722 723 <?php endif; // comment_type ?> 724 <blockquote><p><?php comment_excerpt(); ?></p></blockquote> 725 <p class="row-actions"><?php echo $actions_string; ?></p> 726 </div> 727 </div> 728 <?php 729 } 730 731 /** 732 * The recent comments dashboard widget control. 733 * 734 * @since 3.0.0 735 */ 736 function wp_dashboard_recent_comments_control() { 737 if ( !$widget_options = get_option( 'dashboard_widget_options' ) ) 738 $widget_options = array(); 739 740 if ( !isset($widget_options['dashboard_recent_comments']) ) 741 $widget_options['dashboard_recent_comments'] = array(); 742 743 if ( 'POST' == $_SERVER['REQUEST_METHOD'] && isset($_POST['widget-recent-comments']) ) { 744 $number = absint( $_POST['widget-recent-comments']['items'] ); 745 $widget_options['dashboard_recent_comments']['items'] = $number; 746 update_option( 'dashboard_widget_options', $widget_options ); 747 } 748 749 $number = isset( $widget_options['dashboard_recent_comments']['items'] ) ? (int) $widget_options['dashboard_recent_comments']['items'] : ''; 750 751 echo '<p><label for="comments-number">' . __('Number of comments to show:') . '</label>'; 752 echo '<input id="comments-number" name="widget-recent-comments[items]" type="text" value="' . $number . '" size="3" /></p>'; 753 } 754 755 function wp_dashboard_incoming_links() { 756 wp_dashboard_cached_rss_widget( 'dashboard_incoming_links', 'wp_dashboard_incoming_links_output' ); 757 } 758 759 /** 760 * Display incoming links dashboard widget content. 761 * 762 * @since 2.5.0 763 */ 764 function wp_dashboard_incoming_links_output() { 765 $widgets = get_option( 'dashboard_widget_options' ); 766 @extract( @$widgets['dashboard_incoming_links'], EXTR_SKIP ); 767 $rss = fetch_feed( $url ); 768 769 if ( is_wp_error($rss) ) { 770 if ( is_admin() || current_user_can('manage_options') ) { 771 echo '<p>'; 772 printf(__('<strong>RSS Error</strong>: %s'), $rss->get_error_message()); 773 echo '</p>'; 774 } 775 return; 776 } 777 778 if ( !$rss->get_item_quantity() ) { 779 echo '<p>' . __('This dashboard widget queries <a href="http://blogsearch.google.com/">Google Blog Search</a> so that when another blog links to your site it will show up here. It has found no incoming links… yet. It’s okay — there is no rush.') . "</p>\n"; 780 $rss->__destruct(); 781 unset($rss); 782 return; 783 } 784 785 echo "<ul>\n"; 786 787 if ( !isset($items) ) 788 $items = 10; 789 790 foreach ( $rss->get_items(0, $items) as $item ) { 791 $publisher = ''; 792 $site_link = ''; 793 $link = ''; 794 $content = ''; 795 $date = ''; 796 $link = esc_url( strip_tags( $item->get_link() ) ); 797 798 $author = $item->get_author(); 799 if ( $author ) { 800 $site_link = esc_url( strip_tags( $author->get_link() ) ); 801 802 if ( !$publisher = esc_html( strip_tags( $author->get_name() ) ) ) 803 $publisher = __( 'Somebody' ); 804 } else { 805 $publisher = __( 'Somebody' ); 806 } 807 if ( $site_link ) 808 $publisher = "<a href='$site_link'>$publisher</a>"; 809 else 810 $publisher = "<strong>$publisher</strong>"; 811 812 $content = $item->get_content(); 813 $content = wp_html_excerpt($content, 50) . ' ...'; 814 815 if ( $link ) 816 /* translators: incoming links feed, %1$s is other person, %3$s is content */ 817 $text = __( '%1$s linked here <a href="%2$s">saying</a>, "%3$s"' ); 818 else 819 /* translators: incoming links feed, %1$s is other person, %3$s is content */ 820 $text = __( '%1$s linked here saying, "%3$s"' ); 821 822 if ( !empty($show_date) ) { 823 if ( !empty($show_author) || !empty($show_summary) ) 824 /* translators: incoming links feed, %4$s is the date */ 825 $text .= ' ' . __( 'on %4$s' ); 826 $date = esc_html( strip_tags( $item->get_date() ) ); 827 $date = strtotime( $date ); 828 $date = gmdate( get_option( 'date_format' ), $date ); 829 } 830 831 echo "\t<li>" . sprintf( $text, $publisher, $link, $content, $date ) . "</li>\n"; 832 } 833 834 echo "</ul>\n"; 835 $rss->__destruct(); 836 unset($rss); 837 } 838 839 function wp_dashboard_incoming_links_control() { 840 wp_dashboard_rss_control( 'dashboard_incoming_links', array( 'title' => false, 'show_summary' => false, 'show_author' => false ) ); 841 } 842 843 function wp_dashboard_primary() { 844 wp_dashboard_cached_rss_widget( 'dashboard_primary', 'wp_dashboard_rss_output' ); 845 } 846 847 function wp_dashboard_primary_control() { 848 wp_dashboard_rss_control( 'dashboard_primary' ); 849 } 850 851 /** 852 * {@internal Missing Short Description}} 853 * 854 * @since 2.5.0 855 * 856 * @param string $widget_id 857 */ 858 function wp_dashboard_rss_output( $widget_id ) { 859 $widgets = get_option( 'dashboard_widget_options' ); 860 echo '<div class="rss-widget">'; 861 wp_widget_rss_output( $widgets[$widget_id] ); 862 echo "</div>"; 863 } 864 865 function wp_dashboard_secondary() { 866 wp_dashboard_cached_rss_widget( 'dashboard_secondary', 'wp_dashboard_secondary_output' ); 867 } 868 869 function wp_dashboard_secondary_control() { 870 wp_dashboard_rss_control( 'dashboard_secondary' ); 871 } 872 873 /** 874 * Display secondary dashboard RSS widget feed. 875 * 876 * @since 2.5.0 877 * 878 * @return unknown 879 */ 880 function wp_dashboard_secondary_output() { 881 $widgets = get_option( 'dashboard_widget_options' ); 882 @extract( @$widgets['dashboard_secondary'], EXTR_SKIP ); 883 $rss = @fetch_feed( $url ); 884 885 if ( is_wp_error($rss) ) { 886 if ( is_admin() || current_user_can('manage_options') ) { 887 echo '<div class="rss-widget"><p>'; 888 printf(__('<strong>RSS Error</strong>: %s'), $rss->get_error_message()); 889 echo '</p></div>'; 890 } 891 } elseif ( !$rss->get_item_quantity() ) { 892 $rss->__destruct(); 893 unset($rss); 894 return false; 895 } else { 896 echo '<div class="rss-widget">'; 897 wp_widget_rss_output( $rss, $widgets['dashboard_secondary'] ); 898 echo '</div>'; 899 $rss->__destruct(); 900 unset($rss); 901 } 902 } 903 904 function wp_dashboard_plugins() { 905 wp_dashboard_cached_rss_widget( 'dashboard_plugins', 'wp_dashboard_plugins_output', array( 906 'http://wordpress.org/extend/plugins/rss/browse/popular/', 907 'http://wordpress.org/extend/plugins/rss/browse/new/' 908 ) ); 909 } 910 911 /** 912 * Display plugins most popular, newest plugins, and recently updated widget text. 913 * 914 * @since 2.5.0 915 */ 916 function wp_dashboard_plugins_output() { 917 $popular = fetch_feed( 'http://wordpress.org/extend/plugins/rss/browse/popular/' ); 918 $new = fetch_feed( 'http://wordpress.org/extend/plugins/rss/browse/new/' ); 919 920 if ( false === $plugin_slugs = get_transient( 'plugin_slugs' ) ) { 921 $plugin_slugs = array_keys( get_plugins() ); 922 set_transient( 'plugin_slugs', $plugin_slugs, 86400 ); 923 } 924 925 foreach ( array( 'popular' => __('Most Popular'), 'new' => __('Newest Plugins') ) as $feed => $label ) { 926 if ( is_wp_error($$feed) || !$$feed->get_item_quantity() ) 927 continue; 928 929 $items = $$feed->get_items(0, 5); 930 931 // Pick a random, non-installed plugin 932 while ( true ) { 933 // Abort this foreach loop iteration if there's no plugins left of this type 934 if ( 0 == count($items) ) 935 continue 2; 936 937 $item_key = array_rand($items); 938 $item = $items[$item_key]; 939 940 list($link, $frag) = explode( '#', $item->get_link() ); 941 942 $link = esc_url($link); 943 if ( preg_match( '|/([^/]+?)/?$|', $link, $matches ) ) 944 $slug = $matches[1]; 945 else { 946 unset( $items[$item_key] ); 947 continue; 948 } 949 950 // Is this random plugin's slug already installed? If so, try again. 951 reset( $plugin_slugs ); 952 foreach ( $plugin_slugs as $plugin_slug ) { 953 if ( $slug == substr( $plugin_slug, 0, strlen( $slug ) ) ) { 954 unset( $items[$item_key] ); 955 continue 2; 956 } 957 } 958 959 // If we get to this point, then the random plugin isn't installed and we can stop the while(). 960 break; 961 } 962 963 // Eliminate some common badly formed plugin descriptions 964 while ( ( null !== $item_key = array_rand($items) ) && false !== strpos( $items[$item_key]->get_description(), 'Plugin Name:' ) ) 965 unset($items[$item_key]); 966 967 if ( !isset($items[$item_key]) ) 968 continue; 969 970 // current bbPress feed item titles are: user on "topic title" 971 if ( preg_match( '/"(.*)"/s', $item->get_title(), $matches ) ) 972 $title = $matches[1]; 973 else // but let's make it forward compatible if things change 974 $title = $item->get_title(); 975 $title = esc_html( $title ); 976 977 $description = esc_html( strip_tags(@html_entity_decode($item->get_description(), ENT_QUOTES, get_option('blog_charset'))) ); 978 979 $ilink = wp_nonce_url('plugin-install.php?tab=plugin-information&plugin=' . $slug, 'install-plugin_' . $slug) . 980 '&TB_iframe=true&width=600&height=800'; 981 982 echo "<h4>$label</h4>\n"; 983 echo "<h5><a href='$link'>$title</a></h5> <span>(<a href='$ilink' class='thickbox' title='$title'>" . __( 'Install' ) . "</a>)</span>\n"; 984 echo "<p>$description</p>\n"; 985 986 $$feed->__destruct(); 987 unset($$feed); 988 } 989 } 990 991 /** 992 * Checks to see if all of the feed url in $check_urls are cached. 993 * 994 * If $check_urls is empty, look for the rss feed url found in the dashboard 995 * widget options of $widget_id. If cached, call $callback, a function that 996 * echoes out output for this widget. If not cache, echo a "Loading..." stub 997 * which is later replaced by AJAX call (see top of /wp-admin/index.php) 998 * 999 * @since 2.5.0 1000 * 1001 * @param string $widget_id 1002 * @param callback $callback 1003 * @param array $check_urls RSS feeds 1004 * @return bool False on failure. True on success. 1005 */ 1006 function wp_dashboard_cached_rss_widget( $widget_id, $callback, $check_urls = array() ) { 1007 $loading = '<p class="widget-loading hide-if-no-js">' . __( 'Loading…' ) . '</p><p class="hide-if-js">' . __( 'This widget requires JavaScript.' ) . '</p>'; 1008 $doing_ajax = ( defined('DOING_AJAX') && DOING_AJAX ); 1009 1010 if ( empty($check_urls) ) { 1011 $widgets = get_option( 'dashboard_widget_options' ); 1012 if ( empty($widgets[$widget_id]['url']) && ! $doing_ajax ) { 1013 echo $loading; 1014 return false; 1015 } 1016 $check_urls = array( $widgets[$widget_id]['url'] ); 1017 } 1018 1019 $cache_key = 'dash_' . md5( $widget_id ); 1020 if ( false !== ( $output = get_transient( $cache_key ) ) ) { 1021 echo $output; 1022 return true; 1023 } 1024 1025 if ( ! $doing_ajax ) { 1026 echo $loading; 1027 return false; 1028 } 1029 1030 if ( $callback && is_callable( $callback ) ) { 1031 $args = array_slice( func_get_args(), 2 ); 1032 array_unshift( $args, $widget_id ); 1033 ob_start(); 1034 call_user_func_array( $callback, $args ); 1035 set_transient( $cache_key, ob_get_flush(), 43200); // Default lifetime in cache of 12 hours (same as the feeds) 1036 } 1037 1038 return true; 1039 } 1040 1041 /* Dashboard Widgets Controls */ 1042 1043 // Calls widget_control callback 1044 /** 1045 * Calls widget control callback. 1046 * 1047 * @since 2.5.0 1048 * 1049 * @param int $widget_control_id Registered Widget ID. 1050 */ 1051 function wp_dashboard_trigger_widget_control( $widget_control_id = false ) { 1052 global $wp_dashboard_control_callbacks; 1053 1054 if ( is_scalar($widget_control_id) && $widget_control_id && isset($wp_dashboard_control_callbacks[$widget_control_id]) && is_callable($wp_dashboard_control_callbacks[$widget_control_id]) ) { 1055 call_user_func( $wp_dashboard_control_callbacks[$widget_control_id], '', array( 'id' => $widget_control_id, 'callback' => $wp_dashboard_control_callbacks[$widget_control_id] ) ); 1056 } 1057 } 1058 1059 /** 1060 * The RSS dashboard widget control. 1061 * 1062 * Sets up $args to be used as input to wp_widget_rss_form(). Handles POST data 1063 * from RSS-type widgets. 1064 * 1065 * @since 2.5.0 1066 * 1067 * @param string $widget_id 1068 * @param array $form_inputs 1069 */ 1070 function wp_dashboard_rss_control( $widget_id, $form_inputs = array() ) { 1071 if ( !$widget_options = get_option( 'dashboard_widget_options' ) ) 1072 $widget_options = array(); 1073 1074 if ( !isset($widget_options[$widget_id]) ) 1075 $widget_options[$widget_id] = array(); 1076 1077 $number = 1; // Hack to use wp_widget_rss_form() 1078 $widget_options[$widget_id]['number'] = $number; 1079 1080 if ( 'POST' == $_SERVER['REQUEST_METHOD'] && isset($_POST['widget-rss'][$number]) ) { 1081 $_POST['widget-rss'][$number] = stripslashes_deep( $_POST['widget-rss'][$number] ); 1082 $widget_options[$widget_id] = wp_widget_rss_process( $_POST['widget-rss'][$number] ); 1083 // title is optional. If black, fill it if possible 1084 if ( !$widget_options[$widget_id]['title'] && isset($_POST['widget-rss'][$number]['title']) ) { 1085 $rss = fetch_feed($widget_options[$widget_id]['url']); 1086 if ( is_wp_error($rss) ) { 1087 $widget_options[$widget_id]['title'] = htmlentities(__('Unknown Feed')); 1088 } else { 1089 $widget_options[$widget_id]['title'] = htmlentities(strip_tags($rss->get_title())); 1090 $rss->__destruct(); 1091 unset($rss); 1092 } 1093 } 1094 update_option( 'dashboard_widget_options', $widget_options ); 1095 $cache_key = 'dash_' . md5( $widget_id ); 1096 delete_transient( $cache_key ); 1097 } 1098 1099 wp_widget_rss_form( $widget_options[$widget_id], $form_inputs ); 1100 } 1101 1102 // Display File upload quota on dashboard 1103 function wp_dashboard_quota() { 1104 if ( !is_multisite() || !current_user_can('upload_files') || get_site_option( 'upload_space_check_disabled' ) ) 1105 return true; 1106 1107 $quota = get_space_allowed(); 1108 $used = get_dirsize( BLOGUPLOADDIR ) / 1024 / 1024; 1109 1110 if ( $used > $quota ) 1111 $percentused = '100'; 1112 else 1113 $percentused = ( $used / $quota ) * 100; 1114 $used_color = ( $percentused >= 70 ) ? ' spam' : ''; 1115 $used = round( $used, 2 ); 1116 $percentused = number_format( $percentused ); 1117 1118 ?> 1119 <p class="sub musub"><?php _e( 'Storage Space' ); ?></p> 1120 <div class="table table_content musubtable"> 1121 <table> 1122 <tr class="first"> 1123 <td class="first b b-posts"><?php printf( __( '<a href="%1$s" title="Manage Uploads" class="musublink">%2$sMB</a>' ), esc_url( admin_url( 'upload.php' ) ), $quota ); ?></td> 1124 <td class="t posts"><?php _e( 'Space Allowed' ); ?></td> 1125 </tr> 1126 </table> 1127 </div> 1128 <div class="table table_discussion musubtable"> 1129 <table> 1130 <tr class="first"> 1131 <td class="b b-comments"><?php printf( __( '<a href="%1$s" title="Manage Uploads" class="musublink">%2$sMB (%3$s%%)</a>' ), esc_url( admin_url( 'upload.php' ) ), $used, $percentused ); ?></td> 1132 <td class="last t comments<?php echo $used_color;?>"><?php _e( 'Space Used' );?></td> 1133 </tr> 1134 </table> 1135 </div> 1136 <br class="clear" /> 1137 <?php 1138 } 1139 add_action( 'activity_box_end', 'wp_dashboard_quota' ); 1140 1141 // Display Browser Nag Meta Box 1142 function wp_dashboard_browser_nag() { 1143 $notice = ''; 1144 $response = wp_check_browser_version(); 1145 1146 if ( $response ) { 1147 if ( $response['insecure'] ) { 1148 $msg = sprintf( __( "It looks like you're using an insecure version of <a href='%s'>%s</a>. Using an outdated browser makes your computer unsafe. For the best WordPress experience, please update your browser." ), esc_attr( $response['update_url'] ), esc_html( $response['name'] ) ); 1149 } else { 1150 $msg = sprintf( __( "It looks like you're using an old version of <a href='%s'>%s</a>. For the best WordPress experience, please update your browser." ), esc_attr( $response['update_url'] ), esc_html( $response['name'] ) ); 1151 } 1152 1153 $browser_nag_class = ''; 1154 if ( !empty( $response['img_src'] ) ) { 1155 $img_src = ( is_ssl() && ! empty( $response['img_src_ssl'] ) )? $response['img_src_ssl'] : $response['img_src']; 1156 1157 $notice .= '<div class="alignright browser-icon"><a href="' . esc_attr($response['update_url']) . '"><img src="' . esc_attr( $img_src ) . '" alt="" /></a></div>'; 1158 $browser_nag_class = ' has-browser-icon'; 1159 } 1160 $notice .= "<p class='browser-update-nag{$browser_nag_class}'>{$msg}</p>"; 1161 1162 $browsehappy = 'http://browsehappy.com/'; 1163 $locale = get_locale(); 1164 if ( 'en_US' !== $locale ) 1165 $browsehappy = add_query_arg( 'locale', $locale, $browsehappy ); 1166 1167 $notice .= '<p>' . sprintf( __( '<a href="%1$s" class="update-browser-link">Update %2$s</a> or learn how to <a href="%3$s" class="browse-happy-link">browse happy</a>' ), esc_attr( $response['update_url'] ), esc_html( $response['name'] ), esc_url( $browsehappy ) ) . '</p>'; 1168 $notice .= '<p class="hide-if-no-js"><a href="" class="dismiss">' . __( 'Dismiss' ) . '</a></p>'; 1169 $notice .= '<div class="clear"></div>'; 1170 } 1171 1172 echo apply_filters( 'browse-happy-notice', $notice, $response ); 1173 } 1174 1175 function dashboard_browser_nag_class( $classes ) { 1176 $response = wp_check_browser_version(); 1177 1178 if ( $response && $response['insecure'] ) 1179 $classes[] = 'browser-insecure'; 1180 1181 return $classes; 1182 } 1183 1184 /** 1185 * Check if the user needs a browser update 1186 * 1187 * @since 3.2.0 1188 * 1189 * @return array|bool False on failure, array of browser data on success. 1190 */ 1191 function wp_check_browser_version() { 1192 if ( empty( $_SERVER['HTTP_USER_AGENT'] ) ) 1193 return false; 1194 1195 $key = md5( $_SERVER['HTTP_USER_AGENT'] ); 1196 1197 if ( false === ($response = get_site_transient('browser_' . $key) ) ) { 1198 global $wp_version; 1199 1200 $options = array( 1201 'body' => array( 'useragent' => $_SERVER['HTTP_USER_AGENT'] ), 1202 'user-agent' => 'WordPress/' . $wp_version . '; ' . home_url() 1203 ); 1204 1205 $response = wp_remote_post( 'http://api.wordpress.org/core/browse-happy/1.0/', $options ); 1206 1207 if ( is_wp_error( $response ) || 200 != wp_remote_retrieve_response_code( $response ) ) 1208 return false; 1209 1210 /** 1211 * Response should be an array with: 1212 * 'name' - string - A user friendly browser name 1213 * 'version' - string - The most recent version of the browser 1214 * 'current_version' - string - The version of the browser the user is using 1215 * 'upgrade' - boolean - Whether the browser needs an upgrade 1216 * 'insecure' - boolean - Whether the browser is deemed insecure 1217 * 'upgrade_url' - string - The url to visit to upgrade 1218 * 'img_src' - string - An image representing the browser 1219 * 'img_src_ssl' - string - An image (over SSL) representing the browser 1220 */ 1221 $response = maybe_unserialize( wp_remote_retrieve_body( $response ) ); 1222 1223 if ( ! is_array( $response ) ) 1224 return false; 1225 1226 set_site_transient( 'browser_' . $key, $response, 604800 ); // cache for 1 week 1227 } 1228 1229 return $response; 1230 } 1231 1232 /** 1233 * Empty function usable by plugins to output empty dashboard widget (to be populated later by JS). 1234 */ 1235 function wp_dashboard_empty() {} 1236 1237 /** 1238 * Displays a welcome panel to introduce users to WordPress. 1239 * 1240 * @since 3.3.0 1241 */ 1242 function wp_welcome_panel() { 1243 global $wp_version; 1244 1245 if ( ! current_user_can( 'edit_theme_options' ) ) 1246 return; 1247 1248 $classes = 'welcome-panel'; 1249 1250 $option = get_user_meta( get_current_user_id(), 'show_welcome_panel', true ); 1251 // 0 = hide, 1 = toggled to show or single site creator, 2 = multisite site owner 1252 $hide = 0 == $option || ( 2 == $option && wp_get_current_user()->user_email != get_option( 'admin_email' ) ); 1253 if ( $hide ) 1254 $classes .= ' hidden'; 1255 1256 list( $display_version ) = explode( '-', $wp_version ); 1257 ?> 1258 <div id="welcome-panel" class="<?php echo esc_attr( $classes ); ?>"> 1259 <?php wp_nonce_field( 'welcome-panel-nonce', 'welcomepanelnonce', false ); ?> 1260 <a class="welcome-panel-close" href="<?php echo esc_url( admin_url( '?welcome=0' ) ); ?>"><?php _e('Dismiss'); ?></a> 1261 <div class="wp-badge"><?php printf( __( 'Version %s' ), $display_version ); ?></div> 1262 1263 <div class="welcome-panel-content"> 1264 <h3><?php _e( 'Welcome to your new WordPress site!' ); ?></h3> 1265 <p class="about-description"><?php _e( 'If you need help getting started, check out our documentation on <a href="http://codex.wordpress.org/First_Steps_With_WordPress">First Steps with WordPress</a>. If you’d rather dive right in, here are a few things most people do first when they set up a new WordPress site. If you need help, use the Help tabs in the upper right corner to get information on how to use your current screen and where to go for more assistance.' ); ?></p> 1266 <div class="welcome-panel-column-container"> 1267 <div class="welcome-panel-column"> 1268 <h4><span class="icon16 icon-settings"></span> <?php _e( 'Basic Settings' ); ?></h4> 1269 <p><?php _e( 'Here are a few easy things you can do to get your feet wet. Make sure to click Save on each Settings screen.' ); ?></p> 1270 <ul> 1271 <li><?php echo sprintf( __( '<a href="%s">Choose your privacy setting</a>' ), esc_url( admin_url('options-privacy.php') ) ); ?></li> 1272 <li><?php echo sprintf( __( '<a href="%s">Select your tagline and time zone</a>' ), esc_url( admin_url('options-general.php') ) ); ?></li> 1273 <li><?php echo sprintf( __( '<a href="%s">Turn comments on or off</a>' ), esc_url( admin_url('options-discussion.php') ) ); ?></li> 1274 <li><?php echo sprintf( __( '<a href="%s">Fill in your profile</a>' ), esc_url( admin_url('profile.php') ) ); ?></li> 1275 </ul> 1276 </div> 1277 <div class="welcome-panel-column"> 1278 <h4><span class="icon16 icon-page"></span> <?php _e( 'Add Real Content' ); ?></h4> 1279 <p><?php _e( 'Check out the sample page & post editors to see how it all works, then delete the default content and write your own!' ); ?></p> 1280 <ul> 1281 <li><?php echo sprintf( __( 'View the <a href="%1$s">sample page</a> and <a href="%2$s">post</a>' ), esc_url( get_permalink( 2 ) ), esc_url( get_permalink( 1 ) ) ); ?></li> 1282 <li><?php echo sprintf( __( 'Delete the <a href="%1$s">sample page</a> and <a href="%2$s">post</a>' ), esc_url( admin_url('edit.php?post_type=page') ), esc_url( admin_url('edit.php') ) ); ?></li> 1283 <li><?php echo sprintf( __( '<a href="%s">Create an About Me page</a>' ), esc_url( admin_url('edit.php?post_type=page') ) ); ?></li> 1284 <li><?php echo sprintf( __( '<a href="%s">Write your first post</a>' ), esc_url( admin_url('post-new.php') ) ); ?></li> 1285 </ul> 1286 </div> 1287 <div class="welcome-panel-column welcome-panel-last"> 1288 <h4><span class="icon16 icon-appearance"></span> <?php _e( 'Customize Your Site' ); ?></h4> 1289 <?php 1290 $theme = wp_get_theme(); 1291 if ( $theme->errors() ) : 1292 echo '<p>'; 1293 printf( __( '<a href="%s">Install a theme</a> to get started customizing your site.' ), esc_url( admin_url( 'themes.php' ) ) ); 1294 echo '</p>'; 1295 else: 1296 $customize_links = array(); 1297 if ( 'twentyeleven' == $theme->get_stylesheet() ) 1298 $customize_links[] = sprintf( __( '<a href="%s">Choose light or dark</a>' ), esc_url( admin_url( 'themes.php?page=theme_options' ) ) ); 1299 1300 if ( current_theme_supports( 'custom-background' ) ) 1301 $customize_links[] = sprintf( __( '<a href="%s">Set a background color</a>' ), esc_url( admin_url( 'themes.php?page=custom-background' ) ) ); 1302 1303 if ( current_theme_supports( 'custom-header' ) ) 1304 $customize_links[] = sprintf( __( '<a href="%s">Select a new header image</a>' ), esc_url( admin_url( 'themes.php?page=custom-header' ) ) ); 1305 1306 if ( current_theme_supports( 'widgets' ) ) 1307 $customize_links[] = sprintf( __( '<a href="%s">Add some widgets</a>' ), esc_url( admin_url( 'widgets.php' ) ) ); 1308 1309 if ( ! empty( $customize_links ) ) { 1310 echo '<p>'; 1311 printf( __( 'Use the current theme — %1$s — or <a href="%2$s">choose a new one</a>. If you stick with %1$s, here are a few ways to make your site look unique.' ), $theme->display('Name'), esc_url( admin_url( 'themes.php' ) ) ); 1312 echo '</p>'; 1313 ?> 1314 <ul> 1315 <?php foreach ( $customize_links as $customize_link ) : ?> 1316 <li><?php echo $customize_link ?></li> 1317 <?php endforeach; ?> 1318 </ul> 1319 <?php 1320 } else { 1321 echo '<p>'; 1322 printf( __( 'Use the current theme — %1$s — or <a href="%2$s">choose a new one</a>.' ), $theme->display('Name'), esc_url( admin_url( 'themes.php' ) ) ); 1323 echo '</p>'; 1324 } 1325 endif; ?> 1326 </div> 1327 </div> 1328 <p class="welcome-panel-dismiss"><?php printf( __( 'Already know what you’re doing? <a href="%s">Dismiss this message</a>.' ), esc_url( admin_url( '?welcome=0' ) ) ); ?></p> 1329 </div> 1330 </div> 1331 <?php 1332 }
title
Description
Body
title
Description
Body
title
Description
Body
title
Body
| Generated: Fri May 25 03:56:23 2012 | Hosted by follow the white rabbit. |