かもメモ

自分の落ちた落とし穴に何度も落ちる人のメモ帳

WordPress さくらサーバーでマルチサイトにしたらリダイレクトループでサブサイトの管理画面にログインできなかった件

WordPressのマルチサイトを作成する案件があって、さくらのレンタルサーバーWordPressをインストールしてマルチサイトの設定を行いました。
メインサイトのトップを/にして、ディレクトリ型でマルチサイトをインストールしたまでは良かったのですが、サブサイトを作成してサブサイトの管理画面にアクセスしようとするとリダイレクトループが発生し管理画面にアクセスできない状況にハマってしまいました。(サブサイトそのものはリダイレクトループが発生すること無く表示されていました...

サイト構成

/site-root <- サイトのルートのディレクトリ
  |- .htaccess
  |- index.php
  |- /wordpress  <- WordPress本体
        |- wp-config.php

ネットワーク有効化の際に出力される .htpaccess に記入するコードに問題があった

さくらのレンタルサーバーでマルチサイトのネットワークを有効した時に表示されるRewriteRuleに不要なパスが出力されてしまっていてるのがリダイレクトループになってしまう原因のようでした。

ネットワークの有効化の際に表示される.htaccessの設定👇

2.次の内容を /home/user/www/ にある .htaccess ファイルへ追加して、他の WordPress ルールを置き換えてください:

RewriteEngine On
RewriteBase /
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).*) site-root/wordpress/$2 [L]
RewriteRule ^([_0-9a-zA-Z-]+/)?(.*\.php)$ site-root/wordpress/$2 [L]
RewriteRule . index.php [L]

よく見ると、/www 直下の.htaccessに記入するようにと書かれています。
ドメイン/site-rootディレクトリに指定している場合はWordPress.htaccess/site-root直下にあるので、出力される設定ではパスが異なってしまうのが原因のようです!

RewriteRule のパスを修正する

下から2つ目と3つ目の設定

RewriteRule ^([_0-9a-zA-Z-]+/)?(wp-(content|admin|includes).*) site-root/wordpress/$2 [L]
RewriteRule ^([_0-9a-zA-Z-]+/)?(.*\.php)$ site-root/wordpress/$2 [L]

ここにあるパスを.htaccessのあるドメイン指定してある/site-rootからみてのWordPress本体があるパスに修正します。

このケースではWordPress本体は/site-rootからみるとwordpressディレクトリになるので次のように修正します。

RewriteRule ^([_0-9a-zA-Z-]+/)?(wp-(content|admin|includes).*) wordpress/$2 [L]
RewriteRule ^([_0-9a-zA-Z-]+/)?(.*\.php)$ wordpress/$2 [L]

 
仮に/site-rootに直接WordPressのコアファイルが置かれている場合は次のような感じです。

RewriteRule ^([_0-9a-zA-Z-]+/)?(wp-(content|admin|includes).*) $2 [L]
RewriteRule ^([_0-9a-zA-Z-]+/)?(.*\.php)$ $2 [L]

 

マルチサイトを作ったのは初めてで、注意書きを見をとしてしまっていたためにパスの違いに気づかずハマってしまいました。
サブサイトのそのものが閲覧できていたので余計に、ナゼ管理画面だけリダイレクトループになるんだ!? と盛大にハマりました。

今日のアイカツ格言
「注意書きはちゃんと読もう!」
f:id:kikiki-kiki:20180201075055p:plain


ローリーとふしぎな国の物語 ~プログラミングとアルゴリズムにふれる旅~

ローリーとふしぎな国の物語 ~プログラミングとアルゴリズムにふれる旅~

WordPress マルチサイト設置のメモ

WordPressでマルチサイトを設置した時のメモ

サイト構成
次のような構成で、WordPressの管理画面の設定からサイトが/webrootで表示されるように変更しました。

/webroot
  |- .htaccess
  |- index.php
  |- /wordpress
         |- wp-config.php

マルチサイトの設定

1. wp-config.php にマルチサイトを使用可能にするコードを追加

/wordpress/wp-config.php にマルチサイトを可能にする設定を/* 編集が必要なのはここまでです ! WordPress でブログをお楽しみください。 */コメントの上に追加

define ('WP_ALLOW_MULTISITE', true);

2. プラグインを全て無効にする

プラグインが有効になっているとネットワークのインストールが出来ないので、プラグインを有効にしている場合は一度全て無効にする必要があります。

3. ネットワークのインストール

WordPress管理画面をリロードすると設定 > ツールに「ネットワーク」が追加されているので「ネットワーク」を選択。

