コピペで実装!WordPressでAmazon PA-APIを利用して商品リンクを表示するカスタマイズ方法

当記事はPA-API v4を利用したサンプルになります。PA-API v4は、2019年12月1日以降は利用できません。新しいAPI(PA-API v5)利用して同様のカスタマイズを行うには、PA-APIv版カスタマイズを参照してください。

先日、WordPressのCocoonテーマでAmazon.co.jp Product Advertising API(以下、PA-API)を利用した商品リンク作成ショートコード機能を追加しました。

今回は、そのAmazon商品リンク作成機能を単純化したものを、どんなテーマにも適用出来るようにサンプル化したものを紹介します。

例えば、こんな感じのショートコードを書くだけで(※[カッコ]は省略してあります)

amazon asin="B07K482T9R" kw="iRobot ルンバ"

Amazon商品リンクを手軽に作成できるようになります。

スポンサーリンク
レクタングル(大)広告

Amazon商品リンクショートコードの実装方法

実装するのに必要な主な手順はこちら。

  1. functions.phpにコードを追記
  2. style.cssにスタイルを追記
  3. 各種IDを取得し入力

基本的にコードを2回ほどコピペしてあとは、APIの認証IDや、Amazon、楽天、Yahoo!ショッピングのIDを書き加えるだけです。

functions.phpにコードを追記

まずはテーマ(子テーマ)のfunctions.phpに追記する形で以下のコードを書き加えます。

//外部ファイルの取得
if ( !function_exists( 'get_http_content' ) ):
function get_http_content($url){
  try {
    $ch = curl_init();
    curl_setopt_array($ch, [
      CURLOPT_URL => $url,
      CURLOPT_RETURNTRANSFER => true,
    ]);
    $body = curl_exec($ch);
    $errno = curl_errno($ch);
    $error = curl_error($ch);
    curl_close($ch);
    if (CURLE_OK !== $errno) {
      throw new RuntimeException($error, $errno);
    }
    return $body;
  } catch (Exception $e) {
    return false;
    //echo $e->getMessage();
  }
}
endif;

//シンプルなアソシエイトURLの作成(PA-API制限時用)
if ( !function_exists( 'get_amazon_associate_url' ) ):
function get_amazon_associate_url($asin, $associate_tracking_id){
  $base_url = 'https://www.amazon.co.jp/exec/obidos/ASIN';
  $associate_url = $base_url.'/'.$asin.'/';
  if (!empty($associate_tracking_id)) {
    $associate_url .= $associate_tracking_id.'/';
  }
  $associate_url = esc_url($associate_url);
  return $associate_url;
}
endif;

//Amazon商品紹介リンクの外枠で囲む
if ( !function_exists( 'wrap_amazon_item_box' ) ):
function wrap_amazon_item_box($message){
  return '<div class="amazon-item-box no-icon amazon-item-error cf"><div>'.$message.'</div></div>';
}
endif;

