WP-CLI RESTful – ما كنت أعمل على تطويره


دعوني أقول فقط — كان يوم الخميس، الرابع من فبراير، محبطًا للغاية. أمضيت قدرًا هائلًا من الوقت في يناير في العمل على REST APIREST API واجهة REST API هي اختصار لواجهة برمجة التطبيقات (API) بأسلوب REST، التي تستخدم طلبات HTTP لجلب البيانات وتحديثها وإضافتها وحذفها. وهي الطريقة التي يمكن من خلالها للواجهة الأمامية لتطبيق ما (فكر في «تطبيق الهاتف» أو «الموقع الإلكتروني») التواصل مع مخزن البيانات (فكر في «قاعدة البيانات» أو «نظام الملفات»)
https://developer.wordpress.org/rest-api/
الخاصة بـ WP استعدادًا لما أردت القيام به عبر سطر الأوامر، وقد دُمّر قدر كبير من الزخم والإلهام والمشاعر الإيجابية عمومًا في ذلك الاجتماع. لذلك، أمضيت معظم شهري فبراير ومارس في العمل على ميزات WP-CLIWP-CLI WP-CLI هي واجهة سطر الأوامر الخاصة بـ WordPress، وتُستخدم لتنفيذ المهام الإدارية ومهام التطوير بطريقة برمجية. صفحة المشروع هي http://wp-cli.org/ https://make.wordpress.org/cli/ غير المرتبطة بواجهة REST API الخاصة بـ WP (مثل إدارة الحزم).

لكنني عدت إلى المسار الصحيح. وبما أنني قطعت ثلثي الطريق في أحد تطبيقات WordPress الرائعة التي تجمع بين WP REST API وReactReact React هي مكتبة JavaScript تسهّل فهم واجهات المستخدم عديمة الحالة وذات الحالة وإنشاءها وصيانتها.
https://reactjs.org
، فإنني أواجه عشرات الطرق التي أريد من خلالها جعل WordPress أكثر كفاءة. وبالطبع، يعني هذا تنفيذ ذلك عبر سطر الأوامر.

قبل أن نتابع: معظم ميزات WP-CLI المعتمدة على REST، إن لم تكن كلها، تطلبت تغييرات داخلية في WP-CLI. ستحتاج إلى wp cli update --nightly لتجربة هذه الوظائف الجديدة محليًا. وبعد ذلك، يمكنك استخدام wp package install danielbachhuber/wp-rest-cli لتثبيت أحدث إصدار.

استخدم --debug و--debug=rest لتحليل نقاط نهاية REST الخاصة بك

تتمحور واجهات REST API حول السرعة. فكل ميلي ثانية مهمة، وكل واحدة تتمكن من توفيرها سيكون لها تأثير حقيقي في تجربة المستخدم في العالم الواقعي.

لتسهيل فهم عدد الاستعلامات التي تنفذها نقطة النهاية ومدة تنفيذها بدرجة كبيرة جدًا، أضفت بعض إمكانات التحليل الخفيفة إلى WP-CLI المعتمد على REST.

استخدم --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!"} |
+----+-----------------------------+

تعمل إمكانات التحليل مع أي عملية من عمليات الإنشاء والقراءة والتحديث والحذف.

$ 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 الخاصة بها.

استخدم wp rest * edit لتحرير مورد في محرر النظام لديك

ربما لا يعرف معظم الأشخاص ذلك، لكن يمكنك استخدام wp post edit <id> لتحرير محتوى المنشور في محرر النظام لديك (مثل vim). والآن، باستخدام wp rest * edit، يمكنك تحرير أي مورد من موارد REST في محرر النظام لديك.

$ wp rest post edit 3 --user=daniel

عند تشغيل wp rest * edit، يجلب WP-CLI المعتمد على REST المورد، ويحوّله إلى مستند 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: [ ]

إذا أجريت تغييرات على أي من الحقول، فسيرسل الأمر هذه التغييرات مرة أخرى إلى WordPress (من خلال WP REST API) لتحديثها.

في عمليات تثبيت WordPress التي تدعم Basic Auth، يعمل التحرير أيضًا عبر HTTPHTTP HTTP هو اختصار لبروتوكول نقل النص التشعبي. ويُعد HTTP البروتوكول الأساسي المستخدم في شبكة الويب العالمية، ويحدد هذا البروتوكول كيفية تنسيق الرسائل ونقلها، والإجراءات التي ينبغي لخوادم الويب والمتصفحات اتخاذها استجابةً لأوامر مختلفة.:

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

وهكذا، voilà.

ساهم معنا!

يسعدني أن أسمع آراءك حول العشرات من الأفكار التي لديّ لجعل WP-CLI أكثر اعتمادًا على REST:

  • عرض مستندات المساعدة بتنسيقات مثل مخطط APIAPI واجهة API، أو واجهة برمجة التطبيقات، هي وسيط برمجي يتيح للبرامج التفاعل مع بعضها ومشاركة البيانات بطرق محدودة ومحددة بوضوح. Blueprint وSwagger [#36]
  • إضافة wp rest * generate لإنشاء بيانات وهمية بالتنسيق الذي يتوقعه تطبيقك [#55].
  • إضافة wp rest * diff للمقارنة بين حالة موقعي WordPress مختلفين، على طريقة Dictator [#56].
  • التوصل إلى تطبيق أنيق للأسماء المستعارة، بحيث يصبح --http=http://daniel:[email protected] هو @wpdev [#2039]

وأريد أن أسمع أفكارك أيضًا! وكذلك أي ملاحظات أو أسئلة أو اعتراضات شديدة. لنتحدث على Github.