web-dev-qa-db-fra.com

Comment afficher tous les blogs multisites où cet utilisateur est administrateur?

Etant donné l'ID utilisateur, comment puis-je afficher tous les blogs où cet utilisateur est administrateur?

J'ai essayé:

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

Cependant, il renverra tous les blogs auxquels l'utilisateur a accès, qu'il s'agisse d'un administrateur ou simplement d'un abonné. Mais tout ce que je veux afficher, ce sont ces blogs où cet utilisateur est administrateur.

Est-ce possible? Si oui, comment?

4
Ken

Les fonctionnalités sont stockées sous forme de métadonnées utilisateur dans un tableau sérialisé pour chaque site.

La clé en tant qu'expression régulière ressemblerait à ceci:

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

Alors… récupérez les métadonnées de l'utilisateur, recherchez les chaînes de capacité (elles contiennent les rôles) et comparez le résultat non sérialisé avec le rôle que vous souhaitez rechercher.

Ensuite, obtenez l'ID de blog, le (\d+) dans la regex ci-dessus, et vous avez terminé.

Je pense que c'est plus facile à comprendre avec un code:

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

Usage:

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

Voici une autre façon de le faire:

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

L'utilisation est similaire à la fonction de @ toscho, mais la sortie dans ce cas est du même format que celui renvoyé par get_blogs_of_user().

2
J.D.