Finde alle Redakteure/Autoren aus einem Blognetzwerk

Ein Kunde von uns betreibt ein Blognetzwerk (WordPress Multisite) mit ca. 30 Blogs und ~ 2300 Bentuzer-Accounts. Jetzt steht ein netzwerkweites Update an und alle Moderatoren (eine eigene Benutzerrolle) sollen zu vor per E-Mail benachrichtigt werden.

Ich kann davon ausgehen, dass die Rolle auf allen Blogs den gleichen Namen hat – weil ich sie selbst eingerichtet habe. Also spare ich mir die Mühe ein Plugin zu schreiben und nutze SQL (und in diesem Fall Adminer als Frontend).

WordPress speichert die Rollen, die ein Nutzer in einem bestimmten Blog hat, als User-Meta mit dem Key, der sich aus dem Tabellenpräfix und der Blog-ID zusammensetzt: z.B. wp_13_capabilities. In dem Beispiel ist wp_ der Tabellenpräfix und 13 die Blog-ID.

Die Daten selbst sind serialisiert gespeichert, sehen also z.B. so aus: a:2:{s:6:"editor";b:1;s:9:"moderator";b:1;}

Das SQL sieht also wie folgt aus:

SELECT 
	u.user_nicename,
	u.user_email
FROM wp_users u 
	INNER JOIN wp_usermeta m 
		ON u.ID = m.user_id 
WHERE m.meta_key LIKE "%capabilities"
	AND m.meta_value LIKE "%:\"moderator\";%"
GROUP BY u.user_email
ORDER BY u.user_nicename

Möchte man zusätzlich noch die Domain des entsprechenden Blogs, muss man die Blog-ID aus dem Meta-Key »herauslösen«:

SELECT 
	u.user_nicename,
	u.user_email,
	b.domain
FROM wp_users u 
	INNER JOIN wp_usermeta m 
		ON u.ID = m.user_id 
	INNER JOIN wp_blogs b 
		ON b.blog_id = REPLACE( 
			REPLACE( 
				REPLACE( m.meta_key, "_capabilities", "" ), 
				"wp_", 
				"" 
			), 
			"wp", 
			"1" 
		)
WHERE m.meta_key LIKE "%capabilities"
	AND m.meta_value LIKE "%:\"moderator\";%"
GROUP BY u.user_email
ORDER BY b.domain

Die äußerste REPLACE() Funktion ersetzt das Präfix für das Blog mit der ID 1, denn für diesen folgt der Meta-Key nicht dem o.g. Schema.

Achtung!

Das ganze ist keine zuverlässige Methode um die tatsächliche Rolle der Benutzer zu bestätigen. Es besteht theoretisch die Möglichkeit Capabilities an einzelne Accounts zu vergeben und diese könnten den gleichen Namen haben wie die ganze Rolle. Also sollte man die Ergebnisse im Zweifel genau prüfen, oder eine solche Liste über die API-Funktionen von WordPress zusammen stellen. Es ist genau so denkbar, dass ein weiterer User-Meta-Key dem Pattern "%capabilities" entspricht.

Kommentare

Es wurden noch keine Kommentarte zu diesem Artikel geschrieben.

Fragen, Ideen oder Kritik? – Hier ist Platz dafür!

Dein Kommentar

Um ein Kommentar abzugeben, reicht der Text im Kommentarfeld. Die Angabe eines Namens wäre nett, ist aber nicht erforderlich.

Du darfst folgenden HTML-Code verwenden, musst aber nicht:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>