楽天APIのサンプルコード

楽天ウェブサービスの商品検索APIのサンプルコードです。

まずはデモページをお試しください。

動作させるには楽天のアプリIDとアフィリエイトIDが必要です。

<?php

/**********************************************************************/

//楽天商品検索API
$appId = ''; //アプリID
$affId = ''; //アフィリエイトID

/**********************************************************************/

echo '<div style="width:80%;margin:5% auto;">';

echo '<div style="margin:0; padding:0">';

?>
<div style="margin:0 0 2% 0;">
<form name="searchform" id="itemsearchform" method="get" action="">
<input type="text" name="keyword" id="itemkeyword" value="" />
<input type="submit" id="itemsubmit" value="検索" />
</form>
</div>
<?php

$keyword = htmlspecialchars($_GET['keyword'], ENT_QUOTES);
$e_keyword  = urlencode($keyword);
$currentpage = (empty($_GET['page'])) ? 1 : $_GET['page'];

$first     = $currentpage * 10 - 9;
$last      = $currentpage * 10;

$baseurl = 'https://app.rakuten.co.jp/services/api/IchibaItem/Search/20140222?format=json';
$rsparam = array();

if ($e_keyword != "") {
  $rsparam['keyword'] = $e_keyword;
}

$rsparam['applicationId'] = $appId;
$rsparam['affiliateId'] = $affId;
$rsparam['hits']      = 10;
$rsparam['field']     = 0;
$rsparam['imageFlag'] = 0;
$rsparam['page']      = $currentpage;
$rsparam['orFlag']    = 1;
$rsparam['first']     = $first;
$rsparam['last']      = $last;

foreach ($rsparam as $nr => $rsvalue) {
    $palame .= '&'.$nr.'='.$rsvalue;
}

$rsurl = $baseurl.$palame;

$rs_json = @file_get_contents($rsurl, true);

$item = json_decode($rs_json);
$Item = array();
$Items = $item->Items;
$count = $item->count;
$hits  = $rsparam['hits'];
$max_page = ceil($count/$hits);

// 商品数が1000を超える場合は1000に制限
if($count >= 1000){
  $count = 1000;
}

// 商品ページが100を超える場合は100に制限
if($max_page >= 100){
  $max_page = 100;
}

// 1ページに表示する商品数をセット
if( $page == $max_page ){
	
	// ラストページなら表示数を計算
	$results_per_page = $count % $hits;

}else{
	// ラストページ以外なら10
	$results_per_page = $hits;
}

    $nextpage = $currentpage+1;
    $prevpage = $currentpage-1;

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

$imageFlag = $item->Items[$i]->Item->imageFlag;

    if ($imageFlag == "1") {
$mediumImageUrls = $item->Items[$i]->Item->mediumImageUrls[0]->imageUrl;

$affiliateUrl[$i] = $item->Items[$i]->Item->affiliateUrl;

$itemName[$i] = $item->Items[$i]->Item->itemName;

$itemPrice[$i] = number_format((int)$item->Items[$i]->Item->itemPrice);

$itemCaption[$i] = mb_strimwidth($item->Items[$i]->Item->itemCaption, 0, 380, '...', 'UTF-8');

echo '<div style="padding:10px 10px 0 10px;">';

echo '<div style="width:130px;height:130px;float:left;"><a href="'.$affiliateUrl[$i].'" target="_blank"><img src="'.$mediumImageUrls.'" alt="" /></a></div>';

echo '<div style="margin:0 0 0 136px;"><a href="'.$affiliateUrl[$i].'" target="_blank">'.$itemName[$i].'</a><br />';

echo '<span style="color:#ff0000;">価格 '.$itemPrice[$i].' 円</span><br />';

echo $itemCaption[$i].'</div>';

?>
<div style="clear:both; visibility:hidden; height:10px;">クリア</div>
<hr style="width:100%;border-top:1px dotted #bbb;" />
</div>
<?php }
}

