You have to run through each blog and fetch the recent attachments with:
$args = array (
'post_type' => 'attachment',
'numberposts' => 30
);
$attachments = get_posts( $args );
Dashboard widgets are registered on wp_network_dashboard_setup
in multi-site and wp_dashboard_setup
in single-site.
Make sure to add the following line to the plugin header to get the plugin network enabled:
* Network: true
Then you can get a table like this:
(from my local dev site, yes, it looks a little bit strange)
Sample plugin, very raw!
<?php # -*- coding: utf-8 -*-
/**
* Plugin Name: List recent uploads in a network
* Version: 2013.04.21
* Network: true
*/
if ( is_multisite() )
add_action(
'wp_network_dashboard_setup',
array ( 'T5_Recent_Uploads_Dashboard_Widget', 'register' )
);
else
add_action(
'wp_dashboard_setup',
array ( 'T5_Recent_Uploads_Dashboard_Widget', 'register' )
);
class T5_Recent_Uploads_Dashboard_Widget
{
protected static $instance = NULL;
protected $max_items = 30;
public static function register()
{
self::$instance = new self;
wp_add_dashboard_widget(
__CLASS__,
'Recent Uploads',
array ( self::$instance, 'render' )
);
}
public function render()
{
$uploads = $this->get_recent_uploads();
if ( empty ( $uploads ) )
return print '<p>No new uploads</p>';
printf( '<p>%d new uploads.</p>', count( $uploads ) );
print $this->get_attachment_table( $uploads );
// inspect content here
//print '<pre>$uploads=" . htmlspecialchars( var_export( $uploads, TRUE ), ENT_QUOTES, "utf-8', FALSE ) . '</pre>';
}
protected function get_recent_uploads()
{
if ( ! is_multisite() )
return $this->get_attachments();
$uploads = array();
$current_blog = get_current_blog_id();
$blogs = $this->get_blog_ids();
foreach ( $blogs as $blog )
{
switch_to_blog( $blog->blog_id );
$attachments = $this->get_attachments();
foreach ( $attachments as $attachment )
$uploads[] = $this->prepare_attachment( $attachment, $blog );
}
// restore current blog
switch_to_blog( $current_blog );
return array_slice( $uploads, 0, $this->max_items );
}
protected function prepare_attachment( $attachment, $blog )
{
$attachment->blog_id = $blog->blog_id;
$attachment->blog_name = get_bloginfo( 'name' );
$attachment->edit = get_edit_post_link( $attachment->ID );
return $attachment;
}
protected function get_blog_ids()
{
global $wpdb;
$query = $wpdb->prepare(
"SELECT blog_id
FROM $wpdb->blogs
WHERE site_id = %d
AND public="1"
AND archived = '0'
AND mature="0"
AND spam = '0'
AND deleted = '0'
ORDER BY blog_id",
$wpdb->siteid
);
return $wpdb->get_results( $query );
}
protected function get_attachment_table( $attachments )
{
$table="<table class="widefat">" . $this->get_table_header() . '<tbody>';
foreach ( $attachments as $attachment )
$table .= $this->get_row( $attachment );
return "$table</tbody></table>";
}
protected function get_attachments()
{
$args = array (
'post_type' => 'attachment',
'numberposts' => $this->max_items
);
return get_posts( $args );
}
protected function get_table_header()
{
$columns = array ( 'Attachment', 'User', 'Date' );
if ( is_multisite() )
$columns[] = 'Site';
$header="<tr><th>" . join( '</th><th>', $columns ) . '</th></tr>';
return "<thead>$header</thead><tfoot>$header</tfoot>";
}
protected function get_row( $attachment )
{
$cells = array ();
$cells[] = $this->get_attachment_title( $attachment );
$cells[] = $this->get_user_link( $attachment );
$cells[] = mysql2date( 'Y.m.d', $attachment->post_date );
if ( is_multisite() )
$cells[] = $attachment->blog_name;
return '<tr><td>' . join( '</td><td>', $cells ) . '</td></tr>';
}
protected function get_attachment_title( $attachment )
{
$title = $attachment->post_title;
if ( empty ( $title ) )
$title = basename( $attachment->guid );
return "<a href="https://wordpress.stackexchange.com/questions/96644/$attachment->edit">$title</a>";
}
protected function get_user_link( $attachment )
{
$name = get_the_author_meta( 'nickname', $attachment->post_author );
$url = network_admin_url( 'user-edit.php?user_id=' . $attachment->post_author );
return "<a href="$url">$name</a>";
}
}