是否有JavaScript API?如何在JS中访问公共和私有数据?


8

根据这篇文章,没有针对Wordpress的内置JavaScript API。因此,想要建立在AJAX上的开发人员似乎提出了自己的解决方案,这对我来说似乎不合适。

除了使用内置API获取帖子或任何数据外,我真正想念的是一小套JavaScript函数,用于处理后端和前端接口。现在,关于这个问题有什么计划吗?

例如,我很想知道

  • 左侧主菜单折叠,
  • 什么用户登录
  • 他是哪一组
  • 甚至客户端数据(例如浏览器)

等等。


1
只是一个请求,这不是您的第一篇文章,请使用换行符和段落。使您的帖子对其他人更具可读性。将所有内容写在一个大的paragrahp中有点太多,而且您倾向于以这种方式使读者和可能的帮助者失去作用。谢谢
Pieter Goosen 2014年

谢谢,对不起,有点着急,不会再发生了!
stackoverclan 2014年

2
投票给以主要基于意见的观点结束投票的人:在投票之前,请先阅读问题。
fuxia

1
没问题。这只是将来帮助的提示。一个事实,就是写得好明确的问题会得到很好的答案:-)。幸运的是,我没有投票,这次我是无辜的,大声笑:-)
Pieter Goosen 2014年

Answers:


6

TL; DR

WordPress核心中没有JavaScript API,也没有人计划,但实际上并不需要它。

后端

首先,对于后端,可以从已经存在的JavaScript全局变量中获取一些有用的信息(WordPress喜欢所有全局变量)。

例如

  • ajaxurl用于admin-ajax.phpajax调用的URL
  • pagenow 用于当前管理页面提示,例如“ dashboard”
  • adminpage 用于当前管理页面文件,例如“ index-php”(点替换为hiphens)
  • typenow用于中的当前帖子类型edit.phppost.phppost-new.php
  • userSettings 可用于获取当前登录用户的信息

在后端时,这些信息为您提供了应用程序状态的“上下文”。

对于问题中提到的其他内容,您不需要任何“ API”,因为超简单的jQuery函数可以解决问题。例如,要知道管理菜单是否关闭,可以检查正文中的“折叠”类:

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中,您可以通过JavaScript轻松使用通过PHP获取的所有信息,而无需任何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对象,其中包含所有用户信息以及所有查询变量。

这对后端脚本和前端脚本有效(换句话说:对于两个“边”)。不需要任何其他 JavaScript API即可获取该信息。如果您使用正确的方法将信息从PHP传递到JS,则PHP就足够了。

Backbone.js

Backbone.js是一个JavaScript框架,允许使用JavaScript进行(某种)MVC开发模式。它已包含在WP 3.5的核心中-主要用于处理媒体库。

该库不是WordPress JavaScript API,因为它肯定可以进行更强大的JavaScript开发,但是该库中未添加任何特定于WordPress的功能,并且它是当前的唯一库。 Backbone.js核心用法。媒体库或多或少没有文档记录,没有公共API。而AFAIK并未计划填补这一空白。(如果有人可以证明我做错了,那么很乐意更改/删除该声明)。

WP-API

正如RarstBrian Fegter指出的那样,WP API将成为核心的一部分(可能从WP 4.1开始)。

但是我不得不说这不是 JavaScript API。它仅允许将HTTP请求连接到由WP-API控制的应用程序端点。API从数据库中获取数据并以JSON格式返回数据库。来自文档的示例:

想获取您网站的帖子?只需向发送GET请求即可/wp-json/posts。使用ID更新用户4?向发送POST请求/wp-json/users/4。获得所有带有搜索词“ awesome”的帖子?GET /wp-json/posts?filter[s]=awesome

由于HTTP请求和相关JSON响应可以使用任何支持HTTP请求和JSON数据格式的语言(包括PHP,Ruby,Python,ASP等)来处理,因此WP API的主要目的是允许获取和设置WordPress数据来自非WP应用程序。这意味着从任何应用程序内部,不仅是WordPress。

