web-dev-qa-db-ja.com

2つのワードプレスウェブサイト間のシングルサインオン

私は2つのワードプレスウェブサイトExを持っています:abc.comとxyz.abc.com(両方ともワードプレスにあります)。

multisite 機能を使わずにこの2つのWebサイトにシングルサインオン(SSO)を実装したい。

1
Kajal Solanki

abc.comxyz.abc.com、およびそれらのテーブルプレフィックスが - ab_xy_の2つのWebサイトがあるとしましょう。

必要条件

両方のWebサイトは同じドメイン内にインストールする必要があります。両方のWebサイトは、異なるテーブルプレフィックスを使用して同じデータベースを共有する必要があります。両方のWebサイトはユーザーテーブルを共有する必要があります(例:ab_usersab_usermeta)。

ウェブサイトのwp-config.phpファイル

両方のWebサイトのwp-config.phpファイルは同一である必要がありますが、1つの例外を除いて、$table_prefix Webサイトのabc.comab_、およびxyz.abc.comxy_である必要があります。以下のwp-config.phpについては、abc.comを参照してください。

<?php
/**
 * The base configurations of the WordPress.
 *
 * This file has the following configurations: MySQL settings, Table Prefix,
 * Secret Keys, WordPress Language, and ABSPATH. You can find more information
 * by visiting {@link http://codex.wordpress.org/Editing_wp-config.php Editing
 * wp-config.php} Codex page. You can get the MySQL settings from your web Host.
 *
 * This file is used by the wp-config.php creation script during the
 * installation. You don't have to use the web site, you can just copy this file
 * to "wp-config.php" and fill in the values.
 *
 * @package WordPress
 */

// ** MySQL settings - You can get this info from your web Host ** //
/** The name of the database for WordPress */
define('DB_NAME', 'abc'); // change it, to match your installation  

/** MySQL database username */
define('DB_USER', 'abcadmin'); // change it, to match your installation

/** MySQL database password */
define('DB_PASSWORD', 'database pasword here'); // change it, to match your installation

/** MySQL hostname */
define('DB_Host', 'localhost'); // change it, to match your installation

/** Database Charset to use in creating database tables. */
define('DB_CHARSET', 'utf8');

/** The Database Collate type. Don't change this if in doubt. */
define('DB_COLLATE', '');

/**#@+
 * Authentication Unique Keys and Salts.
 *
 * Change these to different unique phrases!
 * You can generate these using the {@link https://api.wordpress.org/secret-key/1.1/salt/ WordPress.org secret-key service}
 * You can change these at any point in time to invalidate all existing cookies. This will force all users to have to log in again.
 *
 * @since 2.6.0
 */
define('AUTH_KEY',              'use generated value here');
define('SECURE_AUTH_KEY',       'use generated value here');
define('LOGGED_IN_KEY',         'use generated value here');
define('NONCE_KEY',             'use generated value here');

define('AUTH_SALT',             'use generated value here');
define('SECURE_AUTH_SALT',      'use generated value here');
define('LOGGED_IN_SALT',        'use generated value here');
define('NONCE_SALT',            'use generated value here');

define('COOKIE_DOMAIN',         '.abc.com');
define('COOKIEPATH',            '/');
define('COOKIEHASH',            md5('abc.com'));

/**#@-*/

/**
 * WordPress Database Table prefix.
 *
 * You can have multiple installations in one database if you give each a unique
 * prefix. Only numbers, letters, and underscores please!
 */
$table_prefix  = 'ab_'; // in wp-config.php for xyz.abc.com change it to 'xy_'

/* uncomment these two lines after successful website installation */
// define('CUSTOM_USER_TABLE', 'ab_users');
// define('CUSTOM_USER_META_TABLE', 'ab_usermeta');

/**
 * For developers: WordPress debugging mode.
 *
 * Change this to true to enable the display of notices during development.
 * It is strongly recommended that plugin and theme developers use WP_DEBUG
 * in their development environments.
 */
define('WP_DEBUG', false);

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

/** Absolute path to the WordPress directory. */
if ( !defined('ABSPATH') )
    define('ABSPATH', dirname(__FILE__) . '/');

/** Sets up WordPress vars and included files. */
require_once(ABSPATH . 'wp-settings.php');

新規インストール

両方のインストールで使用される空のデータベースを作成します。

