Como posso exibir todos os blogs do Multisite em que esse usuário é administrador?

4

Dado o ID do usuário, como posso exibir todos os blogs em que esse usuário é administrador?

Eu tentei:

<?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>';
?>

No entanto, ele retornará todos os blogs aos quais o usuário tem acesso, independentemente de ser um administrador ou apenas um assinante. Mas tudo que quero exibir são aqueles blogs em que esse usuário é administrador.

Isso é possível? Se sim, como?

    
por Ken 10.11.2012 / 06:05

2 respostas

4

Os recursos são armazenados como metadados do usuário em um array serializado para cada site.

A chave como expressão regular seria assim:

'~' . $GLOBALS['wpdb']->base_prefix . '(\d+)_capabilities~'

Então ... obtenha os metadados do usuário, encontre as cadeias de recursos (elas mantêm as funções) e compare o resultado não serializado com a função que você deseja encontrar.

Em seguida, obtenha o ID do blog, o (\d+) na regex acima e pronto.

Acho mais fácil entender com algum código:

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

Uso:

$blogs = get_user_blogs_by_role( 37, 'editor' );
var_dump( $blogs ); // Array ( 2, 14, 90 )
    
por fuxia 10.11.2012 / 07:08
2

Aqui está uma maneira alternativa de fazer isso:

/**
 * 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;
}

O uso é semelhante à função de @ toscho, mas a saída neste caso é do mesmo formato retornado por get_blogs_of_user() .

    
por J.D. 10.04.2014 / 23:10