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

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?

Related posts

Leave a Reply

4 comments

  1. 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
    }
    
  2. 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: }
    
  3. 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();
    }