NuxtとNetlifyパート2による簡単なヘッドレスWordPress


パート2 - Nuxtと


ヘッドプレスのCMSとしてWordPressを設定するとお得な情報.
NetLifyで展開して、我々のCMSにビルドフックを加えるカバー.
JSON APIのエンドポイントが設定されているので、当社のWordPressの記事やメディアファイルからのデータをクエリすることができます操作し、静的なHTMLファイルにVueとNuxtを使用してレンダリングされます.

NuxTアプリの作成


コマンドラインから新しいNuxtプロジェクトを起動しますnpx create-nuxt-app wp-nuxtこのデモの目的のために以下の設定を行います.
? Project name: wp-nuxt
? Programming language: JavaScript
? Package manager: Npm
? UI framework: Tailwind CSS
? Nuxt.js modules: Axios
? Linting tools: ESLint, Prettier
? Testing framework: None
? Rendering mode: Universal (SSR / SSG)
? Deployment target: Static (Static/JAMStack hosting)
? Development tools: jsconfig.json (Recommended for VS Code if you're not using typescript)
この設定で、VSコードを使用している場合は、次のようにワークスペースの.vscode/settings.json prettier、eslint、およびveturの間の衝突を避けて、正しく保存の上でコードの自動フォーマットを可能にするために.

設定。JSON


{
  "[html]": {
    "editor.defaultFormatter": "esbenp.prettier-vscode"
  },
  "[css]": {
    "editor.defaultFormatter": "esbenp.prettier-vscode"
  },
  "editor.codeActionsOnSave": {
    "source.fixAll.eslint": true
  },
  "eslint.validate": [
    "javascript",
    "vue"
  ],
  "vetur.validation.template": false,
  "css.validate": false,
}
NuxtはボックスのVUEX(Vueの州管理ライブラリ)へのアクセスを提供します.移動するstore/ ディレクトリと新しいファイルの作成index.js . データの取り込みと操作のほとんどはこのファイルで行われます.

ストア/インデックス。js


export const state = () => ({
  events: [],
});

export const getters = {};

export const mutations = {};

export const actions = {};

カスタムフィールド


データを問い合わせる前に、WordPressでそれを生成する必要があります.パート1で作成した新しいカスタム投稿タイプのいくつかを追加し、それらにいくつかのACFフィールドを追加します.それをするにはCustom Fields -> Field Groups -> Add New WordPressのダッシュボードで.あなたがACFに新しいならばdocumentation 実際にはかなり良いです.

このデモでは、イベントという名前の新しいフィールドグループを作成し、「POST型がイベントに等しい場合は、このフィールドグループを表示する」の場所を設定します.

4つの必須フィールドを次の設定で追加します.
Label: Speaker
Name: speaker
Type: Text

Label: Start Time
Name: start_time
Type Date Time Picker

Label: End Time
Name: end_time
Type: Date Time Picker

Label: Image
Name: image
Type: Image
Return Format: Image Array

いくつかのイベントを追加し、必要なフィールドにだけでなく、デフォルトのコンテンツ領域にいくつかのテキストを追加します.
移動するhttp://headless.local/wp-json/wp/v2/events?page=1&per_page=100&_embed=1 そして、あなたはデータを返しますacf にマッチするキーを持つオブジェクトName あなたのカスタムフィールドに入力します.

データの取得


VUEXストアのNuxt Repoに戻ってくださいevents イベントデータを取得するための配列.

ストア/インデックス。js


export const mutations = {
  SET_EVENTS: (state, events) => {
    state.events = events;
  },
};

export const actions = {
  async getEvents({ state, commit }) {
    // if events is already set, stop
    if (state.events.length) return;
    try {
      let events = await this.$axios.$get(`/wp-json/wp/v2/events?page=1&per_page=100&_embed=1`);
      // filter out unnecessary data
      events = events.map(({ id, slug, title, content, acf }) => ({
        id,
        slug,
        title,
        content,
        acf,
      }));
      commit('SET_EVENTS', events);
    } catch (err) {
      console.error('getEvents', err);
    }
  },
};

The @nuxtjs/axios モジュールを実行したときにインストールされましたcreate-nuxt-app 我々にアクセスするthis.$axios .
使用$get データへの即時のアクセスを与えて、通常を必要としません.then(res => res.data) コールの終わりには、かなりクールな機能iMooです.
そうする前に、我々は我々を加えなければなりませんbaseURLaxios NuXt設定ファイルのオブジェクト.

Nuxt設定。js


axios: {
  baseURL: 'http://headless.local',
},
さて、コンポーネントの作成フックでアクションを呼び出します.

インデックス.Vue


<script>
import { mapState, mapActions } from 'vuex';
export default {
  computed: {
    ...mapState(['events']),
  },

  created() {
    this.getEvents();
  },

  methods: {
    ...mapActions(['getEvents']),
  },
};
</script>
また、VUEXの状態とアクションにアクセスすることができますthis.$store.state.events and this.$store.dispatch('getEvents') , しかし、私はそれがきれいに見えて、特定の構成要素で使われている世界的な状態と行動のすべての1つの場所で示すので、VEEX MAPヘルパーを使うのを好みます.

サーバー側を実行する


我々が我々の静的HTMLを生成しているとき、我々のFETCH要求がサーバーで動くのを確実にするために、我々はNuxTプラグインを加えることができます.ファイルを作成するdata.server.js インサイドplugins/ ディレクトリ.

プラグイン/データ。サーバ。js


export default async ({ store }) => {
  await store.dispatch('getEvents');
};
そして、あなたのNuxt Configにプラグインを加えてください.

Nuxt設定。js


plugins: ['~/plugins/data.server.js'],

ページに表示する


これでコンポーネントのテンプレートにデータを使用できます.

インデックス.Vue


<template>
  <div class="max-w-screen-lg mx-auto p-10">
    <div v-for="(event, index) in events" :key="event.id">
      <div :key="index" class="lg:flex lg:max-w-screen-lg pb-8 lg:pb-16">
        <div class="lg:w-1/4">
          <img
            v-if="event.acf.image"
            :src="event.acf.image.sizes.large"
            :alt="event.acf.image.alt"
            class="w-64 h-64 object-cover mb-4 lg:mb-0"
          />
        </div>
        <div class="lg:w-3/4 lg:pl-8">
          <h4 class="text-xl lg:text-3xl font-normal leading-tight">
            {{ event.title.rendered }}
          </h4>
          <h3 class="lg:text-2xl font-bold mb-2">
            {{ event.acf.speaker }}
          </h3>
          <time class="text-sm lg:text-lg font-mono block mb-2">
            {{ event.acf.start_time }} - {{ event.acf.end_time }}
          </time>
          <p class="mb-4" v-html="event.content.rendered"></p>
          <nuxt-link :to="`/events/${event.slug}`" class="btn-sm lg:btn btn-green mb-2 mr-2">
            Event Info
          </nuxt-link>
        </div>
      </div>
    </div>
  </div>
</template>
ここでは、私たちが走ったとき、私たちもインストールされたTailwind CSSフレームワークからユーティリティクラスを使用していますcreate-nuxt-app . あなたがTarwindについてより知りたいならばdocs それは私が今まで使用した最高のいくつかです.
あなたがこの点まで続いたならば、あなたはこれに似ている何かを持つべきです:

しかし、我々は日付順にイベントを表示する必要がある場合.そのために、私たちはguexを使用することができます.

ストア/インデックス。js


export const getters = {
  sortedEvents: (state) => {
    return state.events.slice().sort((a, b) => new Date(a.acf.start_time) - new Date(b.acf.start_time));
  },
};
だってsort メソッドは、元の配列をmap , filter , or reduce , 私は最初の使用slice 浅いコピーを作成してからコピーをソートする引数がないメソッドです.
次のコンポーネントを追加します.

インデックス.Vue


- import { mapState, mapActions } from 'vuex';
+ import { mapState, mapGetters, mapActions } from 'vuex';
export default {
  computed: {
    ...mapState(['events']),
+    ...mapGetters(['sortedEvents']),
  },
  created() {
    this.getEvents();
  },
  methods: {
    ...mapActions(['getEvents']),
  },
};
テンプレートで
- <div v-for="(event, index) in events" :key="event.id">

+ <div v-for="(event, index) in sortedEvents" :key="event.id">
私たちの開始と終了時刻の形式についてもう少し制御するためには、日付fnsnpm i @nuxtjs/date-fns .
次に@nuxtjs/date-fns Nuxt Configのモジュールをビルドし、使用するメソッドをインポートします.あなたが必要とする機能だけをインポートすることができることは、瞬間のような何かについての日付fnsの巨大なパフォーマンス利点です.jsこの例では1メソッドのみ必要です.format . 日付の詳細情報についてはfnsのチェックアウトdocs .

Nuxt設定。js


buildModules: [
  '@nuxtjs/tailwindcss',
+  '@nuxtjs/date-fns',
],
dateFns: {
  methods: ['format'],
},
今すぐ使える$dateFns 以下のようなテンプレートで直接メソッドを示します:

インデックス.Vue


- {{ event.acf.start_time }} - {{ event.acf.end_time }}
+ {{ $dateFns.format(new Date(event.acf.start_time), 'E h') }} - {{ $dateFns.format(new Date(event.acf.end_time), 'haaaaa') }}
私たちのVueのJSページのWordPress JSON APIからコンテンツをレンダリングかなり良い見ている!
パート3では、我々はNuxtアプリをNetlifyに展開し、ビルドフックを追加するので、いつでも新しいコンテンツを公開することができます.
読書ありがとう!ソースコードを見てくださいmidwestdesignweek.com . 👀

株式会社 / デザインウィーク



このセットアップのすべてがあまりにも多く、またはあなたが急いでいるならば、Netlifyはあなたが出発点として使うことができたこの目的のために作られた偉大なレポでした.それは、Vueコアチームのメンバーサラドラスナーによって共同執筆されても、雑誌を壊す上でその内部の作業を説明するコンパニオン記事を持っています.
この記事とレポは、私が始めたとき、とても役に立ちました.

ネットラボ / ヘッドレスWNU


🏔 ヘッドレスワードプレスJamstackテンプレート