if(isset($item)){
?>
<div><!-- Rakuten Web Services Attribution Snippet FROM HERE -->
<a href="http://webservice.rakuten.co.jp/" target="_blank"><img src="http://webservice.rakuten.co.jp/img/credit/200709/credit_31130.gif" border="0" alt="楽天ウェブサービスセンター" title="楽天ウェブサービスセンター" width="311" height="30"/></a><!-- Rakuten Web Services Attribution Snippet TO HERE --></div>
<div>全 <?php echo number_format($count); ?> 品数</div>
<?php }

// ページャー
echo '<p>';

$nextpage= '2'; //

$url_a ="<a style='background-color: #ffffff; color: #ff0000; margin: 0; padding: 0.2em 0.5em; border: solid 1px; text-decoration: none;' href=\"?keyword=$e_keyword&page=";

$url_b ="\"";

$html_Page_Link = Page_Link($max_page,$currentpage,$nextpage,$url_a,$url_b);

echo $html_Page_Link;

function  Page_Link($max_page,$currentpage,$nextpage,$url_a,$url_b){
      
      $html = "";

      if($max_page < 1) return $html;

      if($currentpage > 1) $html .= $url_a.($currentpage-1).$url_b.' style="background-color: #ffffff; margin: 0; padding: 0.2em 0.5em; border: solid 1px; text-decoration: none;"'.">&laquo;</a>";

      $prevpage = $currentpage - $nextpage;

      while ($prevpage < $currentpage) {

          $prevpage++;	

          if($prevpage > 1) $html .= $url_a.($prevpage-1).$url_b.">".($prevpage-1)."</a>";

      }

      $html .= '<span style="background-color: #ff0000; color: #ffffff; margin: 0; padding: 0.2em 0.5em; border: solid 1px #ff0000; text-decoration: none;">'.$currentpage.'</span>';

      if($currentpage < $max_page){

          $max_page = $max_page - $currentpage;

          if($max_page > $nextpage) $max_page=$nextpage;

          $plus=0;

	      while ($plus < $max_page) {

	         $nextpage=$currentpage+$plus+1;

	         $html .= $url_a.$nextpage.$url_b.">".$nextpage."</a>";

	         $plus++;

          }

          $html .= $url_a.($currentpage+1).$url_b.' style="background-color: #ffffff; color: #ff0000; margin: 0; padding: 0.2em 0.4em; border: solid 1px; text-decoration: none;"'.">&raquo;</a>";

      }

    return $html;

}

echo '</p>';

echo '</div>';

echo '</div>';

?>

商品データの繰り返し処理はforeachを使ってもよいのですが、今回は気まぐれでforを使用してみました。

1ページに10商品づつ表示させていますが、切れの悪い最終ページ用に、空のデータ領域が出来ないように下記のコードで表示数を割り出し、forの条件式に渡しています。

if( $page == $max_page ){
	
	// ラストページなら表示数を計算
	$results_per_page = $count % $hits;

}else{
	// ラストページ以外なら10
	$results_per_page = $hits;
}
// 現在ページの商品データ数と照らし合わせてながらループさせる
for($i = 0; $i < $results_per_page; $i++) {

やっぱりトータルレスポンスの数が不明な場合は、黙ってforeachで処理したほうがいいですね。

商品データの表示部分のデザインはタグに直接CSSを記述しています。

環境に応じて外部CSSに記述するなり、改変するなりご自由にどうぞ。

ワードプレス投稿欄でPHPを有効にするプラグインが導入されていれば、上のサンプルコードを貼り付けるだけで動作させるこができますが、ページ送りも含めて動作させるには、ワードプレスのリライト機能の介入を回避する必要があります。

回避する方法についてはデモページで解説していますので、楽天WEBサービスの動作状況と合わせてご確認ください。

尚、ワードプレスの投稿欄に直接、上のサンプルコードを貼り付け、動作させる場合は、
サンプルコード冒頭の

echo '<div style="width:80%;margin:5% auto;">';
echo '<div style="margin:0; padding:0">';

サンプルコード最下部の

echo '</div>';
echo '</div>';

を削除してください。