如何在Wordpress中管理Ajax调用和JSON


13

我有一个想要通过jQuery访问的自定义帖子类型-最好使用JSON。

所以第一件事。创建一个返回/ echos json的函数很容易,但是我将如何通过jquery访问它。

正如Mike在此问题中所写,据我所知,他将其放在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结合起来,然后又应该将其排入队列,因为它不是文件或脚本。


我想编辑您问题的标题以提供更具描述性的标题,但阅读后我仍然不确定100%是您的问题。您只是问问如何访问与自定义帖子类型无关的JSON提要(不是CPT确实没有导入您的问题吗?)重要的是,它不在根目录中吗?是为了管理功能吗?如果您要从最终用户的角度解释自己正在努力实现的目标,以及正在努力解决的技术方法,这可能会有所帮助?
MikeSchinkel,2010年

是的,我可以说标题不是描述性最强的。我只是在上面放了一些东西,因为起初我发布的甚至更糟。编辑后的帖子,其中包含更多信息。
风暴

我刚刚输入的自定义帖子类型,因为似乎很流行的json-api插件实际上并未涵盖自定义帖子类型。
风暴

Answers:


17

Ajax处理程序

目录中确实包含Ajax处理程序,这确实有点令人困惑wp-admin/,但是是的,您也可以并且也应该将其用于非管理员请求。然后,您为wp_ajax_nopriv_[action]钩子注册一个处理程序,而不是普通的wp_ajax_[action]。在这种情况下,您只需要遵循的第一行admin-ajax.php,因为未登录用户完成的请求将离开第50行左右的页面。

因此,为钩子注册一个函数,wp_ajax_nopriv_get_custom_post_data如果您admin-ajax.phpaction参数设置为,它将被调用get_custom_post_data。确保die()自己在处理程序的末尾调用,否则die(-1)将返回默认值。还要注册登录版本wp_ajax_get_custom_post_data(到相同的处理程序功能,没问题),因为如果您登录到站点,则不会遇到nopriv麻烦。

服务器端配置到Javascript

发送服务器端配置数据(如admin-ajax.phpurl)的技巧是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对类似问题的回答

插件目录中的静态Javascript

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

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

哪里storm_json又是一个手柄的名字,然后你给的链接文件,然后依赖(可以null),然后将上更新击败浏览器缓存的请求后,可以添加一个版本号。


好答案。这就是我想知道的,而且我似乎已经使它起作用了。我现在可以访问/wp-admin/admin-ajax.php?action=[action]并获取json结果。我现在的问题是将js放在哪里进行ajax调用。由于我需要把echo admin_url('admin-ajax.php'); 作为网址,我无法将其放入我的插件js文件中。那么我将如何入队呢?我不只是想将脚本打印到页面中间。
风暴

@Storm:我用扩展了我的答案wp_localize_script(),您可以使用它从服务器端向浏览器发送配置数据。(小提示:如果您添加@用户名,该人将收到您回复的通知。因此请@Mike: I updated the title确保他看到您的评论)
Jan Fabry 2010年

感谢一堆Jan。我现在认为我理解了整个程序包。我将不得不花一点时间来充分理解它,但是您一直在提供很大的帮助!答案已接受=)顺便感谢@注释。但是,当我在评论您的答案时,您仍然会收到警报吗?
风暴

@Storm:是的,警报将发给您正在评论的问题或答案的作者,此外,它还会发给您在@评论中提及的其他参与者。因此,我“免费”收到了您的通知,但是如果我不包括您,您将不会收到此消息。在Stack Exchange网络的常规元站点上有完整的解释
Jan Fabry 2010年
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.