coiai Logo

WordPress RestAPI を使ってフロントReactでヘッドレスCMSにする

WordPressで自作テーマを作るのは労力に対してできるものが微妙だなと思い、ヘッドレスCMSにしようと思いました。

スタイリングは一旦無視して機能だけ解説します。動作は次の動画のようになります。

WordPress の投稿をGETしてみる

Terminalで下記コマンドを実行してみましょう

curl -X GET "<https://your-wordpress-site.com/wp-json/wp/v2/posts>"

TerminalでJSONファイルは見づらいためPostmanを使うのがおすすめです。

React アプリをCreate

Terminal を開いて好きなディレクトリに移動して下記コマンドを実行します。

$ npx create-react-app my-ts-headless-cms-app --template typescript

投稿一覧ページの作成

srcディレクトリ内にPostList.tsxを作成します。

import React, { useState, useEffect } from 'react';
import axios from 'axios';

interface Post {
  id: number;
  title: { rendered: string };
}

const PostList: React.FC = () => {
  const [posts, setPosts] = useState<Post[]>([]);

  useEffect(() => {
    axios.get('https://your-wordpress-site.com/wp-json/wp/v2/posts')
      .then(response => {
        setPosts(response.data);
      })
      .catch(error => {
        console.error('Error fetching data:', error);
      });
  }, []);

  return (
    <div>
      <h1>WordPress Post List</h1>
      <ul>
        {posts.map(post => (
          <li key={post.id}>{post.title.rendered}</li>
        ))}
      </ul>
    </div>
  );
};

export default PostList;

App.tsx.を開いて書き換えましょう。

import React from 'react';
import './App.css';
import PostList from './PostList';

function App() {
  return (
    <div className="App">
      <PostList />
    </div>
  );
}

export default App;

一旦ここで動作確認してみましょう!Termialを開いて

$ npm start

うまく起動できましたか??

できたら詳細ページを作っていきましょう!

詳細ページの作成

axis のインストールをします

$ npm i axis

srcディレクトリ内に、PostDetail.tsx を作成します。

import React, { useState, useEffect } from 'react';
import { useParams } from 'react-router-dom';
import axios from 'axios';

interface Post {
  id: number;
  title: { rendered: string };
  content: { rendered: string };
}

const PostDetail: React.FC = () => {
  const { postId } = useParams<{ postId: string }>();
  const [post, setPost] = useState<Post | null>(null);

  useEffect(() => {
    axios.get(`https://your-wordpress-site.com/wp-json/wp/v2/posts/${postId}`)
      .then(response => {
        setPost(response.data);
      })
      .catch(error => {
        console.error('Error fetching data:', error);
      });
  }, [postId]);

  if (!post) {
    return <div>Loading...</div>;
  }

  return (
    <div>
      <h1>{post.title.rendered}</h1>
      <div dangerouslySetInnerHTML={{ __html: post.content.rendered }} />
    </div>
  );
};

export default PostDetail;

react-router-dom をインストールしましょう!

$ nom install react-router-dom

App.tsx を書き換えます

import React from 'react';
import { BrowserRouter, Route } from 'react-router-dom';

import PostList from './PostList';
import PostDetail from './PostDetail';
import './App.css';

function App() {
  return (
    <BrowserRouter>
      <div className="App">
        <div className="Contents">
            <Route index path="/" element={<PostList/>} />
            <Route index path="/post/:postId" element={<PostDetail/>} />
        </div>
      </div>
    </BrowserRouter>
  );
}

export default App;

リストから詳細への遷移を作る

PostList.tsx を下記のように書き換えます。

import React, { useState, useEffect } from 'react';
import axios from 'axios';
import { Link } from 'react-router-dom';

interface Post {
  id: number;
  title: { rendered: string };
}

const PostList: React.FC = () => {
  const [posts, setPosts] = useState<Post[]>([]);

  useEffect(() => {
    axios.get('https://your-wordpress-site.com/wp-json/wp/v2/posts')
      .then(response => {
        setPosts(response.data);
      })
      .catch(error => {
        console.error('Error fetching data:', error);
      });
  }, []);

  return (
    <div>
      <h1>WordPress Post List</h1>
      <ul>
        {posts.map(post => (
          <li key={post.id}>
            {/* 詳細ページへのリンク */}
            <Link to={`/post/${post.id}`}>{post.title.rendered}</Link>
          </li>
        ))}
      </ul>
    </div>
  );
};

