WordPressのログイン情報を別のホスト名(ドメイン名)で利用する方法


WordPressの管理画面のみを別のホスト名に変更した場合

「https://wp-admin.kojinteki.net/」でログインしているにも関わらず
「https://www.kojinteki.net/」にアクセスすると未ログイン判定されてしまいます。

これは、WordPressの認証用Cookieの「setcookieドメイン指定」が「siteurl」に限定されているからです。


setcookieの仕様を確認

認証用のCookieは「wp-includes/pluggable.php」内で定義されているようです。

// Auth cookies.
setcookie( AUTH_COOKIE, ' ', time() - YEAR_IN_SECONDS, ADMIN_COOKIE_PATH, COOKIE_DOMAIN );
setcookie( SECURE_AUTH_COOKIE, ' ', time() - YEAR_IN_SECONDS, ADMIN_COOKIE_PATH, COOKIE_DOMAIN );
setcookie( AUTH_COOKIE, ' ', time() - YEAR_IN_SECONDS, PLUGINS_COOKIE_PATH, COOKIE_DOMAIN );
setcookie( SECURE_AUTH_COOKIE, ' ', time() - YEAR_IN_SECONDS, PLUGINS_COOKIE_PATH, COOKIE_DOMAIN );
setcookie( LOGGED_IN_COOKIE, ' ', time() - YEAR_IN_SECONDS, COOKIEPATH, COOKIE_DOMAIN );
setcookie( LOGGED_IN_COOKIE, ' ', time() - YEAR_IN_SECONDS, SITECOOKIEPATH, COOKIE_DOMAIN );

定数の「LOGGED_IN_COOKIE」は「wp-includes/default-constants.php」で定義されています。

if ( ! defined( 'LOGGED_IN_COOKIE' ) ) {
	define( 'LOGGED_IN_COOKIE', 'wordpress_logged_in_' . COOKIEHASH );
}

認証用のCookieの名前には「COOKIEHASH」が利用されており「COOKIEHASH」自身は

if ( ! defined( 'COOKIEHASH' ) ) {
	$siteurl = get_site_option( 'siteurl' );
	if ( $siteurl ) {
		define( 'COOKIEHASH', md5( $siteurl ) );
	} else {
		define( 'COOKIEHASH', '' );
	}
}

定義されていなければ「siteurl」が指定されているのがわかります。これが別ホスト名でログイン判定されない原因のひとつです。

また「COOKIE_DOMAIN」は「wp-includes/ms-default-constants.php」で定義されており

if ( ! defined( 'COOKIE_DOMAIN' ) && is_subdomain_install() ) {
	if ( ! empty( $current_network->cookie_domain ) ) {
		define( 'COOKIE_DOMAIN', '.' . $current_network->cookie_domain );
	} else {
		define( 'COOKIE_DOMAIN', '.' . $current_network->domain );
	}
}

定義されていなければ、自動的にサイトのドメイン名が指定されます。これが2つ目の理由です。


「COOKIE_DOMAIN」「COOKIEHASH」を指定する

2つの定数が定義されていなければ、自動的に「siteurl」が使われてしまうので「wp-config.php」に以下の内容を追記します。

define('COOKIE_DOMAIN', '.kojinteki.net');
define('COOKIEHASH' , md5('kojinteki.net'));

この方法を使うことで、別のホスト名(ドメイン名)で「is_user_logged_in()」を使った認証情報の判定関数を利用する事ができるようになります。

ちなみに「管理画面で記事を書き」「別のホスト名で記事を表示するだけ」であれば今回の設定を行う必要はありません。

管理画面でログインして、別のホスト名で独自のプログラムなどで認証情報を利用する際にお使いください!