全ての検索カテゴリにおいて、キーワードによる商品検索をすることで、アマゾンの「アフィリエイト商品のHTML」を作成する
Amazon Product Advertising APIを使用して、
全ての検索カテゴリにおいて、キーワードによる商品検索をすることで、アマゾンの「アフィリエイト商品のHTML」を作成する。
switch文の検索インデックスの場合分けで、上記の処理を行うPHPソースコードを解説しています。
全ての検索カテゴリにおいて、キーワードによる商品検索をすることで、アマゾンの「アフィリエイト商品のHTML」を作成する
public static function makeHTMLOfSearchOperation(URLInfo $urlInfo,
CommonRESTParameter $commonParameter, RESTParameter $restParameter,
ItemHTMLOption $itemHTMLOption, ProductTypeOption $productTypeOption,
DisplayHTMLPAAPINotAvailableOption $displayHTMLOption) {
中略
$affiliateHTML;
$searchIndex = $restParameter->getSearchIndex ();
switch ($searchIndex) {
case RESTParagraphUtils::ALL_SEARCH_INDEX :
$affiliateHTML = ItemSearchOperation::makeItemsHTML ( $urlInfo, $itemHTMLOption,
$itemsHTMLInfoMaker );
break;
default :
throw new IllegalArgumentException ( "無効なサーチインデックス:" . $searchIndex );
}
return $affiliateHTML;
ALL_SEARCH_INDEX定数。
const ALL_SEARCH_INDEX = "All"; // TODO Choice部品
makeHTMLOfSearchOperation()関数は、
SearchItemsオペレーションで商品検索することで、アマゾンの「アフィリエイト商品のHTML」を作成する関数です。
ItemSearchOperation::makeItemsHTML()関数は、
全ての検索カテゴリに対して商品検索を行い、アマゾンの「アフィリエイト商品のHTML」を作成する関数です。
全ての検索カテゴリに対して、キーワードで商品検索を行います。
その検索結果で得た商品情報を元に、アマゾンの「アフィリエイト商品のHTML」を作成します。
全ての商品を検索する、Allという検索インデックス
$searchIndex = $restParameter->getSearchIndex ();
現在のところ、$searchIndex変数の値は、Allだけになっています。
他の検索インデックスの値については、未対応です。
Amazon Product Advertising APIにおいては、searchIndexの値は、Allの他にも選べます。
ですが、他の値を指定する処理は未作成です。
このAllは、検索インデックスにおいて、
Amazonで入手可能な全ての商品を対象にして、商品検索をする
という意味になります。
$searchIndex = $restParameter->getSearchIndex ();
switch ($searchIndex) {
case RESTParagraphUtils::ALL_SEARCH_INDEX :
$affiliateHTML = ItemSearchOperation::makeItemsHTML ( $urlInfo, $itemHTMLOption,
$itemsHTMLInfoMaker );
break;
中略
}
return $affiliateHTML;
上記PHPソースコードのswitch文において、
$searchIndex変数がAllである、という条件が成り立つ場合、
ItemSearchOperation::makeItemsHTML()関数が呼び出されます。
ItemSearchOperation::makeItemsHTML()関数は、
全ての検索カテゴリに対して商品検索を行い、アマゾンの「アフィリエイト商品のHTML」を作成します。
作成された、アマゾンの「アフィリエイト商品のHTML」を、$affiliateHTML変数に代入します。
その$affiliateHTML変数を、return文によって返します。
Amazon Product Advertising APIで商品検索する場合、検索インデックスを指定する
Product Advertising APIでSearchItemsオペレーションを使用する場合、検索カテゴリが必要です。
検索インデックスがAllの場合、特定の検索カテゴリが指定されてないことを意味します。
この場合、アマゾンの全ての商品が検索対象となります。
検索インデックスには、例えば以下のような検索カテゴリがあります。
検索インデックスの値 | 検索カテゴリ |
---|---|
All | 全ての商品 |
Books | 和書 |
Electronics | エレクトロニクス |
Kitchen | ホーム&キッチン |
Toys | おもちゃ |
HealthPersonalCare | ヘルスケア |
Beauty | コスメ |
Grocery | 食品 |
Apparel | アパレル&ファッション雑貨 |
Hobbies | ホビー |
日本のアマゾンの場合、検索カテゴリは全部で24個ありました( 2023年3月当時)。
例えば、
Product Advertising APIのSearchItemsオペレーションで「和書」を商品検索したい場合、
検索インデックスに”Books”を指定することになります。
この場合、ダイエットというキーワードで商品検索すると、ダイエットの和書が見つかることになります。
ダイエットサプリという食品は、検索されないことになります。
アマゾン商品のHTMLに関する情報を作成するクラスについて、インスタンス変数を用意する
public static function makeHTMLOfSearchOperation(URLInfo $urlInfo,
CommonRESTParameter $commonParameter, RESTParameter $restParameter,
ItemHTMLOption $itemHTMLOption, ProductTypeOption $productTypeOption,
DisplayHTMLPAAPINotAvailableOption $displayHTMLOption) {
$itemsHTMLInfoMaker = new AmazonItemsHTMLInfoMaker ( $commonParameter, $restParameter,
$productTypeOption );
以下省略
AmazonItemsHTMLInfoMakerクラスは、アマゾン商品のHTMLに関する情報を作成するクラスです。
このAmazonItemsHTMLInfoMakerクラスには、ItemsHTMLInfoMakerインターフェースが適用されています。
ItemsHTMLInfoMakerインターフェースでは、以下の三つのメソッドを宣言しています。
ItemsHTMLInfoMakerインターフェースのメソッド宣言 | ItemsHTMLInfoMakerインターフェースのメソッドの機能 |
---|---|
requestItemSearch() | 何かに対して商品検索を行い、「商品の検索結果」を得る。 |
makeItemArray() | 取得した「商品の検索結果」から、「当プラグイン用の商品情報の配列」を作成する。 |
makeUniqueText() | キーワードによる商品検索の処理に対応する、一意な文字列を作成する。 一意な文字列は、「当プラグイン用の商品情報の配列」などをキャッシュに保存する際、そのキャッシュを識別する識別子を作成するために利用される。 |
よって、AmazonItemsHTMLInfoMakerクラスでは、上記の三つのメソッドを、アマゾンのアフィリエイト商品に関する処理に対応させて、実装することになります。
実装する必要があるメソッド | メソッドの機能 |
---|---|
requestItemSearch() | Amazon Product Advertising APIを使用して、アマゾンに対して商品検索を行い、「アマゾン商品の検索結果」を得る。 |
makeItemArray() | 取得した「アマゾン商品の検索結果」から、「当プラグイン用の商品情報の配列」作成する。 |
makeUniqueText() | アマゾンにおける、キーワードによる商品検索の処理に対応する、一意な文字列を作成する。 一意な文字列は、「当プラグイン用の商品情報の配列」などをキャッシュに保存する際、そのキャッシュを識別する識別子を作成するために利用される。 |
汎用的なメソッドを呼び出すために、ItemsHTMLInfoMakerインターフェースを利用する
以下のItemSearchOperation::makeItemsHTML()関数は、「アフィリエイト商品のHTML」を作成する関数です。
$affiliateHTML = ItemSearchOperation::makeItemsHTML (
$urlInfo, $itemHTMLOption,
$itemsHTMLInfoMaker );
上記の関数は、アマゾンの「アフィリエイト商品のHTML」を作成する場合に、対応していません。
汎用的な(一般的な)「アフィリエイト商品のHTML」を作成する場合に対応している関数と、言えます。
このような場合でも、
AmazonItemsHTMLInfoMakerクラスにItemsHTMLInfoMakerインターフェースを適用することで、
汎用的な「アフィリエイト商品のHTML」を作成するItemSearchOperation::makeItemsHTML()関数を、使用できます。
そして、アマゾンの「アフィリエイト商品のHTML」を作成できます。
インターフェースを使用すると、違いのあるクラス同士がやり取りできる
プログラミングのインターフェースは、違いのあるクラス同士がやり取りを行うことを可能にします。
汎用的な「アフィリエイト商品のHTMLを作成するメソッド」は、アマゾン商品のことを理解できません。
だけど、ItemsHTMLInfoMakerインターフェース経由でやり取りすることで、アマゾンの「アフィリエイト商品のHTML」を作成できるようになります。
ItemSearchOperation::makeItemsHTML()関数は、汎用性がある関数です
ちなみに、ItemSearchOperation::makeItemsHTML()関数は、
ItemsHTMLInfoMakerインターフェースを使用することで、楽天市場の「アフィリエイト商品のHTML」を作成できます。
ItemSearchOperation::makeItemsHTML()関数は、
- アマゾンの「アフィリエイト商品のHTML」を作成すること
- 楽天市場の「アフィリエイト商品のHTML」を作成すること
どちらにも対応できます。
よって、汎用性があるメソッドと言えます。
「アフィリエイト商品のHTML」の作成処理を共通化した関数とも、言えます。
Amazon Product Advertising APIの呼び出しでエラーが起きた場合、「表示するHTML」を表示する
catch ( HttpRequestException $ex ) {
$displayHTML = DisplayHTMLPAAPINotAvailableUtils::makeDisplayHTMLPAAPINotAvailable (
$commonParameter, $restParameter, $displayHTMLOption );
// HTTP Statusのエラー情報を、HTMLのコメントで出力する。下記コメント文を参照。
$displayHTML .= "<!-- HTTPリクエストの例外:" . $ex->getMessage () . "。コード:" . $ex->getCode () .
" -->";
DisplayHTMLPAAPINotAvailableUtils::setDisplayHTMLPAAPINotAvailableCache ( $displayHTML,
$itemHTMLOption, $itemsHTMLInfoMaker );
return $displayHTML;
}
Amazon Product Advertising APIをHTTPリクエストで呼び出してエラーが起きた場合、
上記のcatch文で対処します。
「アフィリエイトの設定」に、「表示するHTML」に関する項目があります。
- 当プラグインの「アフィリエイトの設定」
- アマゾンの設定
- Product Advertising API 利用不可の時、「表示するHTML」
- アマゾンの設定
※関連記事:アフィリエイト商品表示・WordPressプラグイン、アフィリエイトの設定、アマゾンの設定。
HTTPリクエストでエラーが起きたら、
「表示するHTML」に入力されたHTMLを、$displayHTML変数に代入します。
そして return文で、$displayHTMLを返します。
以上の処理より、当プラグインのショートコードが記述されている部分に、「表示するHTML」を表示します。
HTTPリクエストに関するエラー情報を、HTMLのコメント文として追加する
HTTPリクエストに関するエラーメッセージとエラーコードを、 HTMLのコメント文として、「表示するHTML」に追加しています。
よって例えば、
パソコンのブラウザソフトで、「ウェブページのソースを表示する」命令を実行すると、
HTMLのコメント文で、先ほどのエラーメッセージとエラーコードを確認できます。
「表示するHTML」とHTTPリクエストに関するエラー情報は、一時的にキャッシュで保存される
「表示するHTML」と、HTTPリクエストに関するエラー情報のHTMLコメント文は、
DisplayHTMLPAAPINotAvailableUtils::setDisplayHTMLPAAPINotAvailableCache()関数、
この関数を実行することで、ワードプレスのデータベースに一時的にキャッシュで保存されます。
キャッシュが保存される時間は、
- 当プラグインの「アフィリエイトの設定」
- アマゾンの設定
- 商品情報のキャッシュ時間(秒)
- アマゾンの設定
こちらで設定したキャッシュ時間となります。
※関連記事:アフィリエイト商品表示・WordPressプラグイン、アフィリエイトの設定、アマゾンの設定。
例えば、3600という値を設定したら、キャッシュが保存される時間は1時間です。
60秒 × 60分 = 3600秒(1時間)となります。
Product Advertising API 利用不可の時、「表示するHTML」のキャッシュを取得する
$displayHTMLCache = DisplayHTMLPAAPINotAvailableUtils::getDisplayHTMLPAAPINotAvailableCache (
$itemHTMLOption, $itemsHTMLInfoMaker );
if ($displayHTMLCache !== false) {
return $displayHTMLCache;
}
Product Advertising API 利用不可の時、
DisplayHTMLPAAPINotAvailableUtils::getDisplayHTMLPAAPINotAvailableCache()関数で、
「表示するHTML」のキャッシュを取得します。
キャッシュの存在確認については、falseでない、という否定条件で判断しています。
if ($displayHTMLCache !== false)
肯定的な条件で、判断していません。
※関連記事:Javaソースコードにおいて、if文で肯定的な条件分岐を優先する書き方。
ワードプレス関数のget_transient()のサンプルコードでも、同じように否定条件で判断しています。
これは、ワードプレス関数のget_transient()の戻り値について
- キャッシュが存在しない場合は、false
- キャッシュが存在するなら、transientの値
このようになっているからです。
厳密な比較演算子(!==)による判断で、falseでない場合にキャッシュが存在する、となります。
KeywordSearchOperation.phpのソースコード
<?php
namespace goodsmemo\amazon;
use goodsmemo\network\URLInfo;
use goodsmemo\amazon\CommonRESTParameter;
use goodsmemo\amazon\RESTParameter;
use goodsmemo\amazon\ProductTypeOption;
use goodsmemo\amazon\AmazonItemsHTMLInfoMaker;
use goodsmemo\amazon\displayhtml\DisplayHTMLPAAPINotAvailableOption;
use goodsmemo\amazon\displayhtml\DisplayHTMLPAAPINotAvailableUtils;
use goodsmemo\item\ItemSearchOperation;
use goodsmemo\item\html\ItemHTMLOption;
use goodsmemo\item\html\ItemArrayHTMLMaking;
use goodsmemo\option\amazon\RESTParagraphUtils;
use goodsmemo\exception\HttpRequestException;
use goodsmemo\exception\IllegalArgumentException;
require_once GOODS_MEMO_DIR . "network/URLInfo.php";
require_once GOODS_MEMO_DIR . "amazon/CommonRESTParameter.php";
require_once GOODS_MEMO_DIR . "amazon/RESTParameter.php";
require_once GOODS_MEMO_DIR . "amazon/ProductTypeOption.php";
require_once GOODS_MEMO_DIR . "amazon/AmazonItemsHTMLInfoMaker.php";
require_once GOODS_MEMO_DIR . "amazon/displayhtml/DisplayHTMLPAAPINotAvailableOption.php";
require_once GOODS_MEMO_DIR . "amazon/displayhtml/DisplayHTMLPAAPINotAvailableUtils.php";
require_once GOODS_MEMO_DIR . "item/ItemSearchOperation.php";
require_once GOODS_MEMO_DIR . "item/html/ItemHTMLOption.php";
require_once GOODS_MEMO_DIR . "item/html/ItemArrayHTMLMaking.php";
require_once GOODS_MEMO_DIR . "option/amazon/RESTParagraphUtils.php";
require_once GOODS_MEMO_DIR . "exception/HttpRequestException.php";
require_once GOODS_MEMO_DIR . "exception/IllegalArgumentException.php";
class KeywordSearchOperation {
public static function makeHTMLOfSearchOperation(URLInfo $urlInfo,
CommonRESTParameter $commonParameter, RESTParameter $restParameter,
ItemHTMLOption $itemHTMLOption, ProductTypeOption $productTypeOption,
DisplayHTMLPAAPINotAvailableOption $displayHTMLOption) {
$itemsHTMLInfoMaker = new AmazonItemsHTMLInfoMaker ( $commonParameter, $restParameter,
$productTypeOption );
$displayHTMLCache = DisplayHTMLPAAPINotAvailableUtils::getDisplayHTMLPAAPINotAvailableCache (
$itemHTMLOption, $itemsHTMLInfoMaker );
if ($displayHTMLCache !== false) {
return $displayHTMLCache;
}
try {
$affiliateHTML;
$searchIndex = $restParameter->getSearchIndex ();
switch ($searchIndex) {
case RESTParagraphUtils::ALL_SEARCH_INDEX :
$affiliateHTML = ItemSearchOperation::makeItemsHTML ( $urlInfo, $itemHTMLOption,
$itemsHTMLInfoMaker );
break;
default :
throw new IllegalArgumentException ( "無効なサーチインデックス:" . $searchIndex );
}
return $affiliateHTML;
} catch ( HttpRequestException $ex ) {
$displayHTML = DisplayHTMLPAAPINotAvailableUtils::makeDisplayHTMLPAAPINotAvailable (
$commonParameter, $restParameter, $displayHTMLOption );
// HTTP Statusのエラー情報を、HTMLのコメントで出力する。下記コメント文を参照。
$displayHTML .= "<!-- HTTPリクエストの例外:" . $ex->getMessage () . "。コード:" . $ex->getCode () .
" -->";
DisplayHTMLPAAPINotAvailableUtils::setDisplayHTMLPAAPINotAvailableCache ( $displayHTML,
$itemHTMLOption, $itemsHTMLInfoMaker );
return $displayHTML;
}
}
/*
* $responseCode = $ex->getCode ();
*
* 401:InvalidSignature
* ローカル環境(XAMPP)のみで発生した。原因は、わからない。
*
* APIリクエストが多すぎる場合
* 429:Too Many Requests
* The request was denied due to request throttling. Please verify the number of requests made per second to the Amazon Product Advertising API.
*
* Product Advertising API 売上実績なしの場合
* 503:RequestThrottled
* A 503 error means that you are submitting requests too quickly and your requests are being throttled.
* If this is the case, you need to reduce the number of requests you are sending per second.
*/
}