如何显示此用户为管理员的所有多站点博客?

时间:2012-11-10 作者:Ken

给定用户ID,如何显示该用户是管理员的所有博客?

我试过:

<?php
$user_id = 2;
$user_blogs = get_blogs_of_user( $user_id );
echo \'<ul>\';
foreach ($user_blogs AS $user_blog) {
    echo \'<li>\'.$user_blog->blogname.\'</li>\';
}
echo \'</ul>\';
?>
然而,它将返回用户有权访问的所有博客,无论它是管理员还是订阅者。但我只想显示这些博客,其中该用户是管理员。

这可能吗?如果是,如何进行?

2 个回复
最合适的回答,由SO网友:fuxia 整理而成

这些功能作为用户元数据存储在每个站点的序列化阵列中。

作为正则表达式的键如下所示:

\'~\' . $GLOBALS[\'wpdb\']->base_prefix . \'(\\d+)_capabilities~\'
因此……获取用户元数据,找到功能字符串(它们包含角色),并将未序列化的结果与您想要找到的角色进行比较。

然后获取博客ID(\\d+) 在上面的正则表达式中,您就完成了。

我认为使用一些代码更容易理解:

if ( ! function_exists( \'get_user_blogs_by_role\' ) )
{
    /**
     * Get all blog IDs where the user has the given role.
     *
     * @param  int $user_id
     * @param  string $role
     * @return array
     */
    function get_user_blogs_by_role( $user_id, $role )
    {
        $out   = array ();
        $regex = \'~\' . $GLOBALS[\'wpdb\']->base_prefix . \'(\\d+)_capabilities~\';
        $meta  = get_user_meta( $user_id );

        if ( ! $meta )
            return array ();

        foreach ( $meta as $key => $value )
        {
            if ( preg_match( $regex, $key, $matches ) )
            {
                $roles = maybe_unserialize( $meta[$key][0] );

                // the number is a string
                if ( isset ( $roles[$role] ) and 1 === (int) $roles[$role] )
                    $out[] = $matches[1];
            }
        }

        return $out;
    }
}
用法:

$blogs = get_user_blogs_by_role( 37, \'editor\' );
var_dump( $blogs ); // Array ( 2, 14, 90 )

SO网友:J.D.

以下是另一种方法:

/**
 * Get the blogs of a user where they have a given role.
 *
 * @param int    $user_id The ID of the user.
 * @param string $role    The slug of the role.
 *
 * @return object[] The blog details for each blog the user has the role for.
 */
function get_blogs_of_user_by_role( $user_id, $role ) {

    $blogs = get_blogs_of_user( $user_id );

    foreach ( $blogs as $blog_id => $blog ) {

        // Get the user object for the user for this blog.
        $user = new WP_User( $user_id, \'\', $blog_id );

        // Remove this blog from the list if the user doesn\'t have the role for it.
        if ( ! in_array( $role, $user->roles ) ) {
            unset( $blogs[ $blog_id ] );
        }
    }

    return $blogs;
}
其用法类似于@toscho的函数,但本例中的输出与返回的格式相同get_blogs_of_user().

结束

相关推荐

Protect Uploads in Multisite

我正在使用WordPress multisite(3.3.1),并试图保护从某些博客上传的内容不被热链接和直接访问。这与How to Protect Uploads, if User is not Logged In?, 但我只想通过服务器上运行的脚本访问上传内容(即,只有服务器可以显示/提供上传服务),因此内容可以受到WordPress用户权限的保护。例如,我有一个名为40c的字段。jpg位于localhost/files/2011/07/40c。jpg;我想让文件显示出来only 在本地域上由HTML