アマゾンAPIでデータを取得して、ショートコードで商品内容を表示するサンプル。
※実際に使用する場合、商品データをキャッシュする等を追加する必要があります。
プラグン「Amazon Reloaded for WordPress」「PW_Amazon」などを使用することをお勧めします。
// functions.php
// 初期設定
define('MYAMAZON_AWS_ACCESSKEY', 'アクセスキー');
define('MYAMAZON_AWS_SECRETKEY', 'シークレットキー');
define('MYAMAZON_AWS_AFFILIATETAG', 'アフィリエイトID');
// Widgetでショートコード
add_filter('widget_text', 'do_shortcode');
// ショートコード [myamazon asin="123456"]
function myamazon_shortcode($atts) {
extract(shortcode_atts(array(
'asin' => '',
), $atts));
$asin = preg_replace('~�*([0-9a-f]+);~ei', 'chr(hexdec("\\1"))', $asin);
$out = '';
if ($asin) {
$amazon = new AmazonAssociates();
$res = $amazon->findById($asin);
$item = $res->Items->Item;
$amazonurl = 'http://www.amazon.co.jp/exec/obidos/ASIN/'.$item->ASIN.'/'.MYAMAZON_AWS_AFFILIATETAG.'/';
$out .= '<div class="title"><a href="'.$amazonurl.'" target="_blank">'.$item->ItemAttributes->Title.'</a></div>';
if (isset($item->LargeImage->URL)) {
$out .= '<a href="'.$amazonurl.'" target="_blank"><img src="'.$item->LargeImage->URL.'" width="'.$item->LargeImage->Width->value.'" height="'.$item->LargeImage->Height->value.'" title="'.$item->ItemAttributes->Title.'" /></a>';
}
$out .= '<div class="detail">';
if (isset($item->ItemAttributes->Author)) {
$out .= '著者:'.$item->ItemAttributes->Author.'<br />';
}
if (isset($item->ItemAttributes->ListPrice->FormattedPrice)) {
$out .= '価格:'.$item->ItemAttributes->ListPrice->FormattedPrice.'<br />';
}
if (isset($item->ItemAttributes->ReleaseDate)) {
$out .= '発売日:'.$item->ItemAttributes->ReleaseDate.'<br />';
}
$out .= '</div>';
if (isset($item->CustomerReviews->IFrameURL)) {
$out .= '<div class="customerreviews">';
$out .= '<iframe src="'.$item->CustomerReviews->IFrameURL.'" width="100%" height="300"></iframe>';
$out .= '</div>';
}
}
return $out;
}
add_shortcode('myamazon', 'myamazon_shortcode');
// ショートコードWidget [myamazon_widget asin="123456"]
function myamazon_widget_shortcode($atts) {
extract(shortcode_atts(array(
'asin' => '',
), $atts));
$asin = preg_replace('~�*([0-9a-f]+);~ei', 'chr(hexdec("\\1"))', $asin);
$out = '';
if ($asin) {
$amazon = new AmazonAssociates();
$res = $amazon->findById($asin);
$item = $res->Items->Item;
$amazonurl = 'http://www.amazon.co.jp/exec/obidos/ASIN/'.$item->ASIN.'/'.MYAMAZON_AWS_AFFILIATETAG.'/';
if (isset($item->MediumImage->URL)) {
$out .= '<a href="'.$amazonurl.'" target="_blank"><img src="'.$item->MediumImage->URL.'" width="'.$item->MediumImage->Width->value.'" height="'.$item->MediumImage->Height->value.'" title="'.$item->ItemAttributes->Title.'" /></a>';
}
$out .= '<div class="title"><a href="'.$amazonurl.'" target="_blank">'.$item->ItemAttributes->Title.'</a></div>';
}
return $out;
}
add_shortcode('myamazon_widget', 'myamazon_widget_shortcode');
class AmazonAssociates {
var $query = null;
var $awsquery = array();
var $_request = null;
var $Http = null;
var $defaults = array();
var $_debug = false;
public function __construct() {
$this->defaults = array(
'aws_key' => MYAMAZON_AWS_ACCESSKEY,
'aws_secret' => MYAMAZON_AWS_SECRETKEY,
'aws_aftag' => MYAMAZON_AWS_AFFILIATETAG,
'aws_locale' => 'jp',
'aws_version' => '2011-10-26'
);
$this->awsquery = array(
'Service' => 'AWSECommerceService',
'AWSAccessKeyId' => $this->defaults['aws_key'],
'Timestamp' => gmdate("Y-m-d\TH:i:s\Z"),
'AssociateTag' => $this->defaults['aws_aftag'],
'Version' => $this->defaults['aws_version'],
);
}
public function find($type = null, $query = array()) {
if ($type) {
$query['SearchIndex'] = $type;
}
if (!is_array($query)) {
$query = array('Title' => $query);
}
foreach ($query as $key => $val) {
if (preg_match('/^[a-z]/', $key)) {
$query[Inflector::camelize($key)] = $val;
unset($query[$key]);
}
}
$this->query = array_merge(
$this->awsquery,
array(
'Operation' => 'ItemSearch',
),
$query
);
$request = $this->__request();
if ($this->_debug) { var_dump($request); }
return $request;
}
public function findById($id){
$this->query = array_merge(
$this->awsquery,
array(
'Operation' => 'ItemLookup',
'ResponseGroup' => 'Large',
),
array('ItemId' => $id)
);
$request = $this->__request();
if ($this->_debug) { var_dump($request); }
return $request;
}
public function __request(){
$this->_request = $this->__signQuery();
$retval = simplexml_load_file($this->_request);
return $retval;
}
public function __signQuery(){
$method = "GET";
$host = "ecs.amazonaws.".$this->defaults['aws_locale'];
$uri = "/onca/xml";
ksort($this->query);
$canonicalized_query = array();
foreach ($this->query as $param=>$value) {
$param = str_replace("%7E", "~", rawurlencode($param));
$value = str_replace("%7E", "~", rawurlencode($value));
$canonicalized_query[] = $param."=".$value;
}
$canonicalized_query = implode("&", $canonicalized_query);
$string_to_sign = $method."\n".$host."\n".$uri."\n".$canonicalized_query;
$signature = base64_encode(hash_hmac("sha256", $string_to_sign, $this->defaults['aws_secret'], true));
$signature = str_replace("%7E", "~", rawurlencode($signature));
$request = "http://".$host.$uri."?".$canonicalized_query."&Signature=".$signature;
if ($this->_debug) { var_dump($request); }
return $request;
}
}
// 初期設定
define('MYAMAZON_AWS_ACCESSKEY', 'アクセスキー');
define('MYAMAZON_AWS_SECRETKEY', 'シークレットキー');
define('MYAMAZON_AWS_AFFILIATETAG', 'アフィリエイトID');
// Widgetでショートコード
add_filter('widget_text', 'do_shortcode');
// ショートコード [myamazon asin="123456"]
function myamazon_shortcode($atts) {
extract(shortcode_atts(array(
'asin' => '',
), $atts));
$asin = preg_replace('~�*([0-9a-f]+);~ei', 'chr(hexdec("\\1"))', $asin);
$out = '';
if ($asin) {
$amazon = new AmazonAssociates();
$res = $amazon->findById($asin);
$item = $res->Items->Item;
$amazonurl = 'http://www.amazon.co.jp/exec/obidos/ASIN/'.$item->ASIN.'/'.MYAMAZON_AWS_AFFILIATETAG.'/';
$out .= '<div class="title"><a href="'.$amazonurl.'" target="_blank">'.$item->ItemAttributes->Title.'</a></div>';
if (isset($item->LargeImage->URL)) {
$out .= '<a href="'.$amazonurl.'" target="_blank"><img src="'.$item->LargeImage->URL.'" width="'.$item->LargeImage->Width->value.'" height="'.$item->LargeImage->Height->value.'" title="'.$item->ItemAttributes->Title.'" /></a>';
}
$out .= '<div class="detail">';
if (isset($item->ItemAttributes->Author)) {
$out .= '著者:'.$item->ItemAttributes->Author.'<br />';
}
if (isset($item->ItemAttributes->ListPrice->FormattedPrice)) {
$out .= '価格:'.$item->ItemAttributes->ListPrice->FormattedPrice.'<br />';
}
if (isset($item->ItemAttributes->ReleaseDate)) {
$out .= '発売日:'.$item->ItemAttributes->ReleaseDate.'<br />';
}
$out .= '</div>';
if (isset($item->CustomerReviews->IFrameURL)) {
$out .= '<div class="customerreviews">';
$out .= '<iframe src="'.$item->CustomerReviews->IFrameURL.'" width="100%" height="300"></iframe>';
$out .= '</div>';
}
}
return $out;
}
add_shortcode('myamazon', 'myamazon_shortcode');
// ショートコードWidget [myamazon_widget asin="123456"]
function myamazon_widget_shortcode($atts) {
extract(shortcode_atts(array(
'asin' => '',
), $atts));
$asin = preg_replace('~�*([0-9a-f]+);~ei', 'chr(hexdec("\\1"))', $asin);
$out = '';
if ($asin) {
$amazon = new AmazonAssociates();
$res = $amazon->findById($asin);
$item = $res->Items->Item;
$amazonurl = 'http://www.amazon.co.jp/exec/obidos/ASIN/'.$item->ASIN.'/'.MYAMAZON_AWS_AFFILIATETAG.'/';
if (isset($item->MediumImage->URL)) {
$out .= '<a href="'.$amazonurl.'" target="_blank"><img src="'.$item->MediumImage->URL.'" width="'.$item->MediumImage->Width->value.'" height="'.$item->MediumImage->Height->value.'" title="'.$item->ItemAttributes->Title.'" /></a>';
}
$out .= '<div class="title"><a href="'.$amazonurl.'" target="_blank">'.$item->ItemAttributes->Title.'</a></div>';
}
return $out;
}
add_shortcode('myamazon_widget', 'myamazon_widget_shortcode');
class AmazonAssociates {
var $query = null;
var $awsquery = array();
var $_request = null;
var $Http = null;
var $defaults = array();
var $_debug = false;
public function __construct() {
$this->defaults = array(
'aws_key' => MYAMAZON_AWS_ACCESSKEY,
'aws_secret' => MYAMAZON_AWS_SECRETKEY,
'aws_aftag' => MYAMAZON_AWS_AFFILIATETAG,
'aws_locale' => 'jp',
'aws_version' => '2011-10-26'
);
$this->awsquery = array(
'Service' => 'AWSECommerceService',
'AWSAccessKeyId' => $this->defaults['aws_key'],
'Timestamp' => gmdate("Y-m-d\TH:i:s\Z"),
'AssociateTag' => $this->defaults['aws_aftag'],
'Version' => $this->defaults['aws_version'],
);
}
public function find($type = null, $query = array()) {
if ($type) {
$query['SearchIndex'] = $type;
}
if (!is_array($query)) {
$query = array('Title' => $query);
}
foreach ($query as $key => $val) {
if (preg_match('/^[a-z]/', $key)) {
$query[Inflector::camelize($key)] = $val;
unset($query[$key]);
}
}
$this->query = array_merge(
$this->awsquery,
array(
'Operation' => 'ItemSearch',
),
$query
);
$request = $this->__request();
if ($this->_debug) { var_dump($request); }
return $request;
}
public function findById($id){
$this->query = array_merge(
$this->awsquery,
array(
'Operation' => 'ItemLookup',
'ResponseGroup' => 'Large',
),
array('ItemId' => $id)
);
$request = $this->__request();
if ($this->_debug) { var_dump($request); }
return $request;
}
public function __request(){
$this->_request = $this->__signQuery();
$retval = simplexml_load_file($this->_request);
return $retval;
}
public function __signQuery(){
$method = "GET";
$host = "ecs.amazonaws.".$this->defaults['aws_locale'];
$uri = "/onca/xml";
ksort($this->query);
$canonicalized_query = array();
foreach ($this->query as $param=>$value) {
$param = str_replace("%7E", "~", rawurlencode($param));
$value = str_replace("%7E", "~", rawurlencode($value));
$canonicalized_query[] = $param."=".$value;
}
$canonicalized_query = implode("&", $canonicalized_query);
$string_to_sign = $method."\n".$host."\n".$uri."\n".$canonicalized_query;
$signature = base64_encode(hash_hmac("sha256", $string_to_sign, $this->defaults['aws_secret'], true));
$signature = str_replace("%7E", "~", rawurlencode($signature));
$request = "http://".$host.$uri."?".$canonicalized_query."&Signature=".$signature;
if ($this->_debug) { var_dump($request); }
return $request;
}
}
投稿記事で [myamazon asin=”Asinコード”] を指定すると
ウイジェットで [myamazon_widget asin=”Asinコード”] を指定すると
日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)