问题描述

根据 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 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。