designsupply.llc
  • aboutabout
  • servicesservices
  • worksworks
  • mediamedia
  • contactcontact
  • homeサイトトップ
  • about会社概要
  • services業務内容
  • works実績紹介
  • mediaメディア
  • contactお問い合わせ
ja/

media

メディア

  1. サイトトップ
  2. メディア
  3. プログラミングの記事
  4. Next.jsとWordPressでヘッドレスCMSのサイトを作成する#4:静的・動的ルーティングとページ作成

Next.jsとWordPressでヘッドレスCMSのサイトを作成する#4:静的・動的ルーティングとページ作成

  • 2024.07.31
  • プログラミング
  • Next.js
Updated: 2024.07.31
今回の記事ではNext.jsで静的ルーティングと動的ルーティングでそれぞれ下層ページを作成していきます。ヘッドレスCMSを使ったサイトでは、一般的な静的下層ページ以外にも、投稿記事の詳細ページなどURLに投稿記事のIDが入るような動的ルーティングでページを作成する場面が出てきます。それぞれの違いとあわせてページの作成方法をみていきます。   (過去の参考記事もどうぞ) Next.jsとWordPressでヘッドレスCMSのサイトを作成する#3:メタ情報設定・ファイル最適化・ステート管理 Next.jsとWordPressでヘッドレスCMSのサイトを作成する#2:コーディング環境の構築 Next.jsとWordPressでヘッドレスCMSのサイトを作成する#1:インストール・導入    
1. 静的ルーティングでページ作成
App RouterでもPage Router同様にディレクトリベースのルーティングになります。App Routerでは「src/pages」ディレクトリではなく「src/app」ディレクトリになり、「page.tsx」というファイル名でページコンポーネントを作成する必要があります。ですので、appディレクトリ直下にルート名に合わせたディレクトリを用意し、そのディレクトリ配下にpage.tsxファイルを作成します。
touch src/app/foo/page.tsx
  作成したディレクトリに対応するルーティングが自動的に生成され、page.tsxファイルがそのルーティングのページコンポーネントファイルとなります。layout.tsxファイルを継承する形になるので、layout.tsxファイルで読み込んでいる共通パーツはそのまま使えます。また、ページ固有のメタデータを更新するには、page.tsxでMetadataAPIを使い「metadata」の変数名でexportすることで上書きすることができます。 【/src/app/foo/page.tsx】
import type { Metadata } from 'next';

export const metadata: Metadata = {
  title: `ページタイトル | ${process.env.SITENAME}`,
  description: '...ページの説明文...'
}

export default function FooPage() {
  return (
    <main>
      .....
    </main>
  )
}
  実際に、https:localhost/foo とURLにアクセスすることでページが表示されることを確認できます。これで静的ルーティングの下層ページを作成することができました。    
2. 動的ルーティングでページ作成
動的ルーティングも静的ルーティング同様にディレクトリベースでルーティングを決めていきますが、静的ルーティングとはことなり、ディレクトリ名が変数となるように角カッコでパラメーターが入るようにしておきます。今回はブログ記事の投稿IDが入る想定で作成していきます。
mkdir src/app/posts/[id]
touch src/app/posts/[id]/page.tsx
  下記のようなディレクトリ・ファイル構成になります。
┣ /src
  ┣ /app
    ┣ layout.tsx
    ┣ page.tsx
    ┣ ......
    ┣ posts
      ┣ page.tsx // 一覧ページ ※静的ルーティング(/posts)
      ┣ [id]
        ┗ page.tsx // 詳細ページ ※動的ルーティング(/posts/POST_ID)
  動的ルーティングとなるページコンポーネント側で、「generateStaticParams()」メソッドを使って動的ルーティングのパラメータがセットされたパスを生成し、あわせてAPIで取得したコンテンツデータを読み込んでパラメーターに使う投稿IDを紐づけていきます。 【/src/app/posts/[id]/page.tsx】
export async function generateStaticParams() {
  const posts = await fetch('https://exapmle.com/api/****').then((response) => response.json());
  return posts.data.map((post) => ({ id: String(post.id) }));
}

export default async function PostsDetailPage({ params }: { params: { id: string } }) {
  const currentPost = await fetch('https://exapmle.com/api/****').then((response) => response.json()).filter((post) => post.id === Number(params.id));
  console.log(currentPost)

  return (
    <main>
      .....
    </main>
  )
}
  投稿記事本文などの情報もコンテンツ内で展開できるようにfetchメソッドで取得していきます。また、動的ルーティングのページでメタデータを設定する場合には、MetadataAPIを使うのではなく「generateMetadata()」メソッドでexportすることにより動的にメタデータを設定していきます。 【/src/app/posts/[id]/page.tsx】
