是 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作用说明

如何检查当前页面是不是是wordpress中的插件管理面板

引导到 wordpress 不会正确显示图像

php 甚至是WordPress循环中的奇数类

使用 WordPress $wpdb 将数据插入到 WordPress 数据库中的表中

Wordpress 4.0 options.php 中的 403 错误