「アマゾン商品の検索結果」など、「アマゾン商品のHTMLに関する情報」を作成する
「アマゾン商品のHTMLに関する情報」を作成する処理について、PHPソースコードを解説しています。
ここで作成される「アマゾン商品のHTMLに関する情報」とは、以下の三つです。
- アマゾン商品の検索結果。
- 当プラグイン用の商品情報の配列。
- アマゾンにおける、キーワードによる商品検索の検索条件に対応する、一意な文字列。
「アマゾン商品の検索結果」など、「アマゾン商品のHTMLに関する情報」を作成する
class AmazonItemsHTMLInfoMaker implements ItemsHTMLInfoMaker {
以下省略
AmazonItemsHTMLInfoMakerクラスは、「アマゾン商品のHTMLに関する情報」を作成するクラスです。
このクラスで作成される「アマゾン商品のHTMLに関する情報」とは、以下の三つです。
- キーワードによる商品検索で取得した、「アマゾン商品の検索結果」。
- 「アマゾン商品の検索結果」を基に作成した、「当プラグイン用の商品情報の配列」。
- アマゾンにおける、キーワードによる商品検索の検索条件に対応する、「一意な文字列」。
これら三つの情報は、アマゾンの「アフィリエイト商品の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;
}
}