WordPressの静的HTML化・再構築機能を開発しました

2010年4月30日

make-cacheの新バージョンを用意し、
旧バージョンと仕様構造を変更しました。
もしversion 0.4未満の場合は、最新バージョンを入れてください。

WordPressには、wp-cacheというものや、wp-super-cacheと呼ばれる優秀っぽいプラグインがありますが、
この2つとも、誰かがアクセスした時に、キャッシュを生成する。
という仕様だと思います。

しかし私のこのブログのように、ほとんどアクセスが無いサイトだと、キャッシュが生成されなくて本当に寂しいです。
もっとアグレッシブにキャッシュを作ってやりたい。と思い開発しました。

ページにアクセスがあった際などのキャッシュ生成ではありませんが、
MovableTypeの静的HTML生成に近い動きをします。

プラグインをインストールすると、『投稿』欄に『キャッシュ再構築』というリンクが現れ、クリックすると次の画面になります。

記事投稿して、トップページだけ書き換えたい時は『トップページのみ再構築』。
全体を再構築したい場合は『全てを再構築』

ボタンを押すとロード中の画面になります。

なおロード中はAjaxにより非同期通信を行いますので、静的HTML化が対象のファイルが多すぎる場合も、恐らくタイムアウトは起きないと思います。
もし起きたら、ブラウザ側ではなく、WEBサーバ側(ホスティング業者側)で制限をかけていると思います。

完了すると

これで、トップディレクトリ部分から静的HTMLが生成されているかと思います。
試しにディレクトリを見てみてください。

なおこの静的HTML化・再構築プログラムですが、以下の点にご注意ください。

[1]
%postname%
%category%
などにおいて、日本語でURLを構成しているサイトには適用出来ない。

アルファベット化させているものは動くようです。
これは日本語のURLの後にindex.htmlを付けても認識しないからと思われます。
ビジネスシーンでの利用では日本語文字列のURLはあり得ないと思うので、
まあいいか。です。

[2]
コメントやトラックバックの情報は再構築しないと反映されない

全てのページが静的化されるため、コメントやトラックバックは再構築しない限り反映されません。
まあいまどき、コメントやトラックバックはスパムがひどいので、必ず目視チェックがあると思うのでいいか。と。
それに私のブログはコメントやトラックバックなんて一切こないのでノープレブレムです。私が。

[3]
記事を投稿、編集した際には、再構築をしないと反映されない

これまた、全てを静的HTML化しているためです。

[4]
.htaccessで恐らく

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

と書いていると思います。一つ目のRewriteCondの上に

RewriteRule .*\.html/.* /index.php [L]

を記述してください。
例)
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule .*\.html/.* /index.php [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

これは、.htmlでパーマリンクを作っているサイト(私のサイトのような)だと、
コメント投稿完了時の戻りで、404エラーになってしまうためです。
.html/comment~~
が、普通にindex.phpを呼び出すように、このような記述をします。

また、サーバの仕様によっては
トップページはindex.phpが優先されてしまう場合があります。
そんな時は・・・というか念のため、
.htaccessには
DirectoryIndex index.html index.php
を記述してください。

従って、出来上がるであろう最終的な.htaccess
!!!この通り記述せず、実際には
DirectoryIndex~~
という記述と
RewriteRule .*\.html/.* /index.php [L]
だけ追加してください!

——————————————————–
DirectoryIndex index.html index.php

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule .*\.html/.* /index.php [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
——————————————————–
です。

[5]
cacheディレクトリ
not_rewrite.txt
を、書き込み可能な権限にしてください。

[6]
ファイルの文字コードとmetaタグの文字コードがあっていないと文字化けする可能性があります

[7]
カテゴリ等で使用しているディレクトリで、すでに使っているものがある場合、
削除されてしまいますのでご注意ください。
例)
カテゴリ名としてtestというのが存在し、
/category/test/sample.html
というファイルをすでに作成

再構築をすると、
/category
というディレクトリを削除しにいくため、必然的にsample.htmlが削除されます。

上記のお話で、何の事か分からない場合は、
全てのファイルをバックアップしてから、プラグインを導入して試してみた方がよろしいかと思います。
特に、再構築時には元々のキャッシュファイル(静的HTML)はガンガン削除しにいきますので、
注意が必要です。on your risk!でお願いします。
初めて使う時はお願いですからバックアップしてから設定してみてください。
滅多にバックアップはしないですから、いい機会では無いでしょうか。
ちなみにデータベース側には影響を与えていないので、データベースのバックアップは不要です。

そんなプログラムはこちら
WordPressの静的HTML化・再構築機能プラグイン

もしアンインストールする必要がある場合は、申し訳無いですが
make-cache/make-cache.php内115行目付近の
——————————————
//クローリング開始
crawl( $exists, $rooturl, $rooturl, MAKE_CACHE_CACHE_DIR );

//一時ディレクトリに保管されているファイルを全て移動
RenameFile( MAKE_CACHE_CACHE_DIR, MAKE_CACHE_SITEDIR );
——————————————

——————————————
//クローリング開始
//crawl( $exists, $rooturl, $rooturl, MAKE_CACHE_CACHE_DIR );

//一時ディレクトリに保管されているファイルを全て移動
//RenameFile( MAKE_CACHE_CACHE_DIR, MAKE_CACHE_SITEDIR );
——————————————
にして、『全てを再構築』してくれれば、プログラムが生成した静的HTMLは削除してくれます。
この変更がよく分からなかったら、申し訳無いですがプラグインの利用は控えた方がいいかもしれません。

ちなみにプラグインをはずす時に、この処理は自動で行わせたいと思っていますが、今日は疲れました。

さらに情報として、Ktai Styleとの相性について。です。
wp-cacheやwp-super-cacheとKtai Styleの相性は、結構シビアだそうですが、
このプラグインでは、.htaccessにてUserAgentで携帯を指定し、
そのUserAgentだったら全部index.phpに流す。とやれば、
ほとんどKtai Styleには影響を与えずに済むでは無かろうか?というところです。
試してないですが、今度その.htaccessの書き方を書いてみます。今日は疲れました。