「アマゾン商品の検索結果」など、「アマゾン商品のHTMLに関する情報」を作成する

「アマゾン商品のHTMLに関する情報」を作成する処理について、PHPソースコードを解説しています。

ここで作成される「アマゾン商品のHTMLに関する情報」とは、以下の三つです。

  1. アマゾン商品の検索結果。
  2. 当プラグイン用の商品情報の配列。
  3. アマゾンにおける、キーワードによる商品検索の検索条件に対応する、一意な文字列。

「アマゾン商品の検索結果」など、「アマゾン商品のHTMLに関する情報」を作成する

class AmazonItemsHTMLInfoMaker implements ItemsHTMLInfoMaker {

以下省略

AmazonItemsHTMLInfoMakerクラスは、「アマゾン商品のHTMLに関する情報」を作成するクラスです。

このクラスで作成される「アマゾン商品のHTMLに関する情報」とは、以下の三つです。

  1. キーワードによる商品検索で取得した、「アマゾン商品の検索結果」。
  2. 「アマゾン商品の検索結果」を基に作成した、「当プラグイン用の商品情報の配列」。
  3. アマゾンにおける、キーワードによる商品検索の検索条件に対応する、「一意な文字列」。

これら三つの情報は、アマゾンの「アフィリエイト商品のHTML」を作成する処理において、必要な情報です。

AmazonItemsHTMLInfoMakerクラスが上記の三つの情報を作るのは、

AmazonItemsHTMLInfoMakerクラスに対して、
ItemsHTMLInfoMakerインターフェースが適用されているからです。

「商品のHTMLに関する情報」を作成する「三つのメソッド」が宣言されている、ItemsHTMLInfoMakerインターフェース

interface ItemsHTMLInfoMaker {

	public function requestItemSearch(URLInfo $urlInfo, int $itemCount);

	public function makeItemArray($response, ItemHTMLOption $itemHTMLOption);

	public function makeUniqueText(ItemHTMLOption $itemHTMLOption);
}

上記のソースコードにおいて、ItemsHTMLInfoMakerインターフェースでは、

「商品のHTMLに関する情報」を作成する「三つのメソッド」が、宣言されています。

このItemsHTMLInfoMakerインターフェースは、AmazonItemsHTMLInfoMakerクラスに適用されています。

よってAmazonItemsHTMLInfoMakerクラスは、「商品のHTMLに関する情報」を作成する「三つのメソッド」を、持つことになります。

「三つのメソッド」を持つから、
AmazonItemsHTMLInfoMakerクラスは、3個の「アマゾン商品のHTMLに関する情報」を作成することになります。

AmazonItemsHTMLInfoMakerクラスは、アマゾン固有の情報を作るクラスだからです。

AmazonItemsHTMLInfoMakerクラスでは、例えば、「アマゾン商品の検索結果」を作ることになります。

ItemsHTMLInfoMakerインターフェースで宣言されているメソッドの機能

ItemsHTMLInfoMakerインターフェースで宣言されているメソッドの機能は、以下のようになります。

requestItemSearch(URLInfo $urlInfo, int $itemCount)メソッド

$urlInfo変数が保持するURLに対してHTTPリクエストを行い、キーワードによる商品検索を実行します。

その商品検索の結果である「商品の検索結果」を、取得します。

「商品の検索結果」を取得する際、$itemCount変数が保持する「表示する商品数」を考慮して、取得する場合があります。

makeItemArray($response, ItemHTMLOption $itemHTMLOption)メソッド

requestItemSearch() メソッドで取得した、$response変数が保持する「商品の検索結果」を基に、「当プラグイン用の商品情報の配列」を作成します。

「当プラグイン用の商品情報の配列」を作成する際、「表示する商品数」など、$itemHTMLOption変数が保持する「商品HTMLオプションの設定」を考慮して、作成する場合があります。

makeUniqueText(ItemHTMLOption $itemHTMLOption)メソッド

キーワードによる商品検索の検索条件に対応する、一意な文字列を作成します。