export default PostList;

この記事をシェア

投稿日: 2023年8月15日
カテゴリ: 未分類
タグ:
coiai

coiai

この記事もおすすめ

.env ファイルをやめて Bitwarden Secrets Manager に移行した話

.env ファイルをやめて Bitwarden Secrets Manager に移行した話

この記事はなに? 私たちcoiaiはモックアップの作成業務がメインで今までの開発は1-2名程度でした。しかし、6名以上で開発を進めていく案件が増えてきたため、開発環境を見直す必要に迫られました。 今まで環境変数は .env ファイルで管理していました。しかしこれからは、平文として秘密情報が確認できない状態にすること、チームで環境変数の共有の際にセキュアな共有方法を確保することを目的とし、環境整備を行いました。 Bitwarden 導入の目的と意義 背景: .env の何が問題か ローカル開発の秘密情報は .env + .gitignore が定番だが、いくつか弱点がある。 1 と 2 を解決するのがシークレット管理サービスで、Bitwarden Secrets Manager はその中でも安価(Password Manager とは別契約)かつ CLI が単体バイナリで導入が軽い。 Bitwarden Secrets Manager で抑えて起きたい概念 注意点としてPassword Manager(個人のパスワード保管)とは別プロダクトです!Password Manager は弊社でも利用していますが、今回Secret Manager を追加で契約した形になります。 概念は3つだけです。 概念 役割 プロジェクト シークレットの入れ物。今回は 1 リポジトリ = 1 プロジェクト シークレット KEY / VALUE / メモ の3つ組。.env の 1 [&hellip;]

ポッドキャストを取った後Auditionですべきこと

ポッドキャストを取った後Auditionですべきこと

この記事はポッドキャストなどの音声コンテンツを取った後にAuditionで編集する方法について解説しています。 環境 やること 基本的に以下の4つの工程をすると、かなりクオリティアップにつながります! ノイズリダクション 無音部分を選択します。開始地点をi, 終わりをo キーを押すと選択できます。選択できたらエフェクト→ノイズリダクション/リストア→ノイズプリントをキャプチャを押します。 続いて、全体を選択します。cmd, a で全選択になります。エフェクト→ノイズリダクション/リストア→ノイズリダクションを選択します。 以下のようなパネルが表示されうので、ノイズのみをきたりして、削減ちを調整して、良い感じになったら適応ボタンを押します。 シングルバンドコンプレッサ 左のパネルのエフェクトトラックから▶️ボタンを押し、振幅と圧縮→シングルバンドコンプレッッサを選択します。 選択すると下記のようなパネルが開きます。それぞれ、 といった意味があります。設定値は下記画像のようにしています。 設定がめんどくさい場合はプリセットからラジオレベラーを選択してください。 EQ(声をクリアにする) パラメトリックイコライザーを使用します。エフェクト→フィルターとイコライザ→パラメトリックイコライザーを選択します。 私の場合は下記のように設定しています。 無音カット エフェクト→診断→無音をカットをすると左パネルに診断が表示されます。 効果を無音を削除、プリセットをポッドキャストにするとちょうどよくなると思います。設定したら、スキャンボタンを教えて、全て削除で無音がカットされます。 かなりカットされてしまうので、短いCM等に使うのはありかなという感じです。 参考 Adobe 無音カット https://helpx.adobe.com/jp/audition/using/strip-silence.html

この記事を書いた会社

株式会社coiaiは、「想像できることを美しく実現」を掲げ、XR・Web・アプリ・システム開発およびDX支援を行う会社です。 創業2022年、東京都練馬区に本社を置き、要件のヒアリングからPoC(概念実証)、本番運用まで一貫して伴走します。 まずはお気軽にご相談ください。

商号株式会社 coiai創業2022年1月設立2025年1月23日資本金1,500,000円(設立時点)本社所在地東京都練馬区関町北 3-6-9代表者代表取締役 竹村 啓佑 / 代表取締役 服部 陽良

主なご相談内容

会社概要・役員紹介を見る

詳しい会社情報は会社概要ページでご覧いただけます。

資料請求・無料相談

導入要件のヒアリングからPoC、本番運用まで伴走します。まずはお気軽にご相談ください。

お問い合わせの前に 個人情報保護方針 をご確認ください。