「アマゾン商品の検索結果」から、「当プラグイン用の商品情報の配列」を作成する

「アマゾン商品の検索結果」から、「当プラグイン用の商品情報の配列」を作成する処理について、PHPソースコードを解説しています。

「アマゾン商品の検索結果」とは、Amazon Product Advertising APIを使って、キーワードで商品検索して取得した結果です。

この「アマゾン商品の検索結果」から、アフィリエイト商品表示・WordPressプラグイン用の「商品情報の配列」を作成します。

目次
  1. 「アマゾン商品の検索結果」から、「当プラグイン用の商品情報の配列」を作成する
  2. 「アマゾン商品の情報」から、「当プラグイン用の商品情報」を作成する
  3. 「商品のタイトル」を、「当プラグイン用の商品情報」を保持する$item変数に設定する
  4. 「優待会員の名称」と「販売店名」を、「当プラグイン用の商品情報」を保持する$item変数に設定する
  5. 「アマゾン商品の情報」から、「商品レビュー」を作る
  6. 「アマゾン商品の情報」に関する有効性を取得する
  7. SearchIndexResponse.phpのソースコード
  8. 【まとめ記事】へのリンク

「アマゾン商品の検索結果」から、「当プラグイン用の商品情報の配列」を作成する

public static function makeItemArray($searchItemsResponse, int $numberToDisplay,
		bool $adultProductEnable) {

	$itemArray = array ();

	if (empty ( $searchItemsResponse ) or
			! property_exists ( $searchItemsResponse, 'SearchResult' ) or
			! property_exists ( $searchItemsResponse->SearchResult, 'Items' )) {

		return $itemArray; // 商品情報なし
	}

	$searchItems = $searchItemsResponse->SearchResult->Items;
	$priceTime = DateTextMaking::getUnixTimeMillSecond ();

	$searchItemCount = count ( $searchItems );
	$count = min ( $searchItemCount, $numberToDisplay );

	for($i = 0; $i < $count; $i ++) {

		$searchItem = $searchItems [$i];
		if (is_null ( $searchItem )) { // 念のため。配列の要素がNULLの場合
			continue;
		}

		if (SearchIndexResponse::getItemEnabled ( $searchItem, $adultProductEnable )) {

			$item = SearchIndexResponse::makeItem ( $searchItem, $priceTime );
			array_push ( $itemArray, $item );
		}
	}

	return $itemArray;
}

makeItemArray()関数は、「アマゾン商品の検索結果」から、「当プラグイン用の商品情報の配列」を作成します。

$searchItemsResponse変数は、「アマゾン商品の検索結果」を保持します。

$searchItemsResponse変数は、Amazon Product Advertising APIを使って、キーワードで商品検索した結果を保持しています。

※関連記事:「アマゾン商品の検索結果」を保持する、PHPオブジェクトの$responseObject変数

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

「アマゾン商品の情報の配列」を、$searchItems変数に代入する

$itemArray = array ();

中略

$searchItems = $searchItemsResponse->SearchResult->Items;

中略

for($i = 0; $i < $count; $i ++) {

	$searchItem = $searchItems [$i];

中略

	if (SearchIndexResponse::getItemEnabled ( $searchItem, $adultProductEnable )) {

		$item = SearchIndexResponse::makeItem ( $searchItem, $priceTime );
		array_push ( $itemArray, $item );
	}
}

return $itemArray;

$searchItemsResponse->SearchResult->Items変数は、「アマゾン商品の情報の配列」を保持します。

$searchItems変数に、「アマゾン商品の情報の配列」を代入します。
この「アマゾン商品の情報の配列」は、最大10個の「アマゾン商品の情報」です。

$searchItemsResponse変数の例。
$searchItems変数に、下記の[ Items ]の配列を代入します。

