问题描述

我有一个自定义的 post 类型,我想通过 jQuery 访问 – 最好使用 JSON 。

首先是事情。创建返回/echos json 的函数是很容易的,但是如何通过 jquery 访问它。

正如 Mike 在 this question 中写道,他 – 据我所知,他将它放在 wordpress 根目录下。这将使其可访问使用 php 文件名 – 但这是推荐吗?我宁愿把它放在一个插件文件夹中。

我已经尝试阅读 wordpress codex,但是 ajax 调用的方式只是混淆我,因为你发布每个 ajax 调用 admin-ajax.php,即使它不是一个管理页面?

有人可以解决我遇到的问题吗?

/风暴

编辑

我遇到的问题是了解如何在 wordpress 中进行 ajax 调用,以及在哪里放置您的 php 和 js 代码来执行/处理调用。

在另一个我链接的问题中,您创建了将文件放在 wp 根目录中的函数 – 我不想这样做。但是我现在已经学会了如何使用 wp_ajax_(nopriv _)[action],并且可以有效地访问我创建的 json 。剩下的问题是我应该放置 JS 来进行通话。我想将它放在插件 js 文件中,但是由于这是在一个页面中呈现的,而不是在管理站点上,ajaxurl 没有定义,所以我必须使用 php 进行回显。

echo admin_url('admin-ajax.php');

所以问题是我应该如何将这个 PHP 与 javascript 结合起来,然后我如何排队它,看到它不是一个文件或一个脚本。

最佳解决方案

Ajax 处理程序

确实有点混乱,Ajax 处理程序在 wp-admin/目录中,但是,您可以并且应该将其用于 non-admin 请求。然后,为 wp_ajax_nopriv_[action]钩子注册一个处理程序,而不是正常的 wp_ajax_[action]。在这种情况下,您只需遵循 admin-ajax.php 的第一行,因为未登录的用户完成的请求已经离开了第 50 行。

所以注册一个挂钩 wp_ajax_nopriv_get_custom_post_data 的功能,如果您要求 action 参数设置为 get_custom_post_data admin-ajax.php,它将被调用。一定要在你的处理程序的最后调用 die(),否则返回默认的 die(-1)。并且还注册了 logged-in 版本,wp_ajax_get_custom_post_data(同样的处理函数,没有问题),因为如果你登录到你的站点,你不会碰到 nopriv 钩子。

Server-side 配置为 Javascript

发送 server-side 配置数据的技巧 (如 admin-ajax.php url) 是 wp_localize_script()。您传递一系列的键和值将包含在页面的顶部。这可能最初是为本地化的字符串创建的,但您也可以使用它来传递配置数据。

wp_localize_script('storm_json_config', 'storm_config', array(
    'ajaxurl' => admin_url('admin-ajax.php'),
));

storm_json_config 是句柄名称 (如果要稍后将其取出),storm_config 是将包含您的数据的 Javascript 对象的名称。所以你的静态 Javascript 文件可以包含像 jQuery.post(storm_config.ajaxurl, ...)这样的行。

另见 bueltge’s answer to a similar question

从插件目录静态 Javascript

要从您自己的插件目录中加载静态 Javascript 文件,请使用 wp_enqueue_script()。这样会看起来像这样:

wp_enqueue_script('storm_json', plugin_dir_url(__FILE__) . 'js/json.js', array('jquery'), '20101105');

storm_json 再次是一个句柄名称,那么你可以给出文件的链接,然后给出依赖关系 (可以是 null),然后在请求之后添加一个版本号,以便在更新时跳过浏览器缓存。

参考文献

注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。