Unser Ziel ist es, zwei WordPress Webseiten einzurichten, die sich Logins und die gleichen Benutzer teilen. Sobald ein Benutzer eine Webseite abonniert hat, kann er auf die andere Webseite mit der gleichen Rolle und den gleichen Fähigkeiten zugreifen.

Um dieses Ziel zu erreichen, sollten wir in der Lage sein, die WordPress Konfigurationsdatei zu bearbeiten und die Datenbanktabellen zu aktualisieren. Ein allgemeines Verständnis der WordPress-Architektur und der Datenbankstruktur ist unerlässlich, ebenso wie ein Grundwissen über die WordPress-Entwicklung. Keine Sorge, wenn du kein Experte bist. Folge einfach den Anweisungen in diesem Beitrag und stelle deine Fragen in den Kommentaren.

Bevor wir mit dem Programmieren beginnen, müssen wir wissen, wo WordPress die Benutzerrollen und -fähigkeiten speichert. Also ist unser erster Schritt, tief in die Datenbanktabellen einzutauchen.

Wichtig: Das Folgende wird in der Kinsta-Umgebung nicht sofort funktionieren, da wir nur eine WordPress-Installation pro Webseite zulassen (es sei denn, du betreibst WordPress Multisite). Es könnte möglich sein, dies auf unserer Plattform zum Laufen zu bringen, aber es würde einige zusätzliche Einstellungen oder Entwicklungen erfordern. Wir empfehlen, dies mit einem WordPress-Entwickler zu besprechen.

Benutzerdaten und Metadaten

Standardmäßig speichert WordPress benutzerbezogene Daten in drei Tabellen: {$pref}options, {$pref}users und {$pref}usermeta.

  • Die Tabelle {$pref}options speichert die komplette Liste der verfügbaren Rollen und Fähigkeiten in einer Zeile, deren option_key Feld {$pref}user_roles ist.
  • Die {$pref}users Tabelle speichert grundlegende Benutzerdaten, wie Login, Passwort, E-Mail, URL, etc.
  • Die {$pref}usermeta Tabelle speichert Benutzer-Metadaten.

Wenn wir an neuen WordPress Installationen arbeiten, müssen wir uns nicht um die {$pref}user_roles Zeile in der {$pref}options Tabelle kümmern, da das entsprechende option_value Feld immer den gleichen Wert hat. Wir sollten diese Zeile nur für den Fall berücksichtigen, dass wir an bestehenden Installationen arbeiten, bei denen Rollen oder Fähigkeiten geändert wurden.

Mach dir auch keine Sorgen um die {$pref}users Tabelle, denn sie speichert grundlegende Benutzerdaten, die wir nicht ändern werden, wenn wir Benutzer zwischen Webseiten austauschen.
Die {$pref}usermeta Tabelle ist die einzige Tabelle, die wir aktualisieren werden, um unser Ziel zu erreichen.

Benutzer und Usermeta Tabellenstruktur
Benutzer und Usermeta Tabellenstruktur
(Quelle: Codex Database Description)

{$pref}usermeta speichert Benutzer-Metadaten in Schlüssel/Wert-Paaren. In dieser Tabelle werden in fünf Zeilen die Daten gespeichert, die wir berücksichtigen müssen.

Fünf Zeilen in der usermeta Tabelle speichern Daten über die Fähigkeiten des Benutzers, das Level und die Einstellungen des Dashboards
Fünf Zeilen in der usermeta Tabelle speichern Daten über die Fähigkeiten des Benutzers, das Level und die Einstellungen des Dashboards

