WordPressサイトで手軽にAmazonアソシエイトの商品リストなどを挿入できるプラグイン「Amazon Associates Link Builder」、使用されている方も多いと思います。
当サイトでも今まで使っていた「CS Shop」というプラグインが長年更新されていないこともあり、利用している「ドメインキング」レンタルサーバーでPHPのバージョンを7.0にしたら表示されなくなるという現象に対処するため現在「Amazon Associates Link Builder」への切り替えを行っています
そして「CS Shop」から「Amazon Associates Link Builder」へ切り替える最中、奇妙な現象が発生しました。それは、商品リストが表示されたりされなかったりする現象。困った事態です。
そこで何か情報はないかとプラグインのフォーラムを眺めていたら、同様の不具合が多数報告されていました。このプラグイン駄目かも・・・と思いましたが、どうやらそうではなかったようです。
この「Amazon Associates Link Builder」はAmazonアソシエイトの規約に則って作成されたプラグイン、どうやらそこに解決の糸口があったようです。
フォーラムの内容を元にプラグインのソースを眺めていると、疑わしい設定がありました。それは、
- 商品情報がキャッシュされる時間
- 商品情報を取得するためのタイムアウト時間
の2点。これを調整することで何とか表示されないトラブルを最小限にしてみよう!!というのが今回の狙いです(そのためタイトルを(仮)にしたわけです)。同様のトラブルが発生している方の参考になれば幸いです。
現象の確認
まずはどんな状況で「表示されたりされなかったり」が発生するのかを検証してみます。
記事を作成して、その中に「Amazon Associates Link Builder」を使ったリストを挿入してプレビューしてみると、ある記事では表示され、ある記事では表示されない・・・なんて現象が発生します。そして、表示されていない記事を何度かリロードしていると突然表示されるようになります。
逆に表示を確認して公開した記事をしばらく経ってから改めて開いてみると「表示されない」状態になっています。
パソコンやプログラムはあくまでも指示に従って動くものと思ってますから、こんな曖昧な状況はない!!というのが今回の仮説です。「表示されない」ならまだしも「表示されることもある」のは変ですからね。
これには何かミソがある・・・ということで早速検証と改善を行ってみます。
すると・・情報が表示されないのは情報取得のタイムアウトが原因というのが分かってきました。そしてタイムアウトの原因は情報を保持(キャッシュ)する時間が関係することもわかってきました。
Amazon.co.jp Product Advertising API ライセンス契約を確認してみる
知らない間に規約などに抵触すると大変!!ということで、一応「Amazon.co.jp Product Advertising API ライセンス契約」を確認してみました。すると
【Amazon.co.jp Product Advertising API ライセンス契約】によると(以下引用)
(n) 乙は、画像で構成される商品関連コンテンツを保存またはキャッシュしてはいけませんが、画像で構成される商品関連コンテンツへのリンクについては最長24時間保存することができます。乙は、画像で構成されていない他の商品関連コンテンツを、データキャッシュの目的で、最長24時間保存することができますが、その場合、乙は、その後直ちに Product Advertising APIにリクエスト送信を行いまたは新しいデータフィードを取り込み、乙のサイト上の商品関連コンテンツを刷新することにより、商品関連コンテンツを直ちに刷新し、再表示しなければなりません。別途甲から通知がない限り、乙は、個別のAmazon Standard Identification Number(以下「ASIN」といいます。)を、本ライセンスの終了まで、期間の制限なく保存することができます。前記にかかわらず、乙のサイトがクライアントアプリケーションを含む場合、これらのクライアントアプリケーションは、商品関連コンテンツを保存またはキャッシュしてはいけません。甲が要請した場合、乙は、甲が乙の本ライセンスの遵守状況を確認するため、3営業日以内に、甲に対して、商品関連コンテンツを含むまたは使用するクライアントアプリケーションのコピーを提供するものとします。
(o) 乙が商品関連コンテンツをデータフィードから取得する場合またはProduct Advertising APIへのリクエスト送信頻度もしくは乙のサイト上に表示される商品関連コンテンツの刷新頻度が1時間に1回以下の場合、乙は、乙のサイト上の価格情報または発送可能時期についての情報に隣接して、時刻/日付の表示を含めるものとします。ただし、アプリケーション上に表示される価格情報および発送可能時期の情報のリクエストおよび刷新と同日中は、表示のうち日付の部分を省略することができます。
という記述がありました。要約すると
- Amazon.co.jp Product Advertising APIを使用する場合、キャッシュの時間は最大24時間
- 1時間を超えて価格を表示する場合にはどの時点の価格なのかを明確にしておくこと
の2つの要件が必要なようです(全然知りませんでした)。・・ということは、今まで使っていたのは完全に規約違反?なんていう不安がふつふつと沸いてきてちょっと怖くなってきました。
でもこれからは「Amazon Associates Link Builder」を使うんだから・・・で早速調整に入ります。
情報をキャッシュする時間を調整する
前述したようにキャッシュ時間は24時間までと決められています。そこでフォーラムに載っていた「30分」と語句をキーワードにしてソースを探っていると、気になる部分を発見!!早速調整してみます。
プラグインの編集から「amazon-associates-link-builder」を選択し、「aalb_config.php」を開きます
227行目 define( ‘AALB_CACHE_FOR_ASIN_RAWINFO_TTL’, 30 * MINUTE_IN_SECONDS );
228行目 define( ‘AALB_CACHE_FOR_ASIN_ADUNIT_TTL’, 30 * MINUTE_IN_SECONDS );
どうやらこの2つがキャッシュ時間の設定を行っているようです。ここにある「30」という数字を24時間である「14400」に設定しなおします。これで一度取得した情報は24時間キャッシュされ、その間は取得に行かずにキャッシュされた情報が表示されるので、「表示されないとき」は減らせると思います。
ただし1つ条件があって「商品関連コンテンツの刷新頻度が1時間に1回以下の場合はいつの時点の価格なのかを表記する必要がある」とのことなので、当サイトではこの記事の末尾にあるWordress関連本のように
※価格は24時間以内に情報を取得した時点のものであり変更される場合があります。購入においてはAmazon.co.jpに表示されている価格の情報が適用されます。
という文字列を追加して対応するようにしています(発送時期については表示していないので明記する必要はないと判断しました)。
タイムアウトするまでの時間を調整する
次に行うのがAmazon.co.jp Product Advertising APIへ接続して情報が返ってくるまでの待ち時間(タイムアウト時間)の調整です。情報を取得に行っても時間切れになると、「商品情報が表示されない」現象が発生するようです。
プラグインの編集から「amazon-associates-link-builder」を選択し、「aalb_config.php」を開きます
266行目 define( “AALB_WORDPRESS_REQUEST_TIMEOUT”, 40000 );
の「40000」を任意の値に変更します。これは40000ミリ秒なので実際には40秒間、「情報くださいな」に対して反応がなかったらエラーとするという設定。
当然この値を大きくすれば確実に情報取得できる確率が上がるわけですが、待ち時間を長くするとページ上のほかの表示が終わっているのに、アマゾン商品の情報が取得待ちのままずーーーっとページ表示が完了しないという現象が発生しますから、できるだけエラーが出ない最小限の時間にする必要があります(これは環境によりまちまちですね)。
ちなみにこの2つの設定がデフォルトだとどうなるかを簡単に説明すると
- 30分間アクセスのない記事に「Amazon Associates Link Builder」で作成した商品情報が含まれていれば、情報を再取得しに行く
- Amazon.co.jp Product Advertising APIへ接続して商品情報を取得する→完了すれば商品情報を表示
- 40秒間待っても情報取得ができない場合にはエラーを返す→商品情報を表示しない
という流れになり、「表示されたりされなかったり」というからくりが見えてきますね。症状が出ている方は調整の価値あり!です。
ただ前述したようにキャッシュ期間を1時間以上に延長(最大1日)した場合にはその旨を表示しなければならないこと、あまりにも待ち時間を長くすると訪問者に迷惑をかけることもあるというのは肝に銘じて設定するようにしましょう。
ではなぜこんな設定になっているのかというと、「Amazonアソシエイトの規約に則ったプラグイン」であるからだと想像できます。規約に沿ってなるべく最新の情報になるように「30分」のキャッシュにして、なるべくページ表示の妨げにならないように「40秒」というタイムアウト時間になっているということですね。
とはいえ、訪問してくれた人に対して商品情報を表示するページなのに肝心の情報が表示されないときがある(厳密には何度かリロードして情報の取得に成功すれば表示され、設定時間分だけキャッシュされる)のは残念で仕方ないので、サイトでベターな設定にすることが大切だと思います。とはいえ、キャッシュ時間を規約以上に長くすることは・・・お分かりですよね?リスクを冒してまでやる必要があるのかも併せて考えるようにしたいものです。
Amazon.co.jp Product Advertising APIの制限による場合もある
上の調整でどうにもならない場合にはAmazon.co.jp Product Advertising APIのアクセス制限によって表示されない場合もあるようです。
ヘルプの内容を引用すると
プラグインはProduct Advertising APIを使用してリンクを取得し、このAPIにはスロットリング制限があります。詳細はこちら。したがって、あなたのページに複数のショートコードがある場合、広告の非表示につながる抑制されている可能性があります。ポストごとに1つのショートコードを追加するか、販売数を増やすことで許可される上限が増加するのを待ちます。
とあり、この中のスロットリング制限についてのリンクページを見てみると
アプリケーションがアカウントの最大リクエストを超えるリクエストを送信しようとすると、Product Advertising APIからエラーメッセージが表示されることがあります。各アカウントのリクエスト制限は、収益の実績に基づいて計算されます。プロダクト広告APIにアクセスするために使用される各アカウントには、1秒あたり1リクエストの初期使用制限が適用されます*。各アカウントは、後続の30日間(毎分約0.11ドル)で出荷される出荷収益4,600ドルごとに、1秒あたり1回の追加要求(最大10回まで)を受け取ります。次の項目を確認して、販売が商品広告APIへの呼び出しに起因していることを確認できます。
Amazonにリンクする際に、APIが提供するリンクを使用しています。
アソシエイトアカウントと商品広告APIアカウントは、同じAmazonアカウント(電子メールアドレス)を使用して作成されました。
アソシエイトタグをすべてのリクエストでAPIに渡しています。
*新規申込者は1日あたり8,640件のリクエストに制限されます。この制限に達すると、アカウントは10秒ごとに1件のリクエストに制限されます。あなたのアプリケーションがアソシエイツプログラムに完全に受け入れられると、この制限は削除されます。
とあります(機械翻訳の文章です)。ごちゃごちゃと条件が書いてありますが、ひとまずは1日8640回のリクエストが可能で、30日間の売り上げが4600ドル(約4,600,000円)ごとに制限値が拡大していき、アソシエイト側がこのアカウントは制限解除!!と判断すると無制限になるようです。出荷収益=売上高なのか出荷収益=アフィリエイト報酬なのかは文章からきちんと読み解くことができませんが、いずれにしても一般的なサイトで制限が解除される可能性はゼロに近いかもしれません。
また1リクエストというのが、1つのユニット(リスト)のことなのか、各商品の要素ごと(タイトル・画像・価格で3リクエスト)なのかもはっきりしないので何とも言えません。
ただ、実際に導入してみて感じるのは、表示されない場合にページ再読み込みをするときにはこの制限がかかっていない(単純にキャッシュの期限切れで1度目は表示されないだけ)のようですから、コンスタントに表示される工夫をしていくしかないと思います。
ちなみに私の作成している商品一覧ページには表示されない場合に画面をリロードしてほしいという旨のメッセージを表示するようにはしていますが、恐らく素直にリロードしてくれる人は少ないでしょう(それでもやっておいて損はないと思います)。
それから、当サイトのようにワードプレスに関する記事の最後にWordPressの本の紹介を表示しているような場合には共通のユニットをコピーして使いまわすことでどこかのページが開かれればユニットが表示されないことを最小限にできるのではないかと思います。
とにかくいろいろと工夫が必要なプラグインということですね
最後に
今回「Amazon Associates Link Builder」プラグインを導入して、表示されないときがある・・・というトラブルが発生したことで、Amazonアソシエイトの利用方法やAPIの利用方法に関して大変勉強になりました。いけないことですけど私と同様に規約などの内容を理解しないまま「プラグインだから大丈夫だろう・・・」と安易に商品表示をしている方は多いのではないかと思います。
当サイトでは「CS Shop」というプラグインから「Amazon Associates Link Builder」へ変更していっている途中(閲覧されたときには終わっているかもしれません)ですが、この「CS Shop」は30日間商品情報がキャッシュされるようになっています。更にはAmazonアソシエイトの参加者である表示も、価格がいつのものかという表示もされていませんでした。
恐らくはタイムアウトが出て表示できなかったりしたときのため・・・ということで調整されたのでしょうし、Amazonアソシエイトの参加者である表示や価格がいつのものかという表示などをすることで「広告だな」と分かってしまって成果が落ちるのでは?という懸念から表示をしていないのかも・・・と推察できます(「CS Shop」に限らずほとんどのAmazonアソシエイト広告を挿入するプラグインは表示なしですからね)。
でもこれって完全に規約違反ですよね?今までは幸運にもチェックをされていなかったからたまたまスルーできていたのではないかと思って少し怖くなりました(実際にきちんと表記しているサイトなんかないんじゃないの?とさえ思います)。
でも規約にある通り突然停止・・・なんてこともないとはいえませんから、きちんと規約を守って運用していこうと思っています。この記事を読まれた方も、きちんとした対応を心がけていただければと思います。