//Amazon商品リンク作成
//API処理参考:https://qiita.com/yokkong/items/efd3b4dcdeeb1555de8f
add_shortcode('amazon', 'generate_amazon_product_link');
if ( !function_exists( 'generate_amazon_product_link' ) ):
function generate_amazon_product_link($atts){
  extract( shortcode_atts( array(
    'asin' => null,
    'id' => null,
    //'isbn ' => null,
    'kw' => null,
    'title' => null,
    'amazon' => 1,
    'rakuten' => 1,
    'yahoo' => 1,
  ), $atts ) );

  $asin = esc_html(trim($asin));

  //ASINが取得できない場合はID
  if (empty($asin)) {
    $asin = $id;
  }

  //アクセスキー
  $access_key_id = 'ACCESS_KEY_ID';
  //シークレットキー
  $secret_access_key = 'SECRET_ACCESS_KEY';
  //アソシエイトタグ
  $associate_tracking_id = 'ASSOCIATE_TRACKING_ID';
  //楽天アフィリエイトID
  $rakuten_affiliate_id = 'RAKUTEN_AFFILIATE_ID';
  //Yahoo!バリューコマースSID
  $sid = 'SID';
  //Yahoo!バリューコマースPID
  $pid = 'PID';
  //キャッシュ更新間隔
  $days = 60;
  //キーワード
  $kw = trim($kw);


  //アクセスキーもしくはシークレットキーがない場合
  if (empty($access_key_id) || empty($secret_access_key)) {
    $error_message = 'Amazon APIのアクセスキーもしくはシークレットキーが設定されていません。';
    return wrap_amazon_item_box($error_message);
  }

  //ASINがない場合
  if (empty($asin)) {
    $error_message = 'Amazon商品リンクショートコード内にASINが入力されていません。';
    return wrap_amazon_item_box($error_message);
  }

  //アソシエイトurlの取得(デフォルト)
  $associate_url = get_amazon_associate_url($asin, $associate_tracking_id);

  $new_cache = false;
  //キャッシュの存在
  $transient_id = 'nlg_amazon_api_asin_'.$asin;
  $xml_cache = get_transient( $transient_id );
  if ($xml_cache) {
    $res = $xml_cache;
  } else {
    //APIエンドポイントURL
    $endpoint = 'https://ecs.amazonaws.jp/onca/xml';

    // パラメータ
    $params = array(
      //共通↓
      'Service' => 'AWSECommerceService',
      'AWSAccessKeyId' => $access_key_id,
      'AssociateTag' => $associate_tracking_id,
      //リクエストにより変更↓
      'Operation' => 'ItemLookup',
      'ItemId' => $asin,
      'ResponseGroup' => 'ItemAttributes,Images',
      //署名用タイムスタンプ
      'Timestamp' => gmdate('Y-m-d\TH:i:s\Z'),
    );

    //パラメータと値のペアをバイト順?で並べかえ。
    ksort($params);


    // エンドポイントを指定します。
    $endpoint = 'webservices.amazon.co.jp';

    $uri = '/onca/xml';

    $pairs = array();

    // パラメータを key=value の形式に編集します。
    // 同時にURLエンコードを行います。
    foreach ($params as $key => $value) {
      array_push($pairs, rawurlencode($key)."=".rawurlencode($value));
    }

    // パラメータを&で連結します。
    $canonical_query_string = join("&", $pairs);

    // 署名に必要な文字列を先頭に追加します。
    $string_to_sign = "GET\n".$endpoint."\n".$uri."\n".$canonical_query_string;

    // RFC2104準拠のHMAC-SHA256ハッシュアルゴリズムの計算を行います。
    // これがSignatureの値になります。
    $signature = base64_encode(hash_hmac("sha256", $string_to_sign, $secret_access_key, true));

    // Siginatureの値のURLエンコードを行い、リクエストの最後に追加します。
    $request_url = 'https://'.$endpoint.$uri.'?'.$canonical_query_string.'&Signature='.rawurlencode($signature);

    $res = get_http_content($request_url);
    $new_cache = true;
  }

  //XMLが取得できた場合
  if ($res) {
    $responsed_xml = $res;

    // xml取得
    $xml = simplexml_load_string($res);
    //_v($xml);

    if (property_exists($xml->Error, 'Code')) {
      $error_message = '<a href="'.$associate_url.'" target="_blank">'.'Amazonで詳細を見る'.'</a>';

      if (is_user_logged_in()) {
        $admin_message = '<b>'.'管理者用エラーメッセージ'.'</b><br>';
        $admin_message .= 'アイテムを取得できませんでした。'.'<br>';
        $admin_message .= '<pre class="nohighlight"><b>'.$xml->Error->Code.'</b><br>'.preg_replace('/AWS Access Key ID: .+?\. /', '', $xml->Error->Message).'</pre>';
        $admin_message .= '<span style="colof:red;">このエラーメッセージは"サイト管理者のみ"に表示されています。少し時間おいてリロードしてください。</span>';
        $error_message .= '<br><br>'.$admin_message;
      }
      return wrap_amazon_item_box($error_message);
    }

    //var_dump($item);

    if (!property_exists($xml->Items, 'Item')) {
      $error_message = '商品を取得できませんでした。存在しないASINを指定している可能性があります。';
      return wrap_amazon_item_box($error_message);
    }

    if (property_exists($xml->Items, 'Item')) {
      $item = $xml->Items->Item;

      //var_dump($xml);

      //var_dump($xml->Items->Errors);
      // _v($item);
      $ASIN = esc_html($item->ASIN);
      $DetailPageURL = esc_url($item->DetailPageURL);
      if ($DetailPageURL) {
        $associate_url = $DetailPageURL;
      }

      $SmallImage = $item->SmallImage;
      $MediumImage = $item->MediumImage;
      $MediumImageUrl = esc_url($MediumImage->URL);
      $MediumImageWidth = esc_html($MediumImage->Width);
      $MediumImageHeight = esc_html($MediumImage->Height);
      $LargeImage = $item->LargeImage;

      $ItemAttributes = $item->ItemAttributes;

      if ($title) {
        $Title = $title;
      } else {
        $Title = $ItemAttributes->Title;
      }

      $TitleAttr = esc_attr($Title);
      $TitleHtml = esc_html($Title);

      $ProductGroup = esc_html($ItemAttributes->ProductGroup);
      $ProductGroupClass = strtolower($ProductGroup);
      $ProductGroupClass = str_replace(' ', '-', $ProductGroupClass);
      $Publisher = esc_html($ItemAttributes->Publisher);
      $Manufacturer = esc_html($ItemAttributes->Manufacturer);
      $Binding = esc_html($ItemAttributes->Binding);
      if ($Publisher) {
        $maker = $Publisher;
      } elseif ($Manufacturer) {
        $maker = $Manufacturer;
      } else {
        $maker = $Binding;
      }

      $ListPrice = $item->ListPrice;
      $FormattedPrice = esc_html($item->FormattedPrice);

      $buttons_tag = null;
      if ($kw) {
        //Amazonボタンの取得
        $amazon_btn_tag = null;
        if ($amazon) {
          $amazon_url = 'https://www.amazon.co.jp/gp/search?keywords='.urlencode($kw).'&tag='.$associate_tracking_id;
          $amazon_btn_tag =
            '<div class="shoplinkamazon">'.
              '<a href="'.$amazon_url.'" target="_blank" rel="nofollow">'.'Amazon'.'</a>'.
            '</div>';
        }

        //楽天ボタンの取得
        $rakuten_btn_tag = null;
        if ($rakuten_affiliate_id && $rakuten) {
          $rakuten_url = 'https://hb.afl.rakuten.co.jp/hgc/'.$rakuten_affiliate_id.'/?pc=https%3A%2F%2Fsearch.rakuten.co.jp%2Fsearch%2Fmall%2F'.urlencode($kw).'%2F-%2Ff.1-p.1-s.1-sf.0-st.A-v.2%3Fx%3D0%26scid%3Daf_ich_link_urltxt%26m%3Dhttp%3A%2F%2Fm.rakuten.co.jp%2F';
          $rakuten_btn_tag =
            '<div class="shoplinkrakuten">'.
              '<a href="'.$rakuten_url.'" target="_blank" rel="nofollow">'.'楽天市場'.'</a>'.
            '</div>';
        }

        //Yahoo!ボタンの取得
        $yahoo_tag = null;
        if ($sid && $pid && $yahoo) {
          $yahoo_url = 'https://ck.jp.ap.valuecommerce.com/servlet/referral?sid='.$sid.'&pid='.$pid.'&vc_url=http%3A%2F%2Fsearch.shopping.yahoo.co.jp%2Fsearch%3Fp%3D'.$kw;
          $yahoo_tag =
            '<div class="shoplinkyahoo">'.
              '<a href="'.$yahoo_url.'" target="_blank" rel="nofollow">'.'Yahoo!'.'</a>'.
            '</div>';
        }
        //ボタンコンテナ
        $buttons_tag =
          '<div class="amazon-item-buttons">'.
            $amazon_btn_tag.
            $rakuten_btn_tag.
            $yahoo_tag.
          '</div>';
      }

      $tag =
        '<div class="amazon-item-box no-icon '.$ProductGroupClass.' '.$asin.' cf">'.
          '<figure class="amazon-item-thumb">'.
            '<a href="'.$associate_url.'" class="amazon-item-thumb-link" target="_blank" title="'.$TitleAttr.'" rel="nofollow">'.
              '<img src="'.$MediumImageUrl.'" alt="'.$TitleAttr.'" width="'.$MediumImageWidth.'" height="'.$MediumImageHeight.'" class="amazon-item-thumb-image">'.
            '</a>'.
          '</figure>'.
          '<div class="amazon-item-content">'.
            '<div class="amazon-item-title">'.
              '<a href="'.$associate_url.'" class="amazon-item-title-link" target="_blank" title="'.$TitleAttr.'" rel="nofollow">'.
                 $TitleHtml.
              '</a>'.
            '</div>'.
            '<div class="amazon-item-snippet">'.
              '<div class="amazon-item-maker">'.
                $maker.
              '</div>'.
              $buttons_tag.
            '</div>'.
          '</div>'.
        '</div>';
    } else {
      $error_message = '商品を取得できませんでした。存在しないASINを指定している可能性があります。';
      $tag = wrap_amazon_item_box($error_message);
    }

    if ($new_cache) {
      //キャッシュ更新間隔
      $expiration = 60 * 60 * 24 * $days;
      //Amazon APIキャッシュの保存
      set_transient($transient_id, $responsed_xml, $expiration);
    }

    return $tag;
  }

}
endif;

