WordPressで生成するページのURLに対応するディレクトリが存在する場合、ページが表示されない解決策




この記事は最終更新日から2年以上経過しています。

WordPressで生成するページのURLと同じ階層にディレクトリが作成されている場合、WordPressの.htaccessに設定されている

RewriteCond %{REQUEST_FILENAME} !-f # ファイルが存在しない
RewriteCond %{REQUEST_FILENAME} !-d # ディレクトリが存在しない

の影響を受けて正しくページが表示されない場合があります。
この現象が発生する条件は、パーマリンク設定を「基本」以外に変更している場合です。

例えば、以下の条件の場合を考えます。

・WordPressはドキュメントルート/にインストールされている
・パーマリンク設定を「投稿名」に設定
・/about/img/filename.pngという画像ファイルがすでに設置されている

この条件でWordPressの管理画面からスラッグがaboutの固定ページを作成した場合、URLはhttps://localhost/about/のようになりますが、実際アクセスするとWordPressのリダイレクト設定の条件で/about/ディレクトリが存在しているため、リダイレクト処理が正常に動かなくなります。
発生する現象はサーバーの設定によりますが、ディレクトリ一覧が表示されたり、403や404エラーが発生したりします。

解決策としては、ページが大量にない場合が前提になりますが、表示したいページの階層にWordPressのルートディレクトリにあるindex.phpをコピーして以下の変更を行います。

require( dirname( FILE ) . '/wp-blog-header.php' );
↓
require( dirname( FILE ) . '/[ここにWordPress本体までの相対パスを記入]/wp-blog-header.php' );

先ほどの例でいうと、/index.phpを/about/index.phpにコピーします。
コピーしたindex.phpのwp-blog-header.phpへのパスは/about/index.phpからWordPressルートディレクトリの相対パスになるので/../wp-blog-header.phpに変更します。
こんな感じ。

require( dirname( FILE ) . '/../wp-blog-header.php' );

URLに対応するディレクトリが重複している箇所はすべて対応が必要になります。

もう一つの回避策としては、URLとして利用するディレクトリ以外にデザイン用のファイルをまとめて配置するという方法があります。
例えばテーマディレクトリに画像やCSSなどはまとめておくとか。
できればHTMLコーディングの時点でWordPressのURLで利用するディレクトリにテーマかするhtmlファイル以外は置かないようにしてもらうのが無難かと思います。