  • キーワードによる商品検索の各検索条件
  • $itemHTMLOption変数が保持する「商品HTMLオプションの各設定値」

これらの検索条件や設定値を基にして、一意な文字列を作ります。

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

ItemsHTMLInfoMakerインターフェースで宣言されているメソッドの引数は、汎用的な情報を取り扱う引数です

ItemsHTMLInfoMakerインターフェースで宣言されているメソッドの引数については、アマゾンに依存した情報を保持する変数を、使いません

ここで言う依存した情報とは、アマゾンの「アフィリエイト商品のHTML」を作成する処理に依存した情報のことです。

なぜなら、ItemsHTMLInfoMakerインターフェースで宣言されているメソッドは、楽天市場の「アフィリエイト商品のHTML」を作成する場合も、使用されるからです。

よって、メソッドの引数については、

  • アマゾン商品のHTML作成に関する情報
  • 楽天市場商品のHTML作成に関する情報

どちらの情報も取り扱える汎用的な引数であることが、必要です。

例えば以下の引数は、アマゾン商品、楽天市場商品、どちらの「HTML作成に関する情報」も取り扱えます。

  • requestItemSearch()メソッド、URLInfoクラスの$urlInfo引数
  • makeItemArray()メソッド、ItemHTMLOptionクラスの$itemHTMLOption引数

これらは、汎用的な情報を取り扱える引数です。

「Amazon Product Advertising APIのURL」に対してHTTPリクエストを行い、「アマゾン商品の検索結果」を取得する

public function requestItemSearch(URLInfo $urlInfo, int $itemCount) {

	$response = AmazonRequest::requestSearchIndex ( $urlInfo, $this->commonParameter, $this->restParameter, $itemCount );
	return $response;
}

$urlInfo変数が保持する「Amazon Product Advertising APIのURL」に対して、HTTPリクエストを行います。

その際、キーワードによる商品検索を実行します。

その商品検索の結果である「アマゾン商品の検索結果」を、$response変数に代入します。

return文で、$response変数が保持する「アマゾン商品の検索結果」を、返します。

このメソッドから返された「アマゾン商品の検索結果」は、次の見出しで説明しているmakeItemArray()メソッドの$response引数に渡されます。

$response引数が保持する「アマゾン商品の検索結果」を基に、「当プラグイン用の商品情報の配列」を作成する

public function makeItemArray($response, ItemHTMLOption $itemHTMLOption) {

	$numberToDisplay = $itemHTMLOption->getNumberToDisplay ();
	$adultProductEnable = $this->productTypeOption->getAdultProductEnabled ();

	$itemArray = AmazonResponse::makeItemArray ( $response, $numberToDisplay, $adultProductEnable );
	return $itemArray;
}

$response引数が保持する「アマゾン商品の検索結果」を基に、「当プラグイン用の商品情報の配列」を作成します。

作成された「当プラグイン用の商品情報の配列」は、$itemArray配列変数に代入されます。

「当プラグイン用の商品情報の配列」を作成する際、

