PHPで楽天APIを使って商品一覧の作成

楽天市場の商品をAPIを使って取得し一覧表を表示します。APIについては下記のページをご参照ください。

Webtraining - Webトレは、 初心...
JavaScriptでAPI:外部データを取得してみよう!( API then) | Webtraining - Webトレは、 初心者から実... 完成イメージ APIを使って、ボタンをクリックするたびに異なる画像をランダムに表示してみましょう。 今回のテーマ JavaScript の fetch() を使って、外部からデータを読み...

フォルダ構成とファイル名

  • 作成フォルダ:php-rakuten-api
  • 作成ファイル:rakuten01.php
  • 使用CSSファイル(任意):style.cssは任意で作成

完成イメージ

楽天市場の商品一覧コード

楽天デベロッパーサイトにログインし、アプリIDが必要になります。楽天市場にログインする必要があります。アカウントを持っていない場合は、下記のコードは動きません。

楽天APIコード
<?php
// 楽天デベロッパーサイトで取得したアプリIDを設定
$app_id = 'APP_ID';

// パラメータ
$keyword = 'コーヒー';
$hits = 10; // 表示件数(最大30件まで)

// API URL作成
$url = 'https://app.rakuten.co.jp/services/api/IchibaItem/Search/20220601'
    . '?applicationId=' . urlencode($app_id)
    . '&format=json'
    . '&keyword=' . urlencode($keyword)
    . '&hits=' . $hits;

// データ取得
$json = @file_get_contents($url);
if ($json === false) {
    die('<p>楽天APIからデータを取得できませんでした。</p>');
}

// JSONデコード
$data = json_decode($json, true);
if (!isset($data['Items'])) {
    die('<p>データが正しく取得できませんでした。</p>');
}
?>
<!DOCTYPE html>
<html lang="ja">

<head>
    <meta charset="UTF-8">
    <title>楽天商品検索API</title>
    <style>
        body {
            font-family: sans-serif;
            line-height: 1.6;
        }

        .item {
            display: flex;
            gap: 1rem;
            margin-bottom: 1rem;
            align-items: center;
        }

        img {
            width: 80px;
            height: 80px;
            object-fit: cover;
            border-radius: 4px;
        }
    </style>
</head>

<body>
    <h1>楽天市場:コーヒー一覧</h1>

    <?php foreach ($data['Items'] as $obj): ?>
        <?php $item = $obj['Item']; ?>
        <div class="item">
            <img src="<?= htmlspecialchars($item['mediumImageUrls'][0]['imageUrl']) ?>"
                alt="<?= htmlspecialchars($item['itemName']) ?>">
            <div>
                <a href="<?= htmlspecialchars($item['itemUrl']) ?>" target="_blank">
                    <?= htmlspecialchars($item['itemName']) ?>
                </a><br>
                <strong><?= number_format($item['itemPrice']) ?>円</strong>
            </div>
        </div>
    <?php endforeach; ?>
</body>

</html>

プログラムの構成と解説

API URL の作成

$keyword = 'コーヒー';
$hits = 10;
$url = 'https://app.rakuten.co.jp/services/api/IchibaItem/Search/20220601'
    . '?applicationId=' . urlencode($app_id)
    . '&format=json'
    . '&keyword=' . urlencode($keyword)
    . '&hits=' . $hits;

  • 検索キーワード(ここでは「コーヒー」)を指定
  • 表示件数(hits)を 10 件まで指定
  • urlencode() を使い、安全にURLを作成

データ取得とJSONデコード

$json = @file_get_contents($url);
$data = json_decode($json, true);


  • file_get_contents() で楽天APIからJSONデータを取得
  • json_decode(..., true) で連想配列に変換
  • エラー時は die() でメッセージ表示

商品一覧の表示

<?php foreach ($data['Items'] as $obj): ?>
    <?php $item = $obj['Item']; ?>
    <div class="item">
        <img src="<?= htmlspecialchars($item['mediumImageUrls'][0]['imageUrl']) ?>" alt="">
        <div>
            <a href="<?= htmlspecialchars($item['itemUrl']) ?>" target="_blank">
                <?= htmlspecialchars($item['itemName']) ?>
            </a><br>
            <strong><?= number_format($item['itemPrice']) ?>円</strong>
        </div>
    </div>
