2020
05/13

VueからWP REST APIでWordPressに投稿する方法がびっくりするほど簡単だった

これまでWordPressを使ったユーザー投稿型のサイトをいくつか作ってきたのですが

タイケツ – TAIKETSU.CO
とか
Web制作者の(苦笑)
とか
Codetter(こーどったー)
とか

フロント部分をVueにして投稿処理や記事取得にWP REST APIを使ったらどうだろうと思い試してみたところ、びっくりするぐらい簡単にできてしまったのでその感動をお伝えします。

ADs

WordPressの準備

サーバーにWordPressをインストールします。
WordPressはREST APIによってVueによるページからの投稿データを保存する、記事を出力するだけの役割ですので、テーマは使いません(万が一見られても困るので空白のテーマを作って適用させておけばよい)。

※仮に
https://example.com/wp/
にインストールしたとします。

投稿ユーザーの作成

投稿者用のユーザーを作成します。
外部からの投稿ユーザーも管理者と同じアカウントを使っても問題ありませんが、別ユーザーを作っておいたほうが管理しやすいでしょう。投稿権限が必要なので投稿が可能なグループ(「投稿者」やUser Role Editorで細かく設定するなど)にしておきます。

※仮にconsumerというユーザーを作ったとします。

Application Passwordsプラグインの導入

Application Passwordsプラグインをインストールし、有効化します。

有効化してユーザー一覧を開き、先程作成したユーザー(consumer)の詳細を見ると「Application Passwords」という項目が増えています。

ここの「New Application Password Name」に同じユーザー名(consumer)を入力し、「Add New」をクリックするとパスワードが発行されます。

このパスワードは一度しか表示されないためコピペしておきます。

※仮にパスワードを「R9TM 38p0 Cm40 7czU fzXZ jlgY」とします。
このパスワードはどこにも使ってませんのでご安心ください。

functions.phpに追記

今回は投稿内容にカスタムフィールドを含めたいため、

・投稿時にカスタムフィールドを追加する関数
・記事取得時にカスタムフィールドを取得する関数

を追加します。

投稿時にカスタムフィールドを追加する関数

WP REST API v2でカスタムフィールドを含む投稿を行う

投稿内容に「meta」というオブジェクトがあった場合、そのオブジェクトのキー名をカスタムフィールド名、valueをカスタムフィールドの値とする関数です。

記事取得時にカスタムフィールドを取得する関数

WP REST APIによる記事取得はカスタムフィールドが含まれませんので、カスタムフィールドを含めるようにする関数です。

WP REST APIで投稿データを取得する際にカスタムフィールドの値を含める方法

この2つの関数は定型文として毎回functions.phpに追加するかオレオレプラグインとして置いておくといいでしょう。
WordPress側の作業はこれで終わりです。

Vue側

ビルドされたデータ(distフォルダの中身)を公開ディレクトリに置きます。

投稿フォーム

シンプルに本文(WordPressから見た場合、post_contentに当たる)と種類(「genre」というカスタムフィールドに持たせる)のみのフォームを作成します。

textareaとradioにv-modelでデータをバインドし、「投稿する」をクリックすることでpost()関数を実行するだけのシンプルなものです。

新着記事一覧

記事一覧をpostsという名称で保持し(これはのちほどaxiosで取得します)、v-forで一覧表示させます。

実運用ではページネーションや無限スクロールも考えないといけないですが、とりあえずは一覧を出すだけにしておきます。

スクリプト

スクリプト部分はたったこれだけ!

post関数はCSRF対策やエラー処理やバリデーション、重複投稿などやることはまだあるものの、フロントから記事を投稿させるだけならaxios.postの数行で済んでしまいます。

かつてはphpでwp_insert_postの処理を書き、jQueryでAjaxによるPOST送信の処理を書き…と面倒な仕事でしたが、非同期の送信処理がこれほど簡単に書けるとは…いい時代になったものです。

Authorizationの記述について

「ユーザー名:Application Passwordsプラグインが生成したパスワード」をbase64にエンコードしたテキストを記述します。

つまり、ユーザー名が「consumer」、パスワードが「R9TM 38p0 Cm40 7czU fzXZ jlgY」ですので、

consumer:R9TM 38p0 Cm40 7czU fzXZ jlgY

をエンコードして

Basic Y29uc3VtZXI6UjlUTSAzOHAwIENtNDAgN2N6VSBmelhaIGpsZ1k==

となります。

コード全文はGithubをご覧ください。

まとめ

ちょっと仕事の気晴らしにやってみようと思っただけでしたが、思いのほか簡単で驚きました。

Web制作系の方なら使い慣れているWordPressとモダンなフロントエンド環境であるVueの組み合わせというのもありだと思うのですが、いかがでしょう?

ADs

Post Comments

メールアドレスが公開されることはありません。

Comments

コメントはまだありません。