In der ersten Zeile ist das meta_key Feld auf {$pref}capabilities gesetzt und das entsprechende meta_value Feld ist ein serialisiertes Array, das die Benutzerrolle enthält. Die zweite Zeile speichert die Benutzerebene (beachte, dass die Benutzerebenen seit WordPress 3.0 veraltet sind). Die verbleibenden drei Zeilen betreffen Dashboard-Einstellungen, auf die wir in diesem Beitrag nicht weiter eingehen werden.
Benutzerrolle, Level und Einstellungen sind spezifisch für die WordPress-Installation und werden durch den gleichen $pref-Wert identifiziert. Es ist eine wichtige Information, wenn unser Ziel ist, Benutzer zwischen Webseiten zu teilen, denn wir müssen diese Zeilen duplizieren und das meta_key Feld entsprechend ändern.

Das ist alles, was wir über Benutzertabellen wissen müssen, wenn wir das Ziel haben, Logins und Benutzer zwischen neuen WordPress-Installationen zu teilen. Wenn wir an bestehenden Webseiten arbeiten, sollten wir bedenken, dass viele Plugins zusätzliche Zeilen zu {$pref}usermeta hinzufügen und wir eventuell einen tieferen Blick in die Datenbanktabellen werfen müssen.

Nachdem wir das mit den Benutzertabellen gesagt haben, können wir einen Schritt weiter gehen. Nun müssen wir zwei spezifische Konstanten in der wp-config.php Datei definieren.

Eigene Benutzertabellen definieren – Logins teilen

WordPress erlaubt uns, anstelle von {$pref}users und {$pref}usermeta benutzerdefinierte Tabellen zu setzen. Das bedeutet, wenn zwei (oder mehr) WordPress Webseiten sich eine Datenbank teilen, können wir die gleichen Benutzer und Usermeta Tabellen für alle setzen. Das hat zur Folge, dass alle Webseiten, die sich diese Tabellen teilen, auch die gleichen Benutzer haben.

Hinweis: Um die gleichen Benutzer und Usermeta-Tabellen zu teilen, müssen WordPress-Installationen die gleiche Datenbank nutzen.

Wir müssen nur CUSTOM_USER_TABLE und CUSTOM_USER_META_TABLE in der wp-config.php Datei definieren, wie im folgenden Code gezeigt:

// custom users and usermeta tables
define( 'CUSTOM_USER_TABLE', 'my_users_table' );
define( 'CUSTOM_USER_META_TABLE', 'my_usermeta_table' );
Hinweis: Auf bestehenden Webseiten ist es zwingend erforderlich, ein Backup der WordPress-Installation zu erstellen, bevor du Änderungen an den wp-config.php Dateien und Datentabellen vornimmst

Da wir nun wissen, was zu tun ist, ist es an der Zeit, unsere beiden WordPress-Installationen zu starten.

WordPress installieren

Der Einfachheit halber werde ich die WordPress Root-Ordner first und second nennen. first_ und second_ werden die jeweiligen Tabellenpräfixe sein.
Lass uns nun die erste Installation ausführen.

In diesem Beispiel setzen wir das Tabellenpräfixfeld auf first_
In diesem Beispiel setzen wir das Tabellenpräfixfeld auf first_
Hinweis: Alle Installationen werden sich eine einzige Datenbank teilen, und wir sollten jede Installation mit einem eindeutigen Tabellenpräfix versehen.

Wenn die erste WordPress Webseite steht und läuft, können wir ihre Konfigurationsdatei bearbeiten. Öffne /first/wp-config.php und füge die folgenden Zeilen über dem Kommentar ’stop editing‘ ein:

$table_prefix  = 'first_';

define('WP_DEBUG', true);
define( 'WP_DEBUG_LOG', true );
define( 'WP_DEBUG_DISPLAY', false );
@ini_set( 'display_errors', 0 );

// custom users and usermeta tables
define( 'CUSTOM_USER_TABLE', $table_prefix . 'users' );
define( 'CUSTOM_USER_META_TABLE', $table_prefix . 'usermeta' );

/* That's all, stop editing! Happy blogging. */