  • $numberToDisplay変数が保持する「表示する商品数」
  • $adultProductEnable変数が保持する「アダルト商品を表示することの有効性」

これらの情報を考慮して、作成します。

例えば、「表示する商品数」が3件の場合、
「当プラグイン用の商品情報の配列」の要素数は、最大3個となります。

例えば「アダルト商品の表示が無効」の場合、
「アマゾン商品の検索結果」の中にあるアダルト商品は、対象外となります。

よって、アダルト商品は「当プラグイン用の商品情報の配列」においても、対象外となります。
アダルト商品は、「当プラグイン用の商品情報の配列」に存在しません。

アマゾンにおける、キーワードによる商品検索の検索条件に対応する、一意な文字列を作成する

public function makeUniqueText(ItemHTMLOption $itemHTMLOption) {

	$operation = $this->restParameter->getOperation ();
	$searchIndex = $this->restParameter->getSearchIndex ();
	$responseGroup = $this->restParameter->getSearchItemsResources ();
	$keyword = $this->restParameter->getKeyword ();
	$numberToDisplay = $itemHTMLOption->getNumberToDisplay ();
	$cacheExpirationInSeconds = $itemHTMLOption->getCacheExpirationInSeconds ();

	$uniqueText = AmazonSettingSection::ID_PREFIX . $operation . $searchIndex . $responseGroup . $keyword . $numberToDisplay . $cacheExpirationInSeconds;
	return $uniqueText;
}

アマゾンにおける、キーワードによる商品検索の検索条件に対応する、一意な文字列を作成します。

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

アマゾンにおける、キーワードによる商品検索の検索条件

アマゾンにおける、キーワードによる商品検索の検索条件については、以下の通りです。

$operation変数

$operation変数は、Amazon Product Advertising APIのオペレーションを保持します。

例えば、オペレーションがSearchItemsの場合、商品検索を行います。

※関連記事:キーワードによる商品検索で、アマゾンの「アフィリエイト商品のHTML」を作成する、たくさんある「Amazon Product Advertising APIのオペレーション

$searchIndex変数

$searchIndex変数は、Amazon Product Advertising APIの検索インデックスを保持します。

検索インデックスは、検索カテゴリを示す文字列です。

※関連記事:全ての検索カテゴリにおいて、キーワードによる商品検索をすることで、アマゾンの「アフィリエイト商品のHTML」を作成する、検索インデックスを指定する

$responseGroup変数

$responseGroup変数は、Amazon Product Advertising APIのResourcesを保持します。

Resourcesとは、Amazon Product Advertising APIが返す値のタイプです。

※関連記事:「アマゾン商品の検索結果」を取得する、ペイロードのResourcesパラメーター

$keyword変数

$keyword変数は、商品を検索するキーワードを保持します。

このキーワードは、当プラグインのショートコードのkeyword属性で指定された文字列です。

※関連記事:アフィリエイト商品表示・WordPressプラグイン、ショートコードの属性

$numberToDisplay変数

$numberToDisplay変数は、「表示する商品数」を保持します。

この「表示する商品数」は、当プラグインのショートコードのnumber属性で指定された数値です。

※関連記事:アフィリエイト商品表示・WordPressプラグイン、ショートコードの属性

$cacheExpirationInSeconds変数

$cacheExpirationInSeconds変数は、「商品情報のキャッシュ時間(秒)」を保持します。

「商品情報のキャッシュ時間(秒)」は、以下の設定画面で設定されています。

  • 当プラグインの「アフィリエイトの設定」
    • アマゾンの設定
      • 商品情報のキャッシュ時間(秒)

※関連記事:アフィリエイト商品表示・WordPressプラグイン、アフィリエイトの設定、アマゾンの設定

一意な文字列がキャッシュの識別子として利用されるので、一意な文字列の中にキャッシュ時間を含める

一意な文字列がキャッシュの識別子として利用されるので、
$cacheExpirationInSeconds変数の数値を(数値の文字列を)、一意な文字列の中に含めています。

$cacheExpirationInSeconds変数は、商品情報のキャッシュ時間(秒)を保持しています。
例えば、1時間のキャッシュ時間を示す3600という値を、保持しています。

商品情報のキャッシュ時間(秒)は、以下の設定項目で設定できます。

