アマゾンAPIで商品をショートコードで表示する

アマゾン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('~&#x0*([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('~&#x0*([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コード”] を指定すると

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)