コードが長すぎるので、詳しくは説明しません。

一応、PA-APIの制限対策用に、一度商品リンクを作成したら、60日間キャッシュ保存されるようになっています。そして、2回目以降はキャッシュが呼び出され、PA-APIの制限をなるべく回避するようにしてあります。

こちらのAPIの利用方法は以下のコードを参考にさせていただきました。

参考 Amazon Product Advertising APIの署名認証について

style.cssにスタイルを追記

次に、テーマ(子テーマ)のstyle.cssに以下のCSSを貼り付けます。

.amazon-item-box {
  padding: 22px 25px;
  width: 94%;
  margin: 0 auto 1.6em;
  border: 3px solid #dfdfdf;
  box-sizing: border-box;
  text-align: center;
  position: relative;
}

.amazon-item-box {
  position: relative;
}
/*
Font Awesome適用下でコメントアウトすると
ボックス右下にAmazonアイコンが表示されます*/
/*
.amazon-item-box::after {
  font-family: FontAwesome;
  content: "";
  padding-right: 3px;
  position: absolute;
  bottom: 0;
  right: 6px;
  font-size: 24px;
  color: #ccc;
}
*/

.amazon-item-error.cf {
  display: block;
  line-height: 1.2;
}

.amazon-item-thumb {
  width: 160px;
  min-width: 160px;
  margin: 0 auto 5px;
  float: none !important;
}

