まず、こう言わせてください――2月4日木曜日は本当にひどく意気消沈する日でした。1月には、コマンドラインでやりたいことに備えて、WP REST APIREST API REST APIは、HTTPリクエストを使用してデータをGET、PUT、POST、DELETEするRESTful Application Program Interface(API)の略称です。アプリケーションのフロントエンド(「スマートフォンアプリ」や「ウェブサイト」など)がデータストア(「データベース」や「ファイルシステム」など)と通信するための仕組みです。
https://developer.wordpress.org/rest-api/に多大な時間を費やしましたが、その会議で勢いも、ひらめきも、全般的な良い感情も失われてしまいました。そのため、2月と3月の大半は、WP REST APIとは関係のないWP-CLIWP-CLI WP-CLIはWordPress用のコマンドラインインターフェースで、管理や開発の作業をプログラムから実行するために使用されます。プロジェクトページはhttp://wp-cli.org/ https://make.wordpress.org/cli/ですの機能(例:パッケージ管理)に取り組みました。
しかし、私は再び立ち上がりました。あの便利なWP REST API + ReactReact Reactは、ステートレスおよびステートフルなユーザーインターフェースの理解、構築、保守を容易にするJavaScriptライブラリです。
https://reactjs.org WordPressアプリケーションの3分の2まで進んでいるため、WordPressをより効率的に扱う方法が数十個も欲しくなってきました。そしてもちろん、それをコマンドラインで実行するということです。
先に進む前に、多くとは言わないまでも、ほぼすべてのRESTful WP-CLI機能では、内部的にWP-CLIの変更が必要でした。この新機能をローカルで試すには、wp cli update --nightlyを実行してください。実行したら、wp package install danielbachhuber/wp-rest-cliで最新版をインストールできます。
RESTエンドポイントをプロファイリングするには--debugと--debug=restを使用します
REST APIは速度がすべてです。ミリ秒単位の差が重要であり、削減できた時間の一つひとつがユーザー体験に実際の影響を与えます。
エンドポイントが実行しているクエリの数と所要時間を、はるかに簡単に把握できるように、RESTful WP-CLIに軽量なプロファイリング機能を追加しました。
任意のコマンドでクエリの概要を取得するには--debugを使用します。
$ wp rest post list --debug
Debug (rest): REST command executed 7 queries in 0.001954 seconds. Use --debug=rest to see all queries. (1.446s)
+----+-----------------------------+
| id | title |
+----+-----------------------------+
| 1 | {"rendered":"Hello world!"} |
+----+-----------------------------+
実行されたクエリの完全な一覧を取得するには--debug=restを使用します。
$ wp rest post list --fields=id,title --debug=rest
Debug: REST command executed 7 queries in 0.001696 seconds. Ordered by slowness, the queries are:
1:
- 0.000291 seconds
- WP_REST_Posts_Controller->get_items, WP_Query->query, WP_Query->get_posts
- SELECT SQL_CALC_FOUND_ROWS wp_posts.ID FROM wp_posts WHERE 1=1 AND wp_posts.post_type = 'post' AND (wp_posts.post_status = 'publish') ORDER BY wp_posts.post_date DESC LIMIT 0, 10
2:
- 0.000257 seconds
- WP_REST_Posts_Controller->get_items, WP_Query->query, WP_Query->get_posts, WP_Query->set_found_posts
- SELECT FOUND_ROWS()
3:
- 0.000256 seconds
- WP_REST_Posts_Controller->get_items, WP_REST_Posts_Controller->prepare_item_for_response, setup_postdata, WP_Query->setup_postdata, get_userdata, get_user_by, WP_User::get_data_by
- SELECT * FROM wp_users WHERE ID = '1'
4:
- 0.000244 seconds
- WP_REST_Posts_Controller->get_items, WP_REST_Posts_Controller->prepare_item_for_response, setup_postdata, WP_Query->setup_postdata, get_userdata, get_user_by, WP_User->init, WP_User->for_blog, WP_User->_init_caps, get_user_meta, get_metadata, update_meta_cache
- SELECT user_id, meta_key, meta_value FROM wp_usermeta WHERE user_id IN (1) ORDER BY umeta_id ASC
5:
- 0.000233 seconds
- WP_REST_Posts_Controller->get_items, WP_Query->query, WP_Query->get_posts, _prime_post_caches
- SELECT wp_posts.* FROM wp_posts WHERE ID IN (1)
6:
- 0.000209 seconds
- WP_REST_Posts_Controller->get_items, WP_Query->query, WP_Query->get_posts, _prime_post_caches, update_post_caches, update_object_term_cache, wp_get_object_terms
- SELECT t.*, tt.*, tr.object_id FROM wp_terms AS t INNER JOIN wp_term_taxonomy AS tt ON tt.term_id = t.term_id INNER JOIN wp_term_relationships AS tr ON tr.term_taxonomy_id = tt.term_taxonomy_id WHERE tt.taxonomy IN ('category', 'post_tag', 'post_format') AND tr.object_id IN (1) ORDER BY t.name ASC
7:
- 0.000206 seconds
- WP_REST_Posts_Controller->get_items, WP_Query->query, WP_Query->get_posts, _prime_post_caches, update_post_caches, update_postmeta_cache, update_meta_cache
- SELECT post_id, meta_key, meta_value FROM wp_postmeta WHERE post_id IN (1) ORDER BY meta_id ASC
(1.598s)
+----+-----------------------------+
| id | title |
+----+-----------------------------+
| 1 | {"rendered":"Hello world!"} |
+----+-----------------------------+
プロファイリングは、あらゆるCRUD操作で機能します。
$ wp rest post create --title="Test post" --user=daniel --debug
Debug (rest): REST command executed 28 queries in 0.023962 seconds. Use --debug=rest to see all queries. (1.777s)
Success: Created post.
$ wp rest post update 3 --content="Foo bar" --user=daniel --debug
Debug (rest): REST command executed 31 queries in 0.023309 seconds. Use --debug=rest to see all queries. (1.634s)
Success: Updated post.
この機能が、私にとってそうであるように、あなたのRESTエンドポイント開発プロセスにとってかけがえのないものになることを願っています。GithubのIssueでフィードバックをお寄せください。
システムエディターでリソースを編集するにはwp rest * editを使用します
ご存じない方も多いと思いますが、wp post edit <id>を使えば、システムエディター(例:vim)で投稿内容を編集できます。これでwp rest * editを使えば、任意のRESTリソースをシステムエディターで編集できるようになりました。
$ wp rest post edit 3 --user=daniel
wp rest * editを実行すると、RESTful WP-CLIはリソースを取得し、それをYAMLドキュメントに変換して、システムエディターに表示します。
---
date: 2016-04-14T14:02:57
date_gmt: null
password:
slug:
status: draft
title:
raw: Test post
rendered: Test post
content:
raw: Foo bar
rendered: |
|
Foo bar
excerpt:
raw:
rendered: |
|
Foo bar
author: 1
featured_media: 0
comment_status: open
ping_status: open
sticky: false
format: standard
categories:
- 1
tags: [ ]
フィールドを変更すると、コマンドはその内容を(WP REST APIを通じて)WordPressに送り返して更新します。
Basic Authに対応しているWordPressインストールでは、HTTPHTTP HTTPはHyper Text Transfer Protocolの略称です。HTTPはWorld Wide Webで使用される基盤プロトコルであり、メッセージの形式と送信方法、またさまざまなコマンドに応じてWebサーバーやブラウザーが取るべき動作を定義します。経由での編集も可能です。
$ wp --http=http://daniel:[email protected] rest post edit 1
そして、 voilà。
参加しましょう!
よりRESTfulなWP-CLIについて私が持っている数十のアイデアに、ぜひご意見をお聞かせください。
- ヘルプドキュメントをAPIAPI API(Application Programming Interface)とは、プログラム同士が相互にやり取りし、明確に定義された限定的な方法でデータを共有できるようにするソフトウェア仲介機能です。 BlueprintやSwaggerなどの形式で表示する [#36]
- アプリケーションが想定する形式でモックデータを生成する
wp rest * generateを導入する [#55]。 - DictatorのようにDictator、2つの異なるWordPressの状態を比較できる
wp rest * diffを導入する [#56]。 --http=http://daniel:[email protected]が@wpdevになるよう、洗練されたエイリアス実装を考える [#2039]
皆さんのアイデアもぜひ聞かせてください!フィードバック、質問、あるいは激しい反対意見も歓迎します。Githubで話しましょう。