読者です 読者をやめる 読者になる 読者になる

渡米生活。(日記)

渡米生活。本家から切り離しました。あまり渡米生活に関係のないプログラムネタや音楽ネタなど。

wordpressでindex.htmlとindex.phpを同時に使う

既存のサイトに新たにwordpressを導入する場合、今までのトップページはそのままにしておいて、かつwordpressの公開ディレクトリをドメイン直下にしたいことがあります。

具体的には、たとえば、もともとindex.htmlはサイトの入り口としての役割をしており、そこから日本語ページ、英語ページなど、それぞれのトップページへのリンクを張っている場合です。

これは、たとえば、wordpressをwpとかいうディレクトリの直下におき、常に
http://www.example.com/wp/
という形でホームにアクセスする、とかやれば、何も設定をいじらずに運用できますが、それではいつも、/wp/という邪魔な文字列がURLに入ってしまって嬉しくない。

まあ、最初の入り口ページもwpで作れ、という話もあるんですが、過去の経験から、やっぱり入り口ページが別にあると色々便利ということあります。

というわけで、とりあえずこんな方法でやってみました。
(正確には、index.php自体が使えるようになるわけではないので、ちょっとタイトルに偽りあり?)



1).htaccessでindexファイルの優先順位を定義

まず、ドメイン直下をwpの公開ディレクトリにしたい場合、wpのindex.phpをpublic_html直下に置かなければならない、という問題があります。
殆どのサーバーでは、index.htmlとindex.phpが両方同じディレクトリにあった場合、index.htmlを優先して表示すると思いますが、そうでない場合には、そのディレクトリに.htacessを作成して以下の行を加えなくてはなりません。

2014/1/28 index.cgiとなっていたところをindex.phpに変更。

DirectoryIndex index.html index.php

これで、ドメインのみでアクセスした場合は、これまで使われていたindex.htmlが表示されます。


2)wpの自分が使用するテーマの中で、index.phpを使う可能性があるものを列挙

何がやりたいかというと、index.phpを呼ばなければならなくなるような可能性を潰してしまえ、ということです。
何故そんなことをするのかというと、コードの中に、index.phpにアクセスすることを意図して、home_url( '/' ) みたいな関数が書かれている場所があると、それが呼ばれた瞬間にindex.htmlの入り口ページが呼ばれてしまうからです……。

index.phpは、デフォルトでは、トップページを表示するだけでなく、色々なことをやります。
正確には、カテゴリ用、記事表示用など、特別なテンプレートが用意されていなかったら、最後はindex.phpで表示してしまえ、ということです。

どんな優先順位でテンプレートが呼ばれるかは、Codexのこちらのページに詳しく書いてあります。

上のページを見て、どの場合にも、index.phpが呼ばれないように、それぞれテンプレートを作ります。


3)searchform.php を作成

詳細は、Codexのget search formをご覧いただきたいのですが、デフォルトの検索フォームは、以下のとおりドメインにそのまま検索文字列をつなげてしまいます。

<form role="search" method="get" id="searchform" 
     action="<?php echo home_url( '/' ); ?>">
    <div><label class="screen-reader-text" for="s">Search for:</label>
        <input type="text" value="" name="s" id="s" />
        <input type="submit" id="searchsubmit" value="Search" />
    </div>
</form>

この、home_url('/')関数が問題で、これではindex.htmlの方が呼ばれてしまいます。

というわけで、この問題を回避するには、自分のテーマディレクトリ直下に、この部分を以下のように変更したsearchform.phpを置く必要があります。

<form role="search" method="get" id="searchform" 
   action="<?php echo home_url( '/index.php' ); ?>">

よくわからない方は、twentyelevenテーマにsearchform.phpがありますので、それをコピーしてhome_url関数の引数を上のように変更すればよいと思います。


4)home.phpテンプレートを作成、それを使ってtop用の静的ページを作る

まあ、index.phpを使って作ってもいいのかもしれませんが、、、

サイトのトップページですから、ちょっと凝った事もやりたいので、別にテンプレートを作りました。
home.phpが存在すると、トップページの表示に自動的にこちらを使ってくれるという利点がありますが、実はその機能はこの方法では使いません。
なので、別に名前はhome.phpでなくても結構です。

テンプレートの作り方は、こちらを参照

テンプレートが出来たら、あとは管理画面から新しいページ(投稿ではない)を作成し、使用テンプレートをデフォルトテンプレートから、今作ったテンプレートに変えるだけです。

作成ページの名前(スラッグ)は、homeとでもしておいて下さい。


5)管理画面から設定を変更

あとは、こちらの記述に従って設定を変更します。


6)index.htmlから、homeへのリンクを張る

URLは、http://www.example.com/home になります。

これで、ひとたびhomeにきてしまえば、ナビゲーションリンクをクリックしても、きちんとドメイン直下のURLで参照できます。(ページなので、.phpがないことに注意)

ちなみに、http://www.example.com/index.php でwpのページにアクセスすることは出来ません。wpのリダイレクト機能が働き、これは http://www.example.com/である、と解釈され、その結果、index.htmlが表示されます。


以下、いくつか注意点。

  • テーマの中に、ホームに戻ることを意図して、http://www.example.com/のようなアドレスがあると、index.htmlに飛ばされます。それでも構わなければ良いですが、homeに飛ばしたいならURLを手で書き換える必要があります。
  • 固定ページをトップページに置く場合、通常は、wp管理画面の表示設定のフロントページの表示設定で、「固定ページを表示」にチェックします。上の方法は、これをやると、トップページに指定したページにアクセスできなくなりますので、「最新の投稿」にチェックしたままにしておいて下さい。


以上、まだwordpress初心者なので、不具合がありましたらスミマセン。