web-dev-qa-db-ja.com

ドメインとサブドメインの間でWordPressセッションとクッキーを共有するにはどうすればいいですか?

私は自分の質問に対する答えを探すことで多くの時間を逃しました。今日は、1つのサーバーと1つのDBにWPを2つずつインストールしましたが、プレフィックスは異なります。私はすでに2つのブログの間でユーザーデータとメタを共有しました、そして、それはうまく働いています!しかし、2つのブログで自動ログインやシングルサインオンを設定することはできません。以下のコードはWP3.8では機能しません。

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

DBを共有し、ユーザーのデータとメタを共有することに関連する手順はスキップします。これは正しく行ったという前提に基づいています。

両方のサイトのwp-config.phpに集中しましょう。これらは次のように定義されています 識別される必要があります 両方のサイトに対して:

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

そして

kEYとSALTを1回だけ生成し、両方のサイトのwp-config.phpにコピーします。

今、あなたが1つのサイトのいずれかのユーザーとしてログインすると、あなたは2番目のサイトの同じユーザーとしてログインするでしょう。

ちょっと待って。あるサイトに新しいユーザーを作成し、同じサイトに作成したばかりのユーザーとしてログインし、2番目のサイトの/ wp-admin /にアクセスしようとするとどうなりますか?次のようなメッセージが表示されることがあります。

Sorry, you are not allowed to access this page.

これは、2番目のサイトでは、新しく作成されたユーザーにはまだ役割が割り当てられていないためです。

ユーザーの作成時またはユーザーのプロファイルへの変更時に、両方のサイトでユーザーが同期されないようにする方法

私は両方のサイトの/ wp-content/mu-pluginsに置かれるべきであるプラグインを書きました。次のコードを追加して、新しいファイルfpw-sync-users.phpを作成しましょう。

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

そしてそれを両方の宛先にコピーします。

さて、3つすべての$other_prefixes配列で、 'wp_'を2番目のサイトの実際のテーブルプレフィックスに置き換えて、1番目のサイトのプラグインを編集します。代わりに、最初のサイトの実際のテーブルプレフィックスを使用して、2番目のサイトのプラグインを編集します。

今後は、両方のサイトのユーザーが完全に同期され、一方のサイトにログインすると、このユーザーが両方のサイトにログインした状態になります。