[ Index ]

PHP Cross Reference of Wordpress 2.9.1

title

Body

[close]

/wp-admin/includes/ -> dashboard.php (source)

   1  <?php
   2  /**
   3   * WordPress Dashboard Widget Administration Panel 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 unknown
  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  
  20      $update = false;
  21      $widget_options = get_option( 'dashboard_widget_options' );
  22      if ( !$widget_options || !is_array($widget_options) )
  23          $widget_options = array();
  24  
  25      /* Register Widgets and Controls */
  26  
  27      // Right Now
  28      wp_add_dashboard_widget( 'dashboard_right_now', __( 'Right Now' ), 'wp_dashboard_right_now' );
  29  
  30      // Recent Comments Widget
  31      $recent_comments_title = __( 'Recent Comments' );
  32      wp_add_dashboard_widget( 'dashboard_recent_comments', $recent_comments_title, 'wp_dashboard_recent_comments' );
  33  
  34      // Incoming Links Widget
  35      if ( !isset( $widget_options['dashboard_incoming_links'] ) || !isset( $widget_options['dashboard_incoming_links']['home'] ) || $widget_options['dashboard_incoming_links']['home'] != get_option('home') ) {
  36          $update = true;
  37          $num_items = isset($widget_options['dashboard_incoming_links']['items']) ? $widget_options['dashboard_incoming_links']['items'] : 10;
  38          $widget_options['dashboard_incoming_links'] = array(
  39              'home' => get_option('home'),
  40              'link' => apply_filters( 'dashboard_incoming_links_link', 'http://blogsearch.google.com/blogsearch?scoring=d&partner=wordpress&q=link:' . trailingslashit( get_option('home') ) ),
  41              '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') ) ),
  42              'items' => $num_items,
  43              'show_date' => isset($widget_options['dashboard_incoming_links']['show_date']) ? $widget_options['dashboard_incoming_links']['show_date'] : false
  44          );
  45      }
  46      wp_add_dashboard_widget( 'dashboard_incoming_links', __( 'Incoming Links' ), 'wp_dashboard_incoming_links', 'wp_dashboard_incoming_links_control' );
  47  
  48      // WP Plugins Widget
  49      if ( current_user_can( 'activate_plugins' ) )
  50          wp_add_dashboard_widget( 'dashboard_plugins', __( 'Plugins' ), 'wp_dashboard_plugins' );
  51  
  52      // QuickPress Widget
  53      if ( current_user_can('edit_posts') )
  54          wp_add_dashboard_widget( 'dashboard_quick_press', __( 'QuickPress' ), 'wp_dashboard_quick_press' );
  55  
  56      // Recent Drafts
  57      if ( current_user_can('edit_posts') )
  58          wp_add_dashboard_widget( 'dashboard_recent_drafts', __('Recent Drafts'), 'wp_dashboard_recent_drafts' );
  59  
  60      // Primary feed (Dev Blog) Widget
  61      if ( !isset( $widget_options['dashboard_primary'] ) ) {
  62          $update = true;
  63          $widget_options['dashboard_primary'] = array(
  64              'link' => apply_filters( 'dashboard_primary_link',  __( 'http://wordpress.org/development/' ) ),
  65              'url' => apply_filters( 'dashboard_primary_feed',  __( 'http://wordpress.org/development/feed/' ) ),
  66              'title' => apply_filters( 'dashboard_primary_title', __( 'WordPress Development Blog' ) ),
  67              'items' => 2,
  68              'show_summary' => 1,
  69              'show_author' => 0,
  70              'show_date' => 1
  71          );
  72      }
  73      wp_add_dashboard_widget( 'dashboard_primary', $widget_options['dashboard_primary']['title'], 'wp_dashboard_primary', 'wp_dashboard_primary_control' );
  74  
  75      // Secondary Feed (Planet) Widget
  76      if ( !isset( $widget_options['dashboard_secondary'] ) ) {
  77          $update = true;
  78          $widget_options['dashboard_secondary'] = array(
  79              'link' => apply_filters( 'dashboard_secondary_link',  __( 'http://planet.wordpress.org/' ) ),
  80              'url' => apply_filters( 'dashboard_secondary_feed',  __( 'http://planet.wordpress.org/feed/' ) ),
  81              'title' => apply_filters( 'dashboard_secondary_title', __( 'Other WordPress News' ) ),
  82              'items' => 5
  83          );
  84      }
  85      wp_add_dashboard_widget( 'dashboard_secondary', $widget_options['dashboard_secondary']['title'], 'wp_dashboard_secondary', 'wp_dashboard_secondary_control' );
  86  
  87      // Hook to register new widgets
  88      do_action( 'wp_dashboard_setup' );
  89  
  90      // Filter widget order
  91      $dashboard_widgets = apply_filters( 'wp_dashboard_widgets', array() );
  92  
  93      foreach ( $dashboard_widgets as $widget_id ) {
  94          $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>';
  95          wp_add_dashboard_widget( $widget_id, $name, $wp_registered_widgets[$widget_id]['callback'], $wp_registered_widget_controls[$widget_id]['callback'] );
  96      }
  97  
  98      if ( 'POST' == $_SERVER['REQUEST_METHOD'] && isset($_POST['widget_id']) ) {
  99          ob_start(); // hack - but the same hack wp-admin/widgets.php uses
 100          wp_dashboard_trigger_widget_control( $_POST['widget_id'] );
 101          ob_end_clean();
 102          wp_redirect( remove_query_arg( 'edit' ) );
 103          exit;
 104      }
 105  
 106      if ( $update )
 107          update_option( 'dashboard_widget_options', $widget_options );
 108  
 109      do_action('do_meta_boxes', 'dashboard', 'normal', '');
 110      do_action('do_meta_boxes', 'dashboard', 'side', '');
 111  }
 112  
 113  function wp_add_dashboard_widget( $widget_id, $widget_name, $callback, $control_callback = null ) {
 114      global $wp_dashboard_control_callbacks;
 115      if ( $control_callback && current_user_can( 'edit_dashboard' ) && is_callable( $control_callback ) ) {
 116          $wp_dashboard_control_callbacks[$widget_id] = $control_callback;
 117          if ( isset( $_GET['edit'] ) && $widget_id == $_GET['edit'] ) {
 118              list($url) = explode( '#', add_query_arg( 'edit', false ), 2 );
 119              $widget_name .= ' <span class="postbox-title-action"><a href="' . esc_url( $url ) . '">' . __( 'Cancel' ) . '</a></span>';
 120              add_meta_box( $widget_id, $widget_name, '_wp_dashboard_control_callback', 'dashboard', 'normal', 'core' );
 121              return;
 122          }
 123          list($url) = explode( '#', add_query_arg( 'edit', $widget_id ), 2 );
 124          $widget_name .= ' <span class="postbox-title-action"><a href="' . esc_url( "$url#$widget_id" ) . '" class="edit-box open-box">' . __( 'Configure' ) . '</a></span>';
 125      }
 126      $side_widgets = array('dashboard_quick_press', 'dashboard_recent_drafts', 'dashboard_primary', 'dashboard_secondary');
 127      $location = 'normal';
 128      if ( in_array($widget_id, $side_widgets) )
 129          $location = 'side';
 130      add_meta_box( $widget_id, $widget_name , $callback, 'dashboard', $location, 'core' );
 131  }
 132  
 133  function _wp_dashboard_control_callback( $dashboard, $meta_box ) {
 134      echo '<form action="" method="post" class="dashboard-widget-control-form">';
 135      wp_dashboard_trigger_widget_control( $meta_box['id'] );
 136      echo '<p class="submit"><input type="hidden" name="widget_id" value="' . esc_attr($meta_box['id']) . '" /><input type="submit" value="' . esc_attr__( 'Submit' ) . '" /></p>';
 137  
 138      echo '</form>';
 139  }
 140  
 141  /**
 142   * Displays the dashboard.
 143   *
 144   * @since unknown
 145   */
 146  function wp_dashboard() {
 147      global $screen_layout_columns;
 148  
 149      $hide2 = $hide3 = $hide4 = '';
 150      switch ( $screen_layout_columns ) {
 151          case 4:
 152              $width = 'width:24.5%;';
 153              break;
 154          case 3:
 155              $width = 'width:32.67%;';
 156              $hide4 = 'display:none;';
 157              break;
 158          case 2:
 159              $width = 'width:49%;';
 160              $hide3 = $hide4 = 'display:none;';
 161              break;
 162          default:
 163              $width = 'width:98%;';
 164              $hide2 = $hide3 = $hide4 = 'display:none;';
 165      }
 166  ?>
 167  <div id="dashboard-widgets" class="metabox-holder">
 168  <?php
 169      echo "\t<div class='postbox-container' style='$width'>\n";
 170      do_meta_boxes( 'dashboard', 'normal', '' );
 171  
 172      echo "\t</div><div class='postbox-container' style='{$hide2}$width'>\n";
 173      do_meta_boxes( 'dashboard', 'side', '' );
 174  
 175      echo "\t</div><div class='postbox-container' style='{$hide3}$width'>\n";
 176      do_meta_boxes( 'dashboard', 'column3', '' );
 177  
 178      echo "\t</div><div class='postbox-container' style='{$hide4}$width'>\n";
 179      do_meta_boxes( 'dashboard', 'column4', '' );
 180  ?>
 181  </div></div>
 182  
 183  <form style="display:none" method="get" action="">
 184      <p>
 185  <?php
 186      wp_nonce_field( 'closedpostboxes', 'closedpostboxesnonce', false );
 187      wp_nonce_field( 'meta-box-order', 'meta-box-order-nonce', false );
 188  ?>
 189      </p>
 190  </form>
 191  
 192  <?php
 193  }
 194  
 195  /* Dashboard Widgets */
 196  
 197  function wp_dashboard_right_now() {
 198      global $wp_registered_sidebars;
 199  
 200      $num_posts = wp_count_posts( 'post' );
 201      $num_pages = wp_count_posts( 'page' );
 202  
 203      $num_cats  = wp_count_terms('category');
 204  
 205      $num_tags = wp_count_terms('post_tag');
 206  
 207      $num_comm = wp_count_comments( );
 208  
 209      echo "\n\t".'<p class="sub">' . __('At a Glance') . '</p>';
 210      echo "\n\t".'<div class="table">'."\n\t".'<table>';
 211      echo "\n\t".'<tr class="first">';
 212  
 213      // Posts
 214      $num = number_format_i18n( $num_posts->publish );
 215      $text = _n( 'Post', 'Posts', intval($num_posts->publish) );
 216      if ( current_user_can( 'edit_posts' ) ) {
 217          $num = "<a href='edit.php'>$num</a>";
 218          $text = "<a href='edit.php'>$text</a>";
 219      }
 220      echo '<td class="first b b-posts">' . $num . '</td>';
 221      echo '<td class="t posts">' . $text . '</td>';
 222      /* TODO: Show status breakdown on hover
 223      if ( $can_edit_pages && !empty($num_pages->publish) ) { // how many pages is not exposed in feeds.  Don't show if !current_user_can
 224          $post_type_texts[] = '<a href="edit-pages.php">'.sprintf( _n( '%s page', '%s pages', $num_pages->publish ), number_format_i18n( $num_pages->publish ) ).'</a>';
 225      }
 226      if ( $can_edit_posts && !empty($num_posts->draft) ) {
 227          $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>';
 228      }
 229      if ( $can_edit_posts && !empty($num_posts->future) ) {
 230          $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>';
 231      }
 232      if ( current_user_can('publish_posts') && !empty($num_posts->pending) ) {
 233          $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 ) );
 234      } else {
 235          $pending_text = '';
 236      }
 237      */
 238  
 239      // Total Comments
 240      $num = '<span class="total-count">' . number_format_i18n($num_comm->total_comments) . '</span>';
 241      $text = _n( 'Comment', 'Comments', $num_comm->total_comments );
 242      if ( current_user_can( 'moderate_comments' ) ) {
 243          $num = "<a href='edit-comments.php'>$num</a>";
 244          $text = "<a href='edit-comments.php'>$text</a>";
 245      }
 246      echo '<td class="b b-comments">' . $num . '</td>';
 247      echo '<td class="last t comments">' . $text . '</td>';
 248  
 249      echo '</tr><tr>';
 250  
 251      // Pages
 252      $num = number_format_i18n( $num_pages->publish );
 253      $text = _n( 'Page', 'Pages', $num_pages->publish );
 254      if ( current_user_can( 'edit_pages' ) ) {
 255          $num = "<a href='edit-pages.php'>$num</a>";
 256          $text = "<a href='edit-pages.php'>$text</a>";
 257      }
 258      echo '<td class="first b b_pages">' . $num . '</td>';
 259      echo '<td class="t pages">' . $text . '</td>';
 260  
 261      // Approved Comments
 262      $num = '<span class="approved-count">' . number_format_i18n($num_comm->approved) . '</span>';
 263      $text = _nc( 'Approved|Right Now', 'Approved', $num_comm->approved );
 264      if ( current_user_can( 'moderate_comments' ) ) {
 265          $num = "<a href='edit-comments.php?comment_status=approved'>$num</a>";
 266          $text = "<a class='approved' href='edit-comments.php?comment_status=approved'>$text</a>";
 267      }
 268      echo '<td class="b b_approved">' . $num . '</td>';
 269      echo '<td class="last t">' . $text . '</td>';
 270  
 271      echo "</tr>\n\t<tr>";
 272  
 273      // Categories
 274      $num = number_format_i18n( $num_cats );
 275      $text = _n( 'Category', 'Categories', $num_cats );
 276      if ( current_user_can( 'manage_categories' ) ) {
 277          $num = "<a href='categories.php'>$num</a>";
 278          $text = "<a href='categories.php'>$text</a>";
 279      }
 280      echo '<td class="first b b-cats">' . $num . '</td>';
 281      echo '<td class="t cats">' . $text . '</td>';
 282  
 283      // Pending Comments
 284      $num = '<span class="pending-count">' . number_format_i18n($num_comm->moderated) . '</span>';
 285      $text = _n( 'Pending', 'Pending', $num_comm->moderated );
 286      if ( current_user_can( 'moderate_comments' ) ) {
 287          $num = "<a href='edit-comments.php?comment_status=moderated'>$num</a>";
 288          $text = "<a class='waiting' href='edit-comments.php?comment_status=moderated'>$text</a>";
 289      }
 290      echo '<td class="b b-waiting">' . $num . '</td>';
 291      echo '<td class="last t">' . $text . '</td>';
 292  
 293      echo "</tr>\n\t<tr>";
 294  
 295      // Tags
 296      $num = number_format_i18n( $num_tags );
 297      $text = _n( 'Tag', 'Tags', $num_tags );
 298      if ( current_user_can( 'manage_categories' ) ) {
 299          $num = "<a href='edit-tags.php'>$num</a>";
 300          $text = "<a href='edit-tags.php'>$text</a>";
 301      }
 302      echo '<td class="first b b-tags">' . $num . '</td>';
 303      echo '<td class="t tags">' . $text . '</td>';
 304  
 305      // Spam Comments
 306      $num = number_format_i18n($num_comm->spam);
 307      $text = _n( 'Spam', 'Spam', $num_comm->spam );
 308      if ( current_user_can( 'moderate_comments' ) ) {
 309          $num = "<a href='edit-comments.php?comment_status=spam'><span class='spam-count'>$num</span></a>";
 310          $text = "<a class='spam' href='edit-comments.php?comment_status=spam'>$text</a>";
 311      }
 312      echo '<td class="b b-spam">' . $num . '</td>';
 313      echo '<td class="last t">' . $text . '</td>';
 314  
 315      echo "</tr>";
 316      do_action('right_now_table_end');
 317      echo "\n\t</table>\n\t</div>";
 318  
 319      echo "\n\t".'<div class="versions">';
 320      $ct = current_theme_info();
 321  
 322      echo "\n\t<p>";
 323      if ( !empty($wp_registered_sidebars) ) {
 324          $sidebars_widgets = wp_get_sidebars_widgets();
 325          $num_widgets = 0;
 326          foreach ( (array) $sidebars_widgets as $k => $v ) {
 327              if ( 'wp_inactive_widgets' == $k )
 328                  continue;
 329              if ( is_array($v) )
 330                  $num_widgets = $num_widgets + count($v);
 331          }
 332          $num = number_format_i18n( $num_widgets );
 333  
 334          if ( current_user_can( 'switch_themes' ) ) {
 335              echo '<a href="themes.php" class="button rbutton">' . __('Change Theme') . '</a>';
 336              printf(_n('Theme <span class="b"><a href="themes.php">%1$s</a></span> with <span class="b"><a href="widgets.php">%2$s Widget</a></span>', 'Theme <span class="b"><a href="themes.php">%1$s</a></span> with <span class="b"><a href="widgets.php">%2$s Widgets</a></span>', $num_widgets), $ct->title, $num);
 337          } else {
 338              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), $ct->title, $num);
 339          }
 340      } else {
 341          if ( current_user_can( 'switch_themes' ) ) {
 342              echo '<a href="themes.php" class="button rbutton">' . __('Change Theme') . '</a>';
 343              printf( __('Theme <span class="b"><a href="themes.php">%1$s</a></span>'), $ct->title );
 344          } else {
 345              printf( __('Theme <span class="b">%1$s</span>'), $ct->title );
 346          }
 347      }
 348      echo '</p>';
 349  
 350      update_right_now_message();
 351  
 352      echo "\n\t".'<br class="clear" /></div>';
 353      do_action( 'rightnow_end' );
 354      do_action( 'activity_box_end' );
 355  }
 356  
 357  function wp_dashboard_quick_press() {
 358      $drafts = false;
 359      if ( 'post' === strtolower( $_SERVER['REQUEST_METHOD'] ) && isset( $_POST['action'] ) && 0 === strpos( $_POST['action'], 'post-quickpress' ) && (int) $_POST['post_ID'] ) {
 360          $view = get_permalink( $_POST['post_ID'] );
 361          $edit = esc_url( get_edit_post_link( $_POST['post_ID'] ) );
 362          if ( 'post-quickpress-publish' == $_POST['action'] ) {
 363              if ( current_user_can('publish_posts') )
 364                  printf( '<div class="message"><p>' . __( 'Post Published. <a href="%s">View post</a> | <a href="%s">Edit post</a>' ) . '</p></div>', esc_url( $view ), $edit );
 365              else
 366                  printf( '<div class="message"><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 );
 367          } else {
 368              printf( '<div class="message"><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 );
 369              $drafts_query = new WP_Query( array(
 370                  'post_type' => 'post',
 371                  'post_status' => 'draft',
 372                  'author' => $GLOBALS['current_user']->ID,
 373                  'posts_per_page' => 1,
 374                  'orderby' => 'modified',
 375                  'order' => 'DESC'
 376              ) );
 377  
 378              if ( $drafts_query->posts )
 379                  $drafts =& $drafts_query->posts;
 380          }
 381          printf('<p class="textright">' . __('You can also try %s, easy blogging from anywhere on the Web.') . '</p>', '<a href="tools.php">' . __('Press This') . '</a>' );
 382          $_REQUEST = array(); // hack for get_default_post_to_edit()
 383      }
 384  
 385      $post = get_default_post_to_edit();
 386  ?>
 387  
 388      <form name="post" action="<?php echo esc_url( admin_url( 'post.php' ) ); ?>" method="post" id="quick-press">
 389          <h4 id="quick-post-title"><label for="title"><?php _e('Title') ?></label></h4>
 390          <div class="input-text-wrap">
 391              <input type="text" name="post_title" id="title" tabindex="1" autocomplete="off" value="<?php echo esc_attr( $post->post_title ); ?>" />
 392          </div>
 393  
 394          <?php if ( current_user_can( 'upload_files' ) ) : ?>
 395          <div id="media-buttons" class="hide-if-no-js">
 396              <?php do_action( 'media_buttons' ); ?>
 397          </div>
 398          <?php endif; ?>
 399  
 400          <h4 id="content-label"><label for="content"><?php _e('Content') ?></label></h4>
 401          <div class="textarea-wrap">
 402              <textarea name="content" id="content" class="mceEditor" rows="3" cols="15" tabindex="2"><?php echo $post->post_content; ?></textarea>
 403          </div>
 404  
 405          <script type="text/javascript">edCanvas = document.getElementById('content');edInsertContent = null;</script>
 406  
 407          <h4><label for="tags-input"><?php _e('Tags') ?></label></h4>
 408          <div class="input-text-wrap">
 409              <input type="text" name="tags_input" id="tags-input" tabindex="3" value="<?php echo get_tags_to_edit( $post->ID ); ?>" />
 410          </div>
 411  
 412          <p class="submit">
 413              <input type="hidden" name="action" id="quickpost-action" value="post-quickpress-save" />
 414              <input type="hidden" name="quickpress_post_ID" value="<?php echo (int) $post->ID; ?>" />
 415              <?php wp_nonce_field('add-post'); ?>
 416              <input type="submit" name="save" id="save-post" class="button" tabindex="4" value="<?php esc_attr_e('Save Draft'); ?>" />
 417              <input type="reset" value="<?php esc_attr_e( 'Reset' ); ?>" class="button" />
 418              <?php if ( current_user_can('publish_posts') ) { ?>
 419              <input type="submit" name="publish" id="publish" accesskey="p" tabindex="5" class="button-primary" value="<?php esc_attr_e('Publish'); ?>" />
 420              <?php } else { ?>
 421              <input type="submit" name="publish" id="publish" accesskey="p" tabindex="5" class="button-primary" value="<?php esc_attr_e('Submit for Review'); ?>" />
 422              <?php } ?>
 423              <br class="clear" />
 424          </p>
 425  
 426      </form>
 427  
 428  <?php
 429      if ( $drafts )
 430          wp_dashboard_recent_drafts( $drafts );
 431  }
 432  
 433  function wp_dashboard_recent_drafts( $drafts = false ) {
 434      if ( !$drafts ) {
 435          $drafts_query = new WP_Query( array(
 436              'post_type' => 'post',
 437              'post_status' => 'draft',
 438              'author' => $GLOBALS['current_user']->ID,
 439              'posts_per_page' => 5,
 440              'orderby' => 'modified',
 441              'order' => 'DESC'
 442          ) );
 443          $drafts =& $drafts_query->posts;
 444      }
 445  
 446      if ( $drafts && is_array( $drafts ) ) {
 447          $list = array();
 448          foreach ( $drafts as $draft ) {
 449              $url = get_edit_post_link( $draft->ID );
 450              $title = _draft_or_post_title( $draft->ID );
 451              $item = "<h4><a href='$url' title='" . sprintf( __( 'Edit &#8220;%s&#8221;' ), 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>';
 452              if ( $the_content = preg_split( '#\s#', strip_tags( $draft->post_content ), 11, PREG_SPLIT_NO_EMPTY ) )
 453                  $item .= '<p>' . join( ' ', array_slice( $the_content, 0, 10 ) ) . ( 10 < count( $the_content ) ? '&hellip;' : '' ) . '</p>';
 454              $list[] = $item;
 455          }
 456  ?>
 457      <ul>
 458          <li><?php echo join( "</li>\n<li>", $list ); ?></li>
 459      </ul>
 460      <p class="textright"><a href="edit.php?post_status=draft" class="button"><?php _e('View all'); ?></a></p>
 461  <?php
 462      } else {
 463          _e('There are no drafts at the moment');
 464      }
 465  }
 466  
 467  /**
 468   * Display recent comments dashboard widget content.
 469   *
 470   * @since unknown
 471   */
 472  function wp_dashboard_recent_comments() {
 473      global $wpdb;
 474  
 475      if ( current_user_can('edit_posts') )
 476          $allowed_states = array('0', '1');
 477      else
 478          $allowed_states = array('1');
 479  
 480      // Select all comment types and filter out spam later for better query performance.
 481      $comments = array();
 482      $start = 0;
 483  
 484      while ( count( $comments ) < 5 && $possible = $wpdb->get_results( "SELECT * FROM $wpdb->comments c LEFT JOIN $wpdb->posts p ON c.comment_post_ID = p.ID WHERE p.post_status != 'trash' ORDER BY c.comment_date_gmt DESC LIMIT $start, 50" ) ) {
 485  
 486          foreach ( $possible as $comment ) {
 487              if ( count( $comments ) >= 5 )
 488                  break;
 489              if ( in_array( $comment->comment_approved, $allowed_states ) )
 490                  $comments[] = $comment;
 491          }
 492  
 493          $start = $start + 50;
 494      }
 495  
 496      if ( $comments ) :
 497  ?>
 498  
 499          <div id="the-comment-list" class="list:comment">
 500  <?php
 501          foreach ( $comments as $comment )
 502              _wp_dashboard_recent_comments_row( $comment );
 503  ?>
 504  
 505          </div>
 506  
 507  <?php
 508          if ( current_user_can('edit_posts') ) { ?>
 509              <p class="textright"><a href="edit-comments.php" class="button"><?php _e('View all'); ?></a></p>
 510  <?php    }
 511  
 512          wp_comment_reply( -1, false, 'dashboard', false );
 513          wp_comment_trashnotice();
 514  
 515      else :
 516  ?>
 517  
 518      <p><?php _e( 'No comments yet.' ); ?></p>
 519  
 520  <?php
 521      endif; // $comments;
 522  }
 523  
 524  function _wp_dashboard_recent_comments_row( &$comment, $show_date = true ) {
 525      $GLOBALS['comment'] =& $comment;
 526  
 527      $comment_post_url = get_edit_post_link( $comment->comment_post_ID );
 528      $comment_post_title = strip_tags(get_the_title( $comment->comment_post_ID ));
 529      $comment_post_link = "<a href='$comment_post_url'>$comment_post_title</a>";
 530      $comment_link = '<a class="comment-link" href="' . esc_url(get_comment_link()) . '">#</a>';
 531  
 532      $actions_string = '';
 533      if ( current_user_can('edit_post', $comment->comment_post_ID) ) {
 534          // preorder it: Approve | Reply | Edit | Spam | Trash
 535          $actions = array(
 536              'approve' => '', 'unapprove' => '',
 537              'reply' => '',
 538              'edit' => '',
 539              'spam' => '',
 540              'trash' => '', 'delete' => ''
 541          );
 542  
 543          $del_nonce = esc_html( '_wpnonce=' . wp_create_nonce( "delete-comment_$comment->comment_ID" ) );
 544          $approve_nonce = esc_html( '_wpnonce=' . wp_create_nonce( "approve-comment_$comment->comment_ID" ) );
 545  
 546          $approve_url = esc_url( "comment.php?action=approvecomment&p=$comment->comment_post_ID&c=$comment->comment_ID&$approve_nonce" );
 547          $unapprove_url = esc_url( "comment.php?action=unapprovecomment&p=$comment->comment_post_ID&c=$comment->comment_ID&$approve_nonce" );
 548          $spam_url = esc_url( "comment.php?action=spamcomment&p=$comment->comment_post_ID&c=$comment->comment_ID&$del_nonce" );
 549          $trash_url = esc_url( "comment.php?action=trashcomment&p=$comment->comment_post_ID&c=$comment->comment_ID&$del_nonce" );
 550          $delete_url = esc_url( "comment.php?action=deletecomment&p=$comment->comment_post_ID&c=$comment->comment_ID&$del_nonce" );
 551  
 552          $actions['approve'] = "<a href='$approve_url' class='dim:the-comment-list:comment-$comment->comment_ID:unapproved:e7e7d3:e7e7d3:new=approved vim-a' title='" . __( 'Approve this comment' ) . "'>" . __( 'Approve' ) . '</a>';
 553          $actions['unapprove'] = "<a href='$unapprove_url' class='dim:the-comment-list:comment-$comment->comment_ID:unapproved:e7e7d3:e7e7d3:new=unapproved vim-u' title='" . __( 'Unapprove this comment' ) . "'>" . __( 'Unapprove' ) . '</a>';
 554          $actions['edit'] = "<a href='comment.php?action=editcomment&amp;c={$comment->comment_ID}' title='" . __('Edit comment') . "'>". __('Edit') . '</a>';
 555          $actions['reply'] = '<a onclick="commentReply.open(\''.$comment->comment_ID.'\',\''.$comment->comment_post_ID.'\');return false;" class="vim-r hide-if-no-js" title="'.__('Reply to this comment').'" href="#">' . __('Reply') . '</a>';
 556          $actions['spam'] = "<a href='$spam_url' class='delete:the-comment-list:comment-$comment->comment_ID::spam=1 vim-s vim-destructive' title='" . __( 'Mark this comment as spam' ) . "'>" . /* translators: mark as spam link */  _x( 'Spam', 'verb' ) . '</a>';
 557          if ( !EMPTY_TRASH_DAYS )
 558              $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>';
 559          else
 560              $actions['trash'] = "<a href='$trash_url' class='delete:the-comment-list:comment-$comment->comment_ID::trash=1 delete vim-d vim-destructive' title='" . __( 'Move this comment to the trash' ) . "'>" . _x('Trash', 'verb') . '</a>';
 561  
 562          $actions = apply_filters( 'comment_row_actions', array_filter($actions), $comment );
 563  
 564          $i = 0;
 565          foreach ( $actions as $action => $link ) {
 566              ++$i;
 567              ( ( ('approve' == $action || 'unapprove' == $action) && 2 === $i ) || 1 === $i ) ? $sep = '' : $sep = ' | ';
 568  
 569              // Reply and quickedit need a hide-if-no-js span
 570              if ( 'reply' == $action || 'quickedit' == $action )
 571                  $action .= ' hide-if-no-js';
 572  
 573              $actions_string .= "<span class='$action'>$sep$link</span>";
 574          }
 575      }
 576  
 577  ?>
 578  
 579          <div id="comment-<?php echo $comment->comment_ID; ?>" <?php comment_class( array( 'comment-item', wp_get_comment_status($comment->comment_ID) ) ); ?>>
 580              <?php if ( !$comment->comment_type || 'comment' == $comment->comment_type ) : ?>
 581  
 582              <?php echo get_avatar( $comment, 50 ); ?>
 583  
 584              <div class="dashboard-comment-wrap">
 585              <h4 class="comment-meta"><?php printf( __( 'From %1$s on %2$s%3$s' ), '<cite class="comment-author">' . get_comment_author_link() . '</cite>', $comment_post_link.' '.$comment_link, ' <span class="approve">' . __( '[Pending]' ) . '</span>' ); ?></h4>
 586  
 587              <?php
 588              else :
 589                  switch ( $comment->comment_type ) :
 590                  case 'pingback' :
 591                      $type = __( 'Pingback' );
 592                      break;
 593                  case 'trackback' :
 594                      $type = __( 'Trackback' );
 595                      break;
 596                  default :
 597                      $type = ucwords( $comment->comment_type );
 598                  endswitch;
 599                  $type = esc_html( $type );
 600              ?>
 601              <div class="dashboard-comment-wrap">
 602              <?php /* translators: %1$s is type of comment, %2$s is link to the post */ ?>
 603              <h4 class="comment-meta"><?php printf( _x( '%1$s on %2$s', 'dashboard' ), "<strong>$type</strong>", $comment_post_link." ".$comment_link ); ?></h4>
 604              <p class="comment-author"><?php comment_author_link(); ?></p>
 605  
 606              <?php endif; // comment_type ?>
 607              <blockquote><p><?php comment_excerpt(); ?></p></blockquote>
 608              <p class="row-actions"><?php echo $actions_string; ?></p>
 609              </div>
 610          </div>
 611  <?php
 612  }
 613  
 614  function wp_dashboard_incoming_links() {
 615      echo '<p class="widget-loading hide-if-no-js">' . __( 'Loading&#8230;' ) . '</p><p class="describe hide-if-js">' . __('This widget requires JavaScript.') . '</p>';
 616  }
 617  
 618  /**
 619   * Display incoming links dashboard widget content.
 620   *
 621   * @since unknown
 622   */
 623  function wp_dashboard_incoming_links_output() {
 624      $widgets = get_option( 'dashboard_widget_options' );
 625      @extract( @$widgets['dashboard_incoming_links'], EXTR_SKIP );
 626      $rss = fetch_feed( $url );
 627  
 628      if ( is_wp_error($rss) ) {
 629          if ( is_admin() || current_user_can('manage_options') ) {
 630              echo '<p>';
 631              printf(__('<strong>RSS Error</strong>: %s'), $rss->get_error_message());
 632              echo '</p>';
 633          }
 634          return;
 635      }
 636  
 637      if ( !$rss->get_item_quantity() ) {
 638          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&hellip; yet. It&#8217;s okay &#8212; there is no rush.') . "</p>\n";
 639          $rss->__destruct(); 
 640          unset($rss);
 641          return;
 642      }
 643  
 644      echo "<ul>\n";
 645  
 646      if ( !isset($items) )
 647          $items = 10;
 648  
 649      foreach ( $rss->get_items(0, $items) as $item ) {
 650          $publisher = '';
 651          $site_link = '';
 652          $link = '';
 653          $content = '';
 654          $date = '';
 655          $link = esc_url( strip_tags( $item->get_link() ) );
 656  
 657          $author = $item->get_author();
 658          if ( $author ) {
 659              $site_link = esc_url( strip_tags( $author->get_link() ) );
 660  
 661              if ( !$publisher = esc_html( strip_tags( $author->get_name() ) ) )
 662                  $publisher = __( 'Somebody' );
 663          } else {
 664            $publisher = __( 'Somebody' );
 665          }
 666          if ( $site_link )
 667              $publisher = "<a href='$site_link'>$publisher</a>";
 668          else
 669              $publisher = "<strong>$publisher</strong>";
 670  
 671          $content = $item->get_content();
 672          $content = wp_html_excerpt($content, 50) . ' ...';
 673  
 674          if ( $link )
 675              /* translators: incoming links feed, %1$s is other person, %3$s is content */
 676              $text = __( '%1$s linked here <a href="%2$s">saying</a>, "%3$s"' );
 677          else
 678              /* translators: incoming links feed, %1$s is other person, %3$s is content */
 679              $text = __( '%1$s linked here saying, "%3$s"' );
 680  
 681          if ( $show_date ) {
 682              if ( $show_author || $show_summary )
 683                  /* translators: incoming links feed, %4$s is the date */
 684                  $text .= ' ' . __( 'on %4$s' );
 685              $date = esc_html( strip_tags( $item->get_date() ) );
 686              $date = strtotime( $date );
 687              $date = gmdate( get_option( 'date_format' ), $date );
 688          }
 689  
 690          echo "\t<li>" . sprintf( $text, $publisher, $link, $content, $date ) . "</li>\n";
 691      }
 692  
 693      echo "</ul>\n";
 694      $rss->__destruct(); 
 695      unset($rss);
 696  }
 697  
 698  function wp_dashboard_incoming_links_control() {
 699      wp_dashboard_rss_control( 'dashboard_incoming_links', array( 'title' => false, 'show_summary' => false, 'show_author' => false ) );
 700  }
 701  
 702  function wp_dashboard_primary() {
 703      echo '<p class="widget-loading hide-if-no-js">' . __( 'Loading&#8230;' ) . '</p><p class="describe hide-if-js">' . __('This widget requires JavaScript.') . '</p>';
 704  }
 705  
 706  function wp_dashboard_primary_control() {
 707      wp_dashboard_rss_control( 'dashboard_primary' );
 708  }
 709  
 710  /**
 711   * {@internal Missing Short Description}}
 712   *
 713   * @since unknown
 714   *
 715   * @param int $widget_id
 716   */
 717  function wp_dashboard_rss_output( $widget_id ) {
 718      $widgets = get_option( 'dashboard_widget_options' );
 719      echo '<div class="rss-widget">';
 720      wp_widget_rss_output( $widgets[$widget_id] );
 721      echo "</div>";
 722  }
 723  
 724  function wp_dashboard_secondary() {
 725      echo '<p class="widget-loading hide-if-no-js">' . __( 'Loading&#8230;' ) . '</p><p class="describe hide-if-js">' . __('This widget requires JavaScript.') . '</p>';
 726  }
 727  
 728  function wp_dashboard_secondary_control() {
 729      wp_dashboard_rss_control( 'dashboard_secondary' );
 730  }
 731  
 732  /**
 733   * Display secondary dashboard RSS widget feed.
 734   *
 735   * @since unknown
 736   *
 737   * @return unknown
 738   */
 739  function wp_dashboard_secondary_output() {
 740      $widgets = get_option( 'dashboard_widget_options' );
 741      @extract( @$widgets['dashboard_secondary'], EXTR_SKIP );
 742      $rss = @fetch_feed( $url );
 743  
 744      if ( is_wp_error($rss) ) {
 745          if ( is_admin() || current_user_can('manage_options') ) {
 746              echo '<div class="rss-widget"><p>';
 747              printf(__('<strong>RSS Error</strong>: %s'), $rss->get_error_message());
 748              echo '</p></div>';
 749          }
 750      } elseif ( !$rss->get_item_quantity() ) {
 751          $rss->__destruct(); 
 752          unset($rss);
 753          return false;
 754      } else {
 755          echo '<div class="rss-widget">';
 756          wp_widget_rss_output( $rss, $widgets['dashboard_secondary'] );
 757          echo '</div>';
 758          $rss->__destruct(); 
 759          unset($rss);
 760      }
 761  }
 762  
 763  function wp_dashboard_plugins() {
 764      echo '<p class="widget-loading hide-if-no-js">' . __( 'Loading&#8230;' ) . '</p><p class="describe hide-if-js">' . __('This widget requires JavaScript.') . '</p>';
 765  }
 766  
 767  /**
 768   * Display plugins most popular, newest plugins, and recently updated widget text.
 769   *
 770   * @since unknown
 771   */
 772  function wp_dashboard_plugins_output() {
 773      $popular = fetch_feed( 'http://wordpress.org/extend/plugins/rss/browse/popular/' );
 774      $new     = fetch_feed( 'http://wordpress.org/extend/plugins/rss/browse/new/' );
 775      $updated = fetch_feed( 'http://wordpress.org/extend/plugins/rss/browse/updated/' );
 776  
 777      if ( false === $plugin_slugs = get_transient( 'plugin_slugs' ) ) {
 778          $plugin_slugs = array_keys( get_plugins() );
 779          set_transient( 'plugin_slugs', $plugin_slugs, 86400 );
 780      }
 781  
 782      foreach ( array( 'popular' => __('Most Popular'), 'new' => __('Newest Plugins'), 'updated' => __('Recently Updated') ) as $feed => $label ) {
 783          if ( is_wp_error($$feed) || !$$feed->get_item_quantity() )
 784              continue;
 785  
 786          $items = $$feed->get_items(0, 5);
 787  
 788          // Pick a random, non-installed plugin
 789          while ( true ) {
 790              // Abort this foreach loop iteration if there's no plugins left of this type
 791              if ( 0 == count($items) )
 792                  continue 2;
 793  
 794              $item_key = array_rand($items);
 795              $item = $items[$item_key];
 796  
 797              list($link, $frag) = explode( '#', $item->get_link() );
 798  
 799              $link = esc_url($link);
 800              if ( preg_match( '|/([^/]+?)/?$|', $link, $matches ) )
 801                  $slug = $matches[1];
 802              else {
 803                  unset( $items[$item_key] );
 804                  continue;
 805              }
 806  
 807              // Is this random plugin's slug already installed? If so, try again.
 808              reset( $plugin_slugs );
 809              foreach ( $plugin_slugs as $plugin_slug ) {
 810                  if ( $slug == substr( $plugin_slug, 0, strlen( $slug ) ) ) {
 811                      unset( $items[$item_key] );
 812                      continue 2;
 813                  }
 814              }
 815  
 816              // If we get to this point, then the random plugin isn't installed and we can stop the while().
 817              break;
 818          }
 819  
 820          // Eliminate some common badly formed plugin descriptions
 821          while ( ( null !== $item_key = array_rand($items) ) && false !== strpos( $items[$item_key]->get_description(), 'Plugin Name:' ) )
 822              unset($items[$item_key]);
 823  
 824          if ( !isset($items[$item_key]) )
 825              continue;
 826  
 827          // current bbPress feed item titles are: user on "topic title"
 828          if ( preg_match( '/&quot;(.*)&quot;/s', $item->get_title(), $matches ) )
 829              $title = $matches[1];
 830          else // but let's make it forward compatible if things change
 831              $title = $item->get_title();
 832          $title = esc_html( $title );
 833  
 834          $description = esc_html( strip_tags(@html_entity_decode($item->get_description(), ENT_QUOTES, get_option('blog_charset'))) );
 835  
 836          $ilink = wp_nonce_url('plugin-install.php?tab=plugin-information&plugin=' . $slug, 'install-plugin_' . $slug) .
 837                              '&amp;TB_iframe=true&amp;width=600&amp;height=800';
 838  
 839          echo "<h4>$label</h4>\n";
 840          echo "<h5><a href='$link'>$title</a></h5>&nbsp;<span>(<a href='$ilink' class='thickbox' title='$title'>" . __( 'Install' ) . "</a>)</span>\n";
 841          echo "<p>$description</p>\n";
 842          
 843          $$feed->__destruct();
 844          unset($$feed);
 845      }
 846  }
 847  
 848  /**
 849   * Checks to see if all of the feed url in $check_urls are cached.
 850   *
 851   * If $check_urls is empty, look for the rss feed url found in the dashboard
 852   * widget optios of $widget_id. If cached, call $callback, a function that
 853   * echoes out output for this widget. If not cache, echo a "Loading..." stub
 854   * which is later replaced by AJAX call (see top of /wp-admin/index.php)
 855   *
 856   * @since unknown
 857   *
 858   * @param int $widget_id
 859   * @param callback $callback
 860   * @param array $check_urls RSS feeds
 861   * @return bool False on failure. True on success.
 862   */
 863  function wp_dashboard_cached_rss_widget( $widget_id, $callback, $check_urls = array() ) {
 864      $loading = '<p class="widget-loading">' . __( 'Loading&#8230;' ) . '</p>';
 865  
 866      if ( empty($check_urls) ) {
 867          $widgets = get_option( 'dashboard_widget_options' );
 868          if ( empty($widgets[$widget_id]['url']) ) {
 869              echo $loading;
 870              return false;
 871          }
 872          $check_urls = array( $widgets[$widget_id]['url'] );
 873      }
 874  
 875      include_once ABSPATH . WPINC . '/class-feed.php';
 876      foreach ( $check_urls as $check_url ) {
 877          $cache = new WP_Feed_Cache_Transient('', md5($check_url), '');
 878          if ( ! $cache->load() ) {
 879              echo $loading;
 880              return false;
 881          }
 882      }
 883  
 884      if ( $callback && is_callable( $callback ) ) {
 885          $args = array_slice( func_get_args(), 2 );
 886          array_unshift( $args, $widget_id );
 887          call_user_func_array( $callback, $args );
 888      }
 889  
 890      return true;
 891  }
 892  
 893  /* Dashboard Widgets Controls */
 894  
 895  // Calls widget_control callback
 896  /**
 897   * Calls widget control callback.
 898   *
 899   * @since unknown
 900   *
 901   * @param int $widget_control_id Registered Widget ID.
 902   */
 903  function wp_dashboard_trigger_widget_control( $widget_control_id = false ) {
 904      global $wp_dashboard_control_callbacks;
 905  
 906      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]) ) {
 907          call_user_func( $wp_dashboard_control_callbacks[$widget_control_id], '', array( 'id' => $widget_control_id, 'callback' => $wp_dashboard_control_callbacks[$widget_control_id] ) );
 908      }
 909  }
 910  
 911  /**
 912   * The RSS dashboard widget control.
 913   *
 914   * Sets up $args to be used as input to wp_widget_rss_form(). Handles POST data
 915   * from RSS-type widgets.
 916   *
 917   * @since unknown
 918   *
 919   * @param string widget_id
 920   * @param array form_inputs
 921   */
 922  function wp_dashboard_rss_control( $widget_id, $form_inputs = array() ) {
 923      if ( !$widget_options = get_option( 'dashboard_widget_options' ) )
 924          $widget_options = array();
 925  
 926      if ( !isset($widget_options[$widget_id]) )
 927          $widget_options[$widget_id] = array();
 928  
 929      $number = 1; // Hack to use wp_widget_rss_form()
 930      $widget_options[$widget_id]['number'] = $number;
 931  
 932      if ( 'POST' == $_SERVER['REQUEST_METHOD'] && isset($_POST['widget-rss'][$number]) ) {
 933          $_POST['widget-rss'][$number] = stripslashes_deep( $_POST['widget-rss'][$number] );
 934          $widget_options[$widget_id] = wp_widget_rss_process( $_POST['widget-rss'][$number] );
 935          // title is optional.  If black, fill it if possible
 936          if ( !$widget_options[$widget_id]['title'] && isset($_POST['widget-rss'][$number]['title']) ) {
 937              $rss = fetch_feed($widget_options[$widget_id]['url']);
 938              if ( is_wp_error($rss) ) {
 939                  $widget_options[$widget_id]['title'] = htmlentities(__('Unknown Feed'));
 940              } else {
 941                  $widget_options[$widget_id]['title'] = htmlentities(strip_tags($rss->get_title()));    
 942                  $rss->__destruct();
 943                  unset($rss);                
 944              }
 945          }
 946          update_option( 'dashboard_widget_options', $widget_options );
 947      }
 948  
 949      wp_widget_rss_form( $widget_options[$widget_id], $form_inputs );
 950  }
 951  
 952  /**
 953   * Empty function usable by plugins to output empty dashboard widget (to be populated later by JS).
 954   */
 955  function wp_dashboard_empty() {}
 956  
 957  ?>


Generated: Fri Jan 8 00:19:48 2010 Cross-referenced by PHPXref 0.7