Wir haben den Debug-Modus aktiviert, um WordPress zu zwingen, Fehlermeldungen und Warnungen in der Datei debug.log zu speichern (lies mehr zu diesem Thema in Ein detaillierter Einblick in die Konfiguration von WordPress).
Dann haben wir die Konstanten CUSTOM_USER_TABLE und CUSTOM_USER_META_TABLE für die Tabellen first_users und first_usermeta definiert. Auf diese Weise ändern wir nicht die Standardeinstellungen von WordPress.

Wir sind fertig mit der ersten Installation. Als nächstes müssen wir die wp-config.php aus dem Ordner der ersten Installation kopieren und es in den Stammordner der zweiten Installation einfügen. Achte darauf, dass du den Wert $table_prefix entsprechend änderst:

$table_prefix  = 'second_';

define('WP_DEBUG', true);
define( 'WP_DEBUG_LOG', true );
define( 'WP_DEBUG_DISPLAY', false );
@ini_set( 'display_errors', 0 );

// custom users and usermeta tables
define( 'CUSTOM_USER_TABLE', 'first_users' );
define( 'CUSTOM_USER_META_TABLE', 'first_usermeta' );

CUSTOM_USER_TABLE und CUSTOM_USER_META_TABLE werden auf die Werte der ersten Installation gesetzt: first_users und first_usermeta. Das ist alles für die erste Installation.

WordPress ist sich der existierenden Benutzer bewusst und wir sollten eine nicht existierende Email-Adresse für den Admin-Benutzer setzen
WordPress ist sich der existierenden Benutzer bewusst und wir sollten eine nicht existierende Email-Adresse für den Admin-Benutzer setzen

Wenn wir die zweite Installation ausführen, sollten wir eine nicht existierende E-Mail-Adresse für den Admin-Benutzer einstellen, da WordPress eine Anzahl von existierenden Benutzern aus der Tabelle first_users findet.

WordPress erstellt einen Admin-Benutzernamen für die zweite Installation
WordPress erstellt einen Admin-Benutzernamen für die zweite Installation

Logge dich in das Admin-Panel der zweiten Installation als Admin ein und liste die WordPress-Benutzer auf. Hier findest du den neuen Admin-Benutzer und alle Benutzer der ersten Webseite (so können sie sich die Logins teilen). Zu diesem Zeitpunkt können sich die Nutzer der einen Webseite nicht mehr auf der anderen Webseite einloggen.

Die Benutzer der zweiten Webseite werden ihre Rollen nicht von der ersten Webseite erben
Die Benutzer der zweiten Webseite werden ihre Rollen nicht von der ersten Webseite erben

Um den Benutzern auf beiden Webseiten die gleichen Fähigkeiten zu gewähren, müssen wir die {$pref}usermeta Tabelle aktualisieren.

Rollen und Fähigkeiten

Wenn du eine neue WordPress-Installation durchführst, musst du dich nicht um die {$pref}options-Tabelle kümmern. Du musst nur die {$pref}usermeta Tabelle aktualisieren.

In unserem Beispiel, wenn ein neuer Benutzer auf der ersten Webseite erstellt wird, fügt WordPress die Zeilen first_capabilities und first_user_level in der Tabelle first_usermeta hinzu. Um der zweiten Webseite Zugang zu gewähren, sollten diese Zeilen dupliziert werden, wie im Bild unten gezeigt:

second_usermeta_fields

Wenn ein neuer Benutzer auf der zweiten Webseite erstellt wird, werden die second_capabilities und second_user_level Zeilen zur first_usermeta Tabelle hinzugefügt.
Um den Benutzern auf allen Webseiten die gleichen Rollen und Berechtigungen zu geben, sollten die Zeilen first_capabilities und first_user_level in second_capabilities und second_user_level dupliziert werden. Mit diesen beiden Zeilenpaaren in der gleichen first_usermeta-Tabelle können Benutzer auf beide Webseiten mit den gleichen Rechten zugreifen.

Um alle existierenden usermeta-Zeilen zu aktualisieren, kannst du eine SQL-Abfrage ausführen oder Tabellen aus phpMyAdmin aktualisieren. Aber was ist mit den Nutzern, die unsere Webseiten von nun an abonnieren werden? Laut WordPress Codex würden wir ein Plugin verwenden oder eine eigene Funktion bauen.
Und los geht’s!

