メインコンテンツへスキップ
PR 本ページはプロモーションが含まれています

Hugoに画像付きAmazonアソシエイトリンクを導入(ショートコード機能)した話

·1485 文字·3 分

1. はじめに
#

Amazonアソシエイトをやってみました。AmazonアソシエイトのサイトからもURLリンクをコピーできますが、文字列だけで画像が表示できませんでした。

Hugoのショートコードを使って、画像付きのAmazonアソシエイトリンクを貼り付けられるように実装しました。

内容を以下にメモしておきます。 参考になれば幸いです。

2. AmazonのトラッキングIDを変数に入れておく
#

Amazonアソシエイトに登録し、トラッキングIDを取得しておきます。文字列-22みたいな形のIDです。

取得したトラッキングIDを変数として扱えるようにconfig/_default/hugo.tomlに記載します。

config/_default/hugo.toml

[params]
  amazonTrackingID = "amazonトラッキングID-22"

3. ショートコード用のhtmlファイル作成
#

layouts/shortcodes/amazon-associate.htmlに以下のコードを記載しました。 参考までに載せておきます。

layouts/shortcodes/amazon-associate.html

{{ $asin := .Get 0 }}
{{ $title := .Get 1 | default "Amazonで詳細を見る" }}
{{ $img := .Get 2 }}
{{ $trackingID := .Site.Params.amazonTrackingID | default "MISSING_ID" }}
{{ $link := printf "https://www.amazon.co.jp/dp/%s?tag=%s" $asin $trackingID }}

{{ $finalImg := "" }}
{{ if $img }}{{ $finalImg = $img }}{{ else }}{{ $finalImg = printf
"https://m.media-amazon.com/images/P/%s.01.MZZZZZZZ.jpg" $asin }}{{ end }}

<div class="amazon-card-container" style="margin: 2rem 0; max-width: 700px;">
  <a href="{{ $link }}" target="_blank" rel="noopener" class="amazon-card-anchor"
    style="text-decoration: none; color: inherit; display: block; line-height: 1.5;">
    <div class="amazon-link-card"
      style="border: 1px solid #d1d5db; border-radius: 0.75rem; overflow: hidden; background-color: #ffffff; display: flex; flex-direction: column; transition: all 0.3s ease; box-shadow: 0 2px 4px rgba(0,0,0,0.05); width: 100%;">

      {{/* メイン部分 */}}
      <div
        style="display: flex; flex-direction: row; padding: 1.25rem; align-items: flex-start; background-color: #ffffff;">
        <div
          style="flex-shrink: 0; width: 110px; height: 110px; margin-right: 1.25rem; display: flex; align-items: center; justify-content: center; background: #fff;">
          <img src="{{ $finalImg }}" alt="{{ $title }}"
            style="max-height: 100%; max-width: 100%; object-fit: contain; margin: 0; display: block; border: none; pointer-events: none;">
        </div>

        <div style="flex-grow: 1; min-width: 0;">
          <div
            style="font-weight: 700; font-size: 0.95rem; line-height: 1.5; margin-bottom: 1rem; color: #1f2937; word-break: break-all;">
            {{ $title }}
          </div>
          <div
            style="display: inline-block; background: linear-gradient(to bottom, #f7dfa1, #f0c14b); color: #111; padding: 0.4rem 1.2rem; border-radius: 4px; font-size: 0.85rem; font-weight: 500; border: 1px solid #a88734;">
            Amazonで見る
          </div>
        </div>
      </div>

      <div
        style="font-size: 0.65rem; color: #6b7280; text-align: right; padding: 0.6rem 1rem; background-color: #f3f4f6; border-top: 1px solid #e5e7eb; margin: 0; display: block;">
        Amazon.co.jp で詳細を見る
      </div>
    </div>
  </a>
</div>

4. ブラウザのブックマークにJavaScript登録
#

以下のコードをブラウザのブックマークに登録します。

javascript:(function(){
  async function copy(text) {
    try {
      await navigator.clipboard.writeText(text);
      alert('コピー成功!\n' + text);
    } catch (err) {
      /* 古いブラウザ用のフォールバック */
      const el = document.createElement('textarea');
      el.value = text;
      document.body.appendChild(el);
      el.select();
      document.execCommand('copy');
      document.body.removeChild(el);
      alert('コピーしました(fallback)');
    }
  }

  try {
    /* 1. ASINを探す(複数の候補から) */
    const asin = document.querySelector('#ASIN, [data-asin], input[name="idx.asin"]')?.value
               || document.querySelector('[data-asin]')?.dataset.asin;

    /* 2. タイトルを探す */
    const title = document.querySelector('#productTitle, #ebooksProductTitle, #title')?.textContent.trim();

    /* 3. 画像URLを探す(メイン、本、またはサムネイルリストから) */
    const imgEl = document.querySelector('#landingImage, #imgBlkFront, #main-image, .a-dynamic-image');
    let thumb = imgEl?.src || imgEl?.dataset?.oldHires || imgEl?.dataset?.aDynamicImage;

    /* URLがJSON形式(複数画像)で入っている場合の処理 */
    if (thumb && thumb.startsWith('{')) {
      thumb = Object.keys(JSON.parse(thumb))[0];
    }

    if (!asin || !title || !thumb) {
      console.error({asin, title, thumb});
      throw new Error('必須情報の取得に失敗しました');
    }

    const mUrl = thumb.replace(/\._S[X|Y]\d+_/, '._SL200_');

    const shortcode = `{{< amazon-associate "${asin}" "${title}" "${mUrl}" >}}`;
    copy(shortcode);

  } catch (e) {
    alert('エラー: Amazonの商品ページで実行してください。');
    console.error(e);
  }
})();

5. amazonの商品ページで4.で作成したブックマークを実行
#

amazonの商品ページで4.で作成したブックマークを実行すると、 コピーされるので、Hugo内の記事に貼り付けます。 以下のようなショートコードの形で貼り付けられます。

{{< amazon-associate "B0DJ8LD62M" "PFU キーボード HHKB Studio 日本語配列/雪(ポインティングスティック メカニカルキーボード)" "https://m.media-amazon.com/images/I/61d+MPkNrfL._AC_SX679_.jpg" >}}

以下のように商品画像が表示されます。

6. アソシエイトリンクが有効になっているか確認
#

最後に、hugo server でローカルビルドを行い、リンクのデザインや画像が正しく表示されているか確認します。

あわせて、生成されたリンクをコピーしてAmazonアソシエイトの管理画面にある「リンク動作確認ツール」等で、トラッキングIDが正しく紐付いているかチェックしておくと安心です。

nakk
著者
nakk
ITとガジェット。個人的な振り返りや技術メモを中心に投稿しています。どなたかに少しでも役立てば嬉しいです。

関連ページ