RESTful WP-CLI – 我最近一直在折腾的项目


我只想说——2月4日星期四真是相当令人沮丧。1月份,我花了大量时间投入到 WP REST APIREST API REST API 是 RESTful 应用程序接口(API)的缩写,它使用 HTTP 请求来 GET、PUT、POST 和 DELETE 数据。这是应用程序的前端(比如“手机应用”或“网站”)与数据存储(比如“数据库”或“文件系统”)进行通信的方式。
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 应用的一半以上,所以我遇到了几十种希望能够更高效地使用 WordPress 的方式。当然,这意味着要在命令行中完成这些操作。

在继续之前先说明:大多数(如果不是全部)RESTful WP-CLI 功能都需要对 WP-CLI 的底层进行更改。你需要运行 wp cli update --nightly,才能在本地尝试这些新功能。完成后,可以运行 wp package install danielbachhuber/wp-rest-cli 来安装最新版本。

使用 --debug--debug=rest 来分析你的 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 是万维网使用的底层协议,它定义了消息的格式和传输方式,以及 Web 服务器和浏览器应如何响应各种命令。 完成:

$ wp --http=http://daniel:[email protected] rest post edit 1

就是这样。

参与进来吧!

我很期待听到你对我关于打造更 RESTful WP-CLI 的几十个想法的意见:

  • APIAPI API(应用程序编程接口)是一种软件中间层,允许程序相互交互,并以有限且明确定义的方式共享数据。 Blueprint 和 Swagger 等格式呈现帮助文档 [#36]
  • 引入 wp rest * generate,以应用程序所需的格式生成模拟数据 [#55]。
  • 引入 wp rest * diff,以便比较两个不同 WordPress 实例的状态,类似于 Dictator [#56]。
  • 设计一个优雅的别名实现,让 --http=http://daniel:[email protected] 变成 @wpdev [#2039]

我也想听听你的想法!当然,也欢迎任何反馈、问题或激烈的异议。让我们在 Github 上聊聊