問題描述

根據 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 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。