¿Cómo puedo mostrar todos los blogs de sitios múltiples donde este usuario es administrador?

4

Dado el ID de usuario, ¿cómo puedo mostrar todos los blogs donde este usuario es administrador?

Lo intenté:

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

Sin embargo, devolverá todos los blogs a los que el usuario tiene acceso, independientemente de si es un administrador o solo un suscriptor. Pero todo lo que quiero mostrar son aquellos blogs donde este usuario es administrador.

¿Es esto posible? Si es así, ¿cómo?

    
pregunta Ken 10.11.2012 - 06:05

2 respuestas

4

Las capacidades se almacenan como metadatos de usuario en una matriz serializada para cada sitio.

La clave como una expresión regular se vería así:

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

Entonces ... obtenga los metadatos del usuario, encuentre las cadenas de capacidad (que tienen los roles) y compare el resultado no serializado con el rol que desea encontrar.

Luego obtenga la ID del blog, el (\d+) en la expresión regular anterior y listo.

Creo que es más fácil de entender con algún 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 )
    
respondido por el fuxia 10.11.2012 - 07:08
2

Aquí hay una forma alternativa de hacerlo:

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

El uso es similar a la función de @ toscho, pero la salida en este caso es del mismo formato que devuelve get_blogs_of_user() .

    
respondido por el J.D. 10.04.2014 - 23:10

Lea otras preguntas en las etiquetas