stdClass Object 
( 
[SearchResult] => stdClass Object 
( 
[Items] => Array 
( 
[0] => stdClass Object 
(
[ASIN] => XXXX000001
//商品情報その1
中略

)
[1] => stdClass Object 
(
[ASIN] => XXXX000002
//商品情報その2
中略

)

中略

[9] => stdClass Object 
(
[ASIN] => XXXX000009
//商品情報その10
中略

)

以下省略

1個の「アマゾン商品の情報」を、$searchItem変数に代入する

$searchItem = $searchItems [$i];

$searchItem変数に、1個の「アマゾン商品の情報」を代入します。

$searchItem変数の例。

stdClass Object 
(
[ASIN] => XXXX000001
[DetailPageURL] => https://www.amazon.co.jp/dp/4873116686?tag=sample-22&linkCode=osi&th=1&psc=1
[Images] => stdClass Object 
( 
[Primary] => stdClass Object 
( 
[Large] => stdClass Object 
( 
[Height] => 500 
[URL] => https://m.media-amazon.com/images/I/XXXXSSmCnjL._SL500_.jpg 
[Width] => 391 
) 
[Medium] => stdClass Object 
( 
[Height] => 160 
[URL] => https://m.media-amazon.com/images/I/XXXXSSmCnjL._SL160_.jpg 
[Width] => 125 
) 
[Small] => stdClass Object 
( 
[Height] => 75 
[URL] => https://m.media-amazon.com/images/I/XXXXSSmCnjL._SL75_.jpg 
[Width] => 58
)
)
)
[ItemInfo] => stdClass Object 
( 
[ByLineInfo] => stdClass Object 
( 
[Contributors] => Array 
( 
[0] => stdClass Object 
( 
[Locale] => ja_JP 
[Name] => Kevin XXXX 
[Role] => 著 
[RoleType] => author 
) 
[1] => stdClass Object 
( 
[Locale] => ja_JP 
[Name] => Peter XXXX 
[Role] => 著 
[RoleType] => author 
) 
[2] => stdClass Object 
( 
[Locale] => ja_JP 
[Name] => Rasmus XXXX 
[Role] => 著 
[RoleType] => author 
) 
[3] => stdClass Object 
( 
[Locale] => ja_JP 
[Name] => 高木 XXXX 
[Role] => 翻訳 
[RoleType] => translator 
) 
) 
[Manufacturer] => stdClass Object 
( 
[DisplayValue] => XXXXジャパン 
[Label] => Manufacturer 
[Locale] => ja_JP 
) 
) 
[Classifications] => stdClass Object 
( 
[Binding] => stdClass Object 
( 
[DisplayValue] => 大型本 
[Label] => Binding 
[Locale] => ja_JP 
) 
[ProductGroup] => stdClass Object 
( 
[DisplayValue] => 本 
[Label] => ProductGroup 
[Locale] => ja_JP 
) 
) 
[ProductInfo] => stdClass Object 
( 
[IsAdultProduct] => stdClass Object 
( 
[DisplayValue] => false
[Label] => IsAdultProduct 
[Locale] => en_US 
) 
[ItemDimensions] => stdClass Object 
( 
[Height] => stdClass Object 
( 
[DisplayValue] => 9.448818888 
[Label] => Height 
[Locale] => ja_JP 
[Unit] => インチ 
) 
[Length] => stdClass Object 
( 
[DisplayValue] => 1.574803148 
[Label] => Length 
[Locale] => ja_JP 
[Unit] => インチ 
) 
[Weight] => stdClass Object 
( 
[DisplayValue] => 1.322773572 
[Label] => Weight 
[Locale] => ja_JP 
[Unit] => ポンド 
) 
[Width] => stdClass Object 
( 
[DisplayValue] => 7.480314953 
[Label] => Width 
[Locale] => ja_JP 
[Unit] => インチ 
) 
) 
[UnitCount] => stdClass Object 
( 
[DisplayValue] => 1 
[Label] => NumberOfItems 
[Locale] => en_US 
) 
) 
[Title] => stdClass Object 
( 
[DisplayValue] => プログラミングPHP 
[Label] => Title 
[Locale] => ja_JP 
) 
) 
[Offers] => stdClass Object 
( 
[Listings] => Array 
( 
[0] => stdClass Object 
( 
[Id] => XXXXuqZV9p%2F9pThe3wpI3Fjh2M8oyA4O1gf5jmywp2AigraEoBosy%2B9UXq31F6Xjpgb2EgfNU9zKiaF%2Bw6VX2ctWetmRXxRdVs8hTELGa8iJBqm%2FTizDYbJueUUaGTkmWesG%2BH%2FF72w%3D 
[MerchantInfo] => stdClass Object 
( 
[FeedbackCount] => 0 
[FeedbackRating] => 0 
[Id] => AN1VRQENFRJN5 
[Name] => Amazon.co.jp 
) 
[Price] => stdClass Object 
( 
[Amount] => 4180 
[Currency] => JPY 
[DisplayAmount] => ¥4,180 
) 
[ViolatesMAP] => 
) 
) 

[Summaries] => Array 
( 
[0] => stdClass Object 
( 
[Condition] => stdClass Object 
( 
[Value] => Collectible 
) 
[LowestPrice] => stdClass Object 
( 
[Amount] => 8350 
[Currency] => JPY 
[DisplayAmount] => ¥8,350 
) 
) 
[1] => stdClass Object 
( 
[Condition] => stdClass Object 
( 
[Value] => New 
) 
[LowestPrice] => stdClass Object 
( 
[Amount] => 4180 
[Currency] => JPY 
[DisplayAmount] => ¥4,180 
) 
) 
[2] => stdClass Object 
( 
[Condition] => stdClass Object 
( 
[Value] => Used 
) 
[LowestPrice] => stdClass Object 
( 
[Amount] => 1066 
[Currency] => JPY 
[DisplayAmount] => ¥1,066 
) 
) 
) 
) 
) 

「アマゾン商品の情報」から、「当プラグイン用の商品情報」を作成する

$item = SearchIndexResponse::makeItem ( $searchItem, $priceTime );

SearchIndexResponse::makeItem()関数に$searchItem変数を渡して、1個の商品情報を作成します。

$item変数に、作成した1個の商品情報を代入します。
$item変数が保持する、この作成した商品情報は「当プラグイン用の商品情報」です。

$item変数は、Itemクラスの変数です。

Itemクラスについては、以下の関連記事を参照してください。

※関連記事:「当プラグイン用の商品情報の配列」から、「アフィリエイト商品のHTML」を作成する、「当プラグイン用の商品情報」を保持するItemクラス

「当プラグイン用の商品情報」を保持する$item変数の例

「当プラグイン用の商品情報」を保持する$item変数の例です。

goodsmemo\item\Item Object
(
  [pageURL:goodsmemo\item\Item:private] => https://www.amazon.co.jp/dp/XXXX400276?tag=sample-22&linkCode=osi&th=1&psc=1
  [imageItem:goodsmemo\item\Item:private] => goodsmemo\item\ImageItem Object
    (
      [imageURL:goodsmemo\item\ImageItem:private] => https://m.media-amazon.com/images/I/XXXXiVIarbL._SL160_.jpg
      [imageWidth:goodsmemo\item\ImageItem:private] => 125
      [imageHeight:goodsmemo\item\ImageItem:private] => 160
    )

  [title:goodsmemo\item\Item:private] => プログラミングPHP 第4版
  [priceItem:goodsmemo\item\Item:private] => goodsmemo\item\PriceItem Object
    (
      [label:goodsmemo\item\PriceItem:private] => 価格
      [price:goodsmemo\item\PriceItem:private] => 4,290 円
      [priceAddition:goodsmemo\item\PriceItem:private] => 
      [priceTime:goodsmemo\item\PriceItem:private] => 1681545522.9672
      [postageText:goodsmemo\item\PriceItem:private] => 
    )

  [pointItem:goodsmemo\item\Item:private] => goodsmemo\item\PointItem Object
    (
      [pointRate:goodsmemo\item\PointItem:private] => 
      [pointRateStartTime:goodsmemo\item\PointItem:private] => 
      [pointRateEndTime:goodsmemo\item\PointItem:private] => 
    )

  [productionItem:goodsmemo\item\Item:private] => goodsmemo\item\ProductionItem Object
    (
      [contributorArray:goodsmemo\item\ProductionItem:private] => Array
        (
          [0] => Kevin XXXX(著)
          [1] => Peter XXXX(著)
          [2] => 永井 XXXX(監修)
          [3] => 中野 XXXX(翻訳)
        )

      [manufacturerLabel:goodsmemo\item\ProductionItem:private] => 出版社
      [manufacturer:goodsmemo\item\ProductionItem:private] => XXXXジャパン株式会社
      [binding:goodsmemo\item\ProductionItem:private] => 単行本(ソフトカバー)
    )

  [preferentialMember:goodsmemo\item\Item:private] => 
  [shop:goodsmemo\item\Item:private] => Amazon.co.jp
  [reviewItem:goodsmemo\item\Item:private] => goodsmemo\item\ReviewItem Object
    (
      [reviewLineArray:goodsmemo\item\ReviewItem:private] => Array
        (
          [0] => 商品の主な機能に関する情報その1。
          [1] => 商品の主な機能に関する情報その2。
          [2] => 商品の主な機能に関する情報その3。
        )

      [plainTextReview:goodsmemo\item\ReviewItem:private] => 
    )
)

「当プラグイン用の商品情報」を、「当プラグイン用の商品情報の配列」に追加する

$itemArray = array ();

中略

$searchItems = $searchItemsResponse->SearchResult->Items;

中略

for($i = 0; $i < $count; $i ++) {

	$searchItem = $searchItems [$i];

中略

		$item = SearchIndexResponse::makeItem ( $searchItem, $priceTime );
		array_push ( $itemArray, $item );

}

return $itemArray;

array_push()関数で、「当プラグイン用の商品情報」を保持する$item変数を、
「当プラグイン用の商品情報の配列」である$itemArray配列の変数に、追加します。

for文の$count変数が示す回数だけ、
$item変数を$itemArray配列の変数に追加する処理を、試みます。

以上の処理が終了後、
「当プラグイン用の商品情報の配列」である$itemArray配列の変数を、return文で返します。

「当プラグイン用の商品情報の配列」を保持する$itemArray配列変数の例

「当プラグイン用の商品情報の配列」を保持する$itemArray配列変数の例です。

Array
(
  [0] => goodsmemo\item\Item Object
  (
  [pageURL:goodsmemo\item\Item:private] => https://www.amazon.co.jp/dp/XXXX400276?tag=sample-22&linkCode=osi&th=1&psc=1
  [imageItem:goodsmemo\item\Item:private] => goodsmemo\item\ImageItem Object
    (
      [imageURL:goodsmemo\item\ImageItem:private] => https://m.media-amazon.com/images/I/XXXXiVIarbL._SL160_.jpg
      [imageWidth:goodsmemo\item\ImageItem:private] => 125
      [imageHeight:goodsmemo\item\ImageItem:private] => 160
    )

  [title:goodsmemo\item\Item:private] => プログラミングPHP 第4版
  [priceItem:goodsmemo\item\Item:private] => goodsmemo\item\PriceItem Object
    (
      [label:goodsmemo\item\PriceItem:private] => 価格
      [price:goodsmemo\item\PriceItem:private] => 4,290 円
      [priceAddition:goodsmemo\item\PriceItem:private] => 
      [priceTime:goodsmemo\item\PriceItem:private] => 1681545522.9672
      [postageText:goodsmemo\item\PriceItem:private] => 
    )

  [pointItem:goodsmemo\item\Item:private] => goodsmemo\item\PointItem Object
    (
      [pointRate:goodsmemo\item\PointItem:private] => 
      [pointRateStartTime:goodsmemo\item\PointItem:private] => 
      [pointRateEndTime:goodsmemo\item\PointItem:private] => 
    )

  [productionItem:goodsmemo\item\Item:private] => goodsmemo\item\ProductionItem Object
    (
      [contributorArray:goodsmemo\item\ProductionItem:private] => Array
        (
          [0] => Kevin XXXX(著)
          [1] => Peter XXXX(著)
          [2] => 永井 XXXX(監修)
          [3] => 中野 XXXX(翻訳)
        )

      [manufacturerLabel:goodsmemo\item\ProductionItem:private] => 出版社
      [manufacturer:goodsmemo\item\ProductionItem:private] => XXXXジャパン株式会社
      [binding:goodsmemo\item\ProductionItem:private] => 単行本(ソフトカバー)
    )

  [preferentialMember:goodsmemo\item\Item:private] => 
  [shop:goodsmemo\item\Item:private] => Amazon.co.jp
  [reviewItem:goodsmemo\item\Item:private] => goodsmemo\item\ReviewItem Object
    (
      [reviewLineArray:goodsmemo\item\ReviewItem:private] => Array
        (
          [0] => 商品の主な機能に関する情報その1。
          [1] => 商品の主な機能に関する情報その2。
          [2] => 商品の主な機能に関する情報その3。
        )

      [plainTextReview:goodsmemo\item\ReviewItem:private] => 
    )
  )

  [1] => goodsmemo\item\Item Object
  (
  //「当プラグイン用の商品情報」その2
  )

  [2] => goodsmemo\item\Item Object
  (
  //「当プラグイン用の商品情報」その3
  )
)

「アマゾン商品の情報」の個数と、当プラグインで表示する商品数において、小さい方の個数だけ、「当プラグイン用の商品情報」の作成を試みる

$searchItems = $searchItemsResponse->SearchResult->Items;
$priceTime = DateTextMaking::getUnixTimeMillSecond ();

$searchItemCount = count ( $searchItems );
$count = min ( $searchItemCount, $numberToDisplay );

for($i = 0; $i < $count; $i ++) {

以下省略

for文の$count変数は、「当プラグイン用の商品情報」の作成を試みる回数を示します。
基本的に、$count変数が示す個数の商品情報を作成します。

$count変数については、min()関数によって、
$searchItemCount変数と$numberToDisplay変数の小さい方の値が、代入されます。

$searchItemCount変数は、「アマゾン商品の情報」の個数です。

$numberToDisplay変数は、アフィリエイト商品表示・WordPressプラグインで表示する商品数です。
当プラグインで表示する商品数は、当プラグインのショートコードで指定します。

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

例えば以下の場合、

  • 「アマゾン商品の情報」の個数が10個
  • 当プラグインで表示する商品数が1個

この場合、小さい方の数値である1が、$count変数に代入されます。

その結果、当プラグインのショートコードが記述されている場所に、1個の商品が表示されます。

アマゾンのアフィリエイト商品が、1個表示されます。

「アマゾン商品の情報」に関する有効性を取得して、「当プラグイン用の商品情報」を作成するか、判断する

public static function makeItemArray($searchItemsResponse, int $numberToDisplay,
		bool $adultProductEnable) {

	$itemArray = array ();

中略

		if (SearchIndexResponse::getItemEnabled ( $searchItem, $adultProductEnable )) {

			$item = SearchIndexResponse::makeItem ( $searchItem, $priceTime );
			array_push ( $itemArray, $item );
		}

中略

	return $itemArray;
}

SearchIndexResponse::getItemEnabled()関数は、「アマゾン商品の情報」に関する有効性を取得します。

この有効性は、「当プラグイン用の商品情報」を作成する際、作成するかどうかの判断基準になります。

「アマゾン商品の情報」が有効の場合、「当プラグイン用の商品情報」を作成する

if文で使用されているSearchIndexResponse::getItemEnabled()関数の戻り値がtrueの場合、
「アマゾン商品の情報」を保持する$searchItem変数は、有効です。

有効なので、「アマゾン商品の情報」を保持する$searchItem変数から、
「当プラグイン用の商品情報」を保持する$item変数を、作成します

array_push()関数で、「当プラグイン用の商品情報」を保持する$item変数を、
「当プラグイン用の商品情報の配列」である$itemArray変数に、追加します。

「アマゾン商品の情報」が無効の場合、「当プラグイン用の商品情報」を作成しない

if文で使用されているSearchIndexResponse::getItemEnabled()関数の戻り値がfalseの場合、
「アマゾン商品の情報」を保持する$searchItem変数は、無効です。

無効なので、「アマゾン商品の情報」を保持する$searchItem変数から、
「当プラグイン用の商品情報」を保持する$item変数を、作成しません

「アマゾン商品の検索結果」が無い場合、「当プラグイン用の商品情報の配列」を作成しない

「アマゾン商品の検索結果」が無い場合、
「当プラグイン用の商品情報の配列」を作成しません。

「当プラグイン用の商品情報」を保持しない、空の配列を作成します。

$searchItemsResponse変数に、Itemsプロパティが存在しない場合

$searchItemsResponse変数の例。

stdClass Object 
( 
[SearchResult] => stdClass Object 
( 
[Items] => Array 
( 
//Itemsプロパティが存在しない場合、
//「アマゾン商品の検索結果」は無い、と判断する。
)
)
)

$searchItemsResponse変数が、実際に「アマゾン商品の検索結果」を保持しているか、property_exists()関数で調べます。

property_exists()関数は、プロパティが、クラスまたはオブジェクトに存在するかどうかを確認します。
プロパティが存在する場合、property_exists()関数はtrueを返します。

$itemArray = array ();

if (empty ( $searchItemsResponse ) or
		! property_exists ( $searchItemsResponse, 'SearchResult' ) or
		! property_exists ( $searchItemsResponse->SearchResult, 'Items' )) {

	return $itemArray; // 商品情報なし
}

! property_exists ( $searchItemsResponse->SearchResult, ‘Items’ )において、
$searchItemsResponse->SearchResultメンバ変数に、Itemsプロパティが存在しない場合、
「当プラグイン用の商品情報の配列」を作成できません。

この場合、空の配列である$itemArray変数をreturn文で返します。

property_exists()関数の前に論理否定演算子 ! がある点に、注意してください。

$searchItemsResponse変数が、NULL値の場合

empty ( $searchItemsResponse )において、
$searchItemsResponse変数が主にNULL値の場合、
「当プラグイン用の商品情報の配列」を作成できません。

この場合、空の配列である$itemArray変数をreturn文で返します。

is_null()関数を使って判断すれば、充分でした

改めて$searchItemsResponse変数について考えたところ、
$searchItemsResponse変数は

  • NULL値
  • PHPオブジェクト

どちらかだと思います。

よって以下のように、empty()関数の代わりにis_null()関数を使って判断すれば充分と言えます。
is_null ( $searchItemsResponse )

以前にソースコードを記述した時、なぜempty()関数を使ったのか、わかりません。
もしかしたら当時、is_null()関数を知らなかったのかもしれません。

「アマゾン商品の情報」から、「当プラグイン用の商品情報」を作成する

private static function makeItem($searchItem, float $priceTime): Item {

	$item = new Item ();

	if (isset ( $searchItem->DetailPageURL )) {
		$item->setPageURL ( esc_url ( $searchItem->DetailPageURL ) );
	}

	SearchIndexResponse::setItemInfoTo ( $item, $searchItem );

	SearchIndexResponse::setOffersTo ( $item, $searchItem );

	$imageItem = ImageResponse::makeImageItem ( $searchItem );
	$item->setImageItem ( $imageItem );

	$priceItem = PriceResponse::makePriceItem ( $searchItem, $priceTime );
	$item->setPriceItem ( $priceItem );

	$productionItem = ProductionResponse::makeProductionItem ( $searchItem );
	$item->setProductionItem ( $productionItem );

	$reviewItem = SearchIndexResponse::makeReviewItem ( $searchItem );
	$item->setReviewItem ( $reviewItem );

	return $item;
}

$searchItem変数が保持する「アマゾン商品の情報」から、「当プラグイン用の商品情報」を作成します。

作成した「当プラグイン用の商品情報」は、$item変数が保持します。

$item変数に設定される「アマゾン商品の情報」は、以下の通りです。

$item変数に設定される「アマゾン商品の情報」$item変数に設定される「アマゾン商品の情報」の説明
$searchItem->DetailPageURLアマゾンサイトの商品ページへのURLです。
アソシエイトタグが、URLのクエリパラメーターに付与されています。
SearchIndexResponse::setItemInfoTo ( $item, $searchItem );商品名など、商品のタイトル。
SearchIndexResponse::setOffersTo ( $item, $searchItem );優待会員の名称。
販売店名。
$imageItem商品の画像情報。
$priceItem商品の価格情報。
$productionItem詳細な商品情報。
$reviewItem商品レビュー。

商品の主な機能に関する情報。
または、
編集者による論評。現在、未使用 。
$item変数に設定される「アマゾン商品の情報」

以上の「アマゾン商品の情報」を$item変数に設定した後、$item変数はreturn文で返されます。

「当プラグイン用の商品情報」を保持する$item変数の例については、

当記事の「見出し」
「当プラグイン用の商品情報」を保持する$item変数の例
を参照してください。

「アマゾンサイトの商品ページへのURL」を、「当プラグイン用の商品情報」を保持する$item変数に設定する

if (isset ( $searchItem->DetailPageURL )) {
	$item->setPageURL ( esc_url ( $searchItem->DetailPageURL ) );
}

$searchItem->DetailPageURLメンバ変数の例。

stdClass Object 
(
[ASIN] => XXXX000001
[DetailPageURL] => https://www.amazon.co.jp/dp/4873116686?tag=sample-22&linkCode=osi&th=1&psc=1

中略

)

「アマゾン商品の情報」を保持する$searchItem変数に、
「アマゾンサイトの商品ページへのURL」を保持するDetailPageURLメンバ変数が存在する場合、

「当プラグイン用の商品情報」を保持する$item変数に、「アマゾンサイトの商品ページへのURL」を設定します。

$searchItem->DetailPageURLメンバ変数が保持する「アマゾンサイトの商品ページへのURL」については、
esc_url()関数によってサニタイズしたURLが設定されます。

サニタイズとは、Webサイトの脆弱性を悪用するために使用される可能性のある特殊文字、またはプログラムコードを、削除することです。

$item->pageURLメンバ変数の例。

goodsmemo\item\Item Object
(
  [pageURL:goodsmemo\item\Item:private] => https://www.amazon.co.jp/dp/XXXX400276?tag=sample-22&linkCode=osi&th=1&psc=1

以下省略

)

「商品のタイトル」を、「当プラグイン用の商品情報」を保持する$item変数に設定する

private static function setItemInfoTo(Item &$item, $searchItem) {

	if (isset ( $searchItem->ItemInfo )) {
		;
	} else {
		return;
	}

	$itemInfo = $searchItem->ItemInfo;

	if (isset ( $itemInfo->Title ) and isset ( $itemInfo->Title->DisplayValue )) {

		$titleValue = $itemInfo->Title->DisplayValue;
		$item->setTitle ( HTMLUtils::makePlainText ( $titleValue ) );
	}
}

$searchItem->ItemInfo->Titleメンバ変数の例。

stdClass Object 
(
[ASIN] => XXXX000001

中略

[ItemInfo] => stdClass Object 
( 
  [Title] => stdClass Object 
  ( 
  [DisplayValue] => プログラミングPHP 
  [Label] => Title 
  [Locale] => ja_JP 
  ) 

中略

)

中略

)

「アマゾン商品の情報」を保持する$searchItem変数に、
「商品のタイトル」の文字列を保持するDisplayValueメンバ変数が存在する場合、

「当プラグイン用の商品情報」を保持する$item変数に、「商品のタイトル」の文字列を設定します。

$titleValue = $itemInfo->Title->DisplayValue;
$item->setTitle ( HTMLUtils::makePlainText ( $titleValue ) );

上記ソースコードでは、$titleValue変数に「商品のタイトル」の文字列を代入します。

HTMLUtils::makePlainText()関数に$titleValue変数を渡して、「商品のタイトル」の文字列をプレーンテキストに作り直します。

プレーンテキストに作り直した「商品のタイトル」の文字列を、
「当プラグイン用の商品情報」を保持する$item変数に、設定します。

プレーンテキストとは、テキストの表示方法を示すマークアップや特殊文字が含まれていない、単なる文字列です。

$item->titleメンバ変数の例。

goodsmemo\item\Item Object
(

中略

  [title:goodsmemo\item\Item:private] => プログラミングPHP 第4版

以下省略

)

setItemInfoTo()関数の引数 &$item は、参照渡しです

private static function setItemInfoTo(Item &$item, $searchItem) {

中略

		$titleValue = $itemInfo->Title->DisplayValue;
		$item->setTitle ( HTMLUtils::makePlainText ( $titleValue ) );
	}
}

setItemInfoTo()関数の引数 &$item は、引数の先頭に & を付けているので「参照渡し」になります。

よって、setItemInfoTo()関数内で引数$itemが保持している値を変更すると、呼び出し元の$item変数が保持している値も変更されます。

$item->setTitle()メソッドによる「商品のタイトル」の変更が、呼び出し元の変数$itemに対する変更となります。

「優待会員の名称」と「販売店名」を、「当プラグイン用の商品情報」を保持する$item変数に設定する

private static function setOffersTo(Item &$item, $searchItem) {

	if (isset ( $searchItem->Offers )) {
		;
	} else {
		return;
	}

	$offers = $searchItem->Offers;

	if (isset ( $offers->Listings ) and isset ( $offers->Listings [0] )) {

		$listing = $offers->Listings [0];

		if (isset ( $listing->DeliveryInfo ) and
				isset ( $listing->DeliveryInfo->IsPrimeEligible )) {

			$isPrimeEligible = $listing->DeliveryInfo->IsPrimeEligible;
			if ($isPrimeEligible) {
				$item->setPreferentialMember ( HTMLUtils::makePlainText ( "✓prime" ) ); // "✓prime"
			}
		}

		if (isset ( $listing->MerchantInfo ) and isset ( $listing->MerchantInfo->Name )) {

			$merchantName = $listing->MerchantInfo->Name;
			$item->setShop ( HTMLUtils::makePlainText ( $merchantName ) );
		}
	}
}

「優待会員の名称」の文字列「✓prime」を、「当プラグイン用の商品情報」を保持する$item変数に設定する

※この記事を書いている時、$searchItem->Offers->Listings [0]->DeliveryInfo->IsPrimeEligibleメンバ変数の値を、取得することができませんでした。
後日、もしもDeliveryInfo->IsPrimeEligibleメンバ変数を取得できたら、ここにご紹介したいと思います。

「アマゾン商品の情報」を保持する$searchItem変数に、
「プライム配送の対象を示す値」を保持するIsPrimeEligibleメンバ変数が存在する場合、

「当プラグイン用の商品情報」を保持する$item変数に、「優待会員の名称」の文字列「✓prime」を設定します。

$isPrimeEligible = $listing->DeliveryInfo->IsPrimeEligible;
if ($isPrimeEligible) {
	$item->setPreferentialMember ( HTMLUtils::makePlainText ( "✓prime" ) ); // "✓prime"
}

上記ソースコードでは、$isPrimeEligible変数に「プライム配送の対象を示す値」を代入します。

$isPrimeEligible変数がtrueなら、
「当プラグイン用の商品情報」を保持する$item変数に、「✓prime」を設定します。

$item->preferentialMemberメンバ変数の例。(予想)

goodsmemo\item\Item Object
(

中略

  [preferentialMember:goodsmemo\item\Item:private] => ✓prime

以下省略

)

「販売店名」を、「当プラグイン用の商品情報」を保持する$item変数に設定する

$searchItem->Offers->Listings [0]->MerchantInfoメンバ変数の例。

stdClass Object 
(
[ASIN] => XXXX000001

中略

[Offers] => stdClass Object 
( 
[Listings] => Array 
( 
[0] => stdClass Object 
( 
  [MerchantInfo] => stdClass Object 
  ( 
  [FeedbackCount] => 0 
  [FeedbackRating] => 0 
  [Id] => AN1VRQENFRJN5 
  [Name] => Amazon.co.jp 
  ) 

中略

)
)
)

中略

)

「アマゾン商品の情報」を保持する$searchItem変数に、
「販売店名」を保持するNameメンバ変数が存在する場合、

「当プラグイン用の商品情報」を保持する$item変数に、「販売店名」を設定します。

$merchantName = $listing->MerchantInfo->Name;
$item->setShop ( HTMLUtils::makePlainText ( $merchantName ) );

上記ソースコードでは、$merchantName変数に「販売店名」を代入します。

HTMLUtils::makePlainText()関数に$merchantName変数を渡して、「販売店名」の文字列をプレーンテキストに作り直します。

プレーンテキストに作り直した「販売店名」の文字列を、
「当プラグイン用の商品情報」を保持する$item変数に、設定します。

$item->shopメンバ変数の例。

goodsmemo\item\Item Object
(

中略

  [shop:goodsmemo\item\Item:private] => Amazon.co.jp

以下省略

)

「アマゾン商品の情報」から、「商品レビュー」を作る

private static function makeReviewItem($searchItem): ReviewItem {

	$reviewItem = new ReviewItem ();

	if (isset ( $searchItem->ItemInfo ) and isset ( $searchItem->ItemInfo->Features ) and
			isset ( $searchItem->ItemInfo->Features->DisplayValues )) {
		$featuresValues = $searchItem->ItemInfo->Features->DisplayValues; // string[]

		$featureArray = array ();
		foreach ( $featuresValues as $value ) {

			if ($value == NULL) {
				continue;
			}

			$feature = HTMLUtils::makePlainText ( $value );
			array_push ( $featureArray, $feature );
		}

		$reviewItem->setReviewLineArray ( $featureArray );
	}

	// TODO Check back later for updates
	// if (isset($node->EditorialReviews->EditorialReview->Content)) {//Noticd: Trying to get property of non-objectエラーが起きた。
	// $editorialReview = HTMLUtils::makePlainText($node->EditorialReviews->EditorialReview->Content);
	// $reviewItem->setPlainTextReview($editorialReview);
	// }

	return $reviewItem;
}

makeReviewItem()関数は、
「アマゾン商品の情報」を保持する$searchItem変数から、
「商品の主な機能に関する情報」を保持する$reviewItem変数を、作成します。

$reviewItem変数は、ReviewItemクラスの変数です。

ReviewItemクラスは、商品レビューを保持するクラスです。
※ProductionReviewクラスという名前の方が、わかりやすいかもしれません。

しかし現在のところ、「編集者による論評」を取得する処理は未実装です 。

なので、ReviewItemクラスは商品レビューというよりも、「商品の主な機能に関する情報」を保持するクラスになっています。

「商品の主な機能に関する情報の配列」を、$reviewItem変数に設定する

		$featuresValues = $searchItem->ItemInfo->Features->DisplayValues; // string[]

		$featureArray = array ();
		foreach ( $featuresValues as $value ) {

中略

			$feature = HTMLUtils::makePlainText ( $value );
			array_push ( $featureArray, $feature );
		}

		$reviewItem->setReviewLineArray ( $featureArray );

	return $reviewItem;
}

$searchItem->ItemInfo->Features->DisplayValuesメンバ変数の例。

stdClass Object 
(
[ASIN] => XXXX000001

中略

[ItemInfo] => stdClass Object 
( 
  [Features] => stdClass Object 
  (
  [DisplayValues] => Array 
  ( 
  [0] => 商品の主な機能に関する情報その1。
  [1] => 商品の主な機能に関する情報その2。
  [2] => 商品の主な機能に関する情報その3。 
  )
  [Label] => Features 
  [Locale] => ja_JP 
  )

中略

)

中略

)

$searchItem変数は、「アマゾン商品の情報」を保持します。

その$searchItem変数が保持するFeatures->DisplayValuesメンバー配列変数は、
「商品の主な機能に関する情報の配列」です。文字列の配列です。

この「商品の主な機能に関する情報の配列」から、ReviewItemクラス用の「商品の主な機能に関する情報の配列」を作成します。

$featuresValues = $searchItem->ItemInfo->Features->DisplayValues;

上記ソースコードでは、$featuresValues配列変数に、「商品の主な機能に関する情報の配列」を代入します。

foreach ( $featuresValues as $value ) {

中略

	$feature = HTMLUtils::makePlainText ( $value );
	array_push ( $featureArray, $feature );
}

上記ソースコードのforeach文のループ処理で、ReviewItemクラス用の「商品の主な機能に関する情報の配列」を作成します。

$value変数は、「商品の主な機能に関する情報の配列」の値です。
この$value変数の文字列をプレーンテキストに作り直して、$feature変数に代入します。

array_push ( $featureArray, $feature );

プレーンテキストになった「商品の主な機能に関する情報」を保持する$feature変数を、
$featureArray配列変数に、追加します。

foreach文のループ処理が終了後、
$featureArray配列変数は、ReviewItemクラス用の「商品の主な機能に関する情報の配列」を保持します。

$reviewItem->setReviewLineArray ( $featureArray );

$featureArray配列変数を、$reviewItem変数に設定します。

その$reviewItem変数を、return文で返します。

$item->reviewItemメンバ変数の例。

goodsmemo\item\Item Object
(

中略

  [reviewItem:goodsmemo\item\Item:private] => goodsmemo\item\ReviewItem Object
    (
      [reviewLineArray:goodsmemo\item\ReviewItem:private] => Array
        (
          [0] => 商品の主な機能に関する情報その1。
          [1] => 商品の主な機能に関する情報その2。
          [2] => 商品の主な機能に関する情報その3。
        )

      [plainTextReview:goodsmemo\item\ReviewItem:private] => 
    )
)

「アマゾン商品の情報」に関する有効性を取得する

private static function getItemEnabled($searchItem, bool $adultProductEnable): bool {

	if ($adultProductEnable) {
		return true;
	}

	/*
	 * 以下、アダルト商品が無効と指定されている場合について
	 */

	if (isset ( $searchItem->ItemInfo ) and isset ( $searchItem->ItemInfo->ProductInfo ) and
			isset ( $searchItem->ItemInfo->ProductInfo->IsAdultProduct ) and
			isset ( $searchItem->ItemInfo->ProductInfo->IsAdultProduct->DisplayValue )) {
		;
	} else {
		return true; // アダルト商品の情報がない場合、有効とする。
	}

	$isAdultProductValue = $searchItem->ItemInfo->ProductInfo->IsAdultProduct->DisplayValue;
	if ($isAdultProductValue) {
		return false; // $searchItemがアダルト商品なら、無効とする。
	} else {
		return true; // $searchItemが普通の商品なら、有効とする。
	}
}

getItemEnabled()関数で取得する、「アマゾン商品の情報」に関する有効性は、
「当プラグイン用の商品情報」において、
アマゾン商品は対象であるか、対象外であるかを判断するために利用されます。

getItemEnabled()関数の戻り値がtrueの場合、
アマゾン商品は「当プラグイン用の商品情報」において、対象の商品と判断されます。

対象の商品なので、当プラグインのショートコードの場所に、アマゾン商品が表示されます

getItemEnabled()関数の戻り値がfalseの場合、
アマゾン商品は「当プラグイン用の商品情報」において、対象外の商品と判断されます。

対象外の商品なので、当プラグインのショートコードの場所に、アマゾン商品は表示されません

アダルト商品の表示の有効性を考慮して、「アマゾン商品の情報」に関する有効性を判断する

「アマゾン商品の情報」が、「当プラグイン用の商品情報」の対象であるかの判断では、
$adultProductEnable変数が保持する「アダルト商品の表示の有効性」を、考慮しています。

アダルト商品の表示・非表示の設定は、以下の設定項目で設定できます。

  • 当プラグインの「アフィリエイトの設定」
    • アマゾンの設定
      • アダルト商品

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

アダルト商品が表示の場合、「アマゾン商品の情報」を有効と判断する

private static function getItemEnabled($searchItem, bool $adultProductEnable): bool {

	if ($adultProductEnable) {
		return true;
	}

以下省略

$adultProductEnable変数が保持する「アダルト商品の表示の有効性」がtrueの場合、
$searchItem変数が保持する「アマゾン商品の情報」は、「当プラグイン用の商品情報」において、対象の商品であると判断できます。

よって、 return文でtrueを返します。

return文でtrueを返す場合、アダルト商品を表示しても良いです。

よって、$searchItem変数が保持する「アマゾン商品の情報」が、
アダルト商品であるか、一般商品であるかを問わず、当プラグインのショートコードの場所に表示します。

アダルト商品が非表示の場合、「アマゾン商品の情報」に関する有効性を判断する

private static function getItemEnabled($searchItem, bool $adultProductEnable): bool {

中略

	/*
	 * 以下、アダルト商品が無効と指定されている場合について
	 */

	if (isset ( $searchItem->ItemInfo ) and isset ( $searchItem->ItemInfo->ProductInfo ) and
			isset ( $searchItem->ItemInfo->ProductInfo->IsAdultProduct ) and
			isset ( $searchItem->ItemInfo->ProductInfo->IsAdultProduct->DisplayValue )) {
		;
	} else {
		return true; // アダルト商品の情報がない場合、有効とする。
	}

以下省略

上記ソースコードのif文は、
$adultProductEnable変数が保持する「アダルト商品の表示の有効性」がfalseの場合におけるif文です。

「アダルト商品の表示の有効性」がfalseなので、アダルト商品を表示しないという判断になっています。

isset ( $searchItem->ItemInfo->ProductInfo->IsAdultProduct->DisplayValue )

上記のisset文がtrueの場合、$searchItem変数が保持する「アマゾン商品の情報」において、
IsAdultProduct->DisplayValueメンバ変数が、アダルト商品であるかについて、値を保持しています。

この場合、ここのif文では何も処理をせず、次の処理に進みます。

「アマゾン商品の情報」が、アダルト商品に関する値を持っていない場合

} else {
	return true; // アダルト商品の情報がない場合、有効とする。
}

$searchItem変数が保持する「アマゾン商品の情報」が、アダルト商品であるかについて、値を保持していない場合、
上記のelse文に処理が来ます。

この場合、「アマゾン商品の情報」はアダルト商品に関する値を持っていないため、
一般商品である、と判断します。

よって、 return文でtrueを返します。

「アマゾン商品の情報」が、アダルト商品に関する値を持っている場合

private static function getItemEnabled($searchItem, bool $adultProductEnable): bool {

中略

	/*
	 * 以下、アダルト商品が無効と指定されている場合について
	 */

中略

	$isAdultProductValue = $searchItem->ItemInfo->ProductInfo->IsAdultProduct->DisplayValue;
	if ($isAdultProductValue) {
		return false; // $searchItemがアダルト商品なら、無効とする。
	} else {
		return true; // $searchItemが普通の商品なら、有効とする。
	}
}

$searchItem->ItemInfo->ProductInfo->IsAdultProductメンバ変数の例。

stdClass Object 
(
[ASIN] => XXXX000001

中略

[ItemInfo] => stdClass Object 
( 
  [ProductInfo] => stdClass Object 
  ( 
  [IsAdultProduct] => stdClass Object 
  ( 
  [DisplayValue] => false
  [Label] => IsAdultProduct 
  [Locale] => en_US 
  ) 
  )

中略

)

中略

)

$searchItem変数が保持する「アマゾン商品の情報」が、アダルト商品に関する値を持っている場合、
その値によって、「アマゾン商品の情報」に関する有効性を判断します。

$isAdultProductValue = $searchItem->ItemInfo->ProductInfo->IsAdultProduct->DisplayValue;

上記のソースコードでは、$isAdultProductValue変数に「アダルト商品に関する値」を代入します。

$isAdultProductValue変数の値がtrueの場合、アマゾン商品はアダルト商品です。

よって、「アマゾン商品の情報」は無効と判断します。
return文でfalseを返します。

$isAdultProductValue変数の値がfalseの場合、アマゾン商品は一般商品です。

よって、「アマゾン商品の情報」は有効と判断します。
return文でtrueを返します。

Nullポインターエラーの発生を防ぐために、4個のisset()関数を使っています

if (isset ( $searchItem->ItemInfo ) and isset ( $searchItem->ItemInfo->ProductInfo ) and
		isset ( $searchItem->ItemInfo->ProductInfo->IsAdultProduct ) and
		isset ( $searchItem->ItemInfo->ProductInfo->IsAdultProduct->DisplayValue )) {
	;
}

上記のソースコードでは、4個のisset()関数を使っています。

その訳は、nullオブジェクトのメンバ変数を参照した際、
Nullポインターエラーの発生を防ぐためです。

$searchItem->ItemInfo->ProductInfo->IsAdultProduct->DisplayValue

このように、いきなりDisplayValueメンバ変数を参照する場合、
ItemInfo->ProductInfo->IsAdultProduct
これら三つのメンバ変数がnullオブジェクトでないことが、必要です。

「アマゾン商品の検索結果」から取得した「アマゾン商品の情報」については、

ItemInfo->ProductInfo->IsAdultProduct
これら三つのメンバ変数が必ず存在する、とは言えません。

例えばIsAdultProductメンバ変数は、存在しないことがよくあります。

if文では、肯定的な条件分岐を優先する書き方をしています

if (isset ( $searchItem->ItemInfo ) and isset ( $searchItem->ItemInfo->ProductInfo ) and
		isset ( $searchItem->ItemInfo->ProductInfo->IsAdultProduct ) and
		isset ( $searchItem->ItemInfo->ProductInfo->IsAdultProduct->DisplayValue )) {
	;
} else {
	return true; // アダルト商品の情報がない場合、有効とする。
}

上記のif文では、肯定的な条件分岐を優先する書き方をしています。

そのため肯定的な条件が成り立った場合、何もしません。
よって、; セミコロンだけ記述しています。

if文の条件において、「何々である」と、肯定文で条件を判断したいです。
なので、; セミコロンだけを記述する、という書き方をしています。

4個のisset()の場合、

  1. 「ItemInfoメンバ変数が設定されている」
  2. そして「ProductInfoメンバ変数が設定されている」
  3. そして「IsAdultProductメンバ変数が設定されている」
  4. そして「DisplayValueメンバ変数が設定されている」

という風に、「何々である」と肯定文で条件を判断しています。

※関連記事:Javaソースコードにおいて、if文で肯定的な条件分岐を優先する書き方

「表示の有効性」を表すのに、Visibleを使う方がわかりやすいでしょう

アダルト商品の「表示の有効性」を保持する$adultProductEnable変数については、

Visible(視認性)という英単語を使う方が、わかりやすいでしょう。

例:$adultProductVisibleという変数名。

Visibleは、「表示の有効性」を表すのに向いている英単語のように思えるからです。

この記事を書いている時、Java Swingのプログラミングで、setVisibleという名前のメソッドがあったことを、ふと思い出しました。

SearchIndexResponse.phpのソースコード

<?php

namespace goodsmemo\amazon\withoutsdk;

use goodsmemo\amazon\withoutsdk\ImageResponse;
use goodsmemo\amazon\withoutsdk\PriceResponse;
use goodsmemo\amazon\withoutsdk\ProductionResponse;
use goodsmemo\item\Item;
use goodsmemo\item\ReviewItem;
use goodsmemo\item\html\HTMLUtils;
use goodsmemo\date\DateTextMaking;

require_once GOODS_MEMO_DIR . "amazon/withoutsdk/ImageResponse.php";
require_once GOODS_MEMO_DIR . "amazon/withoutsdk/PriceResponse.php";
require_once GOODS_MEMO_DIR . "amazon/withoutsdk/ProductionResponse.php";
require_once GOODS_MEMO_DIR . "item/Item.php";
require_once GOODS_MEMO_DIR . "item/ReviewItem.php";
require_once GOODS_MEMO_DIR . "item/html/HTMLUtils.php";
require_once GOODS_MEMO_DIR . "date/DateTextMaking.php";

class SearchIndexResponse {

	public static function makeItemArray($searchItemsResponse, int $numberToDisplay,
			bool $adultProductEnable) {

		$itemArray = array ();

		if (empty ( $searchItemsResponse ) or
				! property_exists ( $searchItemsResponse, 'SearchResult' ) or
				! property_exists ( $searchItemsResponse->SearchResult, 'Items' )) {

			return $itemArray; // 商品情報なし
		}

		$searchItems = $searchItemsResponse->SearchResult->Items;
		$priceTime = DateTextMaking::getUnixTimeMillSecond ();

		$searchItemCount = count ( $searchItems );
		$count = min ( $searchItemCount, $numberToDisplay );

		for($i = 0; $i < $count; $i ++) {

			$searchItem = $searchItems [$i];
			if (is_null ( $searchItem )) { // 念のため。配列の要素がNULLの場合
				continue;
			}

			if (SearchIndexResponse::getItemEnabled ( $searchItem, $adultProductEnable )) {

				$item = SearchIndexResponse::makeItem ( $searchItem, $priceTime );
				array_push ( $itemArray, $item );
			}
		}

		return $itemArray;
	}

	private static function getItemEnabled($searchItem, bool $adultProductEnable): bool {

		if ($adultProductEnable) {
			return true;
		}

		/*
		 * 以下、アダルト商品が無効と指定されている場合について
		 */

		if (isset ( $searchItem->ItemInfo ) and isset ( $searchItem->ItemInfo->ProductInfo ) and
				isset ( $searchItem->ItemInfo->ProductInfo->IsAdultProduct ) and
				isset ( $searchItem->ItemInfo->ProductInfo->IsAdultProduct->DisplayValue )) {
			;
		} else {
			return true; // アダルト商品の情報がない場合、有効とする。
		}

		$isAdultProductValue = $searchItem->ItemInfo->ProductInfo->IsAdultProduct->DisplayValue;
		if ($isAdultProductValue) {
			return false; // $searchItemがアダルト商品なら、無効とする。
		} else {
			return true; // $searchItemが普通の商品なら、有効とする。
		}
	}

	private static function makeItem($searchItem, float $priceTime): Item {

		$item = new Item ();

		if (isset ( $searchItem->DetailPageURL )) {
			$item->setPageURL ( esc_url ( $searchItem->DetailPageURL ) );
		}

		SearchIndexResponse::setItemInfoTo ( $item, $searchItem );

		SearchIndexResponse::setOffersTo ( $item, $searchItem );

		$imageItem = ImageResponse::makeImageItem ( $searchItem );
		$item->setImageItem ( $imageItem );

		$priceItem = PriceResponse::makePriceItem ( $searchItem, $priceTime );
		$item->setPriceItem ( $priceItem );

		$productionItem = ProductionResponse::makeProductionItem ( $searchItem );
		$item->setProductionItem ( $productionItem );

		$reviewItem = SearchIndexResponse::makeReviewItem ( $searchItem );
		$item->setReviewItem ( $reviewItem );

		return $item;
	}

	private static function setItemInfoTo(Item &$item, $searchItem) {

		if (isset ( $searchItem->ItemInfo )) {
			;
		} else {
			return;
		}

		$itemInfo = $searchItem->ItemInfo;

		if (isset ( $itemInfo->Title ) and isset ( $itemInfo->Title->DisplayValue )) {

			$titleValue = $itemInfo->Title->DisplayValue;
			$item->setTitle ( HTMLUtils::makePlainText ( $titleValue ) );
		}
	}

	private static function setOffersTo(Item &$item, $searchItem) {

		if (isset ( $searchItem->Offers )) {
			;
		} else {
			return;
		}

		$offers = $searchItem->Offers;

		if (isset ( $offers->Listings ) and isset ( $offers->Listings [0] )) {

			$listing = $offers->Listings [0];

			if (isset ( $listing->DeliveryInfo ) and
					isset ( $listing->DeliveryInfo->IsPrimeEligible )) {

				$isPrimeEligible = $listing->DeliveryInfo->IsPrimeEligible;
				if ($isPrimeEligible) {
					$item->setPreferentialMember ( HTMLUtils::makePlainText ( "✓prime" ) ); // "✓prime"
				}
			}

			if (isset ( $listing->MerchantInfo ) and isset ( $listing->MerchantInfo->Name )) {

				$merchantName = $listing->MerchantInfo->Name;
				$item->setShop ( HTMLUtils::makePlainText ( $merchantName ) );
			}
		}
	}

	private static function makeReviewItem($searchItem): ReviewItem {

		$reviewItem = new ReviewItem ();

		if (isset ( $searchItem->ItemInfo ) and isset ( $searchItem->ItemInfo->Features ) and
				isset ( $searchItem->ItemInfo->Features->DisplayValues )) {
			$featuresValues = $searchItem->ItemInfo->Features->DisplayValues; // string[]

			$featureArray = array ();
			foreach ( $featuresValues as $value ) {

				if ($value == NULL) {
					continue;
				}

				$feature = HTMLUtils::makePlainText ( $value );
				array_push ( $featureArray, $feature );
			}

			$reviewItem->setReviewLineArray ( $featureArray );
		}

		// TODO Check back later for updates
		// if (isset($node->EditorialReviews->EditorialReview->Content)) {//Noticd: Trying to get property of non-objectエラーが起きた。
		// $editorialReview = HTMLUtils::makePlainText($node->EditorialReviews->EditorialReview->Content);
		// $reviewItem->setPlainTextReview($editorialReview);
		// }

		return $reviewItem;
	}
}

【まとめ記事】へのリンク

【まとめ記事】アマゾンの商品を表示する場合、「アフィリエイト商品表示・WordPressプラグイン」のPHPソースコード解説

「アフィリエイト商品表示・WordPressプラグイン」を用いて、アマゾンの商品を表示する処理について、PHPソースコードを解説しています。