问题描述

我可以列出网站上的用户上传的所有文件吗?在多站点中,每个用户都可以使用自己的博客管理他们的文件,但超级管理员无法监控所有上传的文件… 我该怎么做?

最佳解决方案

您必须运行每个博客,并获取最近的附件:

$args    = array (
    'post_type'   => 'attachment',
    'numberposts' => 30
);
$attachments = get_posts( $args );

仪表板小工具在 multi-site 的 wp_network_dashboard_setup 和 single-site 中的 wp_dashboard_setup 中注册。

确保将以下行添加到插件头以启用插件网络:

 * Network:     true

那么你可以得到这样的表:

(从我的本地开发网站,是的,它看起来有点奇怪)

示例插件,非常原始!

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

参考文献

注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。