2008-02-02 02:57:51 -05:00
< ? php
2008-09-16 20:40:10 -04:00
/**
2011-04-28 11:24:49 -04:00
* WordPress Dashboard Widget Administration Screen API
2008-09-16 20:40:10 -04:00
*
* @ package WordPress
* @ subpackage Administration
*/
/**
* Registers dashboard widgets .
*
2010-09-04 22:45:39 -04:00
* Handles POST data , sets up filters .
2008-09-16 20:40:10 -04:00
*
2010-09-04 22:45:39 -04:00
* @ since 2.5 . 0
2008-09-16 20:40:10 -04:00
*/
2008-02-02 02:57:51 -05:00
function wp_dashboard_setup () {
2008-10-08 19:32:34 -04:00
global $wp_registered_widgets , $wp_registered_widget_controls , $wp_dashboard_control_callbacks ;
$wp_dashboard_control_callbacks = array ();
2010-10-07 15:34:18 -04:00
$screen = get_current_screen ();
2008-10-08 19:32:34 -04:00
2008-02-02 02:57:51 -05:00
$update = false ;
2008-04-17 18:00:39 -04:00
$widget_options = get_option ( 'dashboard_widget_options' );
2008-04-17 16:14:07 -04:00
if ( ! $widget_options || ! is_array ( $widget_options ) )
2008-02-02 02:57:51 -05:00
$widget_options = array ();
/* Register Widgets and Controls */
2011-05-11 23:33:27 -04:00
$response = wp_check_browser_version ();
2011-06-05 11:14:51 -04:00
if ( $response && $response [ 'upgrade' ] ) {
2011-05-11 23:33:27 -04:00
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' );
}
2008-10-21 13:56:48 -04:00
// Right Now
2010-10-07 15:34:18 -04:00
if ( is_blog_admin () && current_user_can ( 'edit_posts' ) )
2013-11-15 15:15:10 -05:00
wp_add_dashboard_widget ( 'dash-right-now' , __ ( 'Site Content' ), 'wp_dashboard_right_now' );
2008-10-21 13:56:48 -04:00
2010-11-08 12:31:00 -05:00
if ( is_network_admin () )
wp_add_dashboard_widget ( 'network_dashboard_right_now' , __ ( 'Right Now' ), 'wp_network_dashboard_right_now' );
2013-11-13 17:09:10 -05:00
// Activity Widget
2013-11-15 15:15:10 -05:00
wp_add_dashboard_widget ( 'dashboard_activity' , __ ( 'Activity' ), 'wp_dashboard_activity' );
2011-12-22 19:25:09 -05:00
2008-10-31 16:47:36 -04:00
// QuickPress Widget
2013-11-13 17:09:10 -05:00
if ( is_blog_admin () && current_user_can ( 'edit_posts' ) )
2013-11-15 15:15:10 -05:00
wp_add_dashboard_widget ( 'dashboard_quick_press' , __ ( 'Quick Draft' ), 'wp_dashboard_quick_press' );
2008-10-31 16:47:36 -04:00
2013-11-13 17:09:10 -05:00
// WordPress News
2013-11-15 15:15:10 -05:00
wp_add_dashboard_widget ( 'dashboard_primary' , __ ( 'WordPress News' ), 'wp_dashboard_primary' );
2008-02-21 16:20:09 -05:00
2008-02-02 02:57:51 -05:00
// Hook to register new widgets
// Filter widget order
2010-10-21 06:06:17 -04:00
if ( is_network_admin () ) {
do_action ( 'wp_network_dashboard_setup' );
$dashboard_widgets = apply_filters ( 'wp_network_dashboard_widgets' , array () );
2010-10-21 13:51:49 -04:00
} elseif ( is_user_admin () ) {
do_action ( 'wp_user_dashboard_setup' );
2010-10-21 13:53:26 -04:00
$dashboard_widgets = apply_filters ( 'wp_user_dashboard_widgets' , array () );
2010-10-21 06:06:17 -04:00
} else {
do_action ( 'wp_dashboard_setup' );
$dashboard_widgets = apply_filters ( 'wp_dashboard_widgets' , array () );
}
2008-02-02 02:57:51 -05:00
2008-11-17 20:04:41 -05:00
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' ] . " <a href=' { $wp_registered_widgets [ $widget_id ][ 'all_link' ] } ' class='edit-box open-box'> " . __ ( 'View all' ) . '</a>' ;
wp_add_dashboard_widget ( $widget_id , $name , $wp_registered_widgets [ $widget_id ][ 'callback' ], $wp_registered_widget_controls [ $widget_id ][ 'callback' ] );
}
2008-02-02 02:57:51 -05:00
if ( 'POST' == $_SERVER [ 'REQUEST_METHOD' ] && isset ( $_POST [ 'widget_id' ]) ) {
2012-12-01 19:12:43 -05:00
check_admin_referer ( 'edit-dashboard-widget_' . $_POST [ 'widget_id' ], 'dashboard-widget-nonce' );
2008-02-02 02:57:51 -05:00
ob_start (); // hack - but the same hack wp-admin/widgets.php uses
2008-03-23 12:34:28 -04:00
wp_dashboard_trigger_widget_control ( $_POST [ 'widget_id' ] );
2008-02-02 02:57:51 -05:00
ob_end_clean ();
wp_redirect ( remove_query_arg ( 'edit' ) );
exit ;
}
if ( $update )
update_option ( 'dashboard_widget_options' , $widget_options );
2008-10-08 19:32:34 -04:00
2013-10-24 18:59:20 -04:00
/** This action is documented in wp-admin/edit-form-advanced.php */
2010-10-07 15:34:18 -04:00
do_action ( 'do_meta_boxes' , $screen -> id , 'normal' , '' );
2013-10-24 18:59:20 -04:00
/** This action is documented in wp-admin/edit-form-advanced.php */
2010-10-07 15:34:18 -04:00
do_action ( 'do_meta_boxes' , $screen -> id , 'side' , '' );
2008-02-02 02:57:51 -05:00
}
2013-09-16 14:07:10 -04:00
function wp_add_dashboard_widget ( $widget_id , $widget_name , $callback , $control_callback = null , $callback_args = null ) {
2010-10-07 15:34:18 -04:00
$screen = get_current_screen ();
2008-10-08 19:32:34 -04:00
global $wp_dashboard_control_callbacks ;
2010-12-08 14:53:26 -05:00
2008-10-08 19:32:34 -04:00
if ( $control_callback && current_user_can ( 'edit_dashboard' ) && is_callable ( $control_callback ) ) {
$wp_dashboard_control_callbacks [ $widget_id ] = $control_callback ;
if ( isset ( $_GET [ 'edit' ] ) && $widget_id == $_GET [ 'edit' ] ) {
list ( $url ) = explode ( '#' , add_query_arg ( 'edit' , false ), 2 );
2009-05-18 12:00:33 -04:00
$widget_name .= ' <span class="postbox-title-action"><a href="' . esc_url ( $url ) . '">' . __ ( 'Cancel' ) . '</a></span>' ;
2010-12-13 16:21:50 -05:00
$callback = '_wp_dashboard_control_callback' ;
} else {
list ( $url ) = explode ( '#' , add_query_arg ( 'edit' , $widget_id ), 2 );
2010-12-08 14:53:26 -05:00
$widget_name .= ' <span class="postbox-title-action"><a href="' . esc_url ( " $url # $widget_id " ) . '" class="edit-box open-box">' . __ ( 'Configure' ) . '</a></span>' ;
2008-10-08 19:32:34 -04:00
}
}
2010-11-17 13:47:34 -05:00
2013-11-15 15:15:10 -05:00
$side_widgets = array ( 'dashboard_quick_press' , 'dashboard_primary' );
2010-11-08 12:31:00 -05:00
2008-10-31 17:04:48 -04:00
$location = 'normal' ;
if ( in_array ( $widget_id , $side_widgets ) )
$location = 'side' ;
2011-06-15 15:23:35 -04:00
$priority = 'core' ;
if ( 'dashboard_browser_nag' === $widget_id )
$priority = 'high' ;
2013-11-15 15:15:10 -05:00
elseif ( 'dashboard_primary' === $widget_id )
$priority = 'low' ;
2011-06-15 15:23:35 -04:00
2013-09-16 14:07:10 -04:00
add_meta_box ( $widget_id , $widget_name , $callback , $screen , $location , $priority , $callback_args );
2008-10-08 19:32:34 -04:00
}
2008-02-02 02:57:51 -05:00
2008-10-08 19:32:34 -04:00
function _wp_dashboard_control_callback ( $dashboard , $meta_box ) {
2008-11-17 20:04:41 -05:00
echo '<form action="" method="post" class="dashboard-widget-control-form">' ;
2008-10-08 19:32:34 -04:00
wp_dashboard_trigger_widget_control ( $meta_box [ 'id' ] );
2012-12-01 19:12:43 -05:00
wp_nonce_field ( 'edit-dashboard-widget_' . $meta_box [ 'id' ], 'dashboard-widget-nonce' );
2010-10-17 14:24:34 -04:00
echo '<input type="hidden" name="widget_id" value="' . esc_attr ( $meta_box [ 'id' ]) . '" />' ;
submit_button ( __ ( 'Submit' ) );
2008-12-09 13:03:31 -05:00
echo '</form>' ;
2008-02-02 02:57:51 -05:00
}
2008-09-16 20:40:10 -04:00
/**
2008-10-08 19:32:34 -04:00
* Displays the dashboard .
2008-09-16 20:40:10 -04:00
*
2010-09-04 22:45:39 -04:00
* @ since 2.5 . 0
2008-09-16 20:40:10 -04:00
*/
2008-10-08 19:32:34 -04:00
function wp_dashboard () {
2010-10-07 15:34:18 -04:00
$screen = get_current_screen ();
2012-04-24 16:46:04 -04:00
$class = 'columns-' . get_current_screen () -> get_columns ();
2010-10-07 15:34:18 -04:00
2009-02-23 21:37:22 -05:00
?>
2012-03-23 17:41:00 -04:00
< div id = " dashboard-widgets " class = " metabox-holder <?php echo $class ; ?> " >
< div id = 'postbox-container-1' class = 'postbox-container' >
< ? php do_meta_boxes ( $screen -> id , 'normal' , '' ); ?>
</ div >
< div id = 'postbox-container-2' class = 'postbox-container' >
< ? php do_meta_boxes ( $screen -> id , 'side' , '' ); ?>
</ div >
< div id = 'postbox-container-3' class = 'postbox-container' >
< ? php do_meta_boxes ( $screen -> id , 'column3' , '' ); ?>
</ div >
< div id = 'postbox-container-4' class = 'postbox-container' >
< ? php do_meta_boxes ( $screen -> id , 'column4' , '' ); ?>
</ div >
</ div >
2008-10-08 19:32:34 -04:00
2009-02-23 21:37:22 -05:00
< ? php
2008-10-08 19:32:34 -04:00
wp_nonce_field ( 'closedpostboxes' , 'closedpostboxesnonce' , false );
wp_nonce_field ( 'meta-box-order' , 'meta-box-order-nonce' , false );
2008-10-10 19:54:27 -04:00
2008-02-02 02:57:51 -05:00
}
2008-10-08 19:32:34 -04:00
/* Dashboard Widgets */
2008-02-02 02:57:51 -05:00
2013-11-15 15:15:10 -05:00
/**
* Dashboard widget that displays some basic stats about the site .
*
* Formerly 'Right Now' . A streamlined 'Site Content' as of 3.8 .
*
* @ since 2.7 . 0
*/
function wp_dashboard_right_now () {
Introduce WP_Theme, wp_get_themes(), and wp_get_theme() to replace get_themes(), get_theme(), get_theme_data(), current_theme_info(), and others.
* Getters and Helpers: Introduces a series of methods to allow for easy generation of headers for display, and other theme metadata, including page templates.
* Screenshots: Handles support for multiple screenshots. (see # Additional screenshots must be PNG and start with screenshot-2.png, and be sequential to be counted. see #19816.
* Error Handling: Broken themes have a WP_Error object attached to them.
* Caching: Introduces a wp_cache_themes_persistently filter (also in [20020]) to enable persistent caching of all filesystem and sanitization operations normally handled by WP_Theme (and formerly get_file_data() and get_themes()). Themes are cached individually and across five different cache keys for different data pieces.
* Compatibility: A WP_Theme object is backwards compatible with a theme's array formerly returned by get_themes() and get_theme(), and an stdClass object formerly returned by current_theme_info().
* i18n/L10n: Theme headers are now localizable with proper Text Domain and Domain Path headers, like plugins. (Language packs may remove the requirement for headers.) For page templates, see #6007 (not fixed yet, but will be easy now). For headers, fixes #15858.
* PHP and CSS files: New methods that fetch a list of theme files (for the theme editor) only on demand, rather than only loading them into memory. fixes #11214.
Functions deprecated:
* get_themes(), get_allowed_themes() and get_broken_themes() -- use wp_get_themes()
* get_theme() and current_theme_info() -- use wp_get_theme()
* get_site_allowed_themes() -- use WP_Theme::get_allowed_on_network()
* wpmu_get_blog_allowedthemes() -- use WP_theme::get_allowed_on_site()
see also [20016], [20018], [20019], [20020], [20021], [20022], [20025], [20026], [20027]. also fixes #19244.
see #20103.
git-svn-id: http://svn.automattic.com/wordpress/trunk@20029 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-02-28 16:24:44 -05:00
$theme = wp_get_theme ();
2013-11-13 17:09:10 -05:00
if ( current_user_can ( 'switch_themes' ) )
$theme_name = sprintf ( '<a href="themes.php">%1$s</a>' , $theme -> display ( 'Name' ) );
else
$theme_name = $theme -> display ( 'Name' );
?>
< div class = " main " >
< ul >
< ? php
do_action ( 'rightnow_list_start' );
// Using show_in_nav_menus as my arg for grabbing what post types should show, is there better?
$post_types = get_post_types ( array ( 'show_in_nav_menus' => true ), 'objects' );
$post_types = ( array ) apply_filters ( 'rightnow_post_types' , $post_types );
foreach ( $post_types as $post_type => $post_type_obj ){
$num_posts = wp_count_posts ( $post_type );
if ( $num_posts && $num_posts -> publish ) {
printf (
'<li class="%1$s-count"><a href="edit.php?post_type=%1$s">%2$s %3$s</a></li>' ,
$post_type ,
number_format_i18n ( $num_posts -> publish ),
$post_type_obj -> label
);
2009-04-29 19:30:07 -04:00
}
2008-10-31 00:23:17 -04:00
}
2013-11-13 17:09:10 -05:00
// Comments
$num_comm = wp_count_comments ();
if ( $num_comm && $num_comm -> total_comments ) {
$text = _n ( 'comment' , 'comments' , $num_comm -> total_comments );
printf (
'<li class="comment-count"><a href="edit-comments.php">%1$s %2$s</a></li>' ,
number_format_i18n ( $num_comm -> total_comments ),
$text
);
if ( $num_comm -> moderated ) {
$text = _n ( 'in moderation' , 'in moderation' , $num_comm -> total_comments );
printf (
'<li class="comment-mod-count"><a href="edit-comments.php?comment_status=moderated">%1$s %2$s</a></li>' ,
number_format_i18n ( $num_comm -> moderated ),
$text
);
}
2011-05-06 19:42:37 -04:00
}
2013-11-13 17:09:10 -05:00
do_action ( 'rightnow_list_end' );
?>
</ ul >
< p >< ? php printf ( __ ( 'WordPress %1$s running %2$s theme.' ), get_bloginfo ( 'version' , 'display' ), $theme_name ); ?> </p>
</ div >
2011-05-06 19:42:37 -04:00
2013-11-13 17:09:10 -05:00
< ? php
// activity_box_end has a core action, but only prints content when multisite.
// Using an output buffer is the only way to really check if anything's displayed here.
ob_start ();
2008-10-21 13:56:48 -04:00
do_action ( 'rightnow_end' );
do_action ( 'activity_box_end' );
2013-11-13 17:09:10 -05:00
$actions = ob_get_clean ();
if ( ! empty ( $actions ) ) : ?>
< div class = " sub " >
< ? php echo $actions ; ?>
</ div >
< ? php endif ;
2008-10-21 13:56:48 -04:00
}
2010-11-08 12:31:00 -05:00
function wp_network_dashboard_right_now () {
$actions = array ();
if ( current_user_can ( 'create_sites' ) )
$actions [ 'create-site' ] = '<a href="' . network_admin_url ( 'site-new.php' ) . '">' . __ ( 'Create a New Site' ) . '</a>' ;
if ( current_user_can ( 'create_users' ) )
$actions [ 'create-user' ] = '<a href="' . network_admin_url ( 'user-new.php' ) . '">' . __ ( 'Create a New User' ) . '</a>' ;
$c_users = get_user_count ();
$c_blogs = get_blog_count ();
$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 ) );
2010-11-17 13:47:34 -05:00
2010-11-08 12:31:00 -05:00
$sentence = sprintf ( __ ( 'You have %1$s and %2$s.' ), $blog_text , $user_text );
if ( $actions ) {
echo '<ul class="subsubsub">' ;
2010-11-08 12:36:09 -05:00
foreach ( $actions as $class => $action ) {
2010-11-08 12:31:00 -05:00
$actions [ $class ] = " \t <li class=' $class '> $action " ;
}
echo implode ( " |</li> \n " , $actions ) . " </li> \n " ;
echo '</ul>' ;
}
?>
< br class = " clear " />
< p class = " youhave " >< ? php echo $sentence ; ?> </p>
< ? php do_action ( 'wpmuadminresult' , '' ); ?>
2012-06-05 14:51:33 -04:00
< form action = " <?php echo network_admin_url('users.php'); ?> " method = " get " >
2010-11-08 12:31:00 -05:00
< p >
2012-06-05 14:51:33 -04:00
< input type = " search " name = " s " value = " " size = " 30 " autocomplete = " off " />
2012-09-21 15:34:23 -04:00
< ? php submit_button ( __ ( 'Search Users' ), 'button' , 'submit' , false , array ( 'id' => 'submit_users' ) ); ?>
2010-11-08 12:31:00 -05:00
</ p >
</ form >
2012-06-05 14:51:33 -04:00
< form action = " <?php echo network_admin_url('sites.php'); ?> " method = " get " >
2010-11-08 12:31:00 -05:00
< p >
2012-06-05 14:51:33 -04:00
< input type = " search " name = " s " value = " " size = " 30 " autocomplete = " off " />
2012-09-21 15:34:23 -04:00
< ? php submit_button ( __ ( 'Search Sites' ), 'button' , 'submit' , false , array ( 'id' => 'submit_sites' ) ); ?>
2010-11-08 12:31:00 -05:00
</ p >
</ form >
< ? php
do_action ( 'mu_rightnow_end' );
do_action ( 'mu_activity_box_end' );
}
2013-11-13 17:09:10 -05:00
/**
* The Quick Draft widget display and creation of drafts
*
*
*
* @ since 3.8 . 0
*
*/
2013-11-15 15:15:10 -05:00
function wp_dashboard_quick_press ( $error_msg = false ) {
2010-05-23 03:58:06 -04:00
global $post_ID ;
/* Check if a new auto-draft (= no new post_ID) is needed or if the old can be used */
$last_post_id = ( int ) get_user_option ( 'dashboard_quick_press_last_post_id' ); // Get the last post_ID
if ( $last_post_id ) {
$post = get_post ( $last_post_id );
if ( empty ( $post ) || $post -> post_status != 'auto-draft' ) { // auto-draft doesn't exists anymore
2013-11-13 17:09:10 -05:00
$post = get_default_post_to_edit ( 'post' , true );
2012-10-17 14:58:09 -04:00
update_user_option ( get_current_user_id (), 'dashboard_quick_press_last_post_id' , ( int ) $post -> ID ); // Save post_ID
2010-05-23 03:58:06 -04:00
} else {
$post -> post_title = '' ; // Remove the auto draft title
}
} else {
2012-10-17 14:58:09 -04:00
$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
2010-05-23 03:58:06 -04:00
}
$post_ID = ( int ) $post -> ID ;
2008-08-27 15:36:12 -04:00
?>
2013-11-13 17:09:10 -05:00
< form name = " post " action = " <?php echo esc_url( admin_url( 'post.php' ) ); ?> " method = " post " id = " quick-press " class = " initial-form " >
2008-08-27 15:36:12 -04:00
2013-11-13 17:09:10 -05:00
< ? php if ( $error_msg ) : ?>
< div class = " error " >< ? php _e ( $error_msg ); ?> </div>
2008-12-09 15:31:51 -05:00
< ? php endif ; ?>
2008-10-16 18:35:53 -04:00
2013-11-13 17:09:10 -05:00
< div class = " input-text-wrap " id = " title-wrap " >
< label class = " screen-reader-text prompt " for = " title " id = " title-prompt-text " >< ? php _e ( " What's on your mind? " ); ?> </label>
< input type = " text " name = " post_title " id = " title " autocomplete = " off " />
2008-08-27 15:36:12 -04:00
</ div >
2008-12-09 13:03:31 -05:00
2013-11-13 17:09:10 -05:00
< div class = " textarea-wrap " id = " description-wrap " >
< label class = " screen-reader-text prompt " for = " content " id = " content-prompt-text " >< ? php _e ( 'Enter a description' ); ?> </label>
< textarea name = " content " id = " content " class = " mceEditor " rows = " 3 " cols = " 15 " ></ textarea >
2008-08-27 15:36:12 -04:00
</ div >
< p class = " submit " >
2013-11-13 17:09:10 -05:00
< input type = " hidden " name = " action " id = " quickpost-action " value = " post-quickdraft-save " />
2011-10-31 13:08:36 -04:00
< input type = " hidden " name = " post_ID " value = " <?php echo $post_ID ; ?> " />
2010-01-27 09:36:17 -05:00
< input type = " hidden " name = " post_type " value = " post " />
2013-11-13 17:09:10 -05:00
< ? php wp_nonce_field ( 'add-post' ); ?>
< ? php submit_button ( __ ( 'Save Draft' ), 'primary' , 'save' , false , array ( 'id' => 'save-post' ) ); ?>
2008-10-08 19:32:34 -04:00
< br class = " clear " />
2008-08-27 15:36:12 -04:00
</ p >
2008-10-08 19:32:34 -04:00
</ form >
2008-08-27 15:36:12 -04:00
< ? php
2013-11-13 17:09:10 -05:00
wp_dashboard_recent_quickdrafts ();
2008-10-08 19:32:34 -04:00
}
2008-08-27 15:36:12 -04:00
2013-11-13 17:09:10 -05:00
/**
* Show `Recent Drafts` below Quick Draft form
*
*
*
* @ since 3.8 . 0
*
*/
function wp_dashboard_recent_quickdrafts () {
$query_args = array (
'post_type' => 'post' ,
'post_status' => 'draft' ,
'author' => $GLOBALS [ 'current_user' ] -> ID ,
'posts_per_page' => 4 ,
'orderby' => 'modified' ,
'order' => 'DESC'
);
$query_args = apply_filters ( 'dash_recent_quickdrafts_query_args' , $query_args );
$drafts_query = new WP_Query ( $query_args );
$drafts =& $drafts_query -> posts ;
2008-10-08 19:32:34 -04:00
2008-10-22 19:37:55 -04:00
if ( $drafts && is_array ( $drafts ) ) {
2008-08-27 15:36:12 -04:00
$list = array ();
2013-11-13 17:09:10 -05:00
$draft_count = 0 ;
2008-11-02 16:05:38 -05:00
foreach ( $drafts as $draft ) {
2013-11-13 17:09:10 -05:00
if ( 3 == $draft_count )
break ;
$draft_count ++ ;
2008-08-27 15:36:12 -04:00
$url = get_edit_post_link ( $draft -> ID );
2008-10-03 11:56:35 -04:00
$title = _draft_or_post_title ( $draft -> ID );
2013-11-13 17:09:10 -05:00
$item = '<div class="draft-title"><a href="' . $url . '" title="' . sprintf ( __ ( 'Edit “%s”' ), esc_attr ( $title ) ) . '">' . esc_html ( $title ) . '</a> <time datetime="' . get_the_time ( 'c' , $draft ) . '">' . get_the_time ( get_option ( 'date_format' ), $draft ) . '</time></div>' ;
2013-05-08 19:06:41 -04:00
if ( $the_content = wp_trim_words ( $draft -> post_content , 10 ) )
$item .= '<p>' . $the_content . '</p>' ;
2008-11-05 16:56:57 -05:00
$list [] = $item ;
2008-08-27 15:36:12 -04:00
}
2013-11-13 17:09:10 -05:00
do_action ( 'dashboard_quickdraft_drafts_list' , $drafts );
?>
< div class = " drafts " >
< ? php if ( 3 < count ( $drafts ) ) { ?>
< p class = " view-all " >< a href = " edit.php?post_status=draft " >< ? php _e ( 'View all' ); ?> </a></p>
< ? php } ?>
< h4 >< ? php _e ( 'Drafts' ); ?> </h4>
< ul id = " draft-list " >
< li >< ? php echo join ( " </li> \n <li> " , $list ); ?> </li>
</ ul >
</ div >
< ? php }
2008-08-27 15:36:12 -04:00
}
2008-10-08 19:32:34 -04:00
function _wp_dashboard_recent_comments_row ( & $comment , $show_date = true ) {
$GLOBALS [ 'comment' ] =& $comment ;
2008-10-16 16:21:19 -04:00
$comment_post_url = get_edit_post_link ( $comment -> comment_post_ID );
2009-05-15 22:23:12 -04:00
$comment_post_title = strip_tags ( get_the_title ( $comment -> comment_post_ID ));
2008-10-08 19:32:34 -04:00
$comment_post_link = " <a href=' $comment_post_url '> $comment_post_title </a> " ;
2010-05-03 14:16:22 -04:00
$comment_link = '<a class="comment-link" href="' . esc_url ( get_comment_link ()) . '">#</a>' ;
2008-02-02 02:57:51 -05:00
2008-12-09 12:44:04 -05:00
$actions_string = '' ;
2010-09-07 19:35:28 -04:00
if ( current_user_can ( 'edit_comment' , $comment -> comment_ID ) ) {
2009-12-01 17:05:03 -05:00
// preorder it: Approve | Reply | Edit | Spam | Trash
2009-11-27 07:57:35 -05:00
$actions = array (
'approve' => '' , 'unapprove' => '' ,
'reply' => '' ,
'edit' => '' ,
2009-12-01 17:05:03 -05:00
'spam' => '' ,
'trash' => '' , 'delete' => ''
2009-11-27 07:57:35 -05:00
);
2009-10-08 04:24:59 -04:00
$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 " );
2009-12-15 04:45:29 -05:00
$spam_url = esc_url ( " comment.php?action=spamcomment&p= $comment->comment_post_ID &c= $comment->comment_ID & $del_nonce " );
2009-10-08 04:24:59 -04:00
$trash_url = esc_url ( " comment.php?action=trashcomment&p= $comment->comment_post_ID &c= $comment->comment_ID & $del_nonce " );
2009-11-10 05:38:19 -05:00
$delete_url = esc_url ( " comment.php?action=deletecomment&p= $comment->comment_post_ID &c= $comment->comment_ID & $del_nonce " );
2009-10-08 04:24:59 -04:00
2012-11-05 20:01:52 -05:00
$actions [ 'approve' ] = " <a href=' $approve_url ' data-wp-lists='dim:the-comment-list:comment- $comment->comment_ID :unapproved:e7e7d3:e7e7d3:new=approved' class='vim-a' title=' " . esc_attr__ ( 'Approve this comment' ) . " '> " . __ ( 'Approve' ) . '</a>' ;
$actions [ 'unapprove' ] = " <a href=' $unapprove_url ' data-wp-lists='dim:the-comment-list:comment- $comment->comment_ID :unapproved:e7e7d3:e7e7d3:new=unapproved' class='vim-u' title=' " . esc_attr__ ( 'Unapprove this comment' ) . " '> " . __ ( 'Unapprove' ) . '</a>' ;
2010-12-21 12:17:58 -05:00
$actions [ 'edit' ] = " <a href='comment.php?action=editcomment&c= { $comment -> comment_ID } ' title=' " . esc_attr__ ( 'Edit comment' ) . " '> " . __ ( 'Edit' ) . '</a>' ;
$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>' ;
2012-11-05 20:01:52 -05:00
$actions [ 'spam' ] = " <a href=' $spam_url ' data-wp-lists='delete:the-comment-list:comment- $comment->comment_ID ::spam=1' class='vim-s vim-destructive' title=' " . esc_attr__ ( 'Mark this comment as spam' ) . " '> " . /* translators: mark as spam link */ _x ( 'Spam' , 'verb' ) . '</a>' ;
2009-11-10 05:38:19 -05:00
if ( ! EMPTY_TRASH_DAYS )
2012-11-05 20:01:52 -05:00
$actions [ 'delete' ] = " <a href=' $delete_url ' data-wp-lists='delete:the-comment-list:comment- $comment->comment_ID ::trash=1' class='delete vim-d vim-destructive'> " . __ ( 'Delete Permanently' ) . '</a>' ;
2009-11-10 05:38:19 -05:00
else
2012-11-05 20:01:52 -05:00
$actions [ 'trash' ] = " <a href=' $trash_url ' data-wp-lists='delete:the-comment-list:comment- $comment->comment_ID ::trash=1' class='delete vim-d vim-destructive' title=' " . esc_attr__ ( 'Move this comment to the trash' ) . " '> " . _x ( 'Trash' , 'verb' ) . '</a>' ;
2008-02-02 02:57:51 -05:00
2009-11-27 07:57:35 -05:00
$actions = apply_filters ( 'comment_row_actions' , array_filter ( $actions ), $comment );
2008-02-02 02:57:51 -05:00
2008-10-08 19:32:34 -04:00
$i = 0 ;
foreach ( $actions as $action => $link ) {
++ $i ;
( ( ( 'approve' == $action || 'unapprove' == $action ) && 2 === $i ) || 1 === $i ) ? $sep = '' : $sep = ' | ' ;
2008-02-02 02:57:51 -05:00
2008-10-08 19:32:34 -04:00
// Reply and quickedit need a hide-if-no-js span
2008-11-05 16:56:57 -05:00
if ( 'reply' == $action || 'quickedit' == $action )
2008-10-08 19:32:34 -04:00
$action .= ' hide-if-no-js' ;
2008-02-02 02:57:51 -05:00
2008-12-09 07:00:44 -05:00
$actions_string .= " <span class=' $action '> $sep $link </span> " ;
2008-02-02 02:57:51 -05:00
}
2008-10-08 19:32:34 -04:00
}
2008-02-02 02:57:51 -05:00
2008-10-08 19:32:34 -04:00
?>
2008-02-02 02:57:51 -05:00
2008-10-08 21:03:50 -04:00
< div id = " comment-<?php echo $comment->comment_ID ; ?> " < ? php comment_class ( array ( 'comment-item' , wp_get_comment_status ( $comment -> comment_ID ) ) ); ?> >
2008-10-08 19:32:34 -04:00
< ? php if ( ! $comment -> comment_type || 'comment' == $comment -> comment_type ) : ?>
2013-08-22 16:08:08 -04:00
< ? php echo get_avatar ( $comment , 50 , 'mystery' ); ?>
2009-03-05 22:20:38 -05:00
< div class = " dashboard-comment-wrap " >
2010-01-21 16:37:43 -05:00
< h4 class = " comment-meta " >
< ? php printf ( /* translators: 1: comment author, 2: post link, 3: notification if the comment is pending */ __ ( '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 >
2008-10-08 19:32:34 -04:00
< ? php
else :
switch ( $comment -> comment_type ) :
case 'pingback' :
$type = __ ( 'Pingback' );
break ;
case 'trackback' :
$type = __ ( 'Trackback' );
break ;
default :
$type = ucwords ( $comment -> comment_type );
endswitch ;
2009-05-18 11:11:07 -04:00
$type = esc_html ( $type );
2008-10-08 19:32:34 -04:00
?>
2009-03-05 22:20:38 -05:00
< div class = " dashboard-comment-wrap " >
2009-03-02 14:20:19 -05:00
< ? php /* translators: %1$s is type of comment, %2$s is link to the post */ ?>
2009-10-01 13:42:33 -04:00
< h4 class = " comment-meta " >< ? php printf ( _x ( '%1$s on %2$s' , 'dashboard' ), " <strong> $type </strong> " , $comment_post_link . " " . $comment_link ); ?> </h4>
2008-11-05 16:56:57 -05:00
< p class = " comment-author " >< ? php comment_author_link (); ?> </p>
2008-10-08 19:32:34 -04:00
< ? php endif ; // comment_type ?>
< blockquote >< p >< ? php comment_excerpt (); ?> </p></blockquote>
2008-11-27 23:33:35 -05:00
< p class = " row-actions " >< ? php echo $actions_string ; ?> </p>
2009-03-05 22:20:38 -05:00
</ div >
2008-10-08 19:32:34 -04:00
</ div >
< ? php
}
2008-02-02 02:57:51 -05:00
2010-02-12 23:39:39 -05:00
/**
2013-11-13 17:09:10 -05:00
* callback function for `Activity` widget
*
*
*
* @ since 3.8 . 0
2010-02-12 23:39:39 -05:00
*
*/
2013-11-13 17:09:10 -05:00
function wp_dashboard_activity () {
2010-02-12 23:39:39 -05:00
2013-11-13 17:09:10 -05:00
echo '<div id="activity-widget">' ;
2010-02-12 23:39:39 -05:00
2013-11-13 17:09:10 -05:00
do_action ( 'dashboard_activity_beginning' );
$future_posts = dashboard_show_published_posts ( array (
'display' => 2 ,
'max' => 5 ,
'status' => 'future' ,
'order' => 'ASC' ,
'title' => __ ( 'Publishing Soon' ),
'id' => 'future-posts' ,
) );
$recent_posts = dashboard_show_published_posts ( array (
'display' => 2 ,
'max' => 5 ,
'status' => 'publish' ,
'order' => 'DESC' ,
'title' => __ ( 'Recently Published' ),
'id' => 'published-posts' ,
) );
2010-02-12 23:39:39 -05:00
2013-11-13 17:09:10 -05:00
do_action ( 'dashboard_activity_middle' );
2010-02-12 23:39:39 -05:00
2013-11-13 17:09:10 -05:00
$recent_comments = dashboard_comments ();
if ( ! $future_posts && ! $recent_posts && ! $recent_comments ) {
echo '<div class="no-activity">' ;
echo '<p class="smiley"></p>' ;
echo '<p>' . __ ( 'No activity yet!' ) . '</p>' ;
echo '</div>' ;
}
do_action ( 'dashboard_activity_end' );
2010-02-12 23:39:39 -05:00
2013-11-13 17:09:10 -05:00
echo '</div>' ;
2008-02-02 02:57:51 -05:00
}
2008-09-16 20:40:10 -04:00
/**
2013-11-13 17:09:10 -05:00
* Generates `Publishing Soon` and `Recently Published` sections
*
*
*
* @ since 3.8 . 0
2008-09-16 20:40:10 -04:00
*
*/
2013-11-13 17:09:10 -05:00
function dashboard_show_published_posts ( $args ) {
$query_args = array (
'post_type' => 'post' ,
'post_status' => $args [ 'status' ],
'orderby' => 'date' ,
'order' => $args [ 'order' ],
'posts_per_page' => intval ( $args [ 'max' ] ),
'no_found_rows' => true ,
'cache_results' => false
);
$query_args = apply_filters ( 'dash_show_published_posts_query_args' , $query_args );
$posts = new WP_Query ( $query_args );
2009-03-07 14:44:28 -05:00
2013-11-13 17:09:10 -05:00
if ( $posts -> have_posts () ) {
2008-03-02 15:17:30 -05:00
2013-11-13 17:09:10 -05:00
echo '<div id="' . $args [ 'id' ] . '" class="activity-block">' ;
2008-02-21 16:20:09 -05:00
2013-11-13 17:09:10 -05:00
if ( $posts -> post_count > $args [ 'display' ] ) {
echo '<small class="show-more"><a href="#">' . sprintf ( __ ( 'See %s more…' ), $posts -> post_count - intval ( $args [ 'display' ] ) ) . '</a></small>' ;
}
2009-06-19 02:08:27 -04:00
2013-11-13 17:09:10 -05:00
echo '<h4>' . $args [ 'title' ] . '</h4>' ;
2008-02-21 16:20:09 -05:00
2013-11-13 17:09:10 -05:00
echo '<ul>' ;
2009-02-27 14:32:50 -05:00
2013-11-13 17:09:10 -05:00
$i = 0 ;
while ( $posts -> have_posts () ) {
$posts -> the_post ();
printf (
'<li%s><span>%s, %s</span> <a href="%s">%s</a></li>' ,
( $i >= intval ( $args [ 'display' ] ) ? ' class="hidden"' : '' ),
dashboard_relative_date ( get_the_time ( 'U' ) ),
get_the_time (),
get_edit_post_link (),
get_the_title ()
);
$i ++ ;
2009-06-15 12:56:51 -04:00
}
2009-02-27 14:32:50 -05:00
2013-11-13 17:09:10 -05:00
echo '</ul>' ;
echo '</div>' ;
2009-02-27 14:32:50 -05:00
2013-11-13 17:09:10 -05:00
} else {
return false ;
2008-02-21 16:20:09 -05:00
}
2009-02-27 14:32:50 -05:00
2013-11-13 17:09:10 -05:00
wp_reset_postdata ();
2008-02-21 16:20:09 -05:00
2013-11-13 17:09:10 -05:00
return true ;
2008-10-08 19:32:34 -04:00
}
2008-09-16 20:40:10 -04:00
/**
2013-11-13 17:09:10 -05:00
* Show `Comments` section
2008-09-16 20:40:10 -04:00
*
*
*
2013-11-13 17:09:10 -05:00
* @ since 3.8 . 0
2008-09-16 20:40:10 -04:00
*
*/
2013-11-13 17:09:10 -05:00
function dashboard_comments ( $total_items = 5 ) {
global $wpdb ;
2008-02-21 16:20:09 -05:00
2013-11-13 17:09:10 -05:00
// Select all comment types and filter out spam later for better query performance.
$comments = array ();
$start = 0 ;
2011-12-22 19:25:09 -05:00
2013-11-13 17:09:10 -05:00
$comments_query = array (
'number' => $total_items * 5 ,
'offset' => 0
);
if ( ! current_user_can ( 'edit_posts' ) )
$comments_query [ 'status' ] = 'approve' ;
2011-12-22 19:25:09 -05:00
2013-11-13 17:09:10 -05:00
while ( count ( $comments ) < $total_items && $possible = get_comments ( $comments_query ) ) {
foreach ( $possible as $comment ) {
if ( ! current_user_can ( 'read_post' , $comment -> comment_post_ID ) )
continue ;
$comments [] = $comment ;
if ( count ( $comments ) == $total_items )
break 2 ;
}
$comments_query [ 'offset' ] += $comments_query [ 'number' ];
$comments_query [ 'number' ] = $total_items * 10 ;
2011-12-22 19:25:09 -05:00
}
2013-11-13 17:09:10 -05:00
if ( $comments ) {
echo '<div id="latest-comments" class="activity-block">' ;
echo '<h4>' . __ ( 'Comments' ) . '</h4>' ;
2011-12-22 19:25:09 -05:00
2013-11-13 17:09:10 -05:00
echo '<div id="the-comment-list" data-wp-lists="list:comment">' ;
foreach ( $comments as $comment )
_wp_dashboard_recent_comments_row ( $comment );
echo '</div>' ;
2011-12-22 19:25:09 -05:00
2013-11-13 17:09:10 -05:00
if ( current_user_can ( 'edit_posts' ) )
_get_list_table ( 'WP_Comments_List_Table' ) -> views ();
2011-12-22 19:25:09 -05:00
2013-11-13 17:09:10 -05:00
wp_comment_reply ( - 1 , false , 'dashboard' , false );
wp_comment_trashnotice ();
2011-12-22 19:25:09 -05:00
2013-11-13 17:09:10 -05:00
echo '</div>' ;
} else {
return false ;
}
return true ;
}
2011-12-22 19:25:09 -05:00
2013-11-13 17:09:10 -05:00
/**
* return relative date for given timestamp
*
*
*
* @ since 3.8 . 0
*
*/
function dashboard_relative_date ( $time ) {
2011-12-22 19:25:09 -05:00
2013-11-13 17:09:10 -05:00
$diff = floor ( ( $time - time () ) / DAY_IN_SECONDS );
2011-12-22 19:25:09 -05:00
2013-11-13 17:09:10 -05:00
if ( $diff == 0 )
return __ ( 'Today' );
2011-12-22 19:25:09 -05:00
2013-11-13 17:09:10 -05:00
if ( $diff == 1 )
return __ ( 'Tomorrow' );
2011-12-22 19:25:09 -05:00
2013-11-13 17:09:10 -05:00
return date ( 'M jS' , $time );
2011-12-22 19:25:09 -05:00
}
2013-11-15 15:15:10 -05:00
/**
* Display generic dashboard RSS widget feed .
*
* @ since 2.5 . 0
*
* @ param string $widget_id
*/
function wp_dashboard_rss_output ( $widget_id ) {
$widgets = get_option ( 'dashboard_widget_options' );
echo '<div class="rss-widget">' ;
wp_widget_rss_output ( $widgets [ $widget_id ] );
echo " </div> " ;
}
2008-09-16 20:40:10 -04:00
/**
* Checks to see if all of the feed url in $check_urls are cached .
*
* If $check_urls is empty , look for the rss feed url found in the dashboard
2011-09-03 10:18:10 -04:00
* widget options of $widget_id . If cached , call $callback , a function that
2008-09-16 20:40:10 -04:00
* echoes out output for this widget . If not cache , echo a " Loading... " stub
* which is later replaced by AJAX call ( see top of / wp - admin / index . php )
*
2010-09-04 22:45:39 -04:00
* @ since 2.5 . 0
2008-09-16 20:40:10 -04:00
*
2010-09-04 22:45:39 -04:00
* @ param string $widget_id
2008-09-16 20:40:10 -04:00
* @ param callback $callback
* @ param array $check_urls RSS feeds
* @ return bool False on failure . True on success .
*/
2008-02-21 16:20:09 -05:00
function wp_dashboard_cached_rss_widget ( $widget_id , $callback , $check_urls = array () ) {
2011-04-30 13:24:06 -04:00
$loading = '<p class="widget-loading hide-if-no-js">' . __ ( 'Loading…' ) . '</p><p class="hide-if-js">' . __ ( 'This widget requires JavaScript.' ) . '</p>' ;
2011-06-10 02:31:39 -04:00
$doing_ajax = ( defined ( 'DOING_AJAX' ) && DOING_AJAX );
2008-02-21 16:20:09 -05:00
if ( empty ( $check_urls ) ) {
2011-04-29 10:46:27 -04:00
$widgets = get_option ( 'dashboard_widget_options' );
2011-06-10 02:31:39 -04:00
if ( empty ( $widgets [ $widget_id ][ 'url' ]) && ! $doing_ajax ) {
2008-02-21 16:20:09 -05:00
echo $loading ;
return false ;
}
$check_urls = array ( $widgets [ $widget_id ][ 'url' ] );
}
2011-06-10 23:33:17 -04:00
$cache_key = 'dash_' . md5 ( $widget_id );
2011-06-10 02:31:39 -04:00
if ( false !== ( $output = get_transient ( $cache_key ) ) ) {
echo $output ;
return true ;
}
if ( ! $doing_ajax ) {
echo $loading ;
return false ;
2008-02-21 16:20:09 -05:00
}
if ( $callback && is_callable ( $callback ) ) {
$args = array_slice ( func_get_args (), 2 );
array_unshift ( $args , $widget_id );
2011-06-10 02:31:39 -04:00
ob_start ();
2008-02-21 16:20:09 -05:00
call_user_func_array ( $callback , $args );
2012-09-25 01:26:19 -04:00
set_transient ( $cache_key , ob_get_flush (), 12 * HOUR_IN_SECONDS ); // Default lifetime in cache of 12 hours (same as the feeds)
2008-02-21 16:20:09 -05:00
}
return true ;
}
2008-10-08 19:32:34 -04:00
/* Dashboard Widgets Controls */
2008-02-02 02:57:51 -05:00
// Calls widget_control callback
2008-09-16 20:40:10 -04:00
/**
* Calls widget control callback .
*
2010-09-04 22:45:39 -04:00
* @ since 2.5 . 0
2008-09-16 20:40:10 -04:00
*
* @ param int $widget_control_id Registered Widget ID .
*/
2008-03-23 12:34:28 -04:00
function wp_dashboard_trigger_widget_control ( $widget_control_id = false ) {
2008-10-08 19:32:34 -04:00
global $wp_dashboard_control_callbacks ;
2008-12-09 13:03:31 -05:00
2008-10-08 19:32:34 -04:00
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 ]) ) {
call_user_func ( $wp_dashboard_control_callbacks [ $widget_control_id ], '' , array ( 'id' => $widget_control_id , 'callback' => $wp_dashboard_control_callbacks [ $widget_control_id ] ) );
}
2008-02-02 02:57:51 -05:00
}
2008-09-16 20:40:10 -04:00
/**
2013-11-15 15:15:10 -05:00
* WordPress News dashboard widget .
2013-11-13 17:09:10 -05:00
*
2013-11-15 15:15:10 -05:00
* @ since 2.7 . 0
2013-11-13 17:09:10 -05:00
*/
2013-11-15 15:15:10 -05:00
function wp_dashboard_primary () {
$feeds = array (
2013-11-13 17:09:10 -05:00
'news' => array (
'link' => apply_filters ( 'dashboard_primary_link' , __ ( 'http://wordpress.org/news/' ) ),
'url' => apply_filters ( 'dashboard_primary_feed' , __ ( 'http://wordpress.org/news/feed/' ) ),
'title' => '' ,
'items' => 1 ,
'show_summary' => 1 ,
'show_author' => 0 ,
'show_date' => 1 ,
),
'planet' => array (
'link' => apply_filters ( 'dashboard_secondary_link' , __ ( 'http://planet.wordpress.org/' ) ),
'url' => apply_filters ( 'dashboard_secondary_feed' , __ ( 'http://planet.wordpress.org/feed/' ) ),
'title' => '' ,
'items' => 3 ,
'show_summary' => 0 ,
'show_author' => 0 ,
'show_date' => 0 ,
2013-11-15 15:15:10 -05:00
)
);
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' ) ) ) {
$feeds [ 'plugins' ] = array (
2013-11-13 17:09:10 -05:00
'link' => '' ,
'url' => array (
2013-11-15 15:15:10 -05:00
'popular' => 'http://wordpress.org/plugins/rss/browse/popular/' ,
2013-11-13 17:09:10 -05:00
),
'title' => '' ,
'items' => 1 ,
'show_summary' => 0 ,
'show_author' => 0 ,
'show_date' => 0 ,
2013-11-15 15:15:10 -05:00
);
2013-11-13 17:09:10 -05:00
}
2013-11-15 15:15:10 -05:00
wp_dashboard_cached_rss_widget ( 'dashboard_primary' , 'wp_dashboard_primary_output' , $feeds );
2013-11-13 17:09:10 -05:00
}
/**
2013-11-15 15:15:10 -05:00
* Display the WordPress news feeds .
2013-11-13 17:09:10 -05:00
*
* @ since 3.8 . 0
*/
2013-11-15 15:15:10 -05:00
function wp_dashboard_primary_output ( $widget_id , $feeds ) {
foreach ( $feeds as $type => $args ) {
2013-11-13 17:09:10 -05:00
$args [ 'type' ] = $type ;
echo '<div class="rss-widget">' ;
2013-11-15 15:15:10 -05:00
if ( $type === 'plugins' ) {
wp_dashboard_plugins_output ( $args [ 'url' ], $args );
} else {
wp_widget_rss_output ( $args [ 'url' ], $args );
}
2013-11-13 17:09:10 -05:00
echo " </div> " ;
2008-02-02 02:57:51 -05:00
}
2013-11-13 17:09:10 -05:00
}
/**
2013-11-15 15:15:10 -05:00
* Display plugins text for the WordPress news widget .
2013-11-13 17:09:10 -05:00
*
2013-11-15 15:15:10 -05:00
* @ since 2.5 . 0
2013-11-13 17:09:10 -05:00
*/
2013-11-15 15:15:10 -05:00
function wp_dashboard_plugins_output ( $rss , $args = array () ) {
2013-11-13 17:09:10 -05:00
// Plugin feeds plus link to install them
2013-11-15 15:15:10 -05:00
$popular = fetch_feed ( $args [ 'url' ][ 'popular' ] );
2013-11-13 17:09:10 -05:00
2013-11-15 15:15:10 -05:00
if ( false === $plugin_slugs = get_transient ( 'plugin_slugs' ) ) {
$plugin_slugs = array_keys ( get_plugins () );
set_transient ( 'plugin_slugs' , $plugin_slugs , DAY_IN_SECONDS );
}
2013-11-13 17:09:10 -05:00
2013-11-15 15:15:10 -05:00
echo '<ul>' ;
2013-11-13 17:09:10 -05:00
2013-11-15 15:15:10 -05:00
foreach ( array (
'popular' => __ ( 'Popular Plugin' )
) as $feed => $label ) {
if ( is_wp_error ( $$feed ) || ! $$feed -> get_item_quantity () )
continue ;
2013-11-13 17:09:10 -05:00
2013-11-15 15:15:10 -05:00
$items = $$feed -> get_items ( 0 , 5 );
2013-11-13 17:09:10 -05:00
2013-11-15 15:15:10 -05:00
// Pick a random, non-installed plugin
while ( true ) {
// Abort this foreach loop iteration if there's no plugins left of this type
if ( 0 == count ( $items ) )
continue 2 ;
2013-11-13 17:09:10 -05:00
2013-11-15 15:15:10 -05:00
$item_key = array_rand ( $items );
$item = $items [ $item_key ];
2013-11-13 17:09:10 -05:00
2013-11-15 15:15:10 -05:00
list ( $link , $frag ) = explode ( '#' , $item -> get_link () );
2008-02-02 02:57:51 -05:00
2013-11-15 15:15:10 -05:00
$link = esc_url ( $link );
if ( preg_match ( '|/([^/]+?)/?$|' , $link , $matches ) )
$slug = $matches [ 1 ];
else {
unset ( $items [ $item_key ] );
continue ;
}
2013-11-13 17:09:10 -05:00
2013-11-15 15:15:10 -05:00
// Is this random plugin's slug already installed? If so, try again.
reset ( $plugin_slugs );
foreach ( $plugin_slugs as $plugin_slug ) {
if ( $slug == substr ( $plugin_slug , 0 , strlen ( $slug ) ) ) {
unset ( $items [ $item_key ] );
continue 2 ;
2013-11-13 17:09:10 -05:00
}
}
2013-11-15 15:15:10 -05:00
// If we get to this point, then the random plugin isn't installed and we can stop the while().
break ;
}
2013-11-13 17:09:10 -05:00
2013-11-15 15:15:10 -05:00
// Eliminate some common badly formed plugin descriptions
while ( ( null !== $item_key = array_rand ( $items ) ) && false !== strpos ( $items [ $item_key ] -> get_description (), 'Plugin Name:' ) )
unset ( $items [ $item_key ]);
2013-11-13 17:09:10 -05:00
2013-11-15 15:15:10 -05:00
if ( ! isset ( $items [ $item_key ]) )
continue ;
2013-11-13 17:09:10 -05:00
2013-11-15 15:15:10 -05:00
$title = esc_html ( $item -> get_title () );
2013-11-13 17:09:10 -05:00
2013-11-15 15:15:10 -05:00
$description = esc_html ( strip_tags ( @ html_entity_decode ( $item -> get_description (), ENT_QUOTES , get_option ( 'blog_charset' ) ) ) );
2013-11-13 17:09:10 -05:00
2013-11-15 15:15:10 -05:00
$ilink = wp_nonce_url ( 'plugin-install.php?tab=plugin-information&plugin=' . $slug , 'install-plugin_' . $slug ) . '&TB_iframe=true&width=600&height=800' ;
2013-11-13 17:09:10 -05:00
2013-11-15 15:15:10 -05:00
echo " <li class='dashboard-news-plugin'><span> $label :</span> <a href=' $link ' class='dashboard-news-plugin-link'> $title </a></h5> <span>(<a href=' $ilink ' class='thickbox' title=' $title '> " . __ ( 'Install' ) . " </a>)</span></li> " ;
2013-11-13 17:09:10 -05:00
2013-11-15 15:15:10 -05:00
$$feed -> __destruct ();
unset ( $$feed );
2013-11-13 17:09:10 -05:00
}
2013-11-15 15:15:10 -05:00
echo '</ul>' ;
2008-02-02 02:57:51 -05:00
}
2013-05-14 08:37:30 -04:00
/**
* Display file upload quota on dashboard .
*
* Runs on the activity_box_end hook in wp_dashboard_right_now () .
*
* @ since 3.0 . 0
*
* @ return bool True if not multisite , user can ' t upload files , or the space check option is disabled .
*/
2010-08-02 13:56:05 -04:00
function wp_dashboard_quota () {
2013-11-13 17:09:10 -05:00
if ( ! is_multisite () || ! current_user_can ( 'upload_files' ) || get_site_option ( 'upload_space_check_disabled' ) )
2010-08-02 13:56:05 -04:00
return true ;
$quota = get_space_allowed ();
2012-08-01 09:52:06 -04:00
$used = get_space_used ();
2010-08-02 13:56:05 -04:00
if ( $used > $quota )
$percentused = '100' ;
else
$percentused = ( $used / $quota ) * 100 ;
2013-11-13 17:09:10 -05:00
$used_class = ( $percentused >= 70 ) ? ' warning' : '' ;
2010-08-02 13:56:05 -04:00
$used = round ( $used , 2 );
$percentused = number_format ( $percentused );
?>
2013-11-13 17:09:10 -05:00
< h4 class = " mu-storage " >< ? php _e ( 'Storage Space' ); ?> </h4>
< div class = " mu-storage " >
< ul >
< li class = " storage-count " >
< ? php printf (
'<a href="%1$s" title="%3$s">%2$sMB %4$s</a>' ,
esc_url ( admin_url ( 'upload.php' ) ),
number_format_i18n ( $quota ),
__ ( 'Manage Uploads' ),
__ ( 'Space Allowed' )
); ?>
</ li >< li class = " storage-count <?php echo $used_class ; ?> " >
< ? php printf (
'<a href="%1$s" title="%4$s" class="musublink">%2$sMB (%3$s%%) %5$s</a>' ,
esc_url ( admin_url ( 'upload.php' ) ),
number_format_i18n ( $used , 2 ),
$percentused ,
__ ( 'Manage Uploads' ),
__ ( 'Space Used' )
); ?>
</ li >
</ ul >
2010-08-02 13:56:05 -04:00
</ div >
< ? php
}
add_action ( 'activity_box_end' , 'wp_dashboard_quota' );
2011-05-11 23:33:27 -04:00
// Display Browser Nag Meta Box
function wp_dashboard_browser_nag () {
$notice = '' ;
$response = wp_check_browser_version ();
2011-06-05 11:14:51 -04:00
if ( $response ) {
if ( $response [ 'insecure' ] ) {
2011-06-13 04:30:53 -04:00
$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' ] ) );
2011-06-05 11:14:51 -04:00
} else {
2011-06-13 04:30:53 -04:00
$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' ] ) );
2011-06-05 11:14:51 -04:00
}
2011-05-11 23:33:27 -04:00
2011-06-05 11:14:51 -04:00
$browser_nag_class = '' ;
if ( ! empty ( $response [ 'img_src' ] ) ) {
$img_src = ( is_ssl () && ! empty ( $response [ 'img_src_ssl' ] ) ) ? $response [ 'img_src_ssl' ] : $response [ 'img_src' ];
2011-05-11 23:33:27 -04:00
2011-06-05 11:14:51 -04:00
$notice .= '<div class="alignright browser-icon"><a href="' . esc_attr ( $response [ 'update_url' ]) . '"><img src="' . esc_attr ( $img_src ) . '" alt="" /></a></div>' ;
$browser_nag_class = ' has-browser-icon' ;
}
$notice .= " <p class='browser-update-nag { $browser_nag_class } '> { $msg } </p> " ;
2012-05-13 18:44:01 -04:00
$browsehappy = 'http://browsehappy.com/' ;
$locale = get_locale ();
if ( 'en_US' !== $locale )
$browsehappy = add_query_arg ( 'locale' , $locale , $browsehappy );
$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>' ;
2011-06-11 17:14:03 -04:00
$notice .= '<p class="hide-if-no-js"><a href="" class="dismiss">' . __ ( 'Dismiss' ) . '</a></p>' ;
2011-06-05 11:14:51 -04:00
$notice .= '<div class="clear"></div>' ;
2011-05-11 23:33:27 -04:00
}
echo apply_filters ( 'browse-happy-notice' , $notice , $response );
}
function dashboard_browser_nag_class ( $classes ) {
$response = wp_check_browser_version ();
2011-06-05 11:14:51 -04:00
if ( $response && $response [ 'insecure' ] )
2011-05-11 23:33:27 -04:00
$classes [] = 'browser-insecure' ;
return $classes ;
}
/**
* Check if the user needs a browser update
*
2011-06-11 00:40:18 -04:00
* @ since 3.2 . 0
2011-06-05 11:14:51 -04:00
*
* @ return array | bool False on failure , array of browser data on success .
2011-05-11 23:33:27 -04:00
*/
function wp_check_browser_version () {
2011-06-05 11:14:51 -04:00
if ( empty ( $_SERVER [ 'HTTP_USER_AGENT' ] ) )
return false ;
2011-05-11 23:33:27 -04:00
$key = md5 ( $_SERVER [ 'HTTP_USER_AGENT' ] );
2011-05-12 01:45:02 -04:00
if ( false === ( $response = get_site_transient ( 'browser_' . $key ) ) ) {
2011-05-11 23:33:27 -04:00
global $wp_version ;
$options = array (
'body' => array ( 'useragent' => $_SERVER [ 'HTTP_USER_AGENT' ] ),
2012-04-11 16:22:48 -04:00
'user-agent' => 'WordPress/' . $wp_version . '; ' . home_url ()
2011-05-11 23:33:27 -04:00
);
2013-09-14 15:31:08 -04:00
$response = wp_remote_post ( 'http://api.wordpress.org/core/browse-happy/1.1/' , $options );
2011-05-11 23:33:27 -04:00
2011-05-14 15:45:07 -04:00
if ( is_wp_error ( $response ) || 200 != wp_remote_retrieve_response_code ( $response ) )
return false ;
2011-05-11 23:33:27 -04:00
/**
* Response should be an array with :
2011-06-05 11:14:51 -04:00
* 'name' - string - A user friendly browser name
2011-05-11 23:33:27 -04:00
* 'version' - string - The most recent version of the browser
* 'current_version' - string - The version of the browser the user is using
* 'upgrade' - boolean - Whether the browser needs an upgrade
* 'insecure' - boolean - Whether the browser is deemed insecure
* 'upgrade_url' - string - The url to visit to upgrade
* 'img_src' - string - An image representing the browser
2011-05-11 23:45:25 -04:00
* 'img_src_ssl' - string - An image ( over SSL ) representing the browser
2011-05-11 23:33:27 -04:00
*/
2013-09-14 15:31:08 -04:00
$response = json_decode ( wp_remote_retrieve_body ( $response ), true );
2011-05-11 23:33:27 -04:00
2012-04-27 11:57:51 -04:00
if ( ! is_array ( $response ) )
2011-06-05 11:14:51 -04:00
return false ;
2011-05-11 23:33:27 -04:00
2012-09-25 01:26:19 -04:00
set_site_transient ( 'browser_' . $key , $response , WEEK_IN_SECONDS );
2011-05-11 23:33:27 -04:00
}
return $response ;
}
2008-11-17 20:04:41 -05:00
/**
* Empty function usable by plugins to output empty dashboard widget ( to be populated later by JS ) .
*/
function wp_dashboard_empty () {}
2011-09-22 02:23:10 -04:00
/**
* Displays a welcome panel to introduce users to WordPress .
*
2012-01-04 14:03:33 -05:00
* @ since 3.3 . 0
2011-09-22 02:23:10 -04:00
*/
function wp_welcome_panel () {
?>
2011-11-18 19:42:22 -05:00
< div class = " welcome-panel-content " >
2012-09-26 15:44:43 -04:00
< h3 >< ? php _e ( 'Welcome to WordPress!' ); ?> </h3>
< p class = " about-description " >< ? php _e ( 'We’ve assembled some links to get you started:' ); ?> </p>
2011-11-18 19:42:22 -05:00
< div class = " welcome-panel-column-container " >
< div class = " welcome-panel-column " >
2012-09-26 15:44:43 -04:00
< h4 >< ? php _e ( 'Get Started' ); ?> </h4>
2012-11-30 08:40:59 -05:00
< a class = " button button-primary button-hero load-customize hide-if-no-customize " href = " <?php echo wp_customize_url(); ?> " >< ? php _e ( 'Customize Your Site' ); ?> </a>
< a class = " button button-primary button-hero hide-if-customize " href = " <?php echo admin_url( 'themes.php' ); ?> " >< ? php _e ( 'Customize Your Site' ); ?> </a>
2012-09-26 15:44:43 -04:00
< ? php if ( current_user_can ( 'install_themes' ) || ( current_user_can ( 'switch_themes' ) && count ( wp_get_themes ( array ( 'allowed' => true ) ) ) > 1 ) ) : ?>
2012-10-01 10:58:05 -04:00
< p class = " hide-if-no-customize " >< ? php printf ( __ ( 'or, <a href="%s">change your theme completely</a>' ), admin_url ( 'themes.php' ) ); ?> </p>
2012-09-26 15:44:43 -04:00
< ? php endif ; ?>
2011-11-18 19:42:22 -05:00
</ div >
< div class = " welcome-panel-column " >
2012-09-26 15:44:43 -04:00
< h4 >< ? php _e ( 'Next Steps' ); ?> </h4>
2011-11-18 19:42:22 -05:00
< ul >
2012-09-26 15:44:43 -04:00
< ? php if ( 'page' == get_option ( 'show_on_front' ) && ! get_option ( 'page_for_posts' ) ) : ?>
2012-11-17 16:51:39 -05:00
< li >< ? php printf ( '<a href="%s" class="welcome-icon welcome-edit-page">' . __ ( 'Edit your front page' ) . '</a>' , get_edit_post_link ( get_option ( 'page_on_front' ) ) ); ?> </li>
< li >< ? php printf ( '<a href="%s" class="welcome-icon welcome-add-page">' . __ ( 'Add additional pages' ) . '</a>' , admin_url ( 'post-new.php?post_type=page' ) ); ?> </li>
2012-09-26 15:44:43 -04:00
< ? php elseif ( 'page' == get_option ( 'show_on_front' ) ) : ?>
2012-11-17 16:51:39 -05:00
< li >< ? php printf ( '<a href="%s" class="welcome-icon welcome-edit-page">' . __ ( 'Edit your front page' ) . '</a>' , get_edit_post_link ( get_option ( 'page_on_front' ) ) ); ?> </li>
< li >< ? php printf ( '<a href="%s" class="welcome-icon welcome-add-page">' . __ ( 'Add additional pages' ) . '</a>' , admin_url ( 'post-new.php?post_type=page' ) ); ?> </li>
< li >< ? php printf ( '<a href="%s" class="welcome-icon welcome-write-blog">' . __ ( 'Add a blog post' ) . '</a>' , admin_url ( 'post-new.php' ) ); ?> </li>
2012-09-26 15:44:43 -04:00
< ? php else : ?>
2012-11-17 16:51:39 -05:00
< li >< ? php printf ( '<a href="%s" class="welcome-icon welcome-write-blog">' . __ ( 'Write your first blog post' ) . '</a>' , admin_url ( 'post-new.php' ) ); ?> </li>
< li >< ? php printf ( '<a href="%s" class="welcome-icon welcome-add-page">' . __ ( 'Add an About page' ) . '</a>' , admin_url ( 'post-new.php?post_type=page' ) ); ?> </li>
2012-09-26 15:44:43 -04:00
< ? php endif ; ?>
2012-11-17 16:51:39 -05:00
< li >< ? php printf ( '<a href="%s" class="welcome-icon welcome-view-site">' . __ ( 'View your site' ) . '</a>' , home_url ( '/' ) ); ?> </li>
2011-11-18 19:42:22 -05:00
</ ul >
</ div >
2011-11-19 21:10:10 -05:00
< div class = " welcome-panel-column welcome-panel-last " >
2012-11-05 16:12:46 -05:00
< h4 >< ? php _e ( 'More Actions' ); ?> </h4>
2012-09-26 15:44:43 -04:00
< ul >
2012-11-23 11:42:31 -05:00
< li >< ? php printf ( '<div class="welcome-icon welcome-widgets-menus">' . __ ( 'Manage <a href="%1$s">widgets</a> or <a href="%2$s">menus</a>' ) . '</div>' , admin_url ( 'widgets.php' ), admin_url ( 'nav-menus.php' ) ); ?> </li>
2012-11-17 16:51:39 -05:00
< li >< ? php printf ( '<a href="%s" class="welcome-icon welcome-comments">' . __ ( 'Turn comments on or off' ) . '</a>' , admin_url ( 'options-discussion.php' ) ); ?> </li>
2012-12-05 17:51:24 -05:00
< li >< ? php printf ( '<a href="%s" class="welcome-icon welcome-learn-more">' . __ ( 'Learn more about getting started' ) . '</a>' , __ ( 'http://codex.wordpress.org/First_Steps_With_WordPress' ) ); ?> </li>
2012-09-26 15:44:43 -04:00
</ ul >
2011-11-18 19:42:22 -05:00
</ div >
</ div >
2011-09-22 02:23:10 -04:00
</ div >
< ? php
}