web-dev-qa-db-fra.com

Requête SQL à obtenir la liste de tous les utilisateurs avec leurs blogs

Comment interroger une liste d'utilisateurs avec les blogs dans lesquels ils sont membres dans une installation wordpress multi-sites.

Par exemple, j'ai besoin des résultats ci-dessous

user domain
abc  xyz.com
abc  example.com
ggh  example.com

J'ai essayé la requête ci-dessous, mais sa liste ne répertorie pas tous les domaines ..

SELECT DISTINCT a.user_login, a.user_email, c.domain
FROM wp_users a
JOIN wp_usermeta b ON a.id = b.user_id
JOIN wp_blogs c ON b.meta_value = c.site_id
LIMIT 0 , 100

Je ne sais pas comment fonctionne le réseau/les sites multiples. Quelqu'un peut-il me dire comment obtenir le résultat?

2
NEO

Vous pouvez utiliser get_blogs_of_user() pour obtenir tous les blogs d'un utilisateur donné.

Donc, pour obtenir une liste triée par les utilisateurs:

global $wpdb;
$blogs = array();
$user_ids = $wpdb->get_col( 'SELECT ID FROM $wpdb->users' );
foreach( $user_ids as $user_id ) {
    $blogs[$user_id] = get_blogs_of_user( $user_id );
}
// you can use var_dump( $blogs ); to see what's in the $blogs array
2
Pat J

Ayant besoin de la même chose, j'ai réussi à trouver les données clés dans les tables wp_usermeta. Cela a fonctionné pour moi:

SELECT u.user_login, b.domain,
  SUBSTRING_INDEX(SUBSTRING_INDEX(um.meta_value,'"', 2), '"', -1) as role
FROM wp_users u
JOIN wp_usermeta um ON u.ID = um.user_id
JOIN wp_blogs b ON b.blog_id = SUBSTRING(um.meta_key, 4, LENGTH(um.meta_key)-16)
WHERE um.meta_key LIKE 'wp_%_capabilities'

Résultats:

user_login    domain       role
============  ============ ================
webmaster     blog1.com    administrator
user          blog1.com    editor
webmaster     blog2.com    administrator
2
Wraezor Sharp

Vous ne pouvez pas laisser de commentaire, mais la réponse de Wraezor Sharp a très bien fonctionné pour moi. J'avais besoin d'adresses e-mail d'utilisateurs, notre instance multisite se trouvait sur le même nom de domaine et je ne voulais que des administrateurs et pas des abonnés. Voici ce que je suis venu avec:

SELECT
  u.user_login
  , u.user_email
  , concat('https://', b.domain, b.path) as site
  , SUBSTRING_INDEX(SUBSTRING_INDEX(um.meta_value,'"', 2), '"', -1) as role
FROM
  wp_users u
  JOIN wp_usermeta um ON u.ID = um.user_id
  JOIN wp_blogs b ON b.blog_id = SUBSTRING(um.meta_key, 4, LENGTH(um.meta_key)-16)
WHERE
  um.meta_key LIKE 'wp_%_capabilities'
  AND SUBSTRING_INDEX(SUBSTRING_INDEX(um.meta_value,'"', 2), '"', -1) IN ('administrator', 'editor')
ORDER BY
  site asc
;
0
mvc