先月書いた「 WordPressを一部のディレクトリのみ有効にする」カスタマイズの完全版です。

2010-10-13追記:「WordPressの中に静的ファイル置けますよ?」と言われ、やってみたら表示できました(号泣
確かに過去にいくつかのサーバーで表示できないのを確認しており、細かい条件があるようなのですがますます謎です。情報求む。

前回の記事では

  • 未保存の記事のプレビュー
  • ブログ内検索

ができませんでしたが、今回はそれも可能になっています。
ただし、サイトのホーム(index.html)にも細工が必要で、手順も複雑になります。

詳しくは追記以下で。

1: WordPressの設定

WordPressを下層ディレクトリに置く

WordPress本体はひとつ下層に設置します。
この例では「wordpress」というディレクトリに設置したとして話を進めます。

※私はセキュリティ上の理由などで、ディレクトリ名=CMS名にしないことが多いです

「WP No Category Base」を追加する

このカスタマイズをするには、プラグイン「WP No Category Base」が必要です。
これはWordPressで出力されるカテゴリーアーカイブのURLから、最初に必ず付与される「category」を取り除きます。
若干負荷が上がりますが、CMS的な構築をするには必須のプラグインです。

WordPress公式のプラグインディレクトリで入手できます。
http://wordpress.org/extend/plugins/wp-no-category-base/

特に設定は必要なく、アップロードして有効にするだけでOKです。

一般設定/パーマリンク設定を変更する

次に、WordPressの「設定→一般」と「設定→パーマリンク設定」を変更します。

一般設定

「ブログのアドレス」を「サイトルート」に設定します。
最初の図の「www」のURLが「http://example.com/」だった場合はそれを入力して更新します。
このとき、サイトルートに.htaccessが書き出されます。
自作の.htaccessを置いていると上書きされてしまうので、前もって避難させるか、書き込み禁止にしてください。

パーマリンク設定

「カスタム構造」にチェックを入れて、以下のように記入します。

/%category%/%post_id%/

ブログのURLが「http://example.com/」だった場合、カテゴリーがc1、IDが6の記事のURLは
http://example.com/c1/6/
となります。

ここまで作業したら、サイトルートに書き出されている.htaccessを削除してしまいます

2: .httaccessの設定

以下のように記述した、.htaccessをサイトルートに新しく設置します。
(既にある場合は追記します)

AddType application/x-httpd-php .html

# BEGIN WordPress

RewriteEngine On
RewriteBase /

RewriteRule ^?([a-z0-9]+)=([0-9]+) wordpress/?$1=$2 [L]
RewriteRule ^(date|tag|feed)/(.*) wordpress/index.php [L]

RewriteRule ^(c1|c2|c3|c4)/(.*) wordpress/index.php [L]
RewriteRule ^category/(c1|c2|c3|c4)/(.*) wordpress/index.php [L]
RewriteRule ^(c1|c2|c3|c4)/feed/(.*) wordpress/index.php [L]


# END WordPress

AddType application

HTMLファイルでPHPスクリプトを使用可能にします。
ホームが「index.php」で構わない場合は必要ありません。

RewriteBase

「/」はサーバールートからの相対パスです。
もしもサイトルートが「test」だと「/test/」となります。

RewriteRule

条件を満たした場合に、WordPressのindex.phpを呼び出す、という指定です。
最初の二行は変更しないでください。

三行目以降の(c1|c2|c3|c4)に、WordPressを有効にしたいカテゴリー(ディレクトリ名)をパイプ区切りで指示します。
「information」「blog」なら(information|blog)と書きます。
「information/aaa」「blog/bbb/ccc」などの下層ディレクトリもWordPress配下となります。

アップロードしたら、.htaccessのパーミッションを444にしてください
書き込み可になっていると、WordPressの設定を変更したときに上書きされてしまいます。

3: index.htmlの設定

最後に、サイトのホームにあたるindex.htmlに細工をします。

ファイル名を変更する

index.htmlの内容はそのままで、ファイル名を任意に変更してください。
ここでは「home.html」に変更したものとします。

このままだとhome.htmlでもアクセスできてしまうので、気になる場合は「include」などのディレクトリに入れ、アクセス制限をかけて対応してください。

新規にindex.htmlを作成する

index.htmlがなくなるので、以下のように記述したindex.htmlを新規に作成し、サーバーにアップします。

<?php
if(($_GET['s'])||($_GET['p'])) {
//検索かプレビューのGET値があればWordPressとして処理
define('WP_USE_THEMES', true);
require('wordpress/wp-blog-header.php');
} else {
//なければ静的コンテンツを呼び出す
require('home.html');
}
?>

コメントで書いてある通りですが、検索かプレビューだとWordPressとして処理を開始し、それ以外であれば先程リネームしたHTMLをそのまま出力します。


ここまでで作業は終わりです。
正常に動作していれば、

  • 未保存のプレビューと検索結果
  • 指定したカテゴリーと関連フィード
  • 日別アーカイブ
  • タグサーチ

のみWordPressが起動し、それ以外は静的コンテンツがあるサーバーと同じ挙動になります。
(例えカテゴリーを作っていても表示されません)

4: 注意点

  1. 一般的なサーバーで動作確認をしていますが、設置条件やサーバー状況によってはうまくいかないかもしれません。必ず検証してください。
  2. WordPressの404ページは有効になりません。必要な場合は.htaccessにエラーページ指定を追記して自作してください。
  3. HTML/PHP関係は、.htaccessの指定方法が上記と異なるサーバーも多いです。サーバー会社のマニュアルをチェックしたり「サーバー名 html php」などでグーグル先生にお尋ねしてください。

この記事を書いた人

うぇびん

愛知県豊橋市に住んでいる、荒ぶるウェブおばさん。WordPressをはじめとした各種CMSを研究するのが好き。札幌のIT企業のビットスター株式会社に所属しています。