ルートディレクトリ以外にインストールしたWordPressをマルチサイト化すると下記のようなディレクトリ構造になってしまいますが、
- http://www.sample.com/wp (親サイト)
- http://www.sample.com/wp/blog1 (子サイト1)
- http://www.sample.com/wp/blog2 (子サイト2)
- http://www.sample.com/wp/blog3 (子サイト3)
子サイトのディレクトリを親サイトのサブディレクトリではなく下記の構造のようにルートディレクトリに設置したい場合もあると思います
- http://www.sample.com/wp (親サイト)
- http://www.sample.com/blog1 (子サイト1)
- http://www.sample.com/blog2 (子サイト2)
- http://www.sample.com/blog3 (子サイト3)
一見簡単に実現できそうに見えますがWordPressにはこのような機能が直接実装されていないので、Apache等のWebサーバー側でサブディレクトリへのアクセスをリダイレクトしてやる必要があります。下記ではこれを実現したときの手順を解説いたします。.htaccess及びphpファイルを修正しますのでご了承ください。
本解説ではWordPressのバージョン4.7.3を利用しております。
まず始めにWordPressをサブディレクトリ型でマルチサイト化の設定をします。
wp-config.phpに下記の行を追加します。
define('WP_ALLOW_MULTISITE', true);
次にWordPressの管理画面にある「ツール」→「ネットワークの設定」を選択し、ネットワーク作成画面で「サブディレクトリ」を選択し、「インストール」を押します。
次にマルチサイトを有効にするために下記のようなコードをwp-config.php及び.htaccessに追記するよう作業内容が提示されますので、提示された内容を実行していきます。
wp-config.php
define('MULTISITE', true); define('SUBDOMAIN_INSTALL', false); define('DOMAIN_CURRENT_SITE', 'www.sample.com'); define('PATH_CURRENT_SITE', '/wp/'); define('SITE_ID_CURRENT_SITE', 1); define('BLOG_ID_CURRENT_SITE', 1);
.htaccess
RewriteEngine On RewriteBase /wp/ RewriteRule ^index\.php$ - [L] # add a trailing slash to /wp-admin RewriteRule ^([_0-9a-zA-Z-]+/)?wp-admin$ $1wp-admin/ [R=301,L] RewriteCond %{REQUEST_FILENAME} -f [OR] RewriteCond %{REQUEST_FILENAME} -d RewriteRule ^ - [L] RewriteRule ^([_0-9a-zA-Z-]+/)?(wp-(content|admin|includes).*) $2 [L] RewriteRule ^([_0-9a-zA-Z-]+/)?(.*\.php)$ $2 [L] RewriteRule . index.php [L]
ここまででWordPressのマルチサイト化の初期設定ができました。
次から、サイトを追加しディレクトリ構造を並列化する手順を、親サイトのディレクトリ名をwp、子サイトのディレクトリ名をblogとした場合を例として解説いたします。
まず、WordPressの管理画面に新たに追加されている「参加サイト」から「サイトネットワーク管理」→「サイト」を選択し、「新規追加」を押します。
現段階では親サイトwpの直下にしか子サイトblogを配置できませんので、サイトアドレスには仮でblogと入力します。サイトのタイトル及び管理者メールアドレスについては任意の値を入力し、「サイトを追加」を押してください。
ここまででマルチサイト化したWordPressにサイトの追加は行えましたが、子サイトのURLがhttp://www.sample.com/wp/blogという階層構造になっています。
次から、この階層構造をhttp://www.sample.com/blogに変更する手順を解説します。
まず、「参加サイト」→「サイトネットワーク管理」→「サイト」を選択し、www.sample.com/wp/blogの「編集」を押します。編集画面でサイトアドレスを変更できますのでwww.sample.com/blogに書き換えて「変更を保存」を押します。
ここまでWordPress上での作業でしたが、これからはサーバー上のファイルを直接編集していきます。
次は、サーバー上でルートディレクトリにblogという名前でディレクトリを新規作成します。新規作成したblogディレクトリにwpディレクトリにあるindex.php及び.htaccessをコピーします。
コピーしたindex.phpを下記のように編集します。
編集前
require( dirname( __FILE__ ) . '/wp-blog-header.php' );
編集後
require( dirname( __FILE__ ) . '/../wp/wp-blog-header.php' );
編集後のパスについては、子サイトのディレクトリから見た親サイトのディレクトリへの相対パスを入力してください。
ここまでの設定で、子サイトへのアクセスはできるようになりましたが、子サイトの管理画面へログインできないので、クッキー関連の設定及び管理画面利用時のアドレスのリダイレクトの設定を行います。
まず、親サイトのディレクトリにあるwp-config.phpに下記のコードを追加します。
define('ADMIN_COOKIE_PATH', '/'); define('COOKIE_DOMAIN', 'www.sample.com'); define('COOKIEPATH', '/'); define('SITE_COOKIEPATH', '/');
COOKIE_DOMAINの項のwww.sample.comについては、各自が使用しているドメイン名に変更してください。
次に、子サイトのディレクトリにある.htaccessを下記の2行目・7行目・8行目のように編集します。
編集前
# add a trailing slash to /wp-admin RewriteRule ^([_0-9a-zA-Z-]+/)?wp-admin$ $1wp-admin/ [R=301,L] RewriteCond %{REQUEST_FILENAME} -f [OR] RewriteCond %{REQUEST_FILENAME} -d RewriteRule ^ - [L] RewriteRule ^([_0-9a-zA-Z-]+/)?(wp-(content|admin|includes).*) $2 [L] RewriteRule ^([_0-9a-zA-Z-]+/)?(.*\.php)$ $2 [L] RewriteRule . index.php [L]
編集後
# add a trailing slash to /wp-admin RewriteRule ^([_0-9a-zA-Z-]+/blog/)?wp-admin$ $1wp/wp-admin/ [R=301,L] RewriteCond %{REQUEST_FILENAME} -f [OR] RewriteCond %{REQUEST_FILENAME} -d RewriteRule ^ - [L] RewriteRule ^([_0-9a-zA-Z-]+/blog/)?(wp-(content|admin|includes).*) wp/$2 [L] RewriteRule ^([_0-9a-zA-Z-]+/blog/)?(.*\.php)$ wp/$2 [L] RewriteRule . index.php [L]
編集ができましたら、子サイトへのアクセスと管理画面で子サイトのダッシュボードへアクセスできることを確認してください。両方へアクセスできましたら、設定は完了です。
当サイトも上記の設定を適用して運用しており今のところ問題は起きていませんが、何か問題がありましたら教えていただければと思います。
参考にしたサイト