web-dev-qa-db-de.com

Generieren Sie eine Benutzerliste pro Site, um Upgrade-Pläne zu kommunizieren

Mein Team hat eine große WordPress Networks-Installation geerbt. Updates müssen ausgeführt werden und wir müssen dies unseren Redakteuren und Administratoren mitteilen. Mein Systemadministrator hat mich nach einer Liste von URLs und E-Mail-Adressen gefragt, die mit diesen URLs übereinstimmen. Wir planen, sie Standort für Standort zu kontaktieren, um ein systemweites Upgrade durchzuführen.

Was wäre ein effizienter Weg, um dies zu erreichen?

Ich kann eine Liste der E-Mails aus der Tabelle wp_users abrufen. Gibt es ein Tool, das dies bereits (und ordnungsgemäß) erledigt?

Am wichtigsten: Wie kann ich diese Benutzer zu ihren einzelnen WP Standorten in der Netzwerkinstallation gruppieren?

Mit anderen Worten, wie kann ich einen solchen Bericht aus dem WP-Admin heraus erhalten? Mein Kunde möchte nach Möglichkeit ein Plug-In verwenden, um diesen Bericht in der Administrationsoberfläche zu erstellen.

site one
- smellyPete
- bilboBaggins989 
site two
- sallysue997
- billyBob

etc, etc

3
Rick

Dies sollte den Trick machen. Lesen Sie zusammen mit den Kommentaren einige Erklärungen.

// 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

Wenn Sie kein Skript verwenden möchten, können Sie das WordPress-Plugin Benutzer in CSV exportieren verwenden. Dies kann ALLE Benutzer- und Metadaten exportieren, und das funktioniert! Sie können die Benutzer sogar nach Rolle und Registrierungsdatum exportieren.

Funktionen:

  1. Exportiert alle Benutzerfelder
  2. Exportiert Benutzer-Meta
  3. Exportiert Benutzer nach Rolle
  4. Exportiert Benutzer nach Datumsbereich
2
Ravinder Kumar

Es gibt get_users() - Sie können es in Verbindung mit den Ergebnissen einer $wpdb -Anfrage im Sinne von $wpdb->get_col( "SELECT blog_id FROM {$wpdb->blogs}" ); verwenden.

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

    }
}

Wenn ich alles richtig gemacht habe, sollte $list am Ende ein Array des Formats sein

$list = array(
    'site-1' => array( 
        'email-1',
        'email-2',
    ),
    'site-2' => array(
        'email-1',
        'email-3',
    ),
    .
    .
    .
);

Verweise

Kodex:

2
Pat J

Machen Sie Backups, bevor Sie etwas versuchen.

Phpmyadmin, Registerkarte SQL, dann: "SQL-Abfrage/Abfragen für Datenbank ausführen":

SELECT COUNT(*) AS Rows, user_login, user_email, user_nicename, user_url FROM wp_users GROUP BY user_login ORDER BY user_login

ODER wenn Sie mit SQL nicht vertraut sind:

easy phpmyadmin export

Wählen Sie wp_users aus

"Alle überprüfen"

Abfrageergebnisoperationen

Export

Wählen Sie dann MS Excel oder CSV und bearbeiten Sie die Datei, bis Sie Benutzeranmeldung, Benutzername, E-Mail-Adresse und Benutzer-URL haben.

Das sollte ausreichen, um Kontakt aufzunehmen

2
128KB

Ich habe keine Ahnung, ob es ein Plugin gibt, das dies erlaubt, aber wenn es Ihnen nichts ausmacht, ein bisschen SQL zu verwenden, können Sie es auf diese Weise extrahieren:

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"%';

Dadurch wird die folgende Ergebnismenge erzeugt:

+----+------------+---------------------+---------------------+--------------+----------------+
| ID | user_login |     user_email      |   user_registered   | display_name |      path      |
+----+------------+---------------------+---------------------+--------------+----------------+
|  1 | jdoe       | [email protected] | 2014-12-02 10:46:26 | John Doe     | /subsite-path/ |
+----+------------+---------------------+---------------------+--------------+----------------+

dabei sind ID, Benutzer_Login, Benutzer_E-Mail, Benutzer_Registriert und Anzeigename die Details des Benutzers, während Pfad die URL der Unterwebsites ist. (Möglicherweise möchten Sie Domäne anstelle von Pfad auswählen, wenn Ihre Netzwerkinstallation domänenbasiert und nicht verzeichnisbasiert ist.)

Beachten Sie, dass dies eine Zeile pro Site erzeugt, an der der Benutzer registriert ist. Wenn Sie also einen Benutzer auf einer Site als Administrator und auf der anderen als Bearbeiter registriert haben, erzeugt die Abfrage für diesen Benutzer zwei Zeilen.

Mit GROUP_CONCAT können Sie alle diese Zeilen zu einer verketten:

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;

Dadurch wird die folgende Ergebnismenge erzeugt:

+----+------------+---------------------+---------------------+--------------+-----------------+
| 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

Konsole/Terminal einleiten

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;

Ergebnisse analysieren

0
nocommit