AmazonSimpleAdmin を改造してみようとふと思い立ち、内部動作を追ってみたけど、明日になったらたぶん忘れてるので、メモ。
Amazon 商品をポストに埋め込む plugin としては wp-amazon も知られてますけど、これと AmazonSimpleAdmin plugin でどこが違うかと言うと、wp-amazon はポストを書くときに amazon にクエリかけて情報を引っ張ってきてポスト本文中に埋め込むのに対し、AmazonSimpleAdmin はポストを表示する際に amazon に情報を引っ張ってくる、というのが最大の違いです。
AmazonSimpleAdmin の長所は、中古商品情報も常に最新のものが表示される、というところです。例えば以下のような感じで。
[asa book]4774124966[/asa]
一方 AmazonSimpleAdmin の欠点は、まさにこの長所の裏返しで、ポストが閲覧されるたびにクエリを投げるという点です。実際いま wordpress.rauru-block.org サーバ上で tcptrack 走らせてみたら、www.amazon.jp にわらわら繋ぎに行ってる。
これはサーバとして問題だよなあ。だって、ロボットが拾いに来るたびにクエリが走るわけだし。もっと問題なのは RSS Feed だな。うちは20件を Feed で流してるけど、もし20件とも amazon 商品タグが貼り付けられてるとクエリの回数がとんでもないことに。クエリを処理し切るまで apache のプロセスが1個占有されるわけで、とてもよろしくない。
しかし、クエリ結果をキャッシュしとけば結構安心じゃね? ちょうどほら XCache も入れてるからちょうどいい。
WordPress の cache の使い方は簡単です。Codex に WP_Object_Cache の使い方の説明 がありますが、まさにこういう外部サイト問い合わせの時の使い方が例として載ってたり。
というわけで、AmazonSimpleAdmin がクエリ結果をキャッシュするよう改造するにはどこをいじれば良いんぢゃろか、と調べてみました。以下はその途中経過。
- amazinsimpleadmin.php は AsaCore.php を呼んでるだけで、あまり中身は無い。
- コンストラクタの中で
parseContentメソッドがthe_contentフックにadd_filterされる。 - parseContent メソッドでは、
$contentの中をpreg_match_allで舐めて、[asa] 記法のところを見つけてきて、1個1個str_replaceで置換をかける。 - 置換内容を作るのが
_parseTpl($asin,$tpl)メソッド。 _parseTplの中で_getItem($asin)メソッドが呼ばれ、そっから$this->amazon->itemLookup()メソッドが呼ばれる。この時の引数が'ResponseGroup' => 'ItemAttributes,Images,Offers'になってる。このメソッドが実際クエリ投げてるな。
ちなみに itemLookup メソッドは AsaCore.php の中にはありませんでした。amazon プロパティが $amazon = new Zend_Service_Amazon($amazon_api_key); とかいって生成されてるので、Zend Framework の中にあるメソッドだな。ここを呼ぶ前にキャッシュをチェックして、キャッシュされてたらその値を使うようにすれば勝ちだな。キャッシュのキーは ASIN 使えばいいから楽勝。
あ、しかしこれ、コンストラクタの中で Zend_Service_Amazon 呼ぶのか。まさかこの時点で (つまりポストの本文をパースする前に) amazon に TCP 張りに行ったりする? Zend のドキュメント 読んでもその辺書いてないな。むー、Zend Framework のソースの中見なきゃいけない?

