最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

How to check if I am in admin-ajax.php?

programmeradmin0浏览0评论

Right now for my plugin, I am using in_admin() to determine if the user is in the frontend of the site or in the admin area. However, the problem occurs when plugins use admin-ajax.php to process ajax requests.

I need a way to register hooks and plugins only when processing admin-ajax.php file or in the frontend of the site. What is the best way to go about doing that?

Right now for my plugin, I am using in_admin() to determine if the user is in the frontend of the site or in the admin area. However, the problem occurs when plugins use admin-ajax.php to process ajax requests.

I need a way to register hooks and plugins only when processing admin-ajax.php file or in the frontend of the site. What is the best way to go about doing that?

Share Improve this question edited Dec 15, 2016 at 1:29 prosti 4,3234 gold badges26 silver badges45 bronze badges asked Oct 27, 2012 at 17:27 ExtrakunExtrakun 1,0042 gold badges12 silver badges15 bronze badges
Add a comment  | 

4 Answers 4

Reset to default 72

Check the constant DOING_AJAX. Its definition is the first working code in wp-admin/admin-ajax.php. Some very weird plugins, like Jetpack, are defining that constant in unexpected places, so you might include a check for is_admin() as well.

Example:

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

I have asked for a simpler way to check this a long time ago, and this was finally implemented in 4.7.0.

So for WP 4.7 and higher you can use:

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

Good news, the function is there now.

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: }

Just to recap, the admin-ajax.php defines something like this.

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: }

Fuxias solution returns false also for ajax request made from the admin panel. But these requests should return true, because the data you are requesting is provided for an admin view. To solve this issue you can use the following function:

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

DOING_AJAX constant checks if you are in admin-ajax.php

if ( is_admin() && defined( 'DOING_AJAX' ) && DOING_AJAX )
{
    // do something
}
发布评论

评论列表(0)

  1. 暂无评论