調査・研究レポートReport

投稿日:2019年3月3日

WordPress REST API V2 経由でカスタム投稿に紐づくカスタムタクソノミーを更新する

表題の件、ものすごいハマったのでシェアします。

REST API v2 でカスタムタクソノミーを登録できるまでの長い道のり

カスタム投稿用のエンドポイントを作成する

まずカスタム投稿を REST API から操作できるようにするためにはカスタム投稿を作成するための記述を変更する必要があります。

以下の記事にあるように register_post_type() に以下のパラメータを与えてあげる必要があるので修正しましょう。

参考:WordPress REST API で、カスタム投稿タイプなどの情報を取得する

WordPress REST API で、カスタム投稿タイプなどの情報を取得する

上記によって recruit (求人情報) というエンドポイントを作成しました。

APIリファレンスによると投稿のエンドポイントはカスタムタクソノミーをサポートしていない

次にAPI リファレンスでカスタムタクソノミーの更新方法について調べてみることに。

しかしカテゴリとタグしかデフォルトではサポートされてないようでカスタムタクソノミーはどうやらサポート対象外…

カスタムフィールドに関してはACF(Advanced Custom Field)の拡張プラグインを入れることで周辺の機能を拡張してくれるのだが、カスタムタクソノミーにはそのようなプラグインもないので非常に困った状況に陥ったわけです。

参考:REST API ハンドブック 投稿

Posts

リクエストを受領時のアクションフックでカスタムタクソノミーを登録してあげる必要性

そこでとりあえず「Custom Taxomies REST API v2 WordPress Create Posts」とかこのあたりのキーワードでひたすら検索を繰り返しているといい感じの記事にたどり着きました。下記参考の記事を見る限りではエンドポイント送られてきたリクエストを受け取って自分でカスタムタクソノミーを操作しろと書いてあるので早速やってみるも動かない…

この時 functions.php に追加した記述は以下の通り。

参考:Assign custom taxonomy to post with REST API

https://stackoverflow.com/questions/47015522/assign-custom-taxonomy-to-post-with-rest-api

アクションフック「rest_insert_{$this->post_type}」

どうやら rest_insert_posts だと投稿にしか対応してくれない模様。なので、今回追加した recruit 専用のアクションフックが作られているようでしたのでそちらで試してみたらとりあえずは動きました。

参考:do_action( “rest_insert_{$this->post_type}”, WP_Post $post, WP_REST_Request $request, bool $creating )

rest_insert_{$this->post_type}

$request->get_json_params() が配列を取得してくれない

今度は上記の関数が配列を取得してくれないことがわかったので、REST API のリクエストを司るクラスを調査してみることに。

今回自分の実装の仕方だとリクエストボディにパラメータを全部含める形だったので WP_REST_Request クラスのリクエストボディを取得するためのメソッドがあることを知って差し替えてみたら動きました。

参考:WP_REST_Request

https://developer.wordpress.org/reference/classes/wp_rest_request/

リレーションを削除する場合には wp_delete_object_term_relationships() を使う

タクソノミーでONにする情報を送ったときに一旦すべてのリレーションをOFFに変更してから指定されたものをONにすることによって、カスタムタクソノミーを個別にON/OFFを切り替えることができます。最終的には以下の形になりました。

参考:Function Reference/wp delete object term relationships

https://codex.wordpress.org/Function_Reference/wp_delete_object_term_relationships

2019年3月7日追記

WordPressのバージョンを最新の5.1上げたら上記で動かなくなりました。仕組みはよくわかりませんが、どうやら wp_delete_object_term_relationships() を実行しなくてもリレーションは解除されるようです。その1行をコメントしたらうまく動くようになりました。

まとめ

上記によって、とりあえずはREST API 経由でカスタム投稿タイプのカスタムタクソノミーを登録することができました。

調査時間的には10時間くらい合計でかかったので、日本語しかできない自分にとってはいろいろと時間的な限界を感じますね。Google翻訳への依存率は劇高になってるけど、これもっとGoogle翻訳への習熟度を高めたり使いこなすってことが重要になるんでしょうね、今後の日本人のエンジニアにとっては。

全員英語ができる状況には絶対にならないし、日本語しかできなくても遜色なく仕事ができる状況がもっとリアルに目の前に迫ってる感じが非常にうれしいところではあります。

ただ英語を翻訳するのではなく、日本語情報が充実していればかかる時間も半分以下になると思うので学習情報の充実は何とかしないといけないなぁと思います。WordPressCoreが学べる学校とかあったら入りたいんだけど日本にはないからなぁ。いっそのことeラーニングで作りたいくらいなんだけど、まぁ色々あって作るとしたらもっと先になるかな。未経験者から初心者の階段は各プログラミングスクールが準備してるけどその先が一向に準備されていない現状何とかしたいよね。これも僕自身が抱えてる困り感の一つだし、他に同じこと感じてる人多そうだからこれも何とかしたい課題の一つ。中小企業向けというよりかは僕たちみたいに田舎で周囲から情報を手に入れづらい状況にいて、ぼちぼちやってるエンジニア向けとしてすごくほしいところですね。

でもまぁ、ビジネスって考えると顧客母数が少ないんだろうからここに進出してくる企業は少数派だと思うし、だからこそ、僕らみたいな田舎にいるエンジニアが作らないと誰も作らないんじゃないかなぁって思います。まぁ、地域に制約されているようでは時代に乗り遅れているも同然なので、一歩先を行く学習媒体として情報インフラみたいなものを作っていきたいところだし、今後の自社における事業の柱はこの部分になっていく予定なんですけどね。

WordPress開発のススメ

WordPress Coreの部分まで踏み込んで開発ができるようになってくるとWordPressは更に楽しくなってきます。基本的には敷居が低めのフレームワークとして世界のディファクトスタンダードを取った環境ではありますが、懐もそれなりに深さがあります。日々テーマ開発を行うだけで満足せず、プラグイン開発やWordPressを利用した業務アプリ開発など一歩踏み込んだ領域に到達するとウェブサイト制作の用途だけに限らず、業務アプリ開発の現場を劇的に工数削減できそうだったりしてその可能性は計り知れません。

「WordPressは安い」って印象が世間的にあるおかげか、徐々に企業さんの業務アプリをWordPressベースで開発するなんて案件も出てきているので、使い方次第では本当に化けると思うしスクラッチで業務アプリを1から開発するのがコスト的にもったいない!あり得ない!と思える時代来るんじゃないの?とかもちょっとだけ感じたりしてます。それだけWordPressはポテンシャルあると個人的には考えています。ウェブサイトに限定されず、本当の意味でのCMS(Contents Management System)になれる日が来るのか楽しみです。

でもまぁ、僕もまだまだなので、WordPress界隈のエンジニアの先輩方の背中を頑張って追いかけたいと思います。

WordPressのスキルを一歩上に高める最初のステップとしてオススメの書籍を1冊だけご紹介しますのでよかったら手に取ってみてください。

サイトの拡張性を飛躍的に高める WordPressプラグイン開発のバイブル

https://amzn.to/2ToKAJs

FLARESへのご相談・ご依頼

制作依頼・サービスについて不明な点ございましたらお気軽にお問い合わせください

資料ダウンロード

会社やサービスに関する資料ダウンロードをご希望の方は右の資料ダウンロードページからご利用ください。

採用情報

採用応募をご希望の方は応募フォームからご応募ください。

採用サイトへ