ZenCart URL書き換えパッチ日本語版

この記事について

はじめに

このページはショッピングカートプログラムのZenCart日本語版のためのユーザーフレンドリーなURL生成について書きます。
せっかくなのでZenCart以外にも応用できるように書くよう努力します。
ZenCart英語版本家のためのユーザーフレンドリーなURLの書き換えについては zencart User Firendly URLs tips をご覧ください。
このURL rewriteについてはZenCart本家の掲示板で活発に意見が出ました。(掲示板はSearch Engine Friendly Urls)

ところで、何のためにURLを書き換えるかということについて私の意見を先に述べておきます。
SEO関連のウェブや本を見ると検索エンジンに登録されやすくするために長く意味不明なURLをサーチエンジンにフレンドリーなURL(SEFU)に書き換えることが有効だという記述を見ます。しかし、私はこれは過去のこと(少なくとも2004年前半頃まで)ではないかと思っています。現在のサーチエンジンは長い動的URLのページも殆ど拾っていると思います。検索エンジンに登録されないと思うならそれは内容が無い或いは不適切なページが拾われていないだけではないでしょうか?
または出来立てのページはすぐには登録されないので登録待ちということでしょう。

ではURLを書き換えることは無駄かというとURL書き換えによるデメリットがないなら書き換えるべきだと思っています。
特にメールマガジンを発行する場合においては非常に有効だと思います。ご存知のようにショップの発行するメールマガジンは集客や売上向上に非常に有効ですが、それに1行を超えるような無駄に長いURLや意味不明なURLを書くことはできれば避けたいところです。メールマガジンに変なURLが書いてあるとクリックしたくないものです。
ショッピングカートプログラムのZenCartでは積極的にURL書き換えるようにするべきでしょう。

ZenCartについて

とりあえずZenCartについてです。
ZenCartは有名なosCommerceから派生したphp4用のショッピングカートプログラムです。日本語版は ZenCart 日本語公式サイトです。英語版の本家はZenCart : The Art of E-Commerceです。
プログラム部分と表示部分が分けて作ってあるのでソースが非常に読みやすくできています。
既成のショッピングカートを導入するにあたりこの「読みやすい」というのは重要な要素です。実際にショップを運営するとなると改造や機能の追加・削除といったことは避けて通れません。もし、ソースが読みにくいものであったり複雑だったらこの作業が非常に難しくなります。この点ZenCartは言語音痴の私でも理解できるほどわかり易く出来ています。

URL rewriteの方法

URLの書き換えにはapacheのmod_rewriteを使用します。
少なくともmod_rewriteを利用できるサーバーを用意する必要があります。
一部mod_rewriteが利用できないレンタルサーバーもあるのでレンタルサーバーを選ぶ際には注意が必要です。 mod_rewriteが利用できるようになっていることが前提ですのでこのページではmod_rewriteを有効にするための方法については記述しません。mod_rewriteを有効にするには検索エンジンで「mod_rewrite」をキーワードに検索して下さい。

mod_rewriteが有効になっているか調べる方法を書いておきます。
ドキュメントルートに.htaccessファイルを作成します。そこに以下のように記述します。

RewriteEngine on
RewriteBase /
RewriteRule ^.*$ http://www.example.com/ [L]

この状態でブラウザのURL欄にあなたのドメインのURLを適当に入力して表示した時にあなたのドメインではなくwww.example.orgが表示されればmod_rewriteは機能しています。

本来であればURLを書き換えるにあたり対象となるプログラムのソースを全て読んで理解するべきなのでしょうが、忙しいショップ運営者にとってURLの書き換えは瑣末な方になりますのでその為だけに全部ソースを読むというのも馬鹿らしいことです。(ショッピングカートブログラムの場合はどのみち自分のショップとして最適化するにあたり殆どのソースを読むハメになるでしょうが・・)
そこで手抜きな方法を書きます。
まず、普通にページを表示します。そこでページ内のそれぞれのリンクのURLをリストとして書き出します。そして生成されている動的URLの傾向を理解します。どのような場合にどのようなURLが生成されているかわかればそれをどのようなユーザーフレンドリーなURLに書き換えればよいかを決定することができます。新しく生成するURLはあなたが自由に決めることができます。つまりこのページを見てZenCartのURLを書き換える場合もあなたは私の決めたURLとは違うものにできます。

具体的に例を出します。
http://example.com/index.php?main_page=product_info&products_id=15
以上のようなURLがあるとします。これはZenCartでは商品番号15番の商品を表示するURLです。そこで他の商品も表示します。するとURLで変化するのは末尾のid=##の部分だけです。つまり商品表示のURLで「/index.php?main_page=product_info&products_id=」の部分が無駄に長いということになります。そこで私は商品表示URLを以下のようにすることにしました。
http://example.com/products/15.html
どうでしょうか?
元のURLに比べて短くて良いと思いませんか。
私はこのように決めましたが上に書いたようにあなたは別のURLにすることができます。

http://example.com/products15.html
http://example.com/p15.html
http://example.com/p15/
http://example.com/products/mizumushinokusuri.html
パッチVer.0.9からカテゴリ名と商品名の書き換えに対応しました。

同様に他のURLも傾向を調べて生成するURLを決定します。
元のURLとあなたの決めたURLが比較し易いよう表に書くなどしておくとよいでしょう。

URLの書き換えにあたり何を探すかですが、それはズバリ「最終的に動的URLを生成するファイル」です。ZenCartの場合はセッションIDを付けるファイルを探せば最終的な動的URLの生成ファイルが見つかります。それらしい名前のファイルを探したところ、ZENCARTROOT/includes/functions/html_output.phpが見つかりました。
そのファイルを読んだところ動的URLの変数が「$link」であることがわかりました。あとはこの変数をチョイチョイと置換してやれば希望のURLを生成できます。

具体的に何をするかというと先ほどの
http://example.com/index.php?main_page=product_info&products_id=##
でいえば「/index.php?main_page=product_info&products_id=##」を「/products/##.html」に置換するわけです。

静的URLについてはどこに記述があるかわからないのでテンプレートや各サイドボックスのプログラムなどを必要に応じて探すことになります。ZenCartでは実質静的URLであるにも関わらず動的URLの扱いになっているURLが幾つかあるのでそれについては先ほどのhtml_output.phpで置換することになります。

で、発見したのですが、本家zencartではhtml_output.phpの中に「SEARCH_ENGINE_FRIENDLY_URLS == 'true'」という記述があります。そこを見ると'&','?','='を'/'に書き換えるだけという極めてシンプルな内容です。実際に試してみると当然ですが正しく動作しませんでした。どうやら途中で放棄されているみたいです。

どのように置換するか例を挙げます。

if (ereg('product_info&products_id', $link)) {
$link = str_replace('index.php?main_page=product_info&products_id=', 'products/', $link);
}

ユーザーフレンドリーなURLを生成することができるようになったら次はそれを元の動的URLに変換するrewriteルールを作成する必要があります。
この書き換えルールは.htaccessに記述します。(完成したらhttpd.confに記述を移す方がより良いと思われます。)
先ほどの商品番号のURLで例を挙げると次のようになります。

RewriteRule ^products/(.*).html /index.php?main_page=product_info&products_id=$1 [L]

その2につづく