import type { Metadata } from 'next';

export async function generateStaticParams() {
  const posts = await fetch('https://exapmle.com/api/****').then((response) => response.json());
  return posts.data.map((post) => ({ id: String(post.id) }));
}

export async function generateMetadata({ params }: { params: { id: string } }): Promise<Metadata> {
  const currentPost = await fetch('https://exapmle.com/api/****').then((response) => response.json()).filter((post) => post.id === Number(params.id));
  return {
    title: currentPost.title,
    description: currentPost.content.slice(0, 120),
    .....
  }
})

export default async function PostsDetailPage({ params }: { params: { id: string } }) {
  const currentPost = await fetch('https://exapmle.com/api/****').then((response) => response.json()).filter((post) => post.id === Number(params.id));
  console.log(currentPost)

  return (
    <main>
      .....
    </main>
  )
}
  このように静的ルーティングと動的ルーティングではページの作成やルーティングの設定方法にすこし違いがありますが、基本的にはディレクトリベースで設定されることになるのでとてもわかりやすいですね。  
  今回はNext.jsでヘッドレスCMSを使ったサイトで、静的・動的ルーティングでそれぞれ下層ページを作成してきました。動的ルーティングはブログやメディアサイト以外にもウェブアプリなどでも採用されるので覚えておきたいですね。

この記事を書いた人オガワ シンヤ

合同会社デザインサプライ代表兼CEO / ディレクター・ウェブデザイナー・フロントエンドエンジニアをやっています。「ウェブとデザインでヒト・モノ・サービスを繋げ新しい価値を生み出す」をコンセプトに日々奮闘中!制作中はダイエットコーラとチョコレートが欠かせないアラフォーWebクリエイター。

Sponsored Link

categories

  • WordPress(61)
  • JavaScript(49)
  • Vue.js(48)
  • CSS(46)
  • jQuery(34)
  • Nuxt.js(22)
  • Sass(21)
  • Gulp(17)
  • webpack(16)
  • PHP(14)
  • HTML(14)
  • GSAP(11)
  • React(10)
  • Vite(9)
  • Pug(9)
  • Laravel(8)
  • Cordova(8)
  • Linux(7)
  • Next.js(6)
  • Apache(5)
  • Shopify(4)
  • REST API(4)
  • Node.js(4)
  • Smarty(3)
  • Git(3)
  • JSON(3)
  • その他プログラミング(3)
  • Google Apps API(3)
  • Bootstrap(3)
  • 環境構築・システム(3)
  • TypeScript(2)
  • EJS(2)
  • RMS(2)
  • Docker(2)
  • Instagram API(2)
  • Excel VBA(2)
  • SVG(1)
  • Dart(1)
  • ECカートASP(1)
  • Markdown(1)
  • AMP(1)
  • Nginx(1)
  • XML(1)
  • shellscript(1)
  • Ruby(1)
  • MySQL(1)
  • 次の記事
  • 一覧に戻る
  • 前の記事

まだ依頼内容が決まっていなくても、ご相談ください。

課題の整理や小さな検証、UI/UX・フロントエンドの部分的な支援から始められます。

お問い合わせやご相談はこちらから

Webサイト・プロダクトの企画設計/UI・UXデザイン/フロントエンド開発合同会社デザインサプライ(DesignSupply. LLC)

Office:大阪府大阪市天王寺区清水谷町3-22
Email:info@designsupply-web.com
home
  • サイトトップ
about
  • 3つのポリシー
  • 経営理念
  • 代表・クリエイター紹介
  • 会社概要
services
  • ビジネス・プロダクト支援
  • UI/UX・フロントエンド開発支援
  • プロジェクトの進め方・支援体制
  • エデュケーション事業
works
  • 開発プロジェクト
  • クリエイティブ支援
  • 自社プロダクト
media
  • デザイン
  • プログラミング
  • マーケティング
  • Web開発
  • 写真・動画制作
contact
  • お問い合わせ
news
  • インフォメーション
privacy
  • プライバシーポリシー

WE THINK WITH YOU, DESIGN FOR PEOPLE, AND BUILD WHAT WORKS.

WE THINK WITH YOU, DESIGN FOR PEOPLE, AND BUILD WHAT WORKS.

© 2013 - 2026 DesignSupply.LLC
サイトトップへ
contact