Mon équipe a hérité d’une grande installation WordPress Networks. Les mises à jour doivent être exécutées et nous devons les communiquer à nos rédacteurs et à nos administrateurs. Mon administrateur système m'a demandé une liste d'adresses URL et une adresse électronique correspondant à ces adresses. Nous prévoyons de les contacter site par site pour gérer une mise à niveau du système.
Quel serait un moyen efficace de s'y prendre?
Je peux obtenir une liste de courriels à partir de la table wp_users
. Existe-t-il un outil qui le fait déjà (et correctement)?
Plus important encore: comment regrouper ces utilisateurs sur leurs sites WP individuels dans l’installation des réseaux?
En d'autres termes, comment pourrais-je obtenir un rapport comme celui-ci au sein de WP-Admin? Mon client souhaite utiliser un plug-in si possible pour générer ce rapport dans l'interface d'administration.
site one
- smellyPete
- bilboBaggins989
site two
- sallysue997
- billyBob
etc
Cela devrait faire l'affaire. Lisez avec les commentaires pour une explication.
// get users with specified roles -- this can go in functions
function get_users_with_role( $roles ) {
global $wpdb;
if ( ! is_array( $roles ) )
$roles = array_walk( explode( ",", $roles ), 'trim' );
$sql = '
SELECT ID
FROM ' . $wpdb->users . ' INNER JOIN ' . $wpdb->usermeta . '
ON ' . $wpdb->users . '.ID = ' . $wpdb->usermeta . '.user_id
WHERE ' . $wpdb->usermeta . '.meta_key = \'' . $wpdb->prefix . 'capabilities\'
AND (
';
$i = 1;
foreach ( $roles as $role ) {
$sql .= ' ' . $wpdb->usermeta . '.meta_value LIKE \'%"' . $role . '"%\' ';
if ( $i < count( $roles ) ) $sql .= ' OR ';
$i++;
}
$sql .= ' ) ';
$sql .= ' ORDER BY display_name ';
$userIDs = $wpdb->get_col( $sql );
return $userIDs;
}
////// everything else could go in a custom page template just for viewing temporarily.
// poll database for users we need, using custom function (listed above)
$editors_and_admins = get_users_with_role(array('editor', 'administrator'));
// get user objects
$editors_and_admins = get_users(array('include' => $editors_and_admins);
echo '<table>';
// spit out as table - not sure what output you need. could easily create CSV by modifying this
foreach($editors_and_admins as $constituent){
echo '<tr>'
// get name
echo '<td>'.get_the_author_meta('first_name', $constituent->ID).' '.get_the_author_meta('last_name', $constituent->ID).'</td>';
// get email
echo '<td><a href="mailto:'.$constituent->user_email'">'.$constituent->user_email.'</a></td>';
// get URL
echo '<td><a href="'.$constituent->user_url.'">'.$constituent->user_url.'</a></td>';
echo '</tr>';
}
echo '</table>';
Si vous ne souhaitez utiliser aucun script, vous pouvez utiliser le plugin wordpress Exporter les utilisateurs au format CSV , ce qui permet d'exporter TOUTES les données utilisateur et les métadonnées, et cela fonctionne! Vous pouvez même exporter les utilisateurs par rôle et plage de dates d’enregistrement.
Caractéristiques:
Il y a get_users()
- vous pouvez l'utiliser conjointement avec les résultats d'une requête $wpdb
suivant les lignes de $wpdb->get_col( "SELECT blog_id FROM {$wpdb->blogs}" );
function tell_all() {
global $wpdb;
$all_sites = $wpdb->get_col( "SELECT blog_id FROM {$wpdb->blogs}" );
$list = array();
foreach( $all_sites as $site ) {
$args = array(
'blog_id' => $site,
'fields' => 'user_email',
'role' => 'Editor',
);
$url = get_blogaddress_by_id( $site );
$list[$url] = array();
$editors = get_users( $args );
$args['role'] = 'Administrator';
$administrators = get_users( $args );
$users = array_merge( $editors, $administrators );
foreach( $users as $user ) {
$list[$url][] = $user;
}
}
}
Si j'ai tout à fait raison, alors à la fin, $list
devrait être un tableau du format
$list = array(
'site-1' => array(
'email-1',
'email-2',
),
'site-2' => array(
'email-1',
'email-3',
),
.
.
.
);
Manuscrit:
Faites des sauvegardes avant de tenter quoi que ce soit.
Phpmyadmin, onglet SQL, puis: "Exécuter une requête/des requêtes SQL sur une base de données":
SELECT COUNT(*) AS Rows, user_login, user_email, user_nicename, user_url FROM wp_users GROUP BY user_login ORDER BY user_login
OU si vous n'êtes pas à l'aise avec SQL:
Sélectionnez wp_users
"Vérifie tout"
Interrogation des résultats
Exportation
Ensuite, sélectionnez MS Excel ou CSV et éditez-le jusqu'à ce que vous ayez les identifiants utilisateur, nicename, email et user_url.
Cela devrait être suffisant pour prendre contact
Je ne sais pas si un plugin le permet, mais si cela ne vous dérange pas d'utiliser un peu de SQL, vous pouvez l'extraire de cette façon:
SELECT u.ID, u.user_login, u.user_email, u.user_registered, u.display_name, b.path
FROM wp_users u
LEFT JOIN wp_usermeta um ON um.user_id = u.ID
LEFT JOIN wp_blogs b ON um.meta_key LIKE CONCAT_WS('_', 'wp', b.blog_id, 'capabilities')
WHERE um.meta_value LIKE '%"administrator"%' OR um.meta_value LIKE '%"editor"%';
Cela produira les résultats suivants:
+----+------------+---------------------+---------------------+--------------+----------------+
| ID | user_login | user_email | user_registered | display_name | path |
+----+------------+---------------------+---------------------+--------------+----------------+
| 1 | jdoe | [email protected] | 2014-12-02 10:46:26 | John Doe | /subsite-path/ |
+----+------------+---------------------+---------------------+--------------+----------------+
où ID, user_login, user_email, user_registered et display_name sont les détails de l'utilisateur, tandis que chemin est l'URL du sous-site (vous pouvez sélectionner un domaine plutôt qu'un chemin si votre installation réseau est basée sur un domaine et non sur un répertoire
Notez que cela produira une ligne par site sur lequel l'utilisateur est enregistré, ce qui signifie que si vous avez un utilisateur enregistré en tant qu'administrateur sur un site et en tant qu'éditeur sur l'autre, la requête produira 2 lignes pour cet utilisateur.
Avec GROUP_CONCAT, vous pouvez concaténer toutes ces lignes en une:
SELECT u.ID, u.user_login, u.user_email, u.user_registered, u.display_name, GROUP_CONCAT(b.path ORDER BY b.path SEPARATOR '\n')
FROM wp_users u
LEFT JOIN wp_usermeta um ON um.user_id = u.ID
LEFT JOIN wp_blogs b ON um.meta_key LIKE CONCAT_WS('_', 'wp', b.blog_id, 'capabilities')
WHERE um.meta_value LIKE '%"administrator"%' OR um.meta_value LIKE '%"editor"%'
GROUP BY u.ID;
Cela produira les résultats suivants:
+----+------------+---------------------+---------------------+--------------+-----------------+
| ID | user_login | user_email | user_registered | display_name | path |
+----+------------+---------------------+---------------------+--------------+-----------------+
| 1 | jdoe | [email protected] | 2014-12-02 10:46:26 | John Doe | /subsite1-path/ |
| | | | | | /subsite2-path/ |
+----+------------+---------------------+---------------------+--------------+-----------------+
Lancer la console/terminal
mysql -u username -p
password
USE wpdatabasename;
SELECT
`ID` ,
`user_login` ,
`user_nicename` ,
`user_email` ,
`user_url` ,
`user_status` ,
`display_name`
FROM `wp_users`
ORDER BY `user_email` DESC;
Analyser les résultats