サブタイトル
「WordPressのインストールディレクトリーとサイトURLの変更設定」
目次
はじめに
現状のサイトで差し迫った特に大きな問題は発生していないのだが,サーバーのフォルダー管理面のやり易さや運用面の制限等,気になるのでWordPressのインストール構成等を見直してみることにした。
理想の構成としては,WordPress本体はサブディレクトリーに置いて,サイトURLはルートドメインからアクセスするように構成変更する。
初期のWordPressインストールは必ずしもその構成を意識してインストールしておらず,運用途中で変更する場合を想定して手順を検討した。
WordPressの運用形態
ルートドメイン(サブドメイン)にWordPressをインストールした例
URL例 「https://domain.com」又は「https://sub.domain.com」
ドキュメントルートにWordPressのフォルダー・ファイルが配置されるので管理がしにくい。
特に新サブディレクトリーを作成して別ホームページを立ち上げる際にはメンテナンス時のファイル変更等で勘違いしやすいので細心の注意が必要。ホームページはフォルダー単位で分かれていたほうが管理しやすい。また,ルートドメインのファイル配置を狙った攻撃などのセキュリティー面でも懸念がある。
サブディレクトリーにWordPressをインストールした例
URL例 「https://domain.com/wordpress」
複数のサブディレクトリー単位でWordPressの運用が可能であり,ファイル管理もディレクトリー(フォルダー)単位で出来る利点がある。ただしGoogleの検索結果にサイト名が表示されない制限があるようだが,必ずしも希望のサイト名が表示されるわけではない。
構成変更方針
自宅サーバーなので,ファイル更新等のメンテナンスはエクスプローラーで直接編集しているので,フォルダー単位で管理したほうが勘違い等を防止できる。
WordPress本体のフォルダー・ファイルはサブディレクトリーに配置して,アクセスはルートドメインの設定を行う。複数ホームページを設定する際はメインサイトのホームページはルートドメインのURLとして,開発・テスト用のサブホームページはサブドメインやサブディレクトリーのURLとして本番環境と開発・テスト環境を分けて管理する。
運用中WordPressの構成変更
既に運用しているWordPressに対して前項目の変更を加えるのでバックアップを念のため取得しておく。
ルートドメインにインストールしたWordPressの構成変更
ルートドメインにインストールしたWordPressのサイトURLはドメイン名なのだが,ファイルはサブディレクトリーに移動させる必要がある。修正箇所はWordPressのファイルをサブディレクトリーへ移動させる以外は,移動元の空になったルートドメインにアクセス制御の「.htaccess」ファイルを配置するだけで可能。
ファイル移動
WordPressのファイルを新規に作成したサブディレクトリーへ移動する。
具体的には3フォルダー(wp-admin,wp-content,wp-includes)とルート配置のphpファイル・他を全てコピーする。また元のファイルはバックアップフォルダを作成して保存しておくことで,障害時に元に戻すことが可能。
「.htaccess」作成・配置
元のWordPressがインストールされていたルートドメインに「.htaccess」ファイルを配置してルートドメインへのアクセスをサブディレクトリーへリダイレクト処理する。
元々のWordPressはルートドメイン環境の動作でありリンクパス等は変更しておらず,全てのファイルアクセスは一旦ルートドメインに来るので,そこでWordPressファイルがあるサブディレクトリーにリダイレクトしてあたかもルートドメインで動作しているように処理する。
下記のサブディレクトリー名:subを3か所修正してルートドメイン(ドキュメントルート)に保存する。
RewriteEngine on
RewriteCond %{REQUEST_URI} !^/sub/
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /sub/$1
RewriteRule ^(/)?$ sub/index.php [L]
次のドメイン条件:domain.comは当サイトでは不要と思われたので指定していない。
RewriteCond %{HTTP_HOST} ^(www\.)?domain\.com$
「記載する際は1行目(RewriteEngine on)の後と5行目(RewriteRule ^(.*)$ /sub/$1)の後に記入」
サイトのURLに変更がないのでサイトの評価等,外部からのアクセスには影響しない。と思われる。
サブディレクトリーにインストールしたWordPressの構成変更
サブディレクトリーのWordPressサイトのURL(https://domain.com/sub)をルートドメインのURL(https://domain.com)に変更する。
次項の手順を前後するとWordPressにアクセス出来なくなるので注意!
ファイルコピー・編集
サブディレクトリーのWordPressファイルについて次の2ファイルを上位のルートドメイン(ドキュメントルート)にコピーする。元のファイルはWordPressの設定変更後にリネームして無効化する。
「.htaccess」
「index.php」
ファイル編集
.htaccess
WordPressのサイトURLをサブディレクトリーからルートドメインURLに変更するので,ルートドメインへのアクセスをサブディレクトリーへリダイレクトする。
運用途中で変更するので,今まで投稿した記事のURLが変更になるのだが,新旧どちらのURLでもアクセスできるように設定する。WordPress導入時からこの構成であれば必要ない。
動作概要
参照URLがWordPressの3フォルダー(wp-admin,wp-content,wp-includes)とルートのphpファイル(*.php)はリダイレクトを除外し,URLに/サブディレクトリー名/が含まれる場合は次のRewriteRuleの処理に移る。要は通常のサブディレクトリーweb参照のみリダイレクトして管理画面等へのアクセスは除外する。
RewriteRuleはURLのサブディレクトリー名/に続く文字をリダイレクト先ドメインの後ろに追加し恒久的なリダイレクト設定としてリセット(.htaccess処理の最初に戻る)する。
リダイレクト設定されない場合は次の条件チェックに移る。
リダイレクト設定されて再度この条件チェックを行うが今度はサブディレクトリー名が含まれていないので条件除外処理されて次の処理に移る。
index.phpにHTTPの認証情報登録されていない場合フラグを設定する。
どのディレクトリーでもindex.phpならそのまま表示し,ファイルとディレクトリーが無い場合はindex.phpにリダイレクトする。
ハイライト部修正 「サブディレクトリー名」 「ドメイン名」
RewriteBase /サブディレクトリー名/ → /
RewriteRule . /サブディレクトリー名/index.php [L] → . /index.php [L]
#先頭に追加
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{REQUEST_URI} !^.*/wp-admin/.*
RewriteCond %{REQUEST_URI} !^.*/wp-content/.*
RewriteCond %{REQUEST_URI} !^.*/wp-includes/.*
RewriteCond %{REQUEST_URI} !\.php$
RewriteCond %{REQUEST_URI} ^.*/サブディレクトリー名/.*
RewriteRule ^サブディレクトリー名/(.*)$ https://ドメイン名/$1 [R=301,L]
</IfModule>
~~~~~ 省略 ~~~~~
#修正
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
この処理でWordPressのサイトURLがサブディレクトリーからルートドメインへ恒久的に変更になったことをクローラーに認識させる。
index.php
ハイライト行修正 require DIR . ‘/wp-blog-header.php’; →
require DIR . ‘/サブディレクトリー名/wp-blog-header.php’;
<?php
/**
* Front to the WordPress application. This file doesn't do anything, but loads
* wp-blog-header.php which does and tells WordPress to load the theme.
*
* @package WordPress
*/
/**
* Tells WordPress to load the WordPress theme and output it.
*
* @var bool
*/
define( 'WP_USE_THEMES', true );
/** Loads the WordPress Environment and Template */
require __DIR__ . '/サブディレクトリー名/wp-blog-header.php';
header.phpのパス変更
faviconのパスをサブディレクトリーからルートに変更し,faviconファイルもルートに配置する。
<link rel="icon" href="/favicon.ico">
<link rel="icon" type="image/x-icon" href="/favicon.ico">
<link rel="icon" type="image/vnd.microsoft.icon" href="/favicon.ico">
<link rel="shortcut icon" href="/favicon.ico">
<link rel="icon" type="image/png" sizes="32x32" href="/favicon-32x32.png">
<link rel="icon" type="image/png" sizes="96x96" href="/favicon-96x96.png">
<link rel="icon" type="image/svg+xml" href="/favicon.svg">
<link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png">
<link rel="manifest" href="/site.webmanifest">
WordPressの設定変更

WoprdPressの管理画面から「設定」-「一般」-「サイトアドレス (URL)」のサブディレクトリーを削除してドメイン名のURLに変更する。
項目上の「WordPress アドレス (URL)」はそのまま変更なし。
この設定後,下の「変更を保存」をクリックでデーターベースが書き換わって,完全にルートドメインのサイトURLに変更される。
パーマリンク設定についても内容変更なしで「変更を保存」をクリックして再設定する。
ここで何か設定に問題があるとサイト表示されない。
その際はサブディレクトリーのURLで管理画面に入って上記の設定を戻す。又は設定ファイルにコードを追加する方法やデーターベースを直接変更する方法もある。
戻しの方法は別途記事参照
問題発生
パスワード保護記事が開けない!
パスワード保護の記事をパスワード入力後に開いた場合
「Hello! My Name Is 404 お探しのページはありませんでした。」と表示され記事の画面に入れない。wp-login.phpのパスに問題あるような気がする。
ページのソースを確認するとやはりルートドメイン直下のファイルを指定している。
<form class="passForm" action="https://domain.com/wp-login.php?action=postpass" method="post">
「https://domain.com/wp-login.php?action=postpass」にサブディレクトリーのパスがないので
「https://domain.com/wordpress/wp-login.php?action=postpass」にする必要がある。
.htaccessでリダイレクトしてみる。
URLにサブディレクトリー名が無い場合はサブディレクトリー名を入れたURLにリダイレクト
RewriteCond %{REQUEST_URI} !^.*/wordpress/.*
RewriteRule ^wp-login.php$ https://domain.com/wordpress/wp-login.php [R=301,QSA,L]
しかし「リダイレクトすると認証情報が引き継がれない」らしい。よって正しいパスワードを入力しても元の画面に戻ってしまう。
問題解決はソースを修正するしかないので,WordPressのパスワード保護ページをカスタマイズしてみる。
問題解決
テーマ「THE THOR」の修正箇所
変更箇所はテーマによって異なっている。THE THORの場合は特殊で親テーマの「password.php」を修正する。今後,テーマのアップデートの際は修正する必要がある。
テーマファイルエディターを開いて「inc/front/password.php」を表示
28行目の 「home_url()」 を 「site_url()」 に変更する。
home_url():https://ドメイン/ 設定項目では「サイトアドレス (URL)」
site_url():https://ドメイン/サブフォルダー 設定項目では「WordPress アドレス (URL)」

一般的なテーマの修正箇所
一般的なテーマとしたが, 「Catch Evolution」の場合であり他テーマでもほぼ同様と思われる。親または子テーマのfunctions.phpに下記のカスタマイズしたいコードを登録する。
// 記事タイトルの「保護中:」を消去
function remove_protected($title) {
return '%s';
}
add_filter('protected_title_format', 'remove_protected');
// テキスト・リンクURL指定
function my_password_form() {
return
'<p>指定のパスワードを入力<p>
<form class="post_password" action="' . site_url() . '/wp-login.php?action=postpass" method="post">
<input name="post_password" type="password" size="24" />
<input type="submit" name="Submit" value="' . esc_attr__("パスワード送信") . '" />
</form>';
}
add_filter('the_password_form', 'my_password_form');
上記設定変更前後
変更前 変更後


別ドメインに移行
別ドメイン(ディレクトリー)にサイト移行する場合はツールを使用する。
プラグイン「All-in-One WP Migration」を使用できるが移行ファイルサイズは512MB以下の制限がある。有償版にすると制限が解除されるらしい。
プラグイン「Export media with selected content」を使用して投稿記事を移行してみたがNextGEN Gallery等プラグインで表示する画像ファイルはコピーされないので再登録必要。
テーマの移行についてはプラグイン「Customizer Export/Import」をインストールしてテーマの設定コピーを実施したが一部の固定記事の表示位置修正が必要だったりトップページの画像が移行されなかった。テーマにもよると思う。
全般的に画像ファイルの移行は難しいようだ。
他の方法としてはComposer をインストールして行う方法もあるようだが今回は必要なかったので実施していない。手が空いたときに試してみることにする。
おわりに
WordPressの設定画面に「サイトURL」と「WordPressURL」の設定項目があり,最初からこのような構成を意識してWordPressは設計されているようで,WordPressインストール時に考慮すればよかったのだが,当初はとりあえずWordPressが使用できればいいとの安易な気持ちでインストールしたが,ここにきていろいろカスタマイズを考えることが多くなった。
今回行った変更は情報収集した内容に独自の判断を加えて変更しており,サイト閲覧には大きな問題は発生していないが,今後不具合箇所が見つかればその時点で対応すればよいと思っている。