WordPress User automatisiert deaktivieren

Von am 2013-07-24

WordPress ist ein fantastisches Blogging Werkzeug. Es lässt sich einfach einrichten und nutzen. Ebenso kann man schnell und einfach weitere Autoren für den eigenen Blog einrichten, sodass diese Artikel schreiben können. Doch was ist, wenn man viele Autoren auf seinem Blog registriert hat und einige von ihnen nicht mehr aktiv mitwirken, man sie aber auch nicht sofort löschen will? Hier wäre eine automatische Funktion zum Deaktivieren von Benutzern schön.

Die einfachste Möglichkeit einen Benutzer im eigenen Blog inaktiv zu schalten ist, ihm alle Benutzerrollen zu nehmen. So kann er sich zwar noch anmelden, hat ansonsten aber keine Berechtigungen mehr. Dies macht man im Adminbereich. Dort wählt man den entsprechenden Benutzer aus und ändert seine Rolle in — keine Benutzerrolle für diese Seite —.

Klingt gut, ist aber nicht effizient. Vor allem dann nicht, wenn man mehrere hundert Benutzer hat. Die will man ja nicht alle händisch inaktiv schalten. Ich habe hierfür eine Mischung aus Hook, Plugin und Cronjob gewählt. Dadurch habe ich den Vorteil, dass die Deaktivierung der Benutzer vollautomatisch läuft.

Inaktive Benutzer ermitteln

Doch zuerst muss geklärt werden, welche Benutzer überhaupt inaktiv sind. Da WordPress von Haus aus keine Informationen über die Aktivität von Benutzern liefert, helfe ich mir mit einem zusätzlichen Meta-Key, welchen ich in der Tabelle wp_usermeta der WordPress Datenbank ablege. Dieser Meta-Key erhält dann das Datum des letzten Logins eines Benutzers und wird immer dann aktualisiert, wenn sich ein Benutzer neu einloggt.

Hierzu habe ich folgenden Hook in die functions.php meines Themes eingefügt.

[php]/**
* Add user meta key last_login
*/
function at_user_last_login($user_id) {
$user = get_user_by(‚login‘, $user_id);
update_user_meta($user->ID, ‚last_login‘, current_time(‚mysql‘));
}
add_action(‚wp_login‘, ‚at_user_last_login‘);[/php]

Zuerst hole ich mir alle Informationen zu dem Benutzer mit get_user_by(‚login‘, $user_id). Danach aktualisiere ich mit update_user_meta($user->ID, ‚last_login‘, current_time(‚mysql‘)) den Wert für den von mir vorgeschriebenen Key ‚last_login‘. Der Vorteil bei der Methode ist, dass der Key automatisch angelegt wird, wenn er noch nicht existiert.

Allen Benutzern einen neuen Meta-Key zuweisen

Die Sache hat allerdings einen Haken. Benutzer die sich nicht anmelden erhalten diesen Key nicht. Denn der Hook wird nur aktiviert, wenn sich ein Benutzer anmeldet. Deshalb habe ich mir ein kleines Script geschrieben, welches ich einmalig ausführe um alle bestehenden Benutzer mit meinem Meta Key zu bestücken.

[php]global $user_ID;
if(user_can($user_ID, ‚manage_options‘)) {
$blogusers = get_users();
foreach ($blogusers as $user) {
add_user_meta($user->ID, ‚last_login‘, ‚2013-01-01‘, true);
}
}[/php]

In dem Script hole ich mir erst alle Benutzer, und füge dann für jeden Benutzer den Meta Key ‚last_login‘ mit dem Datum 2013-01-01 hinzu. Ein weiteres Script lasse ich auf meinem Webserver als Cronjob laufen.

[php]$con = mysql_connect(‚localhost‘, ‚mein user‘, ‚mein passwort‘) or die(‚error‘);
mysql_select_db(‚conftest‘);
$select = "SELECT user_id
FROM wp_usermeta
WHERE meta_key = ‚last_login‘
AND meta_value < DATE_SUB(NOW(), INTERVAL 60 DAY)";
$result = mysql_query($select);
while($row = mysql_fetch_object($result)) {
$update = "UPDATE wp_usermeta
SET meta_value = ‚a:0:{}‘
WHERE meta_key = ‚wp_capabilities‘
AND user_id = $row->user_id";
mysql_query($update);
}
mysql_close($con);[/php]

Benutzer deaktivieren

Das Script holt sich alle Benutzer, die sich länger als 60 Tage nicht angemeldet haben und setzt deren Rolle auf a:0:{}. Dies steht für — keine Benutzerrolle für diese Seite —. Zum Schluss erstelle ich noch eine front-page.php Datei, in der ich die Rolle des angemeldeten Benutzers abfrage und ihm eine entsprechende Rückmeldung gebe.

[php]global $user_ID;
if($user_ID == 0) {
// not logged in
} else {
$cap = get_user_meta($user_ID, ‚wp_capabilities‘, true);
if($userid == array()) {
// your account has been deactivated during inactivity.
} else {
// hello user you are logged in.
}
}[/php]

Mit der globalen Variable $user_ID hole ich mir die ID des Benutzers auf der Website. Ist sie 0, so ist der Benutzer noch nicht eingeloggt. Mit get_user_meta($user_ID, ‚wp_capabilities‘, true) frage ich dann die Rolle des angemeldeten Benutzers ab. Der Rückgabewert dabei ist ein Array. Ist das Array leer, besitzt der Benutzer für die Seite keine Rolle und erhält auf der Startseite eine entsprechende Meldung. So lassen sich WordPress User deaktivieren. Wenn euch der Beitrag gefällt, dann teilt ihn. Über Kommentare würde ich mich auch sehr freuen.

2 Kommentare
  1. Hallo Torsten. Sorry für die späte Antwort, ich bin frisch Vater geworden. Da kommt man mit dem eigenen Hobby nicht mehr so schnell hinterher… 🙂
    Ein entsprechendes Plugin kenne ich nicht, aber sowas würde sich recht einfach als Plugin realisieren lassen.

    Wenn ich Zeit finde, mache ich dazu einen entsprechenden Artikel.

    VG
    der Alex

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.