問題描述

根據 this post,沒有用於 Wordpress 的內建 JavaScript API 。因此,想要建立在 AJAX 上的開發人員似乎是用自己的解決方案來完成的,這對我來說似乎不合適。

除了使用內建 API 獲取帖子或任何資料,我真正想要的是一組 JavaScript 函式來處理 back-end 和 front-end 介面。現在,有沒有計劃在這個問題?

例如,我很想知道

  • 左側主選單已摺疊,

  • 什麼使用者登入

  • 他是誰

  • 甚至客戶端資料,如瀏覽器

等等。

最佳解決方案

長文慎入

在 WordPress 核心沒有 JavaScript API,沒有人計劃,但實際上,沒有必要。

Backend

首先讓我們說,關於後端,一些有用的資訊可以從已經存在的 JavaScript 全域性變數中獲取 (WordPress 喜歡所有的全球風格) 。

例如。

  • ajaxurl 用於 admin-ajax.php 網址用於 ajax 呼叫

  • pagenow 用於當前的管理頁面,例如’dashboard’

  • adminpage 用於當前的管理頁面檔案,例如’index-php'(點被 hiphens 替代)

  • typenow 當前的帖子型別,而在 edit.php,post.php 或 post-new.php

  • userSettings 可用於獲取當前登入使用者的資訊

當您處於後臺時,這些資訊為您提供了應用程式狀態的一些”context” 。

對於問題中提到的其他事項,您不需要任何”API”,因為 super-simple jQuery 功能可以做到這一點。例如要知道管理選單是否關閉,您可以檢查正文中的”folded” 類:

if ( $(body).hasClass('folded') ) {
  alert( 'Admin left menu is closed!' );
} else {
  alert( 'Admin left menu is open!' );
}

檔案缺乏

對於以前的程式碼片段來說,建立函式是不值得的。 WP 在 PHP 中已經有太多的功能。我真的希望這些額外的功能不會被新增到核心。

WordPress 中真正需要哪些 JavaScript 是現有功能的更多檔案:上述任何內容都不會在任何官方檔案 (如 Codex 或原始檔) 中記錄。

前端?

直到這裡我才談到後端。

這是因為幾乎所有在前端發生的事情都與當前使用的主題有關。我們假設有一個由 WordPress 提供的 JavaScript 檔案,其中包含有關當前應用程式狀態資訊的功能; 如果一個主題沒有排列該 JS 檔案,這些功能是不可用的,並強制一個主題入隊這樣的指令碼將是絕對錯誤的。

不需要 (另一個)API

然而,在 WordPress 中,您可以透過 PHP 獲取的每個資訊都可以在 JavaScript 中輕鬆使用,也不需要任何 AJAX 請求。使這個可能的功能是 wp_localize_script()

假設您想要在 JavaScript 中獲取當前使用者和使用者資料 (如 user-role),並且您也想知道當前頁面中使用的查詢變數,您可以執行以下操作:

$data = array(
  'user'       => wp_get_current_user(),
  'query_vars' => $GLOBALS['wp']->query_vars
);

wp_localize_script( 'myscript', 'MyScriptData', $data );

在指令碼中執行此操作,MyScriptData.user 變數將是一個 JavaScript 物件,所有的使用者資訊都是所有的查詢變數。

這對於後端和前端指令碼 (換句話說:對於”sides”) 均有效。沒有任何額外的 JavaScript API 只需要獲取該資訊。如果您使用正確的方式將資訊從 PHP 傳遞到 JS,PHP 就足夠了。

Backbone.js 的

Backbone.js 是一個 JavaScript 框架,允許使用 JavaScript(一種)MVC 開發模式。它被包含在 WP 3.5 的核心中 – 主要用於處理媒體庫。

這個庫不是一個 WordPress 的 JavaScript API,因為它確實允許一個更強大的 JavaScript 開發,但是沒有一個單獨的 WordPress-specific 函式已被新增到該庫中,它是 Backbone.js 目前唯一的核心用法。媒體庫或多或少沒有檔案,沒有公開的 API 。而 AFAIK 並沒有計劃填補這個空白。 (非常樂意更改/刪除該宣告 – 如果有人可以證明我錯了) 。

WP-API

正如 Rarst 和 Brian Fegter 指出的那樣,WP API 將成為核心部分 (可能從 WP 4.1 開始) 。

但是我不得不說它不是一個 JavaScript API 。它只允許將 HTTP 請求連線到由 WP-API 控制的應用程式端點。並且 API 從資料庫中獲取資料,並將 JSON 格式返回。檔案示例:

Want to get your site』s posts? Simply send a GET request to /wp-json/posts. Update user with ID 4? Send a POST request to /wp-json/users/4. Get all posts with the search term 「awesome」? GET /wp-json/posts?filter[s]=awesome.

由於 HTTP 請求和相關的 JSON 響應可以用支援 HTTP 請求和 JSON 資料格式 (包括 PHP,Ruby,Python,ASP 等) 的任何語言處理,因此 WP API 的主要目的是允許獲取和設定 WordPress 資料來自 non-WP 應用。這意味著從任何應用程式,不僅僅是 WordPress 。

