WordPressのパーマリンク利用時にindex.html付きでも表示できるようにする

ことの是非はともかく、WordPressをindex.htmlでアクセスされた時でも表示したいというケースは多々あります。
もちろん .htaccess でリダイレクトしても良いのですが、今回はWordPress側で行える簡単な対策を紹介します。


WordPressは、パーマリンクの利用時に、環境変数の $_SERVER[‘REQUEST_URI’] を元に、表示条件を決定しています。このため、表示条件を割り出しを行う前に、環境変数自体を改変し、index.htmlを削除してしまえば、index.html 付きのアクセスでも表示は可能になります。

CODE 1は、この考え方を元に、$_SERVER[‘REQUEST_URI’]をWordPressが表示条件の割り出しが出来、なおかつ非正規のリクエストと認識されるように書き換えます。

非正規のリクエストの場合、WordPressは wp-includes/template-loader.phpの template_redirect フックにて、正規のURLにリダイレクトを行うようになっているため、index.html付きでリクエストされた場合でも、最終的にパーマリンク設定本来のアドレスで表示されるようになっています。

CODE 1

function remove_index_html_request() {
	if ( is_admin() ) { return; }
	$permalink_structure = get_option( 'permalink_structure' );
	$home_root = parse_url( home_url() );
	if ( isset( $home_root['path'] ) ) {
		$home_root = trailingslashit( $home_root['path'] );
	} else {
		$home_root = '/';
	}

	if ( $permalink_structure ) {
		if ( $_SERVER['REQUEST_URI'] == $home_root .'index.html' ) {
			$replace = '/index.php';
		} elseif ( preg_match( '/\/$/', $permalink_structure ) ) {
			$replace = '';
		} else {
			$replace = '/';
		}
		$_SERVER['REQUEST_URI'] = preg_replace( '/\/index\.html$/', $replace, $_SERVER['REQUEST_URI'] );
	}
}
add_action( 'init', 'remove_index_html_request' );

※ マルチサイト運用時の検証など不十分なので、その点ご留意ください。

「WordPressのパーマリンク利用時にindex.html付きでも表示できるようにする」への3件のフィードバック

  1. 役に立つ記事ありがとうございます。
    ちなみに、CODE1はどのファイルに加えればいいのでしょうか?

  2. tepppeikawaguchiさん、ありがとうございます。

    他に紹介しているコード同様、テーマのfunctions.phpに追記するか、多くのサイトで利用するのであれば、独自プラグインなどにしてもらえればよいです。
    (独自プラグインの作り方は、初心者でも10秒でできる WordPress プラグインの作り方WordPress でスニペットを簡単に管理する方法あたりを参考に)

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です