.amazon-item-thumb * {
  display: block;
}

.amazon-item-thumb > a > img {
  margin: 0 auto;
}

.amazon-item-content {
  line-height: 125%;
  width: 100%;
}

.amazon-item-snippet {
  font-size: 0.8em;
  margin-top: 6px;
}

.amazon-item-buttons a {
  width: 90%;
  display: block;
  margin: 0px auto 8px;
  padding: 10px 1px;
  text-decoration: none;
  font-size: 14px;
  font-weight: bold;
  text-align: center;
  color: #fff;
}

.amazon-item-buttons a:hover {
  opacity: 0.6;
}

.amazon-item-buttons {
  margin-top: 1em;
}

@media screen and (min-width: 768px) {
  .amazon-item-box {
    text-align: left;
    display: flex;
    font-size: inherit !important;
  }

  .amazon-item-thumb {
    vertical-align: top;
    box-sizing: border-box;
    min-width: auto !important;
  }

  .amazon-item-content {
    line-height: 125%;
    vertical-align: top;
    box-sizing: border-box;
    padding-left: 25px;
    width: 100%;
  }

  .amazon-item-buttons {
    display: flex;
    flex-wrap: wrap;
  }

  .amazon-item-buttons a {
    width: auto;
    text-align: center;
    margin: 0;
    border-radius: 3px;
  }

  .amazon-item-buttons a img {
    position: absolute;
    bottom: 0;
    right: 0;
  }

  .amazon-item-buttons > * {
    width: 31.5%;
    margin: 2px;
    box-sizing: border-box;
  }
}
.shoplinkamazon a {
  background: #f79901;
}

.shoplinkrakuten a {
  background: #bf0000;
}

.shoplinkyahoo a {
  background: #e60033;
  position: relative;
}

Font Awesome適用下で、コメント部分をコメントアウトすると、商品紹介ボックス右下にAmazonアイコンが表示されます。

商品ボックス右下にAmazonアイコン表示

Font Awesomeを使用していないテーマの場合、もしくはアイコンを表示させたくない場合は、そのままにしておいてください。

各種IDを取得し入力

最後に、functions.phpに追加したコード部分に、APIのIDや、AmazonトラッキングID、楽天アフィリエイトID、バリューコマース(Yahoo!ショッピング)のsid・pidを入力してください。

  //アクセスキー
  $access_key_id = 'ACCESS_KEY_ID';
  //シークレットキー
  $secret_access_key = 'SECRET_ACCESS_KEY';
  //アソシエイトタグ
  $associate_tracking_id = 'ASSOCIATE_TRACKING_ID';
  //楽天アフィリエイトID
  $rakuten_affiliate_id = 'RAKUTEN_AFFILIATE_ID';
  //Yahoo!バリューコマースSID
  $sid = 'SID';
  //Yahoo!バリューコマースPID
  $pid = 'PID';
  //キャッシュ更新間隔
  $days = 60;
