WordPressでAmazonアソシエイトのリンクをきれいに表示できるようにしました。プラグインは使っていません。完成形は以下のものです。
まずAmazonアソシエイトを行うためにはAmazonの公式サイトで登録しなければなりません。少し調べればそれほど難しくはないと思います。
このアソシエイトの登録だけでトラッキングIDを付したリンクを貼ることができますが、以下のような形が指定されて、自由にカスタマイズすることはできません。
リンクの表示を自由にカスタマイズするためにはProduct Advertising APIを利用することになります。再びAmazon公式サイトでの登録が必要です。登録するとAccess Key IDとSecret Access Keyという2種類の認証用キーを取得できます。詳しい手順は以下のURLを参照してください。
サービス利用の準備 – Amazon Web サービス
ここからWordPressのプラグインに頼ってもよいのですが、これが定番というものはなさそうでした。それによくわからないものを使うのも気が引けます。ということで自作してみることにしました。
まずは上の参考サイトを熟読しておよその仕組みを理解することです。非常にわかりやすい記述なので助かりました。しかしAmazon側の仕様の変更のためか、2回ほど詰まりました。
1つは認証です。今ではTimestampとSignatureがないとAmazonが受け入れてくれないようです。以下の解説ページにあるように、Signed Requests Helperを利用すると手軽に実験できます。
認証(Timestamp及びSignature) – 共通パラメータ – Amazon Web サービス
もう1つはAssociateTagです。これも必須条件のようです。以下を参考にしてください。
アソシエイトID(AssociateTag) – 共通パラメータ – Amazon Web サービス
これでうまくいくとAmazonから好きな情報をxml形式で取得できます。
あとはこれをphpで処理するだけなのですが、自分でプログラムを組む自信がなかったので、以下のサイトをほとんどそのまま参照しました。
http://www.singularpoint.org/blog/php/amazon-product-advertising-api-%E3%81%A7%E9%81%8A%E3%82%93%E3%81%A7%E3%81%BF%E3%82%8B/
まずはこのコードのYOUR_PUBLIC_KEY、YOUR_SECRET_KEY、YOUR_ASSOCIATE_IDの3箇所を自分のものに変えただけで、あとはそのままphpファイルとして保存し、サーバーにアップロードして実験してみました。ばっちり動きました。
次に、<?php
から?>までのphpのコードを「外観」→「テーマ編集」から「テーマのための関数」の末尾(?>の直前)に入れ、全体をamazon_asinという関数の中に入れ込みました。そしてそれをショートコードにしました。このあたりのショートコードの使い方などは以下のサイトを参考にしてください。
WordPressのショートコードを自作してみる | webOpixel
私が欲しかったのはASINによる詳細表示だけなのでその他の部分はカットし、htmlの表示の部分を少しいじりました。それで完成した最終てきな関数は以下です。
//-------------------------------------------------------------------
// Define your id.
//-------------------------------------------------------------------
// user id information
define("ACCESS_KEY_ID" , 'YOUR_PUBLIC_KEY' );
define("SECRET_ACCESS_KEY" , 'YOUR_SECRET_KEY');
define("ASSOCIATE_TAG" , 'YOUR_ASSOCIATE_ID' );
// access url(Japan)
define("ACCESS_URL" , 'http://ecs.amazonaws.jp/onca/xml' );
// define("ACCESS_URL", 'https://aws.amazonaws.jp/onca/xml');
//-------------------------------------------------------------------
//-------------------------------------------------------------------
// this function is encode with RFC3986 format.
//-------------------------------------------------------------------
function urlencode_RFC3986($str)
{
return str_replace('%7E', '~', rawurlencode($str));
}
function aks_make_query_prototype()
{
$params = array();
$params['Service'] = 'AWSECommerceService';
$params['Version'] = '2009-10-01';
$params['AssociateTag'] = ASSOCIATE_TAG;
$params['SignatureMethod'] = 'HmacSHA256'; // signature format name.
$params['SignatureVersion'] = 2; // signature version.
// time zone (ISO8601 format)
$params['Timestamp'] = gmdate('Y-m-d\TH:i:s\Z');
return $params;
}
// ASIN を指定してサーチ
function aks_make_asin_query($asin)
{
$params = aks_make_query_prototype();
$params['Operation'] = 'ItemLookup';
$params['ItemId'] = $asin;
$params['ResponseGroup'] = 'ItemAttributes,Offers,Images';
// sort $param by asc.
ksort($params);
return $params;
}
// amazon にクエリを送ってレスポンスを得る
function aks_send_query($params)
{
$base_param = 'AWSAccessKeyId='.ACCESS_KEY_ID;
// create canonical string.
$canonical_string = $base_param;
foreach ($params as $k => $v) {
$canonical_string .= '&'.urlencode_RFC3986($k).'='.urlencode_RFC3986($v);
}
// create signature strings.( HMAC-SHA256 & BASE64 )
$parsed_url = parse_url(ACCESS_URL);
$string_to_sign = "GET\n{$parsed_url['host']}\n{$parsed_url['path']}\n{$canonical_string}";
$signature = base64_encode(hash_hmac('sha256', $string_to_sign, SECRET_ACCESS_KEY, true) );
// create URL strings.
$url = ACCESS_URL.'?'.$canonical_string.'&Signature='.urlencode_RFC3986($signature);
// request to amazon !!
$response = file_get_contents($url);
if($response==false){
echo "request failed.";
}
return $response;
}
// レスポンスをパースして simplexml に変換
function aks_get_parsed_xml( $response )
{
// response to strings.
$parsed_xml = null;
if(isset($response)){
$parsed_xml = simplexml_load_string($response);
}
return $parsed_xml;
}
// simplexml を html に整形して表示
function aks_print_items( $response, $parsed_xml, $max_item_num=5 )
{
$result_str = '';
// print out of response.
if( $response &&
isset($parsed_xml) &&
!$parsed_xml->faultstring &&
!$parsed_xml->Items->Request->Errors ){
$itemcnt = 0;
// print("All Result Count:".$total_results." | Pages :".$total_pages );
$result_str .= "<div style='margin:2em;'><table>";
foreach($parsed_xml->Items->Item as $current){
if( $itemcnt >= $max_item_num ){
break;
}
$itemcnt += 1;
$nerr=0;
$result_str .= "<tr><td width='30%' style='text-align:left; padding:0.2em;'><font size='-1'>";
// 画像が無い場合の例外処理をしなきゃね。
$result_str .= '<a href="'.$current->DetailPageURL.'"><img src="'.$current->LargeImage->URL.'" border=0 width=100% height=100%></a><br ></td><td width="70%" style="text-align:left; padding:1em;">';
$result_str .= '<a href="'.$current->DetailPageURL.'">'.$current->ItemAttributes->Title.'</a><br /><br /><br />';
$result_str .= "作 者: ".$current->ItemAttributes->Author.'<br /><br />';
$result_str .= "出版社: ".$current->ItemAttributes->Manufacturer.'<br /><br />';
$result_str .= "発売日: ".$current->ItemAttributes->PublicationDate.'<br /><br />';
if(isset($current->CustomerReviews->TotalReviews) && $current->CustomerReviews->TotalReviews>0){
$result_str .= 'Rate:<a href="'.$current->ItemLinks->ItemLink[2]->URL.'">';
$result_str .= $current->CustomerReviews->AverageRating.'('. $current->CustomerReviews->TotalReviews .')'.'<br />';
$result_str .= '</a><hr />';
}
$result_str .= "</td></tr>";
}
$result_str .= "</table></div>";
}
return $result_str;
}
function amazon_asin($atts) {
(1月4日にこの上の位置を修正しました)
extract(shortcode_atts(array( 'num' => 0, ), $atts));
$params = aks_make_asin_query($num);
$response = aks_send_query($params);
$parsed_xml = aks_get_parsed_xml( $response );
return aks_print_items( $response, $parsed_xml );
}
add_shortcode('amazon_asin', 'amazon_asin');
これを[amazon_asin num=4774152242]のようにASINの番号を引数にして呼び出すと最初の大きくてきれいな表示になります。
試行錯誤の途中では何度もエラーのために真っ白な画面になりました。そのときは以下のサイトを参考にして復旧しました。
WordPressで画面が真っ白になったら、最初にやるべきこと | Simple Colors
ともかくこれで目的は達しました。