Take the 2-minute tour ×
WordPress Development Stack Exchange is a question and answer site for WordPress developers and administrators. It's 100% free, no registration required.

Can I list all files uploaded by users in Network sites? In Multisite each user can manage their files with their own blog but the Super admin can't monitor all the uploaded files...how can i do that?

share|improve this question
    
Nice idea and great code in response, kudos to @all! I imagined a Media network menu to show all network media list, with pagination and stuff. If a plugin already exists or someone goes further with the idea, please report ;) –  brasofilo Apr 21 '13 at 15:14
add comment

2 Answers

up vote 9 down vote accepted

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='$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>";
    }
}
share|improve this answer
    
thank you! work fine ! the list is permanent? there will be pages to shorten the list if very long? thank you! –  Ghinnersmee Apr 21 '13 at 14:53
3  
@Ghinnersmee I made a small update: The list will be at max 30 items long, but you can edit $max_items to change that. –  toscho Apr 21 '13 at 14:55
    
ok..thank you ! –  Ghinnersmee Apr 21 '13 at 15:04
1  
Maybe a small change for use transient caching and it is so much fine and simple solution. –  bueltge Apr 21 '13 at 16:53
1  
@Ghinnersmee You could switch and use the WP_List_Table. Then you get pagination for free... more work as well :) –  kaiser Apr 21 '13 at 17:58
add comment

WordPress 3.7 introduced wp_get_sites() which will return an array of sites in a WordPress Multisite network. This can replace get_blog_ids().

share|improve this answer
add comment

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.