是 WordPress 中的 Ajax
Posted
技术标签:
【中文标题】是 WordPress 中的 Ajax【英文标题】:How to detect if it is an AJAX request in WordPress? 【发布时间】:2012-12-30 04:26:45 【问题描述】:是否有办法检测当前服务器操作当前是否是 WordPress 中的 AJAX 请求?
例如:
is_ajax()
【问题讨论】:
如果 what 当前是一个 ajax 请求? “它”可以表示任何东西。以及在哪里/为什么需要检查这个? 听起来,从您的问题的措辞来看,您并不完全确定 AJAX 是什么。我建议看看这个:w3schools.com/ajax/default.asp This article 不检查它,所以也许你不需要?如果您使用 jQuery,您可以随时在调用服务器时添加?ajax=1
。
wikihow.com/Ask-a-Question-Intelligently
伙计们,我想问的是“这个服务器请求是页面请求还是 AJAX 请求的结果”。完全合理的问题,尽管我同意它可以有更多细节。不过,我会 +1,因为我以前在这里没有见过它,并且不鼓励仓促的否决。
【参考方案1】:
更新:从 WordPress 4.7.0 开始,您可以调用函数 wp_doing_ajax()。这是更可取的,因为以不同方式“执行 Ajax”的插件可以过滤以将“假”变为“真”。
原答案:
如果您使用的是 Ajax as recommended in the codex,那么您可以测试 DOING_AJAX
常量:
if (defined('DOING_AJAX') && DOING_AJAX) /* it's an Ajax call */
【讨论】:
+1 是 WordPress 特定的。我忘了他提到他正在使用 WP。这将是该环境中的首选方式。 该链接中没有提及。我昨天搜索了自己的这个问题 - 实际上有关于这个的 WP 文档,你知道吗? 它不在文档中(但它是一个 wiki,所以你可以添加它!),但它在代码中。没有比代码更好的文档了。 AJAX 完成“codex”的方式使用 wp-admin/admin-ajax.php,如果您查看该文件的顶部,您会看到 DOING_AJAX 已定义。 您可以在本页的 if 语句中看到它的引用 codex.wordpress.org/Plugin_API/Action_Reference/admin_init【参考方案2】:我个人更喜欢wp_doing_ajax()
,但这是另一个应该这样做的例子。
if( true === strpos( $_SERVER[ 'REQUEST_URI' ], 'wp-admin/admin-ajax.php' ) )
// is doing ajax
【讨论】:
【参考方案3】:WordPress 4.7 引入了一种简单的方法来检查 AJAX 请求,所以我想我会添加到这个老问题。
wp_doing_ajax()
来自Developer Reference:
说明:判断当前请求是否为 WordPress Ajax 请求。
返回:(bool)如果是 WordPress Ajax 请求则为真,否则为假。
它本质上是 DOING_AJAX 的包装器。
【讨论】:
【参考方案4】:我知道这是一个旧线程,但接受的答案存在问题,
如果请求是对 admin-ajax.php 文件的请求,那么检查定义的 DOING_AJAX 常量将始终为真。 (https://core.trac.wordpress.org/browser/tags/4.4.2/src/wp-admin/admin-ajax.php#L16)
有时 admin-ajax.php 钩子不用于 AJAX 请求,只是一个简单的端点(例如 Paypal IPN)。
正确的方法是伊恩和斯宾塞提到的。
if( ! empty( $_SERVER[ 'HTTP_X_REQUESTED_WITH' ] ) &&
strtolower( $_SERVER[ 'HTTP_X_REQUESTED_WITH' ]) == 'xmlhttprequest' )
//This is an ajax request.
(会评论...但没有代表)
【讨论】:
感谢您 - 特别是当 Woocommerce 进行 AJAX 调用以修改人员购物车时,这使我无法运行函数。【参考方案5】:if ( ! function_exists('is_ajax') )
function is_ajax()
return defined( 'DOING_AJAX' );
【讨论】:
在代码中添加一些注释会很有帮助。【参考方案6】:我不确定 WordPress 是否有此功能,但可以通过自己创建一个简单的功能来完成。
if (!empty($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest')
// Is AJAX request
return true;
【讨论】:
虽然 !empty 可能不需要,因为它不会返回错误。 其实isset
是不需要的。 empty
检查变量是否已经存在。
@SpencerCameron - 如果这个元素不存在,empty
没有isset
不会引发 PHP 警告吗?
我认为 empty() 检查的第一件事是 isset()?所以 isset() 会使 empty() 变得多余。
我知道它们都可以独立工作,但 empty() 做的第一件事肯定是检查 isset()?【参考方案7】:
要查看当前请求是否是从 js 库(如 jQuery )发送的 AJAX 请求,您可以尝试以下操作:
if( ! empty( $_SERVER[ 'HTTP_X_REQUESTED_WITH' ] ) &&
strtolower( $_SERVER[ 'HTTP_X_REQUESTED_WITH' ]) == 'xmlhttprequest' )
//This is an ajax request.
【讨论】:
+1 获得更短的版本,对我来说今天学到了一些东西。 HTTP_X_REQUESTED_WITH 没有出现在 Wordpress 的 $_SERVER 中。 @vee,HTTP_X_REQUESTED_WITH
不是由 WordPress 设置的。如果请求的发起者传递了它的标头,它就会被填充。以上是关于是 WordPress 中的 Ajax的主要内容,如果未能解决你的问题,请参考以下文章
Wordpress主题文件夹中的functions.php作用说明