  • 当プラグインの「アフィリエイトの設定」
    • アマゾンの設定
      • 商品情報のキャッシュ時間(秒)

※関連記事:アフィリエイト商品表示・WordPressプラグイン、アフィリエイトの設定、アマゾンの設定

当プラグインの「アフィリエイトの設定」にて、商品情報のキャッシュ時間(秒)が変更された場合、キャッシュを識別する識別子も変更する必要があります。

なぜならキャッシュされるデータは、キャッシュ時間に依存しているからです。
「キャッシュされるデータ」と「キャッシュ時間」は、一対一で対応しているからです。

以上より、$cacheExpirationInSeconds変数の数値を、一意な文字列の中に含めています。

Notice: Array to string conversion警告が発生していました

$responseGroup = $this->restParameter->getSearchItemsResources ();

中略

$uniqueText = AmazonSettingSection::ID_PREFIX . $operation . $searchIndex . $responseGroup . $keyword . $numberToDisplay . $cacheExpirationInSeconds;

$uniqueText変数に代入する文字列を作成する処理で、
Notice: Array to string conversion警告が発生していました。

警告が発生する訳は、配列である$responseGroup変数が、”Array”という文字列に変換されていたからです。

上記のソースコードの書き方では、$responseGroup変数が”Array”という文字列に、強制的に変換されていました。

この場合、implode()関数を使って、それぞれの配列要素を結合して文字列を作る必要がありました。

以下のように修正しました。

$searchItemsResourcesArray = $this->restParameter->getSearchItemsResources ();
$searchItemsResourcesText = implode ( $searchItemsResourcesArray ); // 配列から文字列を作る

中略

$uniqueText = AmazonSettingSection::ID_PREFIX . $operation . $searchIndex .
		$searchItemsResourcesText . $keyword . $numberToDisplay . $cacheExpirationInSeconds;

AmazonItemsHTMLInfoMakerというクラス名は、意味がわかりにくいです

AmazonItemsHTMLInfoMakerというクラス名については、ちょっと意味がわかりにくい、と気づきました。

久しぶりにAmazonItemsHTMLInfoMakerという英単語の文字列を見たところ、何を意味しているのか、すぐにわかりませんでした。

おそらく、「アマゾン商品のHTMLに関する情報を作成する」ということを意味している、と思います。

たぶん4年前に、自分がこのクラス名を名付けたのですが、その本人でも、意味を思い出せませんでした。

AmazonItemsHTMLInfoMaker.phpのソースコード

<?php

namespace goodsmemo\amazon;

use goodsmemo\item\ItemsHTMLInfoMaker;
use goodsmemo\network\URLInfo;
use goodsmemo\amazon\CommonRESTParameter;
use goodsmemo\amazon\RESTParameter;
use goodsmemo\amazon\ProductTypeOption;
use goodsmemo\amazon\AmazonRequest;
use goodsmemo\amazon\AmazonResponse;
use goodsmemo\item\html\ItemHTMLOption;
use goodsmemo\option\amazon\AmazonSettingSection;

require_once GOODS_MEMO_DIR . "item/ItemsHTMLInfoMaker.php";
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/AmazonRequest.php";
require_once GOODS_MEMO_DIR . "amazon/AmazonResponse.php";
require_once GOODS_MEMO_DIR . "item/html/ItemHTMLOption.php";
require_once GOODS_MEMO_DIR . "option/amazon/AmazonSettingSection.php";

class AmazonItemsHTMLInfoMaker implements ItemsHTMLInfoMaker {
	private $commonParameter;
	private $restParameter;
	private $productTypeOption;

	public function __construct(CommonRESTParameter $commonParameter, RESTParameter $restParameter, ProductTypeOption $productTypeOption) {

		$this->commonParameter = $commonParameter;
		$this->restParameter = $restParameter;
		$this->productTypeOption = $productTypeOption;
	}

	public function requestItemSearch(URLInfo $urlInfo, int $itemCount) {

		$response = AmazonRequest::requestSearchIndex ( $urlInfo, $this->commonParameter, $this->restParameter, $itemCount );
		return $response;
	}

	public function makeItemArray($response, ItemHTMLOption $itemHTMLOption) {

		$numberToDisplay = $itemHTMLOption->getNumberToDisplay ();
		$adultProductEnable = $this->productTypeOption->getAdultProductEnabled ();

		$itemArray = AmazonResponse::makeItemArray ( $response, $numberToDisplay, $adultProductEnable );
		return $itemArray;
	}

	public function makeUniqueText(ItemHTMLOption $itemHTMLOption) {

		$operation = $this->restParameter->getOperation ();
		$searchIndex = $this->restParameter->getSearchIndex ();
		$responseGroup = $this->restParameter->getSearchItemsResources ();
		$keyword = $this->restParameter->getKeyword ();
		$numberToDisplay = $itemHTMLOption->getNumberToDisplay ();
		$cacheExpirationInSeconds = $itemHTMLOption->getCacheExpirationInSeconds ();

		$uniqueText = AmazonSettingSection::ID_PREFIX . $operation . $searchIndex . $responseGroup . $keyword . $numberToDisplay . $cacheExpirationInSeconds;
		return $uniqueText;
	}
}