monaka

microCMSでAmazonや楽天の広告を掲載する方法

このブログはmicroCMS+Next.js+Cloudflare Pagesという環境で運用している。Cloudflare Pagesは広告の掲載も可能な環境なので、Amazonや楽天などの広告も掲載可能だ。microCMSから記事を入稿する際に、広告を差し込む方法を紹介する。

要件(目指す姿)

  • 商品紹介をするブログパーツのようなものを作りたい
    • 画像を挿入する機能がある
    • 商品タイトルがある
    • Amazon、楽天の商品ページへのURLを掲載できる(ヤフーショッピングは難しそうだったので、テンプレート側に直書きして機能としては作り込まない)
  • 本文中にブログパーツを差し込める
    • 記事の最後だけに掲載するのではなく、記事の文中に広告を差し込みたい
    • 広告の後に再度記事を書くことも可能
  • レスポンシブ対応

完成形イメージ

よくWordPressなどで運用しているブログで見かけるような見た目にしたい。

実装方法

結論から言うとAPIスキーマの中に「繰り返し」というものがあり、カスタムフィールドを何度も利用できるようにすることでmicroCMSの記事本文中に広告を差し込むことができる(イメージは以下)

今回はこの「繰り返し」を使って、「本文」→「商品(広告)」→「本文」というようにすることで記事本文中に「商品(広告)」を差し込めるようにする。

まずmicroCMS側の設定を進め、その後フロント側からAPIを叩いて入稿したデータを取得できるか確認、という流れで進めた。

カスタムフィールドを作成する

まずカスタムフィールドを作成する。自分の場合は以下のようにしてみた。

カスタムフィールドID

カスタムフィールド名

product

商品

main_text

本文

カスタムフィールドのスキーマを設定する

続いてカスタムフィールドのスキーマを設定する。自分の場合は以下のようにしている。(例:productの場合)

フィールドID

表示名

種類

product_name

商品名

テキストフィールド

product_image

商品画像

画像

amazon_link

Amazonリンク

テキストフィールド

rakuten_link

楽天リンク

テキストフィールド

レイアウトを設定する

記事入稿画面のレイアウトが設定できる。自分は以下のイメージのようにした(このスキーマだと多少の違いはあれど、ほとんどの人が同じように設定するだろうと思うけど)

Next.jsで実装するためにデータの型を確認する

まずAPIプレビューでどのようにデータが取得できるか確認するために今回追加したAPIスキーマにテストコンテンツを入稿しておいた。以下は以前投稿した記事をコピペし、広告記事を後ろにつけてみたダミーとなる。以下のようなデータを取得できるようにトライしてみた。

    "main": [
        {
            "fieldId": "main_text",
            "editor": "<p>microCMSのリッチエディタで<span style=\"color: #ff0000\">文字色</span>を指定できるようになった。リッチエディタで色を指定するとspanタグで囲われ、styleが当てられるとのこと。</p><figure><img src=\"https://images.microcms-assets.io/assets/8f0bc8c406f74aabab2691baa1af6a0d/23cf0653ed0e419b87a9e47583ca2d6b/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88%202024-10-10%2023.05.20.png\" alt=\"\" width=\"1163\" height=\"694\"></figure><h2 id=\"h537e21d2f2\">便利な使い方(プリセット)</h2><p>都度、カラーコードを指定するのは面倒なので、よく使う色を予め設定しておくことも可能。設定方法は「APIスキーマ」を選択し、リッチエディタを利用しているフィールドの詳細設定メニューの下部へスクロールすると「色のプリセット」という項目があるので、そこで設定が可能。</p><figure><img src=\"https://images.microcms-assets.io/assets/8f0bc8c406f74aabab2691baa1af6a0d/e576a73a919a47a69d0893e344813115/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88%202024-10-10%2023.08.14.png\" alt=\"\" width=\"1174\" height=\"749\"></figure><h2 id=\"h466fd21fa3\">参照元</h2><p>さらに詳しい使い方や注意点などはmicroCMSブログを参照</p><ul><li><a href=\"https://blog.microcms.io/richeditor-textcolor/\" target=\"_blank\" rel=\"noopener noreferrer nofollow\">リッチエディタで文字色を設定できるようになりました</a></li></ul>"
        },
        {
            "fieldId": "product",
            "product_name": "Next.js+ヘッドレスCMSではじめる! かんたんモダンWebサイト制作入門 高速で、安全で、運用しやすいサイトのつくりかた",
            "product_image": {
                "url": "https://images.microcms-assets.io/assets/8f0bc8c406f74aabab2691baa1af6a0d/390efc1b6be54e58b803d3a43811f313/nextjs_microcms.jpg",
                "height": 1500,
                "width": 1063
            },
            "amazon_link": "https://amzn.to/3Nlh5Tl",
            "rakuten_link": "https://a.r10.to/hPG8Js"
        },
        {
            "fieldId": "main_text",
            "editor": "<p>2回目本文</p><h2 id=\"hdddc12409d\">2回目本文見出し</h2>"
        }
    ]