当然,由于JavaScript是可以同时处理HTTP请求和JSON格式的语言,因此您也可以在WordPress JavaScript中使用WP-API。有人也在为该API开发WP js客户端,但是

  • 使用wp_enqueue_script()+ Ajax API + WordPress PHP函数,可以检索您需要的所有信息,而无需任何其他API。而且,由于所有这三个“成分”都是WP建立的标准,因此使用它们不是“自己的解决方案”。它只是利用标准解决方案来执行自定义(和常见)任务,而这正是该插件开发的全部目的。

  • 甚至可以使用JavaScript来利用WP API。仅仅因为WP-API返回JSON,它并没有使其成为JavaScript API。不涉及JavaScript函数(发送HTTP请求并返回JSON回购。与使用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请求的应用程序中获取和保存信息。

问题在于,无论是在“常规”请求中还是在AJAX请求中,WordPress都几乎是RESTful的:它默认仅支持$_GET$_POST请求,并且使用具有相同URl的一个或另一个将导致...相同的结果。

相反,WP API是RESTful的,因此基于Backbone的应用程序可以将其用于功能强大的JavaScript应用程序,但是我不会将Backbone或WP API或Backbone + WP API定义为WordPress的JavaScript API的事情以上。


做得好!谢谢您的详细回答;尽管我不同意诸如“不需要”之类的内容,但是这给了我很多见解和方向。但是,多数民众赞成在答案!
stackoverclan 2014年

正如答案WP API + Backbone中所述,即使IMHO不能被视为JS API,也可以为您提供很多功能来创建非常复杂的基于js的应用程序。GitHub上的Backbone Wiki中有使用它一系列高级应用程序。WP API可以为WordPress数据提供RESTful 接口,这是使用Backbone的所有功能所必需的。也可以看看这些有关Backbone + WordPress的幻灯片。@ mc007
gmazzap

AJAX入口点花费的时间太长,无法制作一个灵巧的应用程序。它实际上是不行!
stackoverclan 2015年

1
@stackoverclan AJAX入口点很慢,因为它会加载整个WordPress环境。但是WP API也是如此,因此您不会因此而获得性能方面的好处。在国家(地区),使用SHORTINIT可以使ajax更快。用WP API进行同样的操作会更加困难。BTP,您是一个真正的快速应用程序吗?提示:请勿使用WordPress。
gmazzap


3

尽管从历史上看WP一直以后端为中心,但多年来已经声明要大量使用JS。考虑到向后兼容性的承诺,令人怀疑的是,JS是否会很快实现奇偶校验或接管PHP(在我看来),但是在此方面已经取得了一些进展。

WordPress管理员现在随附Backbone和Underscore,这是最新媒体库迭代的很大一部分。不幸的是,实现的细节尚未得到严格记录,并且第三方使用相对不受欢迎。

REST API插件正被开发为“功能插件”,正式意图是将来包含在WordPress核心中。


太棒了,链接“功能插件”对我有很多帮助,以帮助我了解实际发生的事情,这绝对是在进行狩猎之前必读的内容;-)
stackoverclan

3

要回答您的声明:

[...]没有内置的Wordpress Javascript API。因此,想要在Ajax上进行开发的开发人员似乎都提出了自己的解决方案,这对我来说似乎不合适。

没有“自己的解决方案”可以完成。您可以通过使用缓和的事情ATP与ajax_template_part()@GM或类似的插件和走捷径,但仍然没有去与AJAX在WordPress非标准的方式。那些“自己的解决方案” /方法(大多数)做错了。AJAX调用大致是这样完成的:

  1. 在上下文相关挂钩(公共或私有/已登录)上注册AJAX回调
  2. 注册,排队和本地化脚本
  3. 使用jQuery $.ajax()和类似功能对用户交互做出反应。使用全局(本地化)JS对象将数据传递回PHP回调。
  4. 在PHP cb内,您可以验证,过滤和清理数据,检查Nonces和引荐来源网址,执行数据库工作并使用wp_send_json_success()和类似的功能返回JSONify数据。

如果一个插件或主题没有那样做,那么作者就不会读东西或不看示例。还有就是对于应该使用的骨架。

有关如何在WP中处理AJAX的更多详细信息,请参见社区书籍“ WordPressTheRightWay”

除了使用内置API获取帖子或任何数据外,我真正想念的是一小套Javascript函数,用于处理后端和前端接口。[...]例如,我很想知道左边的主菜单是折叠的,或者是什么用户登录或者他是哪个组,甚至是客户端数据,例如浏览器等等。

WordPress根本就没有具体说明您需要使用AJAX做什么。这就是为什么您可以将几乎所有内容填充到本地化/全局化数组中并将其用于AJAX调用的原因。这完全符合Backbone的工作方式:您必须做自己想做的事情。

如果您想使用像AngularJs这样的自以为是的JavaScript MVC框架,那么您来错了地方。还有其他CMS,例如OctoberCMS,Drupal8等,在为其提供基础方面要好得多。WordPress会要求您构建一组自定义的重写端点,您可以在其中返回JS控制器的数据集。


嗨,感谢您提供更详细的答案。我喜欢它,因为您已经提出了一些指导和最佳实践。
stackoverclan 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.