最近contentfulを業務で使うことが多くなった上に、非エンジニアの方々にcontentfulを教える作業が辛くなったため、エディタをwordpress、データベース・APIをcontentfulにと役割分担させるべく「wordpressで書いた記事をcontentfulに同期しちゃう」というスクリプトを書きました。
その際、contentfulのfieldsの仕組みを鑑みてwordpressの記事投稿は通常投稿(post)を許容せず、いわゆるカスタム投稿(custom post type)のみを許容するようにしました。
正直、通常記事しかないとしたらcontentfulの高機能なAPIを使うこともないと思うので、wordpress rest apiでゴニョゴニョして運用した方がいいと思います。
早速使ってみる
Githubからzipなりpullなり適当にダウンロードしてもらって、ローカルで下準備をします。
必要なもの
とりあえず、必要なものは
Wordpress Information
- "Wordpress rest url"(ex: https://example.com/wp-json/wp/v2)
- "Wordpress custom post type slug names"(ex: ["example_slug1","example_slug2", ...])
Or (Only one of these two)
- "Wordpress custom posts and custom post type slug names of those" (ex:
{ "example_slug1": ["example_post1", ...], ... } )Contentful Information
以上になります。(githubから横流しですみません)
日本語で軽く説明しますと、
wordpress rest apiからデータをとるため、rest apiのurl(これは、wp-json/wp/v2という末尾を考えています)、データの対象であるslugsやposts・slugsのペアのいずれかが必要になります。(どっちもはダメです)
次に、contentfulにデータをアップロードする際に諸々の情報が必要になりますが、基本的にググれば出るので割愛します。気をつけることとしては、management apiとdelivery apiが割と区別されているので惑わされないようにするくらいです。(management apiは作成とかで、delivery apiは閲覧専門的な感じです)
wordpress側の設定と入力事項
今回テスト環境に適当なwordpressをインストールして、rest apiは全て公開するというノンセキュアな環境のみで実行しています。そのため、セキュリティプラグインが邪魔するなどの方は、リポジトリを改変するかセキュリティプラグインの設定をうまくrest apiが使えるようにチューニングしてください。
wordpressに Custom Post Type UIを入れてカスタム投稿量産体制を整える
このプラグインを使用すると、カスタム投稿がボタンぽちぽちするだけで作れて、カスタムタクソノミーもボタンぽちぽちで瞬時に作れます。
とりあえず、テストというカスタム投稿とカスタムタグ、カスタムカテゴリーを作成しちゃいます。
(同様にカスタムカテゴリー。写真略)
脱線しますが、wordpressって無料プラグインのくせにあり得ないほどの高機能なプラグインがあったりしてたまに怖いです。その中でもこのプラグインはシンプルさと高機能・カスタマイズ性の高さがすごいので是非この機会に今後も使ってもらいたいですね。
wordpress上でデータを作っとく
僕は、以下のようにデータを作っときました。
下書きを入れているのは、テスト用で、下書きはrest api上で取得できないです。そのためcontentfulへのデータ移植は公開済みのものしか対応していません。
Contentfulでapiを取得する
contentfulアカウント作成→スペース作成(スペースIDが後に必要)→Delivery api keyを取得(後に必要)→management api keyを取得(後に必要)→地域設定が必要なら済ませてdefault areaを設定(後に必要)
加えて、ENVIRONMENT_IDも必要だったりしますが、基本的にmasterで問題ないはずです。
スクリプトを実行する
二通りのパターンで実行できるようにしましたが、今回は楽チンに設定ファイルで済ませてしまいます。
.env.jsonに直接環境設定を記載。ローカル環境なのでこうしています。
setup.jsonにwordpress側の欲しいデータの設定を記載。
なお、WORDPRESS_POST_TYPE_SLUGSとWORDPRESS_POST_TYPE_SLUG_IDSの片方は空でないといけないようにしました。両方を考慮するパターンは、需要がなさそうな上に処理が煩雑になったためです。
run script
node index.js
で実行。
色々出力していますが、終わってcontentfulを確認して中身がいい感じなら完了です。
なお、後半忙しくなって、entry titleを設定してないので、最後にそれだけ設定してしまいましょう。
Entry Titleの設定
Content Modelに入って、作成したcontent modelをクリックします。
その後titleのSettingsをクリックして、Field optionsというところにあるThis field represents the Entry titleにチェックをつければ完了です。
注意点とまとめ
基本的に、個人的なスクリプトなので共通して雑に作成しています。暇な方はプルリク投げてくれると仕事した感が出るのでお願いします。
注意点
今回個人的な使用目的に限定しているためいくつかの制約があります。
・カスタム投稿しか使えない
・カスタムフィールドとかに対応していない
・カスタムタクソノミーがcontent modelのshort textのlistとして扱われる(※1)
・親カテゴリーなどに対応していない
などなど
個人的には、通常投稿で固めていてカスタムフィールドをデータベースとして使用している方も多い印象なので、そうした方々はそれらデータをエクスポートしてカスタム投稿とカスタムタクソノミーに合うように工夫してもらうとかがいいかと思います。例えば、wordpressダッシュボードのツールからエクスポートして、ローカルでそのファイルのpost名をカスタム投稿のpost名に置換してインポートするとカスタム投稿として複製されます。
まとめ
用途が限られるかもしれませんが、簡易的なサイトであったり個人用サイトではこのスクリプトで物足りることは多い気もします。保守メンテはとても暇な際にやる予定なので、エラーが出たりしたら一応共有して頂けると嬉しいです。
※1:contentfulの仕様的に、いわゆるタグやカテゴリーを実現するには、1.content modelに作成するパターンと2.fieldsに書いてしまうパターンの二つがあります。1のパターンだと絞り込みでgetする際にrelationから取得しますが、2のパターンだと標準のfieldsの絞り込みapiで実現できます。好き好きではありますが、個人的にcontentfulの無料枠がasset 5000まで(1だとasset扱いにならざるをない)なのでケチな私は2しか選べなかっただけです。すみません。