it-swarm.com.de

Wie teile ich eine WordPress-Sitzung und Cookies zwischen Domain und Subdomain?

Ich habe viel Zeit verpasst, indem ich nach Antworten auf meine Frage gesucht habe. Für heute habe ich zwei WP Installationen auf einem Server und einer DB, aber mit unterschiedlichem Präfix. Ich habe bereits Benutzerdaten und Meta zwischen zwei Blogs geteilt und es funktioniert einwandfrei! Ich kann jedoch keine automatische Anmeldung oder einmalige Anmeldung unter zwei Blogs einrichten. Der folgende Code funktioniert in WP3.8 nicht.

define('COOKIE_DOMAIN', '.domain.com'); //replace with the 1st website URL
define('COOKIEPATH', '/'); 
6
Hugh Key

Ich überspringe Schritte, die sich auf die gemeinsame Nutzung von Datenbank- und Benutzerdaten sowie Metadaten beziehen, basierend auf der Annahme, dass Sie dies korrekt durchgeführt haben.

Konzentrieren wir uns auf wp-config.php beider Sites. Dies sind die Definitionen, die für beide Sites identisch sein MÜSSEN :

define('COOKIE_DOMAIN', '.domain.com'); // your main domain
define('COOKIEPATH', '/');
define('COOKIEHASH', md5('domain.com')); // notice absence of a '.' in front

und

einmal generiert, KEYs und SALTs, kopiert in die wp-config.php beider Sites.

Wenn Sie sich nun als ein Benutzer auf einer Site anmelden, werden Sie als derselbe Benutzer auf der zweiten Site angemeldet.

Aber warte. Was passiert, wenn Sie einen neuen Benutzer auf einer Site erstellen, sich als soeben erstellter Benutzer auf derselben Site anmelden und versuchen, auf/wp-admin/der zweiten Site zuzugreifen? Sie können erwarten, die folgende Meldung zu sehen:

Sorry, you are not allowed to access this page.

Dies liegt daran, dass dem neu erstellten Benutzer auf der zweiten Site noch keine Rolle zugewiesen wurde.

Wie kann vermieden werden, dass Benutzer nicht auf beiden Sites synchronisiert werden, wenn ein Benutzer erstellt oder das Benutzerprofil geändert wird?

Ich habe ein Plugin geschrieben, das in/wp-content/mu-plugins beider Sites platziert werden sollte. Lassen Sie uns eine neue Datei fpw-sync-users.php mit folgendem Code erstellen:

<?php
// Users synchronization
function fpw_synchronize_admins_on_admin_login( $user_login, $user ) {
    if ( array_key_exists( 'administrator', $user->caps ) ) {
        global $wpdb;
        $site_prefix = $wpdb->prefix;
        $admins_only = true;

        $other_prefixes = array(
            'wp_',
        );

        $args = array( 
            'fields'    => 'ID',
        );
        if ( $admins_only )
            $args[ 'role' ] = 'administrator';

        $users = get_users( $args );

        foreach ( $users as $id ) {
            $cap = get_user_meta( $id, $site_prefix . 'capabilities', true );

            foreach ( $other_prefixes as $prefix )
                update_user_meta( $id, $prefix . 'capabilities', $cap );
        }
    }
}
add_action( 'wp_login', 'fpw_synchronize_admins_on_admin_login', 10, 2 );

function fpw_synchronize_user_on_admin_register( $id ) {
    $me = wp_get_current_user();
    if ( array_key_exists( 'administrator', $me->caps ) ) {
        $other_prefixes = array(
            'wp_',
        );
        $user = get_user_by( 'id', $id );
        $cap = $user->caps;
        foreach ( $other_prefixes as $prefix )
            update_user_meta( $id, $prefix . 'capabilities', $cap );
    }
}
add_action( 'user_register', 'fpw_synchronize_user_on_admin_register', 10, 1 );

function fpw_synchronize_user_on_profile_update( $user_id ) {
    if ( current_user_can( 'edit_user', $user_id ) ) {
        $other_prefixes = array(
            'wp_',
        );
        $cap = array( $_POST[ 'role' ] => true, );
        foreach ( $other_prefixes as $prefix )
            update_user_meta( $user_id, $prefix . 'capabilities', $cap );
    }
 }
add_action('edit_user_profile_update', 'fpw_synchronize_user_on_profile_update');

und kopieren Sie es an beide Ziele.

Bearbeiten Sie nun das Plugin der ersten Site, indem Sie in allen drei $other_prefixes-Arrays 'wp_' durch das echte Tabellenpräfix der zweiten Site ersetzen. Bearbeiten Sie das Plugin der zweiten Site, indem Sie das echte Tabellenpräfix der ersten Site als Ersatz verwenden.

Von nun an werden Benutzer auf beiden Sites vollständig synchronisiert, und die Anmeldung auf einer Site bewirkt, dass dieser Benutzer auf beiden Sites angemeldet ist.