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

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

#1 楼

检查常数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
}


评论


if(define('DOING_AJAX'))本身就足够了。该常数仅在admin-ajax.php中设置,因此您无需检查值。

–约翰·里德(John Reid)
2014年11月26日13:55



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

– fuxia♦
2014年11月26日下午16:36

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

–约翰·里德(John Reid)
2014年12月1日上午10:32

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

–马克·卡普伦
16-3-11在9:05



#2 楼

好消息,该函数已经存在。

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)
17年2月1日,在2:11

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

–prosti
17年2月1日在14:42

#3 楼

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();
}


#4 楼

DOING_AJAX常数会检查您是否在admin-ajax.php

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