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?
Answers:
Thank you for visiting the Q&A section on Magenaut. Please note that all the answers may not help you solve the issue immediately. So please treat them as advisements. If you found the post helpful (or not), leave a comment & I’ll get back to you as soon as possible.
Method 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
}
Method 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: }
Method 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();
}
Method 4
DOING_AJAX constant checks if you are in admin-ajax.php
if ( is_admin() && defined( 'DOING_AJAX' ) && DOING_AJAX )
{
// do something
}
All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0