全ての検索カテゴリにおいて、キーワードによる商品検索をすることで、アマゾンの「アフィリエイト商品の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()キーワードによる商品検索の処理に対応する、一意な文字列を作成する。

一意な文字列は、「当プラグイン用の商品情報の配列」などをキャッシュに保存する際、そのキャッシュを識別する識別子を作成するために利用される。
ItemsHTMLInfoMakerインターフェース

よって、AmazonItemsHTMLInfoMakerクラスでは、上記の三つのメソッドを、アマゾンのアフィリエイト商品に関する処理に対応させて、実装することになります。

実装する必要があるメソッドメソッドの機能
requestItemSearch()Amazon Product Advertising APIを使用して、アマゾンに対して商品検索を行い、「アマゾン商品の検索結果」を得る。
makeItemArray()取得した「アマゾン商品の検索結果」から、「当プラグイン用の商品情報の配列」作成する。
makeUniqueText()アマゾンにおける、キーワードによる商品検索の処理に対応する、一意な文字列を作成する。

一意な文字列は、「当プラグイン用の商品情報の配列」などをキャッシュに保存する際、そのキャッシュを識別する識別子を作成するために利用される。
AmazonItemsHTMLInfoMakerクラス

汎用的なメソッドを呼び出すために、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.
	 */
}