私は2つのワードプレスウェブサイトExを持っています:abc.comとxyz.abc.com(両方ともワードプレスにあります)。
multisite 機能を使わずにこの2つのWebサイトにシングルサインオン(SSO)を実装したい。
abc.com
、xyz.abc.com
、およびそれらのテーブルプレフィックスが - ab_
、xy_
の2つのWebサイトがあるとしましょう。
両方のWebサイトは同じドメイン内にインストールする必要があります。両方のWebサイトは、異なるテーブルプレフィックスを使用して同じデータベースを共有する必要があります。両方のWebサイトはユーザーテーブルを共有する必要があります(例:ab_users
、ab_usermeta
)。
両方のWebサイトのwp-config.php
ファイルは同一である必要がありますが、1つの例外を除いて、$table_prefix
Webサイトのabc.com
はab_
、およびxyz.abc.com
はxy_
である必要があります。以下の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.php
のabc.com
をabc.com
のルートにドロップしてインストールを実行します。まだあなたのウェブサイトにログインしないでください。管理者のユーザー名とパスワードを書き留めます。
wp-config.php
のxyz.abc.com
をxyz.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
データベースからすべてのテーブル(users
とusermeta
を除く)をエクスポートし、それらをabc.com
データベースにインポートする必要があります。
xyz.abc.com
データベースのテーブルプレフィックスがabc.com
データベースのテーブルプレフィックスと異なることを確認してください。異なる場合は、xyz.abc.comのテーブルプレフィックスを変更する以下の手順をスキップできます。
xyz.abc.com
のテーブルプレフィックスを変更します : WPプレフィックスチェンジャー プラグインをインストールしてアクティブにします。その手順を実行してプレフィックスを変更します。このプラグインを無効にして削除してください。これでテーブルのエクスポート/インポートの準備が整いました。
xyz.abc.com
データベースからテーブルをエクスポートし、それらをabc.com
データベースにインポートします。これには、phpMyAdmin
、または他の利用可能なツールを使用できます。
以下の定義を追加して、wp-config.php
のwp-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.php
をxyz.abc.com
に変更します。定義を追加し、wp-config.php
のabc.com
に追加しました。 wp-config.php
内のこれらの定義をabc.com
に一致させるために、keysおよびhashes defineを置き換えます。
両方のWebサイトのfpw-sync-users.php
フォルダーに( 新規インストール セクションの説明に従って)/wp-content/mu-plugins
同期プラグインを追加し、それに応じてプレフィックスを変更します。
それでおしまい。これで、SSOを使用できるユーザーを共有しました。