Listing of all uploaded files in network sites

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:

enter image description here

(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>";
    }
}

Leave a Comment