<?php endforeach; ?>


  • 商品画像、名前、価格をループで表示
  • htmlspecialchars() を使いXSS対策
  • 価格は number_format() で桁区切り表示

ステップアップしてみよう!

アフィリエイト対応

楽天アフィリエイトIDを追加すると、報酬が発生するリンクに変わります。

$affiliate_id = 'あなたのアフィリエイトID';


$url = 'https://app.rakuten.co.jp/services/api/IchibaItem/Search/20220601'
    . '?applicationId=' . urlencode($app_id)
    . '&affiliateId=' . urlencode($affiliate_id) // ← 追加
    . '&format=json'
    . '&keyword=' . urlencode($keyword)
    . '&hits=' . $hits;

検索フォームを追加

キーワードを入力して自由に検索できるように。

<form action="" method="get">
    <input type="text" name="keyword" value="<?= htmlspecialchars($keyword) ?>">
    <button type="submit">検索</button>
</form>

//PHP側
$keyword = trim($_GET['keyword'] ?? '');
if ($keyword === '') {
    $keyword = 'コーヒー';
}

ページネーション 次へだけ

複数ページの結果を見られるように。

$page = isset($_GET['page']) ? (int)$_GET['page'] : 1; // pageがなければ1
$url .= '&page=' . $page;

  • isset($_GET['page']) でURLパラメータがあるか確認
  • (int) で数値に変換して不正な文字列を防止
  • $page=1 がデフォルトなので、最初のアクセス時は1ページ目を表示
<p>
    <a href="?keyword=<?= urlencode($keyword) ?>&page=<?= $page + 1 ?>">次のページ</a>
</p>
  • page=<?= $page + 1 ?> とすることで、現在ページより1つ先を表示
  • keyword もクエリ文字列として付けているので、検索語が維持される

そもそも$_GETとは?

$_GET は、URL のクエリ文字列(?key=value の部分)から値を受け取るためのスーパーグローバル変数です。例えば、次のURLでアクセスしたとき

example.php?page=3&keyword=coffee

PHPでは

echo $_GET['page'];    // 3
echo $_GET['keyword']; // coffee

のようにして値を取得できます。

これにより、ページを移動しても値を引き継ぐことができるので、

  • ページネーション(次のページ・前のページ)
  • 検索キーワードの保持
  • クリックした番号やIDの保持

といった処理が簡単に作れます。ただ注意点として

  • ユーザーが値を自由に変更できるので、必ず型変換やチェックをする
  • 秘密情報やパスワードは載せない(誰でも見えてしまうため)

ページネーション 次へ と次のページは前へも追加

次のページは前のページに戻れるリンクも作る PHP部分は上記と同じです。

$page = isset($_GET['page']) ? (int)$_GET['page'] : 1; // pageがなければ1
$url .= '&page=' . $page;
  • isset($_GET['page'])URL に page パラメータがあるか確認する
  • (int) 数値に変換することで、例えば ?page=abc のような不正な入力を防止
<p>
    <?php if ($page > 1): ?>
        <a href="?keyword=<?= urlencode($keyword) ?>&page=<?= $page - 1 ?>">前のページ</a>
    <?php endif; ?>

    <a href="?keyword=<?= urlencode($keyword) ?>&page=<?= $page + 1 ?>">次のページ</a>
</p>
  • $page = 1 初回アクセス時はデフォルトで1ページ目
  • <a href="?keyword=...&page=<?= $page + 1 ?>">現在ページより1つ先のページを表示
  • 前のページリンク
    $page > 1 のときだけ出力することで、1ページ目では「前へ」を表示しない

楽天の場合総ページ数が含まれているので

楽天APIのレスポンスには pageCount(総ページ数)が含まれています。
次のページが存在しないときは「次のページ」リンクを消しておくと最後に空白のページが出ません。

$totalPages = $data['pageCount'] ?? 1;

<?php if ($page < $totalPages): ?>
    <a href="?keyword=<?= urlencode($keyword) ?>&page=<?= $page + 1 ?>">次のページ</a>
<?php endif; ?>