wp-config.phpabc.comabc.comのルートにドロップしてインストールを実行します。まだあなたのウェブサイトにログインしないでください。管理者のユーザー名とパスワードを書き留めます。

wp-config.phpxyz.abc.comxyz.abc.comのルートにドロップしてインストールを実行します。あなたの新しいウェブサイトにログインしないでください。

両方のWebサイトで、存在しない場合はmu-plugins内に/wp-contentフォルダーを作成します。

以下の内容でfpw-sync-users.phpファイルを作成します。

<?php
/*
  Plugin Name: FPW Synchronize Shared Users
  Author: Frank P. Walentynowicz
  Author URI: https://fw2s.com
  Disclaimer: Use at your own risk. No warranty expressed or implied is provided.
 */

// Users synchronization on admin login
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(
            'xy_',
        );

        $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 );

// User synchronization on admin create user
function fpw_synchronize_user_on_admin_register( $id ) {
    $me = wp_get_current_user();
    if ( array_key_exists( 'administrator', $me->caps ) ) {
        $other_prefixes = array(
            'xy_',
        );
        $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 );

// User synchronization on profile update
function fpw_synchronize_user_on_profile_update( $user_id ) {
    if ( current_user_can( 'edit_user', $user_id ) ) {
        $other_prefixes = array(
            'xy_',
        );
        $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');

両方のWebサイトのfpw-sync-users.phpフォルダーに/wp-content/mu-pluginsファイルをドロップします。

以下のすべてのオカレンスを置き換えて、fpw-sync-users.phpファイルをxyz.abc.com用に変更します。

$other_prefixes = array(
    'xy_',
);

と:

$other_prefixes = array(
    'ab_',
);

これら2つの定義をコメント解除して、両方のWebサイトのwp-config.phpファイルを変更します。

// define('CUSTOM_USER_TABLE', 'ab_users');
// define('CUSTOM_USER_META_TABLE', 'ab_usermeta');

全部できた。 abc.comにログインして、xyz.abc.comに進みます。あなたもこのウェブサイトにログインするでしょう。

xy_usersテーブルとxy_usermetaテーブルはデータベースから削除できます。これらのテーブルは使用されなくなるためです。

既存のインストール

データベースを別にして既存のWebサイトを扱う場合、状況は少し複雑になります。

重要 :先に進む前に、両方のWebサイトのwp-config.phpファイルとデータベースのバックアップを作成してください。

abc.com Webサイトのデータベースを共有データベースとして使用しましょう。 xyz.abc.comデータベースからすべてのテーブル(usersusermetaを除く)をエクスポートし、それらをabc.comデータベースにインポートする必要があります。

xyz.abc.comデータベースのテーブルプレフィックスがabc.comデータベースのテーブルプレフィックスと異なることを確認してください。異なる場合は、xyz.abc.comのテーブルプレフィックスを変更する以下の手順をスキップできます。

xyz.abc.comのテーブルプレフィックスを変更します WPプレフィックスチェンジャー プラグインをインストールしてアクティブにします。その手順を実行してプレフィックスを変更します。このプラグインを無効にして削除してください。これでテーブルのエクスポート/インポートの準備が整いました。

xyz.abc.comデータベースからテーブルをエクスポートし、それらをabc.comデータベースにインポートします。これには、phpMyAdmin、または他の利用可能なツールを使用できます。

以下の定義を追加して、wp-config.phpwp-config.phpを変更します( 新規インストール セクションのabc.comの例を参照)。

define('COOKIE_DOMAIN',         '.abc.com');
define('COOKIEPATH',            '/');
define('COOKIEHASH',            md5('abc.com'));

そして

define('CUSTOM_USER_TABLE', 'ab_users');
define('CUSTOM_USER_META_TABLE', 'ab_usermeta');

データベース関連の定義を置き換えて、共有データベースの値と一致するように、wp-config.phpxyz.abc.comに変更します。定義を追加し、wp-config.phpabc.comに追加しました。 wp-config.php内のこれらの定義をabc.comに一致させるために、keysおよびhashes defineを置き換えます。

両方のWebサイトのfpw-sync-users.phpフォルダーに( 新規インストール セクションの説明に従って)/wp-content/mu-plugins同期プラグインを追加し、それに応じてプレフィックスを変更します。

それでおしまい。これで、SSOを使用できるユーザーを共有しました。