web-dev-qa-db-fra.com

Comment partager une session WordPress et des cookies entre domaine et sous-domaine?

J'ai raté beaucoup de temps en cherchant une réponse à ma question. Pour le moment, j’ai deux WP installations sur un serveur et un DB, mais avec un préfixe différent. Je partageais déjà les données des utilisateurs et la méta entre deux blogs et tout fonctionnait bien! Mais je ne peux toujours pas configurer la connexion automatique ou la connexion unique sous deux blogs. Le code ci-dessous ne fonctionne pas dans WP3.8.

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

Je vais ignorer les étapes liées au partage de la base de données et au partage des données et méta des utilisateurs, en supposant que vous l'avez fait correctement.

Concentrons-nous sur wp-config.php des deux sites. Ceux-ci définissent que DOIT ÊTRE IDENTIQUE pour les deux sites:

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

et

générés une seule fois, KEY et SALT, copiés dans wp-config.php des deux sites.

Désormais, si vous vous connectez en tant qu'utilisateur sur un site, vous serez connecté en tant que même utilisateur sur le deuxième site.

Mais attendez. Que se passe-t-il lorsque vous créez un nouvel utilisateur sur un site, vous connectez en tant qu'utilisateur créé sur le même site et essayez d'accéder à/wp-admin/du deuxième site? Vous pouvez vous attendre à voir le message suivant:

Sorry, you are not allowed to access this page.

En effet, sur le deuxième site, l'utilisateur nouvellement créé n'a encore aucun rôle attribué.

Comment éviter que l'utilisateur ne soit pas synchronisé sur les deux sites, en cas de création ou de modification du profil de l'utilisateur?

J'ai écrit un plugin, qui devrait être placé dans/wp-content/mu-plugins des deux sites. Faisons un nouveau fichier fpw-sync-users.php, avec le code suivant:

<?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');

et copiez-le sur les deux destinations.

Maintenant, éditez le plugin du premier site, en remplaçant "wp_" par le préfixe de table réel du deuxième site, dans les trois tableaux $other_prefixes. Modifiez le plug-in du deuxième site en utilisant le préfixe de table réel du premier site.

À partir de maintenant, les utilisateurs des deux sites seront entièrement synchronisés et la connexion à un site permettra à cet utilisateur de se connecter aux deux sites.

3