當然,由於 JavaScript 是一種可以處理 HTTP 請求和 JSON 格式的語言,您也可以在 WordPress JavaScript 中使用 WP-API 。有人也在為該 API 開發 WP js client,但是

  • 使用 wp_enqueue_script() + the Ajax API + WordPress PHP 功能,可以檢索所有您需要的資訊,沒有任何額外的 API 。而且由於”ingredients” 都是 WP 建立的標準,所以使用它們不是”own solution” 。它只是使用標準的解決方案來完成自定義 (和常見的) 任務,這就是這個外掛開發的一切。

  • 甚至可以使用 JavaScript 來使用 WP API 。只是因為 WP-API 返回 JSON,它不會成為 JavaScript API 。沒有 JavaScript 函式 (傳送 HTTP 請求並返回 JSON reposnse,與使用 AJAX API 的情況相同) 。否則任何返回 JSON 的服務都應被視為 WordPress JS API 。 WP-API 應該被視為返回 JSON 的外部服務 API,而且可能是消耗這個 JSON 服務的站點是相同的。

  • 沒有一件可以用 WP API 完成的事情,也不能透過使用 AJAX API 來完成。但是 AJAX API 可以做很多事情。但不是與 WP-API 。

關於 WP-API + Backbone.js 的註釋

使用 Backbone.js,可以在支援 RESTful HTTP 請求的應用程式中獲取和儲存資訊。

問題是,在”regular” 請求和 AJAX 中的 WordPress 都是 RESTful 的:它僅支援每個預設的 $_GET$_POST 請求,並且使用一個或另一個具有相同的 URl 的結果… 相同的結果。

相反,WP API 是 RESTful 的,所以 Backbone-based 應用程式可以利用它來實現強大的 JavaScript 應用程式,但是我將遠離將 Backbone 或 WP API 或 Backbone + WP API 定義為用於 WordPress 的 JavaScript API,用於上述內容。

次佳解決方案

圍繞 JSON REST API 進行了相當多的開發,應該是 merged into the 4.1 release 。我相信它正式被稱為’WP API’ 。您現在可以開始使用程式碼庫,並跟上最新的開發 here,直到它獲得核心。 Ryan McCue 和團隊豐富了一些很好的檔案 here

第三種解決方案

雖然歷史上 WP 已經以後端為中心,但已經有多年來已經宣佈進行了大量的 JS 使用。考慮到向後相容性承諾,JS 很快就會實現平衡或接管 PHP(在我看來),但是有一些進展是值得懷疑的。

WordPress 管理員現在附帶了 Backbone 和 Underscore,這是大部分最新的媒體庫迭代。不幸的是,實施細節嚴重無證,第三方使用情況相對不受歡迎。

REST API 外掛正在開發為 「feature plugin」,官方意圖將來會被包含在 WordPress 核心中。

第四種方案

回答你的發言:

[…] there is no built-in Javascript API for WordPress. Therefore developers who want to build on Ajax seem to come up all with their own solution which doesn’t seem right to me.

沒有”own solution” 要完成。您可以透過使用 ATP 與 ajax_template_part() by @ G.M 來緩解事情。或類似的外掛,並採取一個捷徑,但仍然沒有 non-standard 方式去與 AJAX 在 WordPress 。那些”own solutions” /方式 (主要是) 做錯了。 (大致)AJAX 呼叫如下:

  1. 在上下文感知掛鉤 (公共或私有/登入) 上註冊 AJAX 回撥

  2. 註冊,排隊和本地化指令碼

  3. 使用 jQuery $.ajax()和類似的功能對使用者互動做出反應。使用全域性 (本地化)JS 物件將資料傳回到 PHP 回撥。

  4. 在 PHP cb 內部,您可以驗證,過濾和清理資料,檢查 Nonces 和引薦來源,使用 wp_send_json_success()和類似功能返回資料庫資料並返回 JSONify 資料。

如果外掛或主題沒有這樣做,那麼作者沒有讀取東西或沒有看到例子。有一個應該使用的骨架。

More and detailed info about how to handle AJAX in WP can be found in the community book “WordPressTheRightWay”

What I really miss apart from fetching posts or whatever data with a built-in API is a small set of Javascript functions to deal with the back-end and front-end interface. […] For instance, I’d love to know that the left main menu is collapsed, or what user is logged in or which group he is, or even client data like browser and so forth.

您在 AJAX 中需要做什麼,WordPress 並不具體。這就是為什麼你可以將所有東西都填充到本地化/全球化的陣列中,併為 AJAX 呼叫提供可用性。這完全符合骨幹工作原理:你必須做你想要做的事情。

如果你想使用一些有意思的 JavaScript MVC 框架,如 AngularJs,那麼你是錯誤的地方。還有其他 CMS,如 OctoberCMS,Drupal8 等,為提供一個基礎更好。 WordPress 將要求您構建一組自定義的 Rewrite Endpoints,您可以在其中返回 JS 控制器的資料集。

參考文獻

注:本文內容整合自 Google/Baidu/Bing 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。