如何检查我是否在admin-ajax.php中?


27

现在,对于我的插件,我正在使用in_admin()以确定用户是在站点的前端还是在管理区域中。但是,当插件用于admin-ajax.php处理ajax请求时,就会出现问题。

我需要一种仅在处理admin-ajax.php文件时或在站点的前端中注册钩子和插件的方法。这样做的最佳方法是什么?

Answers:


61

检查常数DOING_AJAX。其定义是中的第一个工作代码wp-admin/admin-ajax.php。一些非常奇怪的插件(例如Jetpack)正在意外位置定义该常量,因此您可能还需要进行检查is_admin()

例:

if ( is_admin() && defined( 'DOING_AJAX' ) && DOING_AJAX )
{
    // do something
}

要求一种更简单的方法来检查很久以前,并且最终在4.7.0中实现了这一点。

因此,对于4.7或更高版本的WP,您可以使用:

if ( wp_doing_ajax() )
{
    // do something
}

4
if ( defined( 'DOING_AJAX' ) )本身就足够了。仅设置常量,admin-ajax.php因此您无需检查值。
约翰·里德

5
@JohnReid这是一个全局常量,任何人都可以将其设置为任何值,包括FALSE
fuxia

好点子。WP内核中没有设置该值的地方,但是我想这并不意味着某些流氓插件可能不会将其设置为false。先生,+ 1!
约翰·里德2014年

1
这是Codex的方式,但是在实践中我看到人们在他们的主题中设置该标志,因此,如果您想知道是否应该像ajax那样工作,则此解决方案很好,但是如果您实际上需要知道是否要这样做,则可能不是最佳选择这是一个ajax请求。
Mark Kaplun

5

好消息,该功能已经存在。

File: /wp-includes/load.php
1037: /**
1038:  * Determines whether the current request is a WordPress Ajax request.
1039:  *
1040:  * @since 4.7.0
1041:  *
1042:  * @return bool True if it's a WordPress Ajax request, false otherwise.
1043:  */
1044: function wp_doing_ajax() {
1045:   /**
1046:    * Filters whether the current request is a WordPress Ajax request.
1047:    *
1048:    * @since 4.7.0
1049:    *
1050:    * @param bool $wp_doing_ajax Whether the current request is a WordPress Ajax request.
1051:    */
1052:   return apply_filters( 'wp_doing_ajax', defined( 'DOING_AJAX' ) && DOING_AJAX );
1053: }

回顾一下,admin-ajax.php定义是这样的。

File: /wp-admin/admin-ajax.php
11: /**
12:  * Executing Ajax process.
13:  *
14:  * @since 2.1.0
15:  */
16: define( 'DOING_AJAX', true );
17: if ( ! defined( 'WP_ADMIN' ) ) {
18:     define( 'WP_ADMIN', true );
19: }

感谢更新!我错过了4.7版本说明中的那个。
Tom Auger

嘿@TomAuger,太酷了。此功能是ajax的Michael Jordan。谢谢23
prosti '17

1

Fuxias解决方案false还会返回管理面板发出的Ajax请求。但是这些请求应该返回true,因为您请求的数据是为管理员视图提供的。要解决此问题,可以使用以下功能:

function saveIsAdmin() {
    //Ajax request are always identified as administrative interface page
    //so let's check if we are calling the data for the frontend or backend
    if (wp_doing_ajax()) {
        $adminUrl = get_admin_url();
        //If the referer is an admin url we are requesting the data for the backend
        return (substr($_SERVER['HTTP_REFERER'], 0, strlen($adminUrl)) === $adminUrl);
    }

    //No ajax request just use the normal function
    return is_admin();
}

0

DOING_AJAX 不断检查您是否在 admin-ajax.php

if ( is_admin() && defined( 'DOING_AJAX' ) && DOING_AJAX )
{
    // do something
}
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.