X-Git-Url: https://scripts.mit.edu/gitweb/autoinstalls/wordpress.git/blobdiff_plain/177fd6fefd2e3d5a0ea6591c71d660cabdb3c1a4..888fa4ed68091f3314f711c5f6fe75858bf5410b:/wp-admin/includes/dashboard.php
diff --git a/wp-admin/includes/dashboard.php b/wp-admin/includes/dashboard.php
index 9ce9db91..fb50197e 100644
--- a/wp-admin/includes/dashboard.php
+++ b/wp-admin/includes/dashboard.php
@@ -1,149 +1,121 @@
'WordPress Dashboard',
- 'id' => 'wp_dashboard',
- 'before_widget' => "\t
\n\n",
- 'before_title' => "\t\t\t\n\n"
- ) );
-
-
/* Register Widgets and Controls */
- // Recent Comments Widget
- if ( current_user_can( 'moderate_comments' ) && $mod_comments = $wpdb->get_var("SELECT COUNT(*) FROM $wpdb->comments WHERE comment_approved = '0'") ) {
- $notice = sprintf( __ngettext( '%d comment awaiting moderation', '%d comments awaiting moderation', $mod_comments ), $mod_comments );
- $notice = "$notice";
- } else {
- $notice = '';
- }
- wp_register_sidebar_widget( 'dashboard_recent_comments', __( 'Recent Comments' ), 'wp_dashboard_recent_comments',
- array( 'all_link' => 'edit-comments.php', 'notice' => $notice, 'width' => 'half' )
- );
+ $response = wp_check_browser_version();
- // Incoming Links Widget
- if ( !isset( $widget_options['dashboard_incoming_links'] ) ) {
- $update = true;
- $widget_options['dashboard_incoming_links'] = array(
- 'link' => apply_filters( 'dashboard_incoming_links_link', 'http://blogsearch.google.com/blogsearch?hl=en&scoring=d&partner=wordpress&q=link:' . trailingslashit( get_option('home') ) ),
- 'url' => apply_filters( 'dashboard_incoming_links_feed', 'http://blogsearch.google.com/blogsearch_feeds?hl=en&scoring=d&ie=utf-8&num=10&output=rss&partner=wordpress&q=link:' . trailingslashit( get_option('home') ) ),
- 'items' => 5,
- 'show_date' => 0
- );
+ if ( $response && $response['upgrade'] ) {
+ add_filter( 'postbox_classes_dashboard_dashboard_browser_nag', 'dashboard_browser_nag_class' );
+ if ( $response['insecure'] )
+ wp_add_dashboard_widget( 'dashboard_browser_nag', __( 'You are using an insecure browser!' ), 'wp_dashboard_browser_nag' );
+ else
+ wp_add_dashboard_widget( 'dashboard_browser_nag', __( 'Your browser is out of date!' ), 'wp_dashboard_browser_nag' );
}
- wp_register_sidebar_widget( 'dashboard_incoming_links', __( 'Incoming Links' ), 'wp_dashboard_empty',
- array( 'all_link' => $widget_options['dashboard_incoming_links']['link'], 'feed_link' => $widget_options['dashboard_incoming_links']['url'], 'width' => 'half' ),
- 'wp_dashboard_cached_rss_widget', 'wp_dashboard_incoming_links_output'
- );
- wp_register_widget_control( 'dashboard_incoming_links', __( 'Incoming Links' ), 'wp_dashboard_rss_control', array(),
- array( 'widget_id' => 'dashboard_incoming_links', 'form_inputs' => array( 'title' => false, 'show_summary' => false, 'show_author' => false ) )
- );
+ // Right Now
+ if ( is_blog_admin() && current_user_can('edit_posts') )
+ wp_add_dashboard_widget( 'dashboard_right_now', __( 'At a Glance' ), 'wp_dashboard_right_now' );
- // WP Plugins Widget
- wp_register_sidebar_widget( 'dashboard_plugins', __( 'Plugins' ), 'wp_dashboard_empty',
- array( 'all_link' => 'http://wordpress.org/extend/plugins/', 'feed_link' => 'http://wordpress.org/extend/plugins/rss/topics/', 'width' => 'half' ),
- 'wp_dashboard_cached_rss_widget', 'wp_dashboard_plugins_output',
- array( 'http://wordpress.org/extend/plugins/rss/browse/popular/', 'http://wordpress.org/extend/plugins/rss/browse/new/', 'http://wordpress.org/extend/plugins/rss/browse/updated/' )
- );
+ if ( is_network_admin() )
+ wp_add_dashboard_widget( 'network_dashboard_right_now', __( 'Right Now' ), 'wp_network_dashboard_right_now' );
- // Primary feed (Dev Blog) Widget
- if ( !isset( $widget_options['dashboard_primary'] ) ) {
- $update = true;
- $widget_options['dashboard_primary'] = array(
- 'link' => apply_filters( 'dashboard_primary_link', __( 'http://wordpress.org/development/' ) ),
- 'url' => apply_filters( 'dashboard_primary_feed', __( 'http://wordpress.org/development/feed/' ) ),
- 'title' => apply_filters( 'dashboard_primary_title', __( 'WordPress Development Blog' ) ),
- 'items' => 2,
- 'show_summary' => 1,
- 'show_author' => 0,
- 'show_date' => 1
- );
+ // Activity Widget
+ if ( is_blog_admin() ) {
+ wp_add_dashboard_widget( 'dashboard_activity', __( 'Activity' ), 'wp_dashboard_site_activity' );
}
- wp_register_sidebar_widget( 'dashboard_primary', $widget_options['dashboard_primary']['title'], 'wp_dashboard_empty',
- array( 'all_link' => $widget_options['dashboard_primary']['link'], 'feed_link' => $widget_options['dashboard_primary']['url'], 'width' => 'half', 'class' => 'widget_rss' ),
- 'wp_dashboard_cached_rss_widget', 'wp_dashboard_rss_output'
- );
- wp_register_widget_control( 'dashboard_primary', __( 'Primary Feed' ), 'wp_dashboard_rss_control', array(),
- array( 'widget_id' => 'dashboard_primary' )
- );
-
- // Secondary Feed (Planet) Widget
- if ( !isset( $widget_options['dashboard_secondary'] ) ) {
- $update = true;
- $widget_options['dashboard_secondary'] = array(
- 'link' => apply_filters( 'dashboard_secondary_link', __( 'http://planet.wordpress.org/' ) ),
- 'url' => apply_filters( 'dashboard_secondary_feed', __( 'http://planet.wordpress.org/feed/' ) ),
- 'title' => apply_filters( 'dashboard_secondary_title', __( 'Other WordPress News' ) ),
- 'items' => 15
- );
+ // QuickPress Widget
+ if ( is_blog_admin() && current_user_can( 'edit_posts' ) ) {
+ $quick_draft_title = sprintf( '%1$s %2$s', __( 'Quick Draft' ), __( 'Drafts' ) );
+ wp_add_dashboard_widget( 'dashboard_quick_press', $quick_draft_title, 'wp_dashboard_quick_press' );
}
- wp_register_sidebar_widget( 'dashboard_secondary', $widget_options['dashboard_secondary']['title'], 'wp_dashboard_empty',
- array( 'all_link' => $widget_options['dashboard_secondary']['link'], 'feed_link' => $widget_options['dashboard_secondary']['url'], 'width' => 'full' ),
- 'wp_dashboard_cached_rss_widget', 'wp_dashboard_secondary_output'
- );
- wp_register_widget_control( 'dashboard_secondary', __( 'Secondary Feed' ), 'wp_dashboard_rss_control', array(),
- array( 'widget_id' => 'dashboard_secondary', 'form_inputs' => array( 'show_summary' => false, 'show_author' => false, 'show_date' => false ) )
- );
-
-
- /* Dashboard Widget Template
- wp_register_sidebar_widget( $widget_id (unique slug) , $widget_title, $output_callback,
- array(
- 'all_link' => full url for "See All" link,
- 'feed_link' => full url for "RSS" link,
- 'width' => 'fourth', 'third', 'half', 'full' (defaults to 'half'),
- 'height' => 'single', 'double' (defaults to 'single'),
- ),
- $wp_dashboard_empty_callback (only needed if using 'wp_dashboard_empty' as your $output_callback),
- $arg, $arg, $arg... (further args passed to callbacks)
- );
-
- // optional: if you want users to be able to edit the settings of your widget, you need to register a widget_control
- wp_register_widget_control( $widget_id, $widget_control_title, $control_output_callback,
- array(), // leave an empty array here: oddity in widget code
- array(
- 'widget_id' => $widget_id, // Yes - again. This is required: oddity in widget code
- 'arg' => an arg to pass to the $control_output_callback,
- 'another' => another arg to pass to the $control_output_callback,
- ...
- )
- );
- */
-
- // Hook to register new widgets
- do_action( 'wp_dashboard_setup' );
- // Hard code the sidebar's widgets and order
- $dashboard_widgets = array();
- $dashboard_widgets[] = 'dashboard_recent_comments';
- $dashboard_widgets[] = 'dashboard_incoming_links';
- $dashboard_widgets[] = 'dashboard_primary';
- if ( current_user_can( 'activate_plugins' ) )
- $dashboard_widgets[] = 'dashboard_plugins';
- $dashboard_widgets[] = 'dashboard_secondary';
-
- // Filter widget order
- $dashboard_widgets = apply_filters( 'wp_dashboard_widgets', $dashboard_widgets );
+ // WordPress News
+ wp_add_dashboard_widget( 'dashboard_primary', __( 'WordPress News' ), 'wp_dashboard_primary' );
+
+ if ( is_network_admin() ) {
+
+ /**
+ * Fires after core widgets for the Network Admin dashboard have been registered.
+ *
+ * @since 3.1.0
+ */
+ do_action( 'wp_network_dashboard_setup' );
+
+ /**
+ * Filter the list of widgets to load for the Network Admin dashboard.
+ *
+ * @since 3.1.0
+ *
+ * @param array $dashboard_widgets An array of dashboard widgets.
+ */
+ $dashboard_widgets = apply_filters( 'wp_network_dashboard_widgets', array() );
+ } elseif ( is_user_admin() ) {
+
+ /**
+ * Fires after core widgets for the User Admin dashboard have been registered.
+ *
+ * @since 3.1.0
+ */
+ do_action( 'wp_user_dashboard_setup' );
+
+ /**
+ * Filter the list of widgets to load for the User Admin dashboard.
+ *
+ * @since 3.1.0
+ *
+ * @param array $dashboard_widgets An array of dashboard widgets.
+ */
+ $dashboard_widgets = apply_filters( 'wp_user_dashboard_widgets', array() );
+ } else {
- $wp_dashboard_sidebars = array( 'wp_dashboard' => $dashboard_widgets, 'array_version' => 3.5 );
+ /**
+ * Fires after core widgets for the admin dashboard have been registered.
+ *
+ * @since 2.5.0
+ */
+ do_action( 'wp_dashboard_setup' );
+
+ /**
+ * Filter the list of widgets to load for the admin dashboard.
+ *
+ * @since 2.5.0
+ *
+ * @param array $dashboard_widgets An array of dashboard widgets.
+ */
+ $dashboard_widgets = apply_filters( 'wp_dashboard_widgets', array() );
+ }
- add_filter( 'dynamic_sidebar_params', 'wp_dashboard_dynamic_sidebar_params' );
+ foreach ( $dashboard_widgets as $widget_id ) {
+ $name = empty( $wp_registered_widgets[$widget_id]['all_link'] ) ? $wp_registered_widgets[$widget_id]['name'] : $wp_registered_widgets[$widget_id]['name'] . " " . __('View all') . '';
+ wp_add_dashboard_widget( $widget_id, $name, $wp_registered_widgets[$widget_id]['callback'], $wp_registered_widget_controls[$widget_id]['callback'] );
+ }
if ( 'POST' == $_SERVER['REQUEST_METHOD'] && isset($_POST['widget_id']) ) {
+ check_admin_referer( 'edit-dashboard-widget_' . $_POST['widget_id'], 'dashboard-widget-nonce' );
ob_start(); // hack - but the same hack wp-admin/widgets.php uses
wp_dashboard_trigger_widget_control( $_POST['widget_id'] );
ob_end_clean();
@@ -153,367 +125,785 @@ function wp_dashboard_setup() {
if ( $update )
update_option( 'dashboard_widget_options', $widget_options );
+
+ /** This action is documented in wp-admin/edit-form-advanced.php */
+ do_action( 'do_meta_boxes', $screen->id, 'normal', '' );
+
+ /** This action is documented in wp-admin/edit-form-advanced.php */
+ do_action( 'do_meta_boxes', $screen->id, 'side', '' );
}
-// Echoes out the dashboard
-function wp_dashboard() {
- echo "\n\n\n";
+ $location = 'normal';
+ if ( in_array($widget_id, $side_widgets) )
+ $location = 'side';
+
+ $priority = 'core';
+ if ( 'dashboard_browser_nag' === $widget_id )
+ $priority = 'high';
+
+ add_meta_box( $widget_id, $widget_name, $callback, $screen, $location, $priority, $callback_args );
}
-// Makes sidebar_widgets option reflect the dashboard settings
-function wp_dashboard_sidebars_widgets() { // hackery
- return $GLOBALS['wp_dashboard_sidebars'];
+function _wp_dashboard_control_callback( $dashboard, $meta_box ) {
+ echo '';
}
-// Modifies sidbar params on the fly to set up ids, class names, titles for each widget (called once per widget)
-// Switches widget to edit mode if $_GET['edit']
-function wp_dashboard_dynamic_sidebar_params( $params ) {
- global $wp_registered_widgets, $wp_registered_widget_controls;
-
- $sidebar_defaults = array('widget_id' => 0, 'before_widget' => '', 'after_widget' => '', 'before_title' => '', 'after_title' => '');
- extract( $sidebar_defaults, EXTR_PREFIX_ALL, 'sidebar' );
- extract( $params[0], EXTR_PREFIX_ALL, 'sidebar' );
-
- if ( !isset($wp_registered_widgets[$sidebar_widget_id]) || !is_array($wp_registered_widgets[$sidebar_widget_id]) ) {
- return $params;
- }
- $widget_defaults = array('id' => '', 'width' => '', 'height' => '', 'class' => '', 'feed_link' => '', 'all_link' => '', 'notice' => false, 'error' => false);
- extract( $widget_defaults, EXTR_PREFIX_ALL, 'widget' );
- extract( $wp_registered_widgets[$sidebar_widget_id], EXTR_PREFIX_ALL, 'widget' );
-
- $the_classes = array();
- if ( in_array($widget_width, array( 'third', 'fourth', 'full' ) ) )
- $the_classes[] = $widget_width;
-
- if ( 'double' == $widget_height )
- $the_classes[] = 'double';
-
- if ( $widget_class )
- $the_classes[] = $widget_class;
-
- // Add classes to the widget holder
- if ( $the_classes )
- $sidebar_before_widget = str_replace( "
+
+
+
+
+ \n\n";
+function wp_network_dashboard_right_now() {
+ $actions = array();
+ if ( current_user_can('create_sites') )
+ $actions['create-site'] = '' . __( 'Create a New Site' ) . '';
+ if ( current_user_can('create_users') )
+ $actions['create-user'] = '' . __( 'Create a New User' ) . '';
- $sidebar_after_widget .= "\t\t\t\n\n";
+ $c_users = get_user_count();
+ $c_blogs = get_blog_count();
- foreach( array_keys( $params[0] ) as $key )
- $$key = ${'sidebar_' . $key};
+ $user_text = sprintf( _n( '%s user', '%s users', $c_users ), number_format_i18n( $c_users ) );
+ $blog_text = sprintf( _n( '%s site', '%s sites', $c_blogs ), number_format_i18n( $c_blogs ) );
- $params[0] = compact( array_keys( $params[0] ) );
+ $sentence = sprintf( __( 'You have %1$s and %2$s.' ), $blog_text, $user_text );
- return $params;
+ if ( $actions ) {
+ echo '';
+ foreach ( $actions as $class => $action ) {
+ $actions[ $class ] = "\t- $action";
+ }
+ echo implode( " |
\n", $actions ) . "\n";
+ echo '
';
+ }
+?>
+
+
+
+
+
+
+
+
+
+
+post_status != 'auto-draft' ) { // auto-draft doesn't exists anymore
+ $post = get_default_post_to_edit( 'post', true );
+ update_user_option( get_current_user_id(), 'dashboard_quick_press_last_post_id', (int) $post->ID ); // Save post_ID
+ } else {
+ $post->post_title = ''; // Remove the auto draft title
+ }
+ } else {
+ $post = get_default_post_to_edit( 'post' , true);
+ $user_id = get_current_user_id();
+ // Don't create an option if this is a super admin who does not belong to this site.
+ if ( ! ( is_super_admin( $user_id ) && ! in_array( get_current_blog_id(), array_keys( get_blogs_of_user( $user_id ) ) ) ) )
+ update_user_option( $user_id, 'dashboard_quick_press_last_post_id', (int) $post->ID ); // Save post_ID
+ }
-/* Dashboard Widgets */
+ $post_ID = (int) $post->ID;
+?>
-function wp_dashboard_recent_comments( $sidebar_args ) {
- global $comment;
- extract( $sidebar_args, EXTR_SKIP );
+
+ 'post',
+ 'post_status' => 'draft',
+ 'author' => get_current_user_id(),
+ 'posts_per_page' => 4,
+ 'orderby' => 'modified',
+ 'order' => 'DESC'
+ );
+ $drafts = get_posts( $query_args );
+ if ( ! $drafts ) {
+ return;
+ }
+ }
+
+ echo '';
+ if ( count( $drafts ) > 3 ) {
+ echo '
' . _x( 'View all', 'drafts' ) . "
\n";
+ }
+ echo '
' . __( 'Drafts' ) . "
\n
";
+
+ $drafts = array_slice( $drafts, 0, 3 );
+ foreach ( $drafts as $draft ) {
+ $url = get_edit_post_link( $draft->ID );
+ $title = _draft_or_post_title( $draft->ID );
+ echo "- \n";
+ echo '';
+ if ( $the_content = wp_trim_words( $draft->post_content, 10 ) ) {
+ echo '
' . $the_content . '
';
+ }
+ echo " \n";
+ }
+ echo "
\n
";
+}
- echo $before_title;
- echo $widget_name;
- echo $after_title;
+function _wp_dashboard_recent_comments_row( &$comment, $show_date = true ) {
+ $GLOBALS['comment'] =& $comment;
- $lambda = create_function( '', 'return 5;' );
- add_filter( 'option_posts_per_rss', $lambda ); // hack - comments query doesn't accept per_page parameter
- $comments_query = new WP_Query('feed=rss2&withcomments=1');
- remove_filter( 'option_posts_per_rss', $lambda );
+ $comment_post_title = strip_tags(get_the_title( $comment->comment_post_ID ));
- $is_first = true;
+ if ( current_user_can( 'edit_post', $comment->comment_post_ID ) ) {
+ $comment_post_url = get_edit_post_link( $comment->comment_post_ID );
+ $comment_post_link = "$comment_post_title";
+ } else {
+ $comment_post_link = $comment_post_title;
+ }
- if ( $comments_query->have_comments() ) {
- while ( $comments_query->have_comments() ) { $comments_query->the_comment();
+ $comment_link = '';
+
+ $actions_string = '';
+ if ( current_user_can( 'edit_comment', $comment->comment_ID ) ) {
+ // preorder it: Approve | Reply | Edit | Spam | Trash
+ $actions = array(
+ 'approve' => '', 'unapprove' => '',
+ 'reply' => '',
+ 'edit' => '',
+ 'spam' => '',
+ 'trash' => '', 'delete' => ''
+ );
- $comment_post_url = get_permalink( $comment->comment_post_ID );
- $comment_post_title = get_the_title( $comment->comment_post_ID );
- $comment_post_link = "$comment_post_title";
- $comment_link = '';
- $comment_meta = sprintf( __( 'From %1$s on %2$s %3$s' ), get_comment_author(), $comment_post_link, $comment_link );
+ $del_nonce = esc_html( '_wpnonce=' . wp_create_nonce( "delete-comment_$comment->comment_ID" ) );
+ $approve_nonce = esc_html( '_wpnonce=' . wp_create_nonce( "approve-comment_$comment->comment_ID" ) );
+
+ $approve_url = esc_url( "comment.php?action=approvecomment&p=$comment->comment_post_ID&c=$comment->comment_ID&$approve_nonce" );
+ $unapprove_url = esc_url( "comment.php?action=unapprovecomment&p=$comment->comment_post_ID&c=$comment->comment_ID&$approve_nonce" );
+ $spam_url = esc_url( "comment.php?action=spamcomment&p=$comment->comment_post_ID&c=$comment->comment_ID&$del_nonce" );
+ $trash_url = esc_url( "comment.php?action=trashcomment&p=$comment->comment_post_ID&c=$comment->comment_ID&$del_nonce" );
+ $delete_url = esc_url( "comment.php?action=deletecomment&p=$comment->comment_post_ID&c=$comment->comment_ID&$del_nonce" );
+
+ $actions['approve'] = "" . __( 'Approve' ) . '';
+ $actions['unapprove'] = "" . __( 'Unapprove' ) . '';
+ $actions['edit'] = "". __('Edit') . '';
+ $actions['reply'] = '' . __('Reply') . '';
+ $actions['spam'] = "" . /* translators: mark as spam link */ _x( 'Spam', 'verb' ) . '';
+ if ( !EMPTY_TRASH_DAYS )
+ $actions['delete'] = "" . __('Delete Permanently') . '';
+ else
+ $actions['trash'] = "" . _x('Trash', 'verb') . '';
+
+ /**
+ * Filter the action links displayed for each comment in the 'Recent Comments'
+ * dashboard widget.
+ *
+ * @since 2.6.0
+ *
+ * @param array $actions An array of comment actions. Default actions include:
+ * 'Approve', 'Unapprove', 'Edit', 'Reply', 'Spam',
+ * 'Delete', and 'Trash'.
+ * @param object $comment The comment object.
+ */
+ $actions = apply_filters( 'comment_row_actions', array_filter($actions), $comment );
+
+ $i = 0;
+ foreach ( $actions as $action => $link ) {
+ ++$i;
+ ( ( ('approve' == $action || 'unapprove' == $action) && 2 === $i ) || 1 === $i ) ? $sep = '' : $sep = ' | ';
+
+ // Reply and quickedit need a hide-if-no-js span
+ if ( 'reply' == $action || 'quickedit' == $action )
+ $action .= ' hide-if-no-js';
+
+ $actions_string .= "$sep$link";
+ }
+ }
- if ( $is_first ) : $is_first = false;
-?>
- “”
-
-comment_count > 1 ) : ?>
-
+ ' . get_comment_author_link() . '', $comment_post_link.' '.$comment_link, ' ' . __( '[Pending]' ) . '' ); ?> +
+ + comment_type ) : + case 'pingback' : + $type = __( 'Pingback' ); + break; + case 'trackback' : + $type = __( 'Trackback' ); + break; + default : + $type = ucwords( $comment->comment_type ); + endswitch; + $type = esc_html( $type ); + ?> +$type", $comment_post_link." ".$comment_link ); ?>
+ + + + + +' . __( 'No activity yet!' ) . '
'; + echo '