キャッシュの更新間隔を変更したい場合は$days変数に入れる日数を変更してください。

PA-APIの「アクセスキー」と「シークレットキー」の入手方法は、以下を参照してください。

Amazon商品紹介リンク用の認証機能を取得&登録方法です。Amazonアソシエイトからアクセスキーとシークレットキーを作成登録する方法です。

Amazonアソシエイトの「トラッキングID」を取得するには、以下を参照してください。

AmazonアソシエイトからトラッキングIDを取得して、Cocoonの商品紹介リンクで利用するために設定する方法です。

「楽天アフィリエイトID」を取得するには、以下を参照してください。

楽天ウェブサービスからアフィリエイトIDを取得して設定登録する方法です。

バリューコマースからYahoo!ショッピングの「sid」と「pid」を取得するには、以下を参照してください。

バリューコマースでYahoo!ショッピングと提携しsidとpidを取得し設定登録する方法です。

Amazonアソシエイトに登録されていないサイトで利用すると、規約違反になる可能性があるので、事前に必ず登録申請を行ってください。

現在Amazonアソシエイトを利用して「サイトの収益化」を行っている方も多いかと思います。そういった方は当然、サイトをAma...

使い方と動作確認

何点か商品リンクを作成してみます。

基本的に、asinオプションにAmazonのASINを指定すればOKです(書籍以外)。

ASINとはAmazonの商品IDのことです。

ダイソン掃除機

amazon asin="B07BHH7YF5" kw="ダイソン スティッククリーナー"
以下全て、ショートコードの[カッコ]を取り除いた状態でサンプルコードを紹介します。でないと実行されてしまうので。

紙の書籍

紙の書籍の場合はISBNで(ISBN-10)。

amazon asin="4087468178" kw="桐島、部活やめるってよ"

Kindle書籍

Kindle書籍の場合は、ASINで。

amazon asin="B00A773H60" kw="桐島、部活やめるってよ"

ボタンが不要な場合

個々のボタンの表示を切り替えるならこんな感じ。

amazon asin="B01FIG3SMC" kw="Kindle Paperwhite マンガモデル" rakuten=0 yahoo=0
1が表示、0が非表示です。
全ての検索ボタンを非表示にするのであれば、kwオプションを無くすか、未入力にしてください。

詳しい使い方

ASIN、ISBN等の取得方法や、詳しい使い方は以下を参照してください。

Cocoonの「Amazon商品リンクタグ作成ショートコード」機能の使い方を詳しく解説しています。

こちらのブックマークレットを使用するとクリック一発でショートコードを作成することもできます。

Amazon商品リンクショートコードを手軽に作成するための「Amazonリンク作成ブックマークレット」の登録方法と、使い方の解説です。

また、実用で使うのであれば、正しくトラッキングIDが設定されているか以下の方法で確認しておくことをおすすめします。

Amazon商品リンクのアソシエイトリンクの有効性を確認する方法です。

注意点

当記事のコードは、なるべく簡潔に書いたサンプルコードです。

ですので、どんな環境でも確実に動作するということは、保証はできません。

また、他にも考えられる注意点を列挙しておきます。

  • PA-APIには、リクエスト制限があります。制限が厳しい状態になっている場合はなかなか商品リンクが表示されない可能性があります。そういう場合は時間をおいてブラウザでリロードすればいずれ読み込まれます。制限について詳しくはリンク先をご確認ください。
  • 当カスタマイズコードを含む、PA-APIを利用したものを有償販売する場合はPA-APIライセンス違反になると思うのでご注意ください。
  • 当記事で紹介されているコードはサンプルコードです。利用することにより不利益が起こったとしても当サイトは責任を負いません
  • Cocoonのようなキャッシュの削除機能はありません。基本的に時間を置けばキャッシュは削除されます。キャッシュの削除方法機能実装の質問には、お答えできかねるのでご了承ください。
  • キャッシュ期間が長いため値段は表示させてません

あくまで利用は自己責任でお願いします。

まとめ

今回のカスタマイズを用いることで、商品リンクを手軽に作成できるようになるかと思います。

最初、ASINの取得などに手間どるかもしれませんが、慣れると30秒ほどで商品リンクを作成できるかと思います。

