未分類 > 楽天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 = 'httpss://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="https://webservice.rakuten.co.jp/" target="_blank"><img src="https://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>';
を削除してください。