TwitterFacebookHatena

WordPressからNext.jsへのスムーズな移行

1. WordPress のデータをエクスポート

WordPress から Next.js に乗り換えるには、まず WordPress のデータをエクスポートする必要があります。ここでは、REST API を使ってデータを取得します。

import axios from 'axios'

const getWordPressPosts = async () => {
  const response = await axios.get('https://your-wordpress-site.com/wp-json/wp/v2/posts')
  return response.data
}

2. エクスポートされたデータを Next.js で取り込む

次に、エクスポートされたデータを Next.js で取り込みます。getStaticProps を使ってデータを取得し、props としてコンポーネントに渡します。

// pages/posts/index.tsx
import type { GetStaticProps } from 'next'
import { getWordPressPosts } from '../../lib/api'

type Post = {
  id: number
  title: string
  content: string
}

type Props = {
  posts: Post[]
}

const PostsPage = ({ posts }: Props) => {
  return (
    <div>
      {posts.map((post) => (
        <div key={post.id}>
          <h2>{post.title}</h2>
          <div dangerouslySetInnerHTML={{ __html: post.content }} />
        </div>
      ))}
    </div>
  )
}

export const getStaticProps: GetStaticProps = async () => {
  const posts = await getWordPressPosts()
  return { props: { posts } }
}

export default PostsPage

3. スタイルと機能の移行

最後に、WordPress のテーマやプラグインに依存していたスタイルや機能を Next.js で再現します。以下に、シンプルなサイドバーを実装する例を示します。

// components/Sidebar.tsx
import { useState } from 'react'

type Props = {
  items: string[]
}

const Sidebar = ({ items }: Props) => {
  const [activeIndex, setActiveIndex] = useState<number | null>(null)

  const handleClick = (index: number) => {
    setActiveIndex(activeIndex === index ? null : index)
  }

  return (
    <div>
      {items.map((item, index) => (
        <div key={index} onClick={() => handleClick(index)}>
          <h3>{item}</h3>
          {activeIndex === index && <div>コンテンツがここに表示されます</div>}
        </div>
      ))}
    </div>
  )
}

export default Sidebar

これで、WordPress から Next.js に乗り換える準備が整いました。上記の手順を参考に、独自のスタイイルや機能を移行して、Next.js のパワフルな機能を活用しながら、高速でモダンなウェブサイトを構築しましょう。

4. ルーティングとページ生成

WordPress のページや投稿に対応する静的ページを Next.js で生成するには、getStaticPaths を使用します。ここでは、すべての投稿のスラッグを取得し、それらを使ってページを生成します。

// pages/posts/[slug].tsx
import type { GetStaticPaths, GetStaticProps } from 'next'
import { getWordPressPosts, getWordPressPostBySlug } from '../../lib/api'

type Post = {
  id: number
  title: string
  content: string
}

type Props = {
  post: Post
}

const PostPage = ({ post }: Props) => {
  return (
    <div>
      <h1>{post.title}</h1>
      <div dangerouslySetInnerHTML={{ __html: post.content }} />
    </div>
  )
}

export const getStaticPaths: GetStaticPaths = async () => {
  const posts = await getWordPressPosts()
  const paths = posts.map((post) => `/posts/${post.slug}`)
  return { paths, fallback: false }
}

export const getStaticProps: GetStaticProps = async ({ params }) => {
  const post = await getWordPressPostBySlug(params.slug as string)
  return { props: { post } }
}

export default PostPage

5. 画像やメディアの扱い

Next.js では、next/image を使用して、最適化された画像を提供することができます。以下に、WordPress から取得した画像を表示する例を示します。

// components/FeaturedImage.tsx
import Image from 'next/image'
import type { ImageLoaderProps } from 'next/image'

type Props = {
  src: string
  alt: string
  width: number
  height: number
}

const myLoader = ({ src, width, quality }: ImageLoaderProps) => {
  return `${src}?w=${width}&q=${quality || 75}`
}

const FeaturedImage = ({ src, alt, width, height }: Props) => {
  return (
    <div>
      <Image loader={myLoader} src={src} alt={alt} width={width} height={height} layout="responsive" />
    </div>
  )
}

export default FeaturedImage

6. SEO 対策

Next.js では、next/head を使用して、各ページのメタ情報を設定することができます。以下に、タイトルやディスクリプションを設定する例を示します。

// components/Seo.tsx
import Head from 'next/head'

type Props = {
  title: string
  description: string
}

const Seo = ({ title, description }: Props) => {
  return (
    <Head>
      <title>{title}</title>
      <meta name="description" content={description} />
    </Head>
  )
}

export default Seo

これで、WordPress から Next.js に乗り換える準備が整いました。上記の手順を参考に、独自のスタイイルや機能を移行して、Next.js のパワフルな機能を活用しながら、高速でモダンなウェブサイトを構築しましょう。

WordPressからNext.jsへのスムーズな移行