キーワードによる商品検索で、「アフィリエイト商品のHTML」を作成する
キーワードで商品検索して、商品情報を取得して、「アフィリエイト商品のHTML」を作成する。
上記の処理を行うPHPソースコードを解説しています。
「アフィリエイト商品のHTML」を作成するため、主に以下の三つの処理を行います。
- キーワードで商品検索して、「商品の検索結果」を取得すること。
- 取得した「商品の検索結果」から、「当プラグイン用の商品情報の配列」を作成すること。
- 作成した「当プラグイン用の商品情報の配列」を基に、「アフィリエイト商品のHTML」を作成すること。
- キーワードによる商品検索で、「アフィリエイト商品のHTML」を作成する
- 「アフィリエイト商品のHTML」を作成するため、主に三つの処理を行うmakeItemsHTML()関数
- makeItemsHTML()関数の主な三つの処理における、変数の例
- 「アフィリエイト商品のHTML」を作成する処理に関して、汎用化されているmakeItemsHTML()関数
- 商品情報をキャッシュしない場合、最新の「商品の検索結果」を取得して、「アフィリエイト商品のHTML」を作成する
- 「当プラグイン用の商品情報の配列」のキャッシュが無い場合、「当プラグイン用の商品情報の配列」を作成して、キャッシュに保存する
- 「当プラグイン用の商品情報の配列」のキャッシュを取得する
- 「当プラグイン用の商品情報の配列」から、「アフィリエイト商品のHTML」を作成する
- ItemSearchOperation.phpのソースコード
- 【まとめ記事】へのリンク
キーワードによる商品検索で、「アフィリエイト商品のHTML」を作成する
public static function makeItemsHTML(URLInfo $urlInfo, ItemHTMLOption $itemHTMLOption,
ItemsHTMLInfoMaker $itemsHTMLInfoMaker) {
$cacheExpirationInSeconds = $itemHTMLOption->getCacheExpirationInSeconds ();
if ($cacheExpirationInSeconds <= 0) {
$response = $itemsHTMLInfoMaker->requestItemSearch ( $urlInfo,
$itemHTMLOption->getNumberToDisplay () );
$itemArray = $itemsHTMLInfoMaker->makeItemArray ( $response, $itemHTMLOption ); // var_dump($itemArray);
$itemsHtml = ItemArrayHTMLMaking::makeItemArrayHTML ( $itemArray, $itemHTMLOption );
return $itemsHtml;
}
$itemArray = NULL;
$uniqueText = $itemsHTMLInfoMaker->makeUniqueText ( $itemHTMLOption );
// $transientID:キャッシュされるデータにつけるユニークな識別子。長さ 45 文字以下であること。
// md5() :32 文字の 16 進数からなるハッシュを返します。
$transientID = GOODS_MEMO_PREFIX . md5 ( $uniqueText ); // var_dump($transientID);
$transientItemArrayCache = get_transient ( $transientID );
if ($transientItemArrayCache !== FALSE) {
$binaryItemArray = base64_decode ( $transientItemArrayCache ); // var_dump($binaryItemArray);
if ($binaryItemArray !== FALSE) {
$itemArray = @unserialize ( $binaryItemArray ); // エラー抑制演算子:E_WARNINGが画面に表示されるのを防ぐ。//var_dump($itemArray);
if ($itemArray === FALSE) {
$itemArray = NULL;
}
}
}
if (is_null ( $itemArray )) {
$response = $itemsHTMLInfoMaker->requestItemSearch ( $urlInfo,
$itemHTMLOption->getNumberToDisplay () );
$itemArray = $itemsHTMLInfoMaker->makeItemArray ( $response, $itemHTMLOption ); // var_dump($itemArray);
/**
* レンタルサーバーのMySQLにおいて
* set_transient()に配列変数$itemArrayを設定する場合、失敗している場合があった。set_transient returns false.
* よって _transient_goodsmemoXXXX が作成されないため、429:Too Many Requestsエラーが起きていた。
* 設定する値を、64種類の英数字の文字列にした。
* テーブル: wp_options:option_value列 longtext型
*/
$binaryItemArray = serialize ( $itemArray ); // バイナリ文字列。データベースのBLOB型に保存できる。longtext型に保存できない場合があった。//var_dump($binaryItemArray);
$transientItemArray = base64_encode ( $binaryItemArray ); // 64種類の印字可能な英数字の文字列。データベースのlongtext型に保存できる。
/* 一時的にデータベースに商品情報を保存する。有効期限後、削除される。 */
set_transient ( $transientID, $transientItemArray, $cacheExpirationInSeconds ); // 失敗したら、falseを返した。
}
$itemsHtml = ItemArrayHTMLMaking::makeItemArrayHTML ( $itemArray, $itemHTMLOption );
return $itemsHtml;
}
キーワードで商品検索して、商品情報を取得して、「アフィリエイト商品のHTML」を作成します。
$itemsHtml変数が、作成された「アフィリエイト商品のHTML」を保持します。
$itemsHtml変数を、 return文で返します。
「アフィリエイト商品のHTML」を作成するため、主に三つの処理を行うmakeItemsHTML()関数
上記ソースコードのmakeItemsHTML()関数は、主に以下の三つの処理を行ないます。
- キーワードで商品検索して、「商品の検索結果」を取得すること。
- 取得した「商品の検索結果」から、「当プラグイン用の商品情報の配列」を作成すること。
- 作成した「当プラグイン用の商品情報の配列」を基に、「アフィリエイト商品のHTML」を作成すること。
上記の三つの処理は、ソースコードで言うと以下のものになります。
$response = $itemsHTMLInfoMaker->requestItemSearch ( $urlInfo,
$itemHTMLOption->getNumberToDisplay () );
$itemArray = $itemsHTMLInfoMaker->makeItemArray ( $response, $itemHTMLOption ); // var_dump($itemArray);
$itemsHtml = ItemArrayHTMLMaking::makeItemArrayHTML ( $itemArray, $itemHTMLOption );
- $itemsHTMLInfoMaker->requestItemSearch()メソッドを用いて、「商品の検索結果」を取得します。
- $itemsHTMLInfoMaker->makeItemArray()メソッドを用いて、「当プラグイン用の商品情報の配列」を作成します。
- ItemArrayHTMLMaking::makeItemArrayHTML()関数を用いて、「アフィリエイト商品のHTML」を作成します。
makeItemsHTML()関数は50行くらいありますが、
主な処理は、上記の三つの処理になります。
makeItemsHTML()関数では、
$itemArray変数が保持する「当プラグイン用の商品情報の配列」について、キャッシュの保存や取得の処理を行なっています。
そのため、makeItemsHTML()関数は50行くらいあります。
ですが、
「商品の検索結果」を取得して、「アフィリエイト商品のHTML」を作成するだけなら、
makeItemsHTML()関数は3行くらいになります。
「当プラグイン用の商品情報の配列」について、キャッシュ処理を行う
上記ソースコードのmakeItemsHTML()関数では、
$itemArray変数が保持する「当プラグイン用の商品情報の配列」について、キャッシュ処理を行なっています。
set_transient()関数を用いて、「当プラグイン用の商品情報の配列」のキャッシュを保存しています。
get_transient ()関数を用いて、「当プラグイン用の商品情報の配列」のキャッシュを取得しています。
上記のキャッシュ処理を行なうため、makeItemsHTML()関数の行数が多くなっています。
makeItemsHTML()関数の主な三つの処理における、変数の例
$response = $itemsHTMLInfoMaker->requestItemSearch ( $urlInfo,
$itemHTMLOption->getNumberToDisplay () );
$itemArray = $itemsHTMLInfoMaker->makeItemArray ( $response, $itemHTMLOption ); // var_dump($itemArray);
$itemsHtml = ItemArrayHTMLMaking::makeItemArrayHTML ( $itemArray, $itemHTMLOption );
makeItemsHTML()関数の主な三つの処理における、それぞれの変数の例です。
$itemsHTMLInfoMaker->requestItemSearch()メソッドにおける、変数の例
$response変数は、キーワードで商品検索して取得した「商品の検索結果」を保持します。
$response変数の例については、以下の関連記事を参照してください。
※関連記事:「アマゾン商品の検索結果」を保持する、PHPオブジェクトの$responseObject変数。
$response変数は、$responseObject変数と同じです。
$itemsHTMLInfoMaker->makeItemArray()メソッドにおける、変数の例
$itemArray変数は、「商品の検索結果」から作成した「当プラグイン用の商品情報の配列」を保持します。
$itemArray変数の例については、以下の関連記事を参照してください。
※関連記事:「アマゾン商品の検索結果」から、「当プラグイン用の商品情報の配列」を作成する、「当プラグイン用の商品情報の配列」を保持する$itemArray配列変数の例。
ItemArrayHTMLMaking::makeItemArrayHTML()関数における、変数の例
$itemsHtml変数は、「当プラグイン用の商品情報の配列」から作成した「アフィリエイト商品のHTML」を保持します。
アマゾンの「アフィリエイト商品のHTML」を保持する$itemsHtml変数の例。
<div class="goodsmemo-amazon-items goodsmemo-items">
<div class="goodsmemo-amazon-item1 goodsmemo-oneItem">
<div class="imageArea" >
<a href="https://www.amazon.co.jp/dp/XXXX400276?tag=sample-22&linkCode=osi&th=1&psc=1">
<img src="https://m.media-amazon.com/images/I/XXXXiVIarbL._SL160_.jpg" alt="プログラミングPHP 第4版" width="125" height="160" />
</a>
</div>
<p class="title" >
<a href="https://www.amazon.co.jp/dp/XXXX400276?tag=sample-22&linkCode=osi&th=1&psc=1">プログラミングPHP 第4版</a>
</p>
<div class="itemDetailsTable">
<div class="tableRow" >
<p class="rowLabel">価格:</p>
<p class="price">
<span class="priceValue">4,290 円</span><span class="priceTime">(2023年4月15日 16:58時点<a href="#goodsmemo-amazon-items-footer-2023-04-15-16-58-58-87" class="priceTimeLink" >詳細はこちら</a>)</span>
</p>
</div>
<div class="tableRow" style="display: none;">
<p class="rowLabel"></p>
<p class="preferentialMember"></p>
</div>
<div class="tableRow" style="display: none;">
<p class="rowLabel"></p>
<p class="postage"></p>
</div>
</div>
<div class="itemDetailsTable">
<div class="tableRow" style="display: none;">
<p class="rowLabel">ポイント:</p>
<p class="pointRate"> 倍</p>
</div>
<div class="tableRow" style="display: none;">
<p class="rowLabel"></p>
<p class="pointRateStartTime">✓開始日時 </p>
</div>
<div class="tableRow" style="display: none;">
<p class="rowLabel"></p>
<p class="pointRateEndTime">✓終了日時 </p>
</div>
</div>
<div class="itemDetailsTable">
<div class="tableRow" >
<p class="rowLabel"></p>
<p class="contributor">Kevin XXXX(著), Peter XXXX(著), 永井 XXXX(監修), 中野 XXXX(翻訳)</p>
</div>
<div class="tableRow" >
<p class="rowLabel">出版社:</p>
<p class="manufacturer">XXXXジャパン</p>
</div>
<div class="tableRow" >
<p class="rowLabel">種別:</p>
<p class="binding">単行本(ソフトカバー)</p>
</div>
<div class="tableRow" >
<p class="rowLabel">販売店:</p>
<p class="shop">Amazon.co.jp</p>
</div>
</div>
<p class="review">商品の主な機能に関する情報その1。<br>商品の主な機能に関する情報その2。<br>商品の主な機能に関する情報その3。</p>
</div>
<div id="goodsmemo-amazon-items-footer-2023-04-15-16-58-58-87" class="footer">
価格の詳細:価格および発送可能時期は表示された日付/時刻の時点のものであり、変更される場合があります。
本商品の購入においては、購入の時点でAmazon.co.jpに表示されている価格および発送可能時期の情報が適用されます。
</div>
</div>
「アフィリエイト商品のHTML」を作成する処理に関して、汎用化されているmakeItemsHTML()関数
public static function makeItemsHTML(URLInfo $urlInfo, ItemHTMLOption $itemHTMLOption,
ItemsHTMLInfoMaker $itemsHTMLInfoMaker) {
中略
$response = $itemsHTMLInfoMaker->requestItemSearch ( $urlInfo,
$itemHTMLOption->getNumberToDisplay () );
$itemArray = $itemsHTMLInfoMaker->makeItemArray ( $response, $itemHTMLOption ); // var_dump($itemArray);
$itemsHtml = ItemArrayHTMLMaking::makeItemArrayHTML ( $itemArray, $itemHTMLOption );
以下省略
上記ソースコードのmakeItemsHTML()関数は、以下の点において汎用化されています。
- キーワードで商品検索して、「商品の検索結果」を取得すること。
- 取得した「商品の検索結果」から、「当プラグイン用の商品情報の配列」を作成すること。
- 作成した「当プラグイン用の商品情報の配列」を基に、「アフィリエイト商品のHTML」を作成すること。
特に1番と2番の処理については、ItemsHTMLInfoMakerインターフェースのおかげで、以下のように汎用化できています。
- $itemsHTMLInfoMaker->requestItemSearch()メソッドを用いて、「商品の検索結果」を取得します。
- $itemsHTMLInfoMaker->makeItemArray()メソッドを用いて、「当プラグイン用の商品情報の配列」を作成します。
汎用化されたことで、
- アマゾンの商品を検索して、アマゾンの「アフィリエイト商品のHTML」を作成すること、
- 楽天市場の商品を検索して、楽天市場の「アフィリエイト商品のHTML」を作成すること、
どちらの処理にも対応しています。
よって
- アマゾンアソシエイト
- 楽天アフィリエイト
どちらのアフィリエイトにも対応したHTMLを作成できます。
「汎用化された商品情報の配列」を作成する処理を規定するItemsHTMLInfoMakerインターフェース
ItemsHTMLInfoMakerインターフェースでは、以下の三つのメソッドを宣言しています。
ItemsHTMLInfoMakerインターフェースのメソッド宣言 | ItemsHTMLInfoMakerインターフェースのメソッドの機能 |
---|---|
requestItemSearch() | 何かに対して商品検索を行い、「商品の検索結果」を得る。 |
makeItemArray() | 取得した「商品の検索結果」から、「当プラグイン用の商品情報の配列」を作成する。 |
makeUniqueText() | キーワードによる商品検索の処理に対応する、一意な文字列を作成する。 一意な文字列は、「当プラグイン用の商品情報の配列」などをキャッシュに保存する際、そのキャッシュを識別する識別子を作成するために利用される。 |
ItemsHTMLInfoMakerインターフェースで宣言されている以下の二つのメソッド
- requestItemSearch()メソッド
- makeItemArray()メソッド
これらのメソッドを使うことで、「当プラグイン用の商品情報の配列」を作成できます。
$response = $itemsHTMLInfoMaker->requestItemSearch ( $urlInfo,
$itemHTMLOption->getNumberToDisplay () );
$itemArray = $itemsHTMLInfoMaker->makeItemArray ( $response, $itemHTMLOption );
$itemArray配列の変数が、「当プラグイン用の商品情報の配列」を保持します。
$response変数と$itemArray配列の変数の例については、
当記事の「見出し」
makeItemsHTML()関数の主な三つの処理における変数の例
を参照してください。
「当プラグイン用の商品情報の配列」は汎用化されているので、共通化されたmakeItemArrayHTML()関数で、「アフィリエイト商品のHTML」を作成できる
$itemArray配列の変数が保持する「当プラグイン用の商品情報の配列」とは、「汎用化された商品情報の配列」と言えます。
汎用化されたため、例えば
「アマゾン商品の情報の配列」が「当プラグイン用の商品情報の配列」に、作り替えられています。
「アマゾン商品の情報」が「一般的な商品情報」に、変換されています。
$itemsHtml = ItemArrayHTMLMaking::makeItemArrayHTML ( $itemArray, $itemHTMLOption );
「一般的な商品情報」に変換されたので、
上記ソースコードのItemArrayHTMLMaking::makeItemArrayHTML()関数だけで、「アフィリエイト商品のHTML」を作成できます。
ItemArrayHTMLMaking::makeItemArrayHTML()関数という共通化された関数だけで、
- アマゾンの「アフィリエイト商品のHTML」
- 楽天市場の「アフィリエイト商品のHTML」
どちらのHTMLも作成できます。
商品情報をキャッシュしない場合、最新の「商品の検索結果」を取得して、「アフィリエイト商品のHTML」を作成する
$cacheExpirationInSeconds = $itemHTMLOption->getCacheExpirationInSeconds ();
if ($cacheExpirationInSeconds <= 0) {
$response = $itemsHTMLInfoMaker->requestItemSearch ( $urlInfo,
$itemHTMLOption->getNumberToDisplay () );
$itemArray = $itemsHTMLInfoMaker->makeItemArray ( $response, $itemHTMLOption ); // var_dump($itemArray);
$itemsHtml = ItemArrayHTMLMaking::makeItemArrayHTML ( $itemArray, $itemHTMLOption );
return $itemsHtml;
}
当プラグインの設定において、「商品情報をキャッシュしない」と設定されている場合、
最新の「商品の検索結果」を取得して、「アフィリエイト商品のHTML」を作成します。
上記ソースコードにおいて、$cacheExpirationInSeconds変数に、「商品情報のキャッシュ時間(秒)」を代入します。
$cacheExpirationInSeconds変数の値が0以下、
つまり、商品情報のキャッシュ時間が0秒と指定されている場合、
$itemArray変数が保持する「当プラグイン用の商品情報の配列」をキャッシュしません。
キーワードで商品検索して、最新の商品情報を取得して、「アフィリエイト商品のHTML」を作成します。
作成された「アフィリエイト商品のHTML」は、$itemsHtml変数に代入されます。
$itemsHtml変数は、 return文によって返されます。
「アフィリエイト商品のHTML」を作成する処理については、
当記事の「見出し」
「アフィリエイト商品のHTML」を作成するため、主に三つの処理を行うmakeItemsHTML()関数
を参照してください。
当プラグインの「アフィリエイトの設定」の「商品情報のキャッシュ時間(秒)」
$cacheExpirationInSeconds変数に代入される「商品情報のキャッシュ時間(秒)」は、以下の設定画面で設定されています。
- 当プラグインの「アフィリエイトの設定」
- アマゾンの設定
- 商品情報のキャッシュ時間(秒)
- アマゾンの設定
※関連記事:アフィリエイト商品表示・WordPressプラグイン、アフィリエイトの設定、アマゾンの設定。
「当プラグイン用の商品情報の配列」のキャッシュが無い場合、「当プラグイン用の商品情報の配列」を作成して、キャッシュに保存する
$itemArray = NULL;
$uniqueText = $itemsHTMLInfoMaker->makeUniqueText ( $itemHTMLOption );
// $transientID:キャッシュされるデータにつけるユニークな識別子。長さ 45 文字以下であること。
// md5() :32 文字の 16 進数からなるハッシュを返します。
$transientID = GOODS_MEMO_PREFIX . md5 ( $uniqueText ); // var_dump($transientID);
//「当プラグイン用の商品情報の配列」のキャッシュが無い場合
//$itemArray変数は、NULL値です。
if (is_null ( $itemArray )) {
$response = $itemsHTMLInfoMaker->requestItemSearch ( $urlInfo,
$itemHTMLOption->getNumberToDisplay () );
$itemArray = $itemsHTMLInfoMaker->makeItemArray ( $response, $itemHTMLOption ); // var_dump($itemArray);
/**
* レンタルサーバーのMySQLにおいて
* set_transient()に配列変数$itemArrayを設定する場合、失敗している場合があった。set_transient returns false.
* よって _transient_goodsmemoXXXX が作成されないため、429:Too Many Requestsエラーが起きていた。
* 設定する値を、64種類の英数字の文字列にした。
* テーブル: wp_options:option_value列 longtext型
*/
$binaryItemArray = serialize ( $itemArray ); // バイナリ文字列。データベースのBLOB型に保存できる。longtext型に保存できない場合があった。//var_dump($binaryItemArray);
$transientItemArray = base64_encode ( $binaryItemArray ); // 64種類の印字可能な英数字の文字列。データベースのlongtext型に保存できる。
/* 一時的にデータベースに商品情報を保存する。有効期限後、削除される。 */
set_transient ( $transientID, $transientItemArray, $cacheExpirationInSeconds ); // 失敗したら、falseを返した。
}
「当プラグイン用の商品情報の配列」のキャッシュが無い場合、
「商品の検索結果」を取得して、「当プラグイン用の商品情報の配列」を作成して、キャッシュに保存します。
「当プラグイン用の商品情報の配列」を保持する$itemArray変数がNULL値の場合、
「当プラグイン用の商品情報の配列」のキャッシュがありません。
この場合、以下の手順で「当プラグイン用の商品情報の配列」を作成します。
- $itemsHTMLInfoMaker->requestItemSearch()メソッドを用いて、「商品の検索結果」を取得します。
- $itemsHTMLInfoMaker->makeItemArray()メソッドを用いて、「当プラグイン用の商品情報の配列」を作成します。
$itemArray配列の変数が、作成された「当プラグイン用の商品情報の配列」を保持します。
「当プラグイン用の商品情報の配列」を、キャッシュに保存する
$binaryItemArray = serialize ( $itemArray ); // バイナリ文字列。データベースのBLOB型に保存できる。longtext型に保存できない場合があった。//var_dump($binaryItemArray);
$transientItemArray = base64_encode ( $binaryItemArray ); // 64種類の印字可能な英数字の文字列。データベースのlongtext型に保存できる。
/* 一時的にデータベースに商品情報を保存する。有効期限後、削除される。 */
set_transient ( $transientID, $transientItemArray, $cacheExpirationInSeconds ); // 失敗したら、falseを返した。
ワードプレスのキャッシュ機能を利用できるset_transient()関数を用いて、
「当プラグイン用の商品情報の配列」をキャッシュに保存します。
$transientID変数は、保存するキャッシュを識別する識別子です。
保存するキャッシュを特定する、一意な文字列です。
$transientItemArray変数は、Base64形式の「当プラグイン用の商品情報の配列」を保持しています。
$cacheExpirationInSeconds変数は、キャッシュを保存する時間です。
保存したキャッシュが期限切れになるまでの秒数です。
$cacheExpirationInSeconds変数については、
当記事の「見出し」
当プラグインの「アフィリエイトの設定」の「商品情報のキャッシュ時間(秒)」
を参照してください。
キャッシュに保存するため、「当プラグイン用の商品情報の配列」を「バイトストリーム表現の文字列」に変換する
set_transient ( $transientID, $transientItemArray, $cacheExpirationInSeconds ); // 失敗したら、falseを返した。
set_transient()関数は、配列変数などのオブジェクト変数を、キャッシュデータとして保存できる関数です。
よって、「当プラグイン用の商品情報の配列」を保持する$itemArray配列の変数を、キャッシュデータとして保存できるはずです。
ですが以前(たぶん2018年当時)、
set_transient()関数を用いて、$itemArray配列の変数をキャッシュに保存する場合、
失敗している場合がありました。
set_transient()関数の戻り値が、falseでした。
なのでやむを得ず、
$itemArray配列の変数を文字列に変換して、キャッシュに保存するように修正しました。
$binaryItemArray = serialize ( $itemArray ); // バイナリ文字列。データベースのBLOB型に保存できる。longtext型に保存できない場合があった。//var_dump($binaryItemArray);
PHPのserialize()関数は、配列やオブジェクトなどの値を、文字列に変換する関数です。
この関数の戻り値は、「バイトストリーム表現の文字列」です。
配列やオブジェクトの型と値を表す特殊な形式の文字列になります。
$binaryItemArray変数には、$itemArray配列変数の値を表す「バイトストリーム表現の文字列」が、代入されます。
「バイトストリーム表現の文字列」について
serialize()関数の戻り値である「バイトストリーム表現の文字列」の例を、以下に示します。
<?php
// 配列を作成
$array = array("apple", "banana", "cherry");
// 配列をシリアライズ
$serialized = serialize($array);
// シリアライズした配列を出力
echo $serialized;
?>
このコードを実行すると、以下のような出力が得られます。
a:3:{i:0;s:5:"apple";i:1;s:6:"banana";i:2;s:6:"cherry";}
この出力された「バイトストリーム表現の文字列」は、
- 配列の型と要素数、
- インデックスと値
などを表しています。
`a:3`は配列であることと、要素数が3であることを示します。
`i:0`は、インデックスが0であることを示します。
`s:5:"apple"`は、値が文字列で長さが5であることと、その内容を示しています。
"banana"や"cherry"の要素も、同様に表現されています。
バイトストリーム表現の「当プラグイン用の商品情報の配列」を、Base64形式の文字列に変換して、キャッシュに保存する
$transientItemArray = base64_encode ( $binaryItemArray ); // 64種類の印字可能な英数字の文字列。データベースのlongtext型に保存できる。
以前(たぶん2018年当時)、
set_transient()関数を用いて、「バイトストリーム表現の文字列」を保持する$binaryItemArray変数をキャッシュに保存する場合も、
失敗していたようです。
set_transient()関数の戻り値が、falseでした。
よってやむを得ず、
「バイトストリーム表現の文字列」を「Base64形式のASCII文字列」に変換して、キャッシュデータとして保存するようにしました。
PHPのbase64_encode()関数は、データをBase64形式にエンコードする関数です。
Base64形式とは、バイナリデータを64種類の文字(A-Z, a-z, 0-9, +, /)で表現する方法です。
$transientItemArray変数には、$binaryItemArray変数の値を表す「Base64形式の文字列」が、代入されます。
set_transient ( $transientID, $transientItemArray, $cacheExpirationInSeconds ); // 失敗したら、falseを返した。
set_transient()関数の引数に、
「Base64形式の文字列」に変換された「当プラグイン用の商品情報の配列」を
($transientItemArray変数を)指定します。
そうすることで、
エラーなしで、「当プラグイン用の商品情報の配列」をキャッシュに保存できるようになりました。
「Base64形式の文字列」について
base64_encode()関数の戻り値である「Base64形式の文字列」の例を、以下に示します。
<?php
$str = 'こんにちは、世界!';
echo base64_encode($str);
?>
このコードを実行すると、次のような出力が得られます。
5L2g5aW977yM44Gr44Gh44GvIQ==
「Base64形式の文字列」とは、Base64方式でデータを変換した結果の文字列です。
Base64方式とは、データを64種類の英数字と記号で表現するエンコード方式です。
Base64方式では、データを6ビットずつに分割して、変換表を使って文字に変換します。
変換について言うと、バイナリデータを6ビットずつに分割して、それぞれに対応するASCII文字を割り当てます。
ASCII文字は、
- 大文字のAからZ、
- 小文字のaからz、
- 数字の0から9、
- 記号の+と/
の64種類です。
例えば、文字列"ABC"は、
バイナリデータでは
"01000001 01000010 01000011"となります。
これを6ビットずつに分割すると
"010000 010100 001001 000011"となります。
これらのビット列を、変換表に従って文字に変換すると
"QUJD"となります。
このようにして、任意のデータを英数字と記号で表現します。
バイナリデータが6ビットで割り切れない場合は、余ったビットに0を補って6ビットにします。
そして、変換後のASCII文字列の末尾に、補った0の数に応じて=を付加します。
「当プラグイン用の商品情報の配列」のキャッシュを識別する、トランジェント識別子を作成する
$uniqueText = $itemsHTMLInfoMaker->makeUniqueText ( $itemHTMLOption );
// $transientID:キャッシュされるデータにつけるユニークな識別子。長さ 45 文字以下であること。
// md5() :32 文字の 16 進数からなるハッシュを返します。
$transientID = GOODS_MEMO_PREFIX . md5 ( $uniqueText ); // var_dump($transientID);
GOODS_MEMO_PREFIX定数の定義。
define ( "GOODS_MEMO_PREFIX", "goodsmemo" );
上記ソースコードの$transientID変数は、キャッシュを特定するトランジェント識別子を保持します。
set_transient()関数を用いて、データをキャッシュに保存する場合、トランジェント識別子が必要です。
例えば、「当プラグイン用の商品情報の配列」をキャッシュに保存する場合、
保存する「当プラグイン用の商品情報の配列」と一対一で対応するトランジェント識別子が、必要になります。
トランジェント識別子については、
- 一意な文字列であること
- 文字列の長さは40文字以下であること
これらの点が推奨されています。
この推奨されている事項を守るために、
当プラグインを示す接頭辞(GOODS_MEMO_PREFIX)とmd5()関数を使って、トランジェント識別子を作成しています。
トランジェント識別子の作成については、以下の関連記事を参照してください。
※関連記事:Product Advertising API 利用不可の時に表示する、「表示するHTML」を作成する、トランジェント識別子を作成する。
トランジェント識別子を作成するため、キーワードによる商品検索の検索条件に対応する、一意な文字列を作成する
$uniqueText = $itemsHTMLInfoMaker->makeUniqueText ( $itemHTMLOption );
上記ソースコードの$uniqueText変数は、
キーワードによる商品検索の検索条件に対応する、一意な文字列を保持します。
この「検索条件に対応する一意な文字列」は、トランジェント識別子を作成するために使用されます。
この「検索条件に対応する一意な文字列」については、以下の関連記事を参照してください。
※関連記事:アマゾン商品のHTMLに関する情報を作成する、「アマゾンにおける、キーワードによる商品検索の検索条件に対応する、一意な文字列を作成する」。
「当プラグイン用の商品情報の配列」のキャッシュを取得する
$itemArray = NULL;
$uniqueText = $itemsHTMLInfoMaker->makeUniqueText ( $itemHTMLOption );
// $transientID:キャッシュされるデータにつけるユニークな識別子。長さ 45 文字以下であること。
// md5() :32 文字の 16 進数からなるハッシュを返します。
$transientID = GOODS_MEMO_PREFIX . md5 ( $uniqueText ); // var_dump($transientID);
$transientItemArrayCache = get_transient ( $transientID );
if ($transientItemArrayCache !== FALSE) {
$binaryItemArray = base64_decode ( $transientItemArrayCache ); // var_dump($binaryItemArray);
if ($binaryItemArray !== FALSE) {
$itemArray = @unserialize ( $binaryItemArray ); // エラー抑制演算子:E_WARNINGが画面に表示されるのを防ぐ。//var_dump($itemArray);
if ($itemArray === FALSE) {
$itemArray = NULL;
}
}
}
get_transient()関数を用いて、「当プラグイン用の商品情報の配列」のキャッシュを取得します。
取得できた場合、
キャッシュデータから復元した「当プラグイン用の商品情報の配列」を、$itemArray配列の変数に代入します。
実際のところ、base64_decode()関数とunserialize()関数を用いて、$itemArray配列の変数に「当プラグイン用の商品情報の配列」を代入します。
get_transient()関数は、ワードプレスのデータベースからキャッシュを取得する関数です。
get_transient()関数の引数に、トランジェント識別子を指定します。
そのトランジェント識別子に対応するキャッシュを返します。
もしも、
- トランジェント識別子が存在しない、
- または、キャッシュの有効期限が切れている
このような場合は、get_transient()関数はfalseを返します。
戻り値がfalseの場合、上記ソースコードでは、
$itemArray配列の変数はNULL値のまま、となります。
「当プラグイン用の商品情報の配列」を特定するトランジェント識別子
$transientID = GOODS_MEMO_PREFIX . md5 ( $uniqueText ); // var_dump($transientID);
GOODS_MEMO_PREFIX定数の定義。
define ( "GOODS_MEMO_PREFIX", "goodsmemo" );
上記ソースコードの$transientID変数は、トランジット識別子です。
このトランジェント識別子は、キャッシュデータとして保存されている「当プラグイン用の商品情報の配列」を特定する識別子です。
get_transient()関数の引数に、$transientID変数を指定することで、キャッシュを取得できます。
トランジェント識別子については、
当記事の「見出し」
「当プラグイン用の商品情報の配列」のキャッシュを識別する、トランジェント識別子を作成する
を参照してください。
「当プラグイン用の商品情報の配列」のキャッシュを取得して、「バイトストリーム表現の文字列」を復元する
$transientItemArrayCache = get_transient ( $transientID );
中略
$binaryItemArray = base64_decode ( $transientItemArrayCache ); // var_dump($binaryItemArray);
get_transient()関数を用いて、
$transientItemArrayCache変数に、Base64形式の「当プラグイン用の商品情報の配列」を、代入します。
base64_decode()関数の引数に、$transientItemArrayCache変数を指定して、
Base64形式の「当プラグイン用の商品情報の配列」を、復元します。
$binaryItemArray変数に、バイトストリーム表現の「当プラグイン用の商品情報の配列」を、代入します。
PHP関数のbase64_decode()関数は、Base64方式によりエンコードされたデータを、デコードするための関数です。
デコードとは、エンコードされたデータを元のデータに戻す、という意味です。
Base64形式の「当プラグイン用の商品情報の配列」については、
当記事の「見出し」
バイトストリーム表現の「当プラグイン用の商品情報の配列」を、Base64形式の文字列に変換して、キャッシュに保存する
を参照してください。
バイトストリーム表現の「当プラグイン用の商品情報の配列」については、
当記事の「見出し」
キャッシュに保存するため、「当プラグイン用の商品情報の配列」を「バイトストリーム表現の文字列」に変換する
を参照してください。
「バイトストリーム表現の文字列」から、「当プラグイン用の商品情報の配列」を復元する
$itemArray = @unserialize ( $binaryItemArray ); // エラー抑制演算子:E_WARNINGが画面に表示されるのを防ぐ。//var_dump($itemArray);
if ($itemArray === FALSE) {
$itemArray = NULL;
}
$binaryItemArray変数は、バイトストリーム表現の「当プラグイン用の商品情報の配列」を保持します。
unserialize()関数の引数に$binaryItemArray変数を指定して、「当プラグイン用の商品情報の配列」を復元します。
$itemArray配列の変数に、「当プラグイン用の商品情報の配列」を代入します。
unserialize()関数の戻り値がfalseの場合、
バイトストリーム表現の「当プラグイン用の商品情報の配列」を、復元できなかったことになります。
この場合、$itemArray配列の変数にNULL値を代入します。
unserialize()関数は、シリアライズされた文字列を元の値に戻す関数です。
例えば、配列やオブジェクトなどをserialize()関数で文字列に変換したものを、unserialize()関数で元に戻すことができます。
unserialize()関数の処理で、エラーが発生していたようです
$itemArray = @unserialize ( $binaryItemArray ); // エラー抑制演算子:E_WARNINGが画面に表示されるのを防ぐ。//var_dump($itemArray);
unserialize()関数に、エラー制御演算子の@文字が付いています。
エラー制御演算子とは、PHPの式の前に@を付けることで、その式によって発生するエラーメッセージを無視できる演算子です。
unserialize()関数は、不正な文字列や不完全な文字列を引数に渡すと、E_WARNINGレベルのエラーを発生させます。
E_WARNINGレベルのエラーは、実行を停止せずに警告を表示するエラーです。
以前(たぶん2018年頃)、unserialize()関数の処理でE_WARNINGレベルのエラーが起きていたようです。
そのため、エラー制御演算子を使っています。
「当プラグイン用の商品情報の配列」から、「アフィリエイト商品のHTML」を作成する
public static function makeItemsHTML(URLInfo $urlInfo, ItemHTMLOption $itemHTMLOption,
ItemsHTMLInfoMaker $itemsHTMLInfoMaker) {
//$itemArray配列の変数は、
//キャッシュから取得した「当プラグイン用の商品情報の配列」
//または
//最新の「商品の検索結果」から作成した「当プラグイン用の商品情報の配列」
//のいずれかです。
$itemsHtml = ItemArrayHTMLMaking::makeItemArrayHTML ( $itemArray, $itemHTMLOption );
return $itemsHtml;
}
「当プラグイン用の商品情報の配列」から、「アフィリエイト商品のHTML」を作成します。
$itemsHtml変数が、作成された「アフィリエイト商品のHTML」を保持します。
$itemsHtml変数を、 return文で返します。
$itemArray配列の変数は、「当プラグイン用の商品情報の配列」を保持します。
以下のいずれかを、保持しています。
- キャッシュから取得した「当プラグイン用の商品情報の配列」。
- 最新の「商品の検索結果」から作成した「当プラグイン用の商品情報の配列」。
ItemArrayHTMLMaking::makeItemArrayHTML()関数は、「アフィリエイト商品のHTML」を作成する関数です。
ItemArrayHTMLMaking::makeItemArrayHTML()関数の引数に、
「当プラグイン用の商品情報の配列」を保持する$itemArray配列の変数を、指定します。
以上より、「アフィリエイト商品のHTML」が作成されます。
「アフィリエイト商品のHTML」の例については、
当記事の「見出し」
ItemArrayHTMLMaking::makeItemArrayHTML()関数における、変数の例
を参照してください。
ItemSearchOperation.phpのソースコード
<?php
namespace goodsmemo\item;
use goodsmemo\network\URLInfo;
use goodsmemo\item\html\ItemHTMLOption;
use goodsmemo\item\ItemsHTMLInfoMaker;
use goodsmemo\item\html\ItemArrayHTMLMaking;
require_once GOODS_MEMO_DIR . "network/URLInfo.php";
require_once GOODS_MEMO_DIR . "item/html/ItemHTMLOption.php";
require_once GOODS_MEMO_DIR . "item/ItemsHTMLInfoMaker.php";
require_once GOODS_MEMO_DIR . "item/html/ItemArrayHTMLMaking.php";
class ItemSearchOperation {
public static function makeItemsHTML(URLInfo $urlInfo, ItemHTMLOption $itemHTMLOption,
ItemsHTMLInfoMaker $itemsHTMLInfoMaker) {
$cacheExpirationInSeconds = $itemHTMLOption->getCacheExpirationInSeconds ();
if ($cacheExpirationInSeconds <= 0) {
$response = $itemsHTMLInfoMaker->requestItemSearch ( $urlInfo,
$itemHTMLOption->getNumberToDisplay () );
$itemArray = $itemsHTMLInfoMaker->makeItemArray ( $response, $itemHTMLOption ); // var_dump($itemArray);
$itemsHtml = ItemArrayHTMLMaking::makeItemArrayHTML ( $itemArray, $itemHTMLOption );
return $itemsHtml;
}
$itemArray = NULL;
$uniqueText = $itemsHTMLInfoMaker->makeUniqueText ( $itemHTMLOption );
// $transientID:キャッシュされるデータにつけるユニークな識別子。長さ 45 文字以下であること。
// md5() :32 文字の 16 進数からなるハッシュを返します。
$transientID = GOODS_MEMO_PREFIX . md5 ( $uniqueText ); // var_dump($transientID);
$transientItemArrayCache = get_transient ( $transientID );
if ($transientItemArrayCache !== FALSE) {
$binaryItemArray = base64_decode ( $transientItemArrayCache ); // var_dump($binaryItemArray);
if ($binaryItemArray !== FALSE) {
$itemArray = @unserialize ( $binaryItemArray ); // エラー抑制演算子:E_WARNINGが画面に表示されるのを防ぐ。//var_dump($itemArray);
if ($itemArray === FALSE) {
$itemArray = NULL;
}
}
}
if (is_null ( $itemArray )) {
$response = $itemsHTMLInfoMaker->requestItemSearch ( $urlInfo,
$itemHTMLOption->getNumberToDisplay () );
$itemArray = $itemsHTMLInfoMaker->makeItemArray ( $response, $itemHTMLOption ); // var_dump($itemArray);
/**
* レンタルサーバーのMySQLにおいて
* set_transient()に配列変数$itemArrayを設定する場合、失敗している場合があった。set_transient returns false.
* よって _transient_goodsmemoXXXX が作成されないため、429:Too Many Requestsエラーが起きていた。
* 設定する値を、64種類の英数字の文字列にした。
* テーブル: wp_options:option_value列 longtext型
*/
$binaryItemArray = serialize ( $itemArray ); // バイナリ文字列。データベースのBLOB型に保存できる。longtext型に保存できない場合があった。//var_dump($binaryItemArray);
$transientItemArray = base64_encode ( $binaryItemArray ); // 64種類の印字可能な英数字の文字列。データベースのlongtext型に保存できる。
/* 一時的にデータベースに商品情報を保存する。有効期限後、削除される。 */
set_transient ( $transientID, $transientItemArray, $cacheExpirationInSeconds ); // 失敗したら、falseを返した。
}
$itemsHtml = ItemArrayHTMLMaking::makeItemArrayHTML ( $itemArray, $itemHTMLOption );
return $itemsHtml;
}
}