また、商品検索は実際のAmazonサイトを利用します。高精度の検索やレビュー、あわせ買い商品を見て参考にできるので、商品探しもはかどるかと思います。

参考 Amazon.co.jp Product Advertising APIライセンス契約

参考 Product Advertising API (PA-API) の利用ガイドライン

『コピペで実装!WordPressでAmazon PA-APIを利用して商品リンクを表示するカスタマイズ方法』へのコメント

  1. 名前:コクンカー 投稿日:2018/08/02(木) 11:26:27 ID:67e67c790

    早速試してみます!
    有益な情報、有難うございます!!

    変動する「価格」まで、表示するのは難しのですかね?

  2. 名前:わいひら 投稿日:2018/08/02(木) 15:23:23 ID:0f910d7d0

    価格表示は技術的には簡単です。
    $ListPrice変数を最終的に出力しさせれば、できることはできます(価格自体は変数に入れています)。
    ただ価格表示は、PA-APIライセンス的に面倒くさい部分があるので表示させていません。
    詳しくは、記事の最後のほうにあるライセンスの参考リンクを参照してください。
    そのライセンス内容に沿った価格出力をすれば問題ないかと思います。
    以下は抜粋。

    (o) 乙が商品関連コンテンツをデータフィードから取得する場合またはProduct Advertising APIへのリクエスト送信頻度もしくは乙のサイト上に表示される商品関連コンテンツの刷新頻度が1時間に1回以下の場合、乙は、乙のサイト上の価格情報または発送可能時期についての情報に隣接して、時刻/日付の表示を含めるものとします。ただし、アプリケーション上に表示される価格情報および発送可能時期の情報のリクエストおよび刷新と同日中は、表示のうち日付の部分を省略することができます。許容される表示の例は以下のとおりです。

    ・Amazon.co.jp 価格: \ 3,200 (2008年1月7日 14:11時点 ?詳細はこちら?)
    ・Amazon.co.jp 価格: \ 3,200 (14:11 時点 ?詳しくはこちら?)

    また、乙は、下記の免責文言を、価格情報または発送可能時期についての情報に隣接して表示するか、またはハイパーリンク、ポップアップ、スクリプト・ポップアップその他類似の方法で表示しなければなりません。

    ・「価格および発送可能時期は表示された日付/時刻の時点のものであり、変更される場合があります。本商品の購入においては、購入の時点でAmazon.co.jpに表示されている価格および発送可能時期の情報が適用されます。」

    乙は、上記の例において、「詳細はこちら」および「詳しくはこちら」をクリックすることにより、エンドユーザが免責文言を確認できるようにすることもできます。

  3. 名前:こくんかー 投稿日:2018/08/02(木) 18:53:13 ID:67e67c790

    なるほど

    確かに、「RINKER」には『詳細』がありますねー。
    ポップアップで表示されるとは、気づきませんでした。スマホなら尚更です。

    やっぱり、価格表示があると判りやすいかな。

  4. 名前:わいひら 投稿日:2018/08/02(木) 22:55:59 ID:0f910d7d0

    価格を表示していないと、リンク先に価格を見に行ってもらえるので、クリックしてもらえる可能性は高くなるかと思います。
    何のために、商品リンクを置くかといえば、紹介報酬のための方が大多数だと思われます。そのためには、まずクリックしてもらって、Amazonページを開いてもらわないことには始まりません。
    ウェブページ上で完結する分かりやすさで言えば、確かに価格表示をさせていた方が訪問者にもわかりやすいかもしれません。
    けれど、購入してもらうことを考えたら、やはりリンク先を開いてもらうことが大事かなと思っています。そういった意味で表示させてないというのもあります。

    もちろん、価格を見た上で納得してリンク先を開いてもらった方が良いという考え方もあるとは思います。

  5. 名前:ぽこたん 投稿日:2018/09/02(日) 22:21:46 ID:13bfbc7db

    本記事のショートコード機能とカエレバのどちらを使うか悩んでいます。機能的には本記事のショートコードで十分なのですが、どちらを使うか検討するポイント(メリデメ)があればご教示ください。

  6. 名前:わいひら 投稿日:2018/09/03(月) 20:51:33 ID:1e22a5a03

    今思いつく限りは、ショートコードを利用するメリットとデメリットはこんな感じでしょうか。

    メリット

    • ソースコードが長くならずスッキリする(タグまみれにならない)
    • コードさえ変更すれば後から自由に機能追加&仕様変更も可能(カエレバはタグ記入なので仕様変更が困難)
    • クレジット表記が入らない

    デメリット

    • Amazonのリクエスト制限にかかる可能性がある
    • PHP処理で出力するので多少のサーバー負荷がかかる(キャッシュ機能込みで一応、負荷対策はしてある)
    • ショートコードの使い方を知っている必要がある(ブックマークレットを使えば手軽に作れるけど)

    迷うようであれば、カエレバを使っておいた方が無難だと思います。

  7. 名前:ぽこたん 投稿日:2018/09/03(月) 22:37:56 ID:63efee78f

    メリデメでご教示いただき感謝いたします。
    ショートコードを使わせていただきたいと思います。
    わいひらさんの開発姿勢に感銘を受けて、Cocoonを使わせていただきたいと思っています。応援しています。

  8. 名前:わいひら 投稿日:2018/09/04(火) 22:13:20 ID:d1c4b6e4c

    Cocoonも使っていただけているとは、ありがとうございます!
    WordPressは奥が深くて、結構楽しんで作っています。
    そういったものが、いろいろな方に使っていただけるのは、やはり嬉しいです。

  9. 名前:スー 投稿日:2018/10/07(日) 19:04:25 ID:d09bd5d37

    わいひらさん、こんにちは!simplisityを子テーマにて利用させていただいています。
    この記事で、実装させていただこうとコードをfunctions.phpに貼り付けたのですが、以下のようにエラーになってしまいます。
    Parse error: syntax error, unexpected ‘[‘ in /****/wp-content/themes/simplicity2-child/functions.php on line 554

    エラー部分は、コードの6行目部分のようです。
    curl_setopt_array($ch, [

    phpのコード記述に関してあまり詳しくないのですが、私の環境では ”[” がエラーになってしまっているみたいです。(PHP7.2)

    ローカル環境(xampp)とサーバーにアップして両方試してみましたが、どちらも同じ箇所でエラーになってしまいます。
    どうしたら使えるようになるでしょうか、アドバイスお願いします。m(_ _)m

  10. 名前:スー 投稿日:2018/10/07(日) 19:24:03 ID:d09bd5d37

    すみません、先ほどの投稿ですが、自己解決しました。
    curl_setopt_array($ch, [
    の部分を、
    curl_setopt_array($ch, array(
    に書き換えたら動きました!(閉じ括弧も。)
    PHP 5.1.3 以降のバージョンは、こうすれば動くっぽいです。
    お騒がせ致しました。これかも役に立つ記事楽しみにしています!(^^)

  11. 名前:わいひら 投稿日:2018/10/07(日) 23:24:24 ID:03c670fc8

    [角カッコ]は新しい配列の指定方法なので、古いPHP(正確には5.4未満)では動作しません。
    でも、PHP7.2では動作すると思うのですが。実際に僕の環境では動いていたんですけど。何でだろう。

  12. 名前:スー 投稿日:2018/10/08(月) 01:02:43 ID:bc23000ab

    すみません・・・!わいひらさんのコメントで、もう一度確認してみたところ、サーバー側のphpの設定がうまくいっておらず、php5.3を使っていました。。
    逆にコメントのお陰で未だに古いバージョンを使っていたことに気づけました。。
    お騒がせしました。m(_ _)m
    これからも楽しみにしています!

  13. 名前:わいひら 投稿日:2018/10/08(月) 10:51:59 ID:06dea55af

    なるほど。それなら上で書かれた動作も納得です。
    古いバージョンを使用していると、セキュリティー的な問題もあるので、新しい安定バージョンを利用するに越したことはないと思います。

  14. 名前:keikanri 投稿日:2019/02/24(日) 00:17:37 ID:239c23924

    コード非常に有益で利用させていただております!本当にありがとうございます!

    1つエラーが発生しておりまして、もしわかればご確認させていただきたく、ご連絡いたしました。

    1つのサイトでは問題なく可動しているのですが、別サイトにて別のアクセスキー、シークレットキー、アソシエイトタグを利用した場合、以下エラーメッセージが表示されてしまします。

    RequestThrottled
    You are submitting requests too quickly. Please retry your requests at a slower rate.

    エラーが発生している別サイトに正常に稼働している方のサイトで利用している、アクセスキー、シークレットキー、アソシエイトタグを利用した場合は、こちらでも正常に稼働したします。

    アクセスキー、シークレットキー、アソシエイトタグも正しく設定しているように見え、メッセージ的にも「あまりにも早くリクエストを提出している」という部分がよくわからず、もし原因や対策などわかればご教示いただけますと幸いです。

  15. 名前:わいひら 投稿日:2019/02/24(日) 19:38:40 ID:eeaaa86cd

    書き込みだけでは確かなことはわからないのですか、エラーが出るサイトは、サイト登録がされていて審査が通っていますでしょうか?
    Amazonアソシエイトに、登録サイトを複数追加する方法

  16. 名前:keikanri 投稿日:2019/02/25(月) 19:11:35 ID:7527d4d70

    はい。こちら審査も通っている状態です。わかりづらく申し訳ありません。念の為、申し少し詳細な情報を記述させていだきます。

    1.サイトAでは問題なくショートコードが正常に可動して表示されます。こちらはアカウントaのアクセスキー、シークレットキー、アソシエイトタグを利用しております。

    2.サイトBでは別のアカウントbのアクセスキー、シークレットキー、アソシエイトタグ利用したところ、以下のエラーが発生いたしました。こちら登録サイトの審査も通っている状況です。実際にはアカウントbのアカウントを開設する際に、審査したサイトがサイトBとなります。

    RequestThrottled
    You are submitting requests too quickly. Please retry your requests at a slower rate.

    3.一度サイトBにアカウントaのアクセスキー、シークレットキー、アソシエイトタグを登録したところ、ショートコードが正常に稼働し表示されます。

    現状このような状況です。

  17. 名前:わいひら 投稿日:2019/02/25(月) 20:09:45 ID:397cf22d7

    ちなみに、Bのサイトは売上実績等はありますか?
    ご存知かもしれませんが、2019年1月23日のPA-APIの仕様変更で、APIの利用制限がかなり厳しくなりました。
    https://affiliate.amazon.co.jp/help/topic/t52/ref=amb_link_zYXX0aRKMACI_Qkj9rR6Nw_3?pf_rd_p=52bc14ee-db71-4ae7-902e-b0e5053949f4

    以下のエラーメッセージが出る場合は、PA-APIの制限にかかっている可能性が高いです。

    RequestThrottled
    You are submitting requests too quickly. Please retry your requests at a slower rate.

    実際は、Amazonアソシエイトのアナウンスよりかなり厳しい制限になっているようです。
    以下のような記事もあります。
    https://konpure.com/2019/02/04/post-9786/

    もしかしたら、サイトごとに売上実績とかが適応されるとかがあるのかもしれません。

  18. 名前:keikanri 投稿日:2019/02/25(月) 23:39:28 ID:7527d4d70

    ご返信ありがとうございます!はい、売上実績はございます。Aサイトよりも実際にはBサイトの売上の方が大きい状況です。

    こちら私も頂いた情報やAPIメッセージから情報追ってみます!

  19. 名前:わいひら 投稿日:2019/02/26(火) 10:40:33 ID:f09bab86a

    だとしたら、本当にエラーメッセージの通りにAPIのアクセス制限を受けているのではないでしょうか。
    もしソースコードに不具合があるとしたら、双方のサイトとも動作しなくなると思うので、今回のサンプルコードが原因とはちょっと考えにくいです。

    今回エラーメッセージが出ているのは、全てのAmazon商品リンクなのでしょうか。

  20. 名前:keikanri 投稿日:2019/02/28(木) 08:59:47 ID:ac7471553

    確認してみたところ、売上実績自体はあるのですが、確かにPA-API経由の売上実績がございませんでした…

    おそらくこれが原因かと思いますので、まずは公式の商品リンクで実績を作ろうと思います!

    はいまさにちゃんと動いているので、コードが原因ではないかと私も思います!

  21. 名前:わいひら 投稿日:2019/02/28(木) 12:52:06 ID:fdaf60c42

    確認してみたところ、売上実績自体はあるのですが、確かにPA-API経由の売上実績がございませんでした…

    だとしたら、これが原因で間違いなさそうですね。

    それにしても、今回のPA-APIの仕様変更は厳しすぎですね…。せめて、これから始める人のために1日100リクエストくらいはOKにして欲しかった。
    それならば、このサンプルプログラムは、キャッシュを利用するので、何とかいけたのに。

  22. 名前:keikanri 投稿日:2019/02/28(木) 18:10:25 ID:ac7471553

    確かに仕様変更厳しいですよね….(笑)私もそう思います。

    ご調査いただきまして、本当にありがとうございました!ひとまず原因がわかってよかったです!