サブサイトの運用を「サブドメイン型」にするか「サブディレクトリ型」にするかを決めます。 レンタルサーバーの場合「サブドメイン型」にするとサブサイトを作る度にドメインの設定を行わなければならない場合もあるので「サブディレクトリ型」にした方がメンドーは無いかもしれません。
既に運用としているWordPressサイトをマルチサイトにする時は固定ページなどでディレクトリの割当がされているせいか「サブドメイン型」しか選択できなくなるようです。

サイトのネットワーク名・マルチサイト全ての管理者(特権管理者権限)アカウントになるサイトネットワーク管理者のメールアドレスを確認します。 ネットワークの設定を1度行うとDBが変更されてしまうので修正するにはDBを初期化してWordPressを再インストールする必要があります。
設定に問題がなければ「インストールボタン」をクリックしてマルチサイトが使用できるネットワークをインストールします。

4. サイトネットワークの設置

ネットワークのインストールが完了するとwp-config.phpとサイトのトップ(index.phpのある階層)にある.htpaccessを変更する指示が出るので、これを各ファイルにコピペしていきます。
f:id:kikiki-kiki:20180201055509p:plain

/wordpress/wp-config.php 1.で追加したコードの下に表示されたコードをコピペします

define ('WP_ALLOW_MULTISITE', true);
define('MULTISITE', true);  // マルチサイトにする: true
define('SUBDOMAIN_INSTALL', false); // サブドメイン型: true サブディレクトリ型: false
define('DOMAIN_CURRENT_SITE', 'example.com'); // サイト全体のトップドメイン
define('PATH_CURRENT_SITE', '/'); // メインサイトのパス
define('SITE_ID_CURRENT_SITE', 1); // メインサイトのID
define('BLOG_ID_CURRENT_SITE', 1); // メインブログのID (将来的に複数のブログが管理できるようになるっぽい?)

wp-config.phpの変更が完了したらパーミッション400に変更しておきます。

次に、サイトトップに当たる階層にある.htpaccessに表示されたコードをコピペします。

RewriteEngine On
RewriteBase /
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).*) wordpress/$2 [L]
RewriteRule ^([_0-9a-zA-Z-]+/)?(.*\.php)$ wordpress/$2 [L]
RewriteRule . index.php [L]

この時 BEGIN WordPress で始まるWordPressが出力していた設定があるとリダイレクトループが発生してサイトが表示されなくなります。
注意書きにある通り「他のWordPress ルールを置き換えてください」とあるので、これを削除してしまうかコメントアウトします。(コメントアウトの方が万が一の時に戻しやすいかもです)

# BEGIN WordPress
# <IfModule mod_rewrite.c>
# RewriteEngine On
# RewriteBase /
# RewriteRule ^index\.php$ - [L]
# RewriteCond %{REQUEST_FILENAME} !-f
# RewriteCond %{REQUEST_FILENAME} !-d
# RewriteRule . /index.php [L]
# </IfModule>
# END WordPress

5. 管理画面に再ログイン

wp-config.php.htpaccessの変更が完了したら、管理画面をリロードするとログアウトしているので、3. で決めた特権管理者権限のアカウントでログインできればマルチサイトの設定は完了です。
ログインボタンを押した時にログイン画面にリダイレクトされてしまう場合は、一度Cookieを削除するとログインがログインが出来るようになるようです。
 

wp-config.phpに追加した define('MULTISITE', true); の値をfalseにするとDBやマルチサイトのデータを残したまま、マルチサイトでないメインのサイトだけの状態に戻すことが出来るようです。
但し、テーマ内にget_blog_details()の様なマルチサイトの時しか使えない関数があるとエラーになるので注意が必要です。
FYI: https://codex.wordpress.org/Function_Reference#Multisite_functions


[参考]

WordPress 子テーマ「親テーマが見つかりません。」になるとき

WordPressで子テーマを作成してインストールしようとしたら
修正が必要なテーマ: 親テーマが見つかりません。「THEME NAME」の親テーマをインストールしてください。
というエラーが表示される時

親テーマの指定はディレクトリ名でなければならない

テーマの構成

/themes
   |- /my-theme
   |- /my-sub-theme

親テーマ(my-theme)の設定

/* /my-theme/style.css
  Theme Name:  MY THEME
  ...
*/

この様な構成の時、子テーマ(my-sub-theme)での親テーマをTemplate:に指定します

/* /my-sub-theme/style.css
  Theme Name:  MY SUB THEME
   Template:   my-theme
*/

親テーマ名のMY THEMEではなく、親テーマのディレクトリ名のmy-themeで指定しないと親テーマとして認識されない。
テスト環境が大文字小文字を同じものとして扱ってたりして、本番サーバーが大文字小文字を別だと認識してたりするとハマったりする。


SHINY DAYS(TVアニメ「ゆるキャン△」OPテーマ)

SHINY DAYS(TVアニメ「ゆるキャン△」OPテーマ)