web-dev-qa-db-fra.com

Générer une liste d'utilisateurs par site pour communiquer les plans de mise à niveau

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

3
Rick

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>';
2
GhostToast

Pluin inadmin area

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:

  1. Exporte tous les champs utilisateurs
  2. Meta utilisateurs exportateurs
  3. Exporte les utilisateurs par rôle
  4. Exporte les utilisateurs par période
2
Ravinder Kumar

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',
    ),
    .
    .
    .
);

Références

Manuscrit:

2
Pat J

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:

easy phpmyadmin export

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

2
128KB

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/ |
+----+------------+---------------------+---------------------+--------------+-----------------+
1
Jonathan Pasquier

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

0
nocommit