microcms.tsを編集する

microcms.tsで記事部分の情報を取得しているので、今回追加したカスタムフィールドも取得できるように追記する

export type Main = {
  fieldId: string;
  editor: string;
  product_name: string;
  product_link: string;
  amazon_link: string;
  rakuten_link: string;
  product_image: {
    url: string;
    width: number;
    height: number;
  };
};

articleコンポーネントで取得するdataを差し替える

次に記事表示をしているarticleコンポーネントのdataを今回追加したAPIスキーマに差し替える。自分は今まで記事本文を「data.content」で取得していたが、今回作成したAPIスキーマのIDをmainにしたので、「data.main」に差し替えている。

      <div className={styles.content}>
        {data.main.map((block, index) => {
          switch (block.fieldId) {
            case "main_text":
              return (
                <div
                  key={`main_text-${index}`}
                  dangerouslySetInnerHTML={{ __html: block.editor }}
                  className={styles.content}
                />
              );
            case "product":
              return (
                <div key={`product-${index}`} className={styles.product}>
                  <Image
                    src={block.product_image.url}
                    alt={block.product_name}
                    width={block.product_image.width}
                    height={block.product_image.height}
                    className={styles.product_image}
                  />
                  <div className={styles.product_info}>
                    <span className={styles.product_name}>
                      {block.product_name}
                    </span>
                    <div className={styles.product_links}>
                      <a
                        href={block.amazon_link}
                        target="_blank"
                        className={`${styles.link} ${styles.amazon}`}
                      >
                        Amazon
                      </a>
                      <a
                        href={block.rakuten_link}
                        target="_blank"
                        className={`${styles.link} ${styles.rakuten}`}
                      >
                        楽天市場
                      </a>
                      <a
                        href="#"
                        target="_blank"
                        rel="nofollow"
                        className={`${styles.link} ${styles.yahoo}`}
                      >
                        Yahoo!ショッピング
                      </a>
                    </div>
                  </div>
                </div>
              );
            default:
              return null;
          }
        })}
      </div>

最後にCSSでデザインを整える

localhost環境で画面プレビューし、今回追加した広告の情報が表示されるのが確認できたら最後にCSSでデザインを変更する。以下は実装例。

.product_image {
  width: 100%;
  height: auto;
}

.product {
  display: flex; 
  align-items: center; 
  border: 1px solid #ccc; 
  border-radius: 8px; 
  padding: 16px; 
  margin-bottom: 16px; 
  background-color: #f9f9f9; 
  box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1); 
}

.product_image {
  max-width: 120px; 
  height: auto; 
  margin-right: 16px; 
  border-radius: 4px; 
}

.product_info {
  display: flex;
  flex-direction: column; 
}

.product_name {
  font-size: 1.1em; 
  font-weight: bold; 
  margin-bottom: 8px; 
}

.product_links {
  display: flex; 
  gap: 12px; 
}

.product_links .link {
  padding: 8px 12px; 
  color: white; 
  text-decoration: none; 
  border-radius: 4px; 
  font-size: 0.9em; 
  font-weight: bold;
  width: -webkit-fill-available;
  text-align: center;
}

.amazon {
  background-color: #ffa724; 
  transition: background-color 0.3s ease;
}
.amazon:hover {
  background-color: #ffc766; 
}
.rakuten {
  background-color: #ff5f5f; 
  transition: background-color 0.3s ease;
}
.rakuten:hover {
  background-color: #ff7a7a; 
}
.yahoo {
  background-color: #39c0e0; 
  transition: background-color 0.3s ease;
}
.yahoo:hover {
  background-color: #5bcfee; 
}

@media (max-width: 640px) {
  .product {
    flex-direction: column; 
    align-items: flex-start;
    gap: 20px;
  }

  .product_image {
    margin: 0 auto;
  }

  .product_links {
    flex-direction: column; 
    width: 100%; 
    gap: 8px; 
  }

  .link {
    width: 100%; 
  }
}

まとめ

今回、記事本文に広告を追加するために「繰り返し」と「カスタムフィールド」を活用してみた。「カスタムフィールド」を利用すれば、例えば会話形式のコンテンツなどブログによくあるような見せ方もmicroCMSで再現可能だ。WordPressを使わなくても必要十分な機能をつけることができるので、非常に面白いなと感じている。引き続き勉強していきたい。

Next.js+ヘッドレスCMSではじめる! かんたんモダンWebサイト制作入門 高速で、安全で、運用しやすいサイトのつくりかた
Next.js+ヘッドレスCMSではじめる! かんたんモダンWebサイト制作入門 高速で、安全で、運用しやすいサイトのつくりかた
Amazon楽天市場Yahoo!ショッピング

関連記事