Automatisches Duplizieren von Caps und Levels mit einer Funktion

set_user_role ist ein Action Hook, der immer dann ausgelöst wird, wenn ein neuer Benutzer erstellt oder die Rolle eines bestehenden Benutzers bearbeitet wurde. Dank dieser Aktion können wir Updates der Usermeta-Tabelle automatisieren.
Füge also in der Hauptdatei eines Plugins die folgende Funktion ein:

function ksu_save_role( $user_id, $role ) {

	// Site 1
	// Change value if needed
	$prefix_1 = 'first_';
	
	// Site 2 prefix
	// Change value if needed
	$prefix_2 = 'second_';
	
	$caps = get_user_meta( $user_id, $prefix_1 . 'capabilities', true );
	$level = get_user_meta( $user_id, $prefix_1 . 'user_level', true );

	if ( $caps ){
		update_user_meta( $user_id, $prefix_2 . 'capabilities', $caps );
	}

	if ( $level ){
		update_user_meta( $user_id, $prefix_2 . 'user_level', $level );
	}
}

add_action( 'set_user_role', 'ksu_save_role', 10, 2 );

Die Callback-Funktion hat drei Argumente, von denen zwei erforderlich sind: $user_id und $role.
Was die Funktion macht, ist ziemlich selbsterklärend. get_user_meta gibt den Wert des angegebenen Benutzer-Meta-Feldes zurück. Wir haben diese Funktion zweimal aufgerufen, um die Felder first_capabilities und first_user_level abzurufen. Dann haben wir diese Werte verwendet, um die Felder second_capabilities und second_user_level zur Tabelle first_usermeta hinzuzufügen.

Lade dieses Plugin auf die erste Webseite hoch und aktiviere es.

Damit die Installationen symmetrisch funktionieren, müssen wir das Plugin einfach in jeder Installation hochladen und aktivieren, aber die richtigen Werte für die Präfixe setzen. Wenn wir zum Beispiel diese Funktion auf der zweiten Webseite aktivieren wollen, müssen wir die Variablen wie folgt deklarieren:

$prefix_1 = 'second_';
$prefix_2 = 'first_';

Also bearbeite und installiere das Plugin auf der zweiten Webseite und erstelle einen neuen Benutzer oder ändere eine bestehende Benutzerrolle. Überprüfe dann die erste Webseite. Die Benutzerrollen werden genau die gleichen sein wie auf der zweiten Webseite.

Zusammenfassung

In diesem Beitrag habe ich erklärt, wie man Benutzern in unabhängigen WordPress-Installationen die gleichen Rechte einräumen kann. Sobald der Benutzer auf einer Webseite registriert ist, kann er auf alle Webseiten zugreifen, die die gleichen Benutzer- und Usermeta-Tabellen haben.
Ich habe angenommen, dass ich mit neuen Installationen arbeite. Wenn du an bestehenden Webseiten arbeitest, solltest du bedenken, dass einige Plugins die Usermeta-Tabelle aktualisiert oder sogar neue Tabellen erstellt haben könnten, die benutzerbezogene Daten speichern. In diesem Fall wäre eine genauere Analyse der Datenbank angebracht.

Wenn du Fragen zur Freigabe von Logins in WordPress hast oder deine Erfahrungen mit uns teilen möchtest, kannst du dich gerne an der Konversation beteiligen, indem du einen Kommentar schreibst.

Der vollständige Code unseres Plugins ist in diesem öffentlichen Gist verfügbar

Carlo Daniele Kinsta

Carlo is a passionate lover of webdesign and front-end development. He has been playing with WordPress for more than 20 years, also in collaboration with Italian and European universities and educational institutions. He has written hundreds of articles and guides about WordPress, published both on Italian and international websites, as well as on printed magazines. You can find him on LinkedIn.