¿Cómo verificar si estoy en admin-ajax.php?
Actualmente para mi plugin, estoy usando in_admin()
para determinar si el usuario está en el frontend del sitio o en el área de administración. Sin embargo, el problema ocurre cuando los plugins usan admin-ajax.php
para procesar peticiones ajax.
Necesito una manera de registrar hooks y plugins solo cuando se está procesando el archivo admin-ajax.php
o en el frontend del sitio. ¿Cuál es la mejor manera de hacer esto?

Verifica la constante DOING_AJAX
. Su definición es el primer código funcional en wp-admin/admin-ajax.php
. Algunos plugins muy extraños, como Jetpack, están definiendo esa constante en lugares inesperados, por lo que podrías incluir una verificación adicional para is_admin()
.
Ejemplo:
if ( is_admin() && defined( 'DOING_AJAX' ) && DOING_AJAX )
{
// hacer algo
}
Hace mucho tiempo solicité una forma más sencilla de verificar esto, y finalmente se implementó en la versión 4.7.0.
Así que para WordPress 4.7 y versiones superiores puedes usar:
if ( wp_doing_ajax() )
{
// hacer algo
}

if ( defined( 'DOING_AJAX' ) )
es suficiente por sí mismo. La constante solo se establece en admin-ajax.php
, así que no necesitas verificar un valor.

@JohnReid Es una constante global, cualquiera puede establecerla con cualquier valor, incluyendo FALSE
.

Buen punto. No hay ningún lugar en el núcleo de WP que establezca este valor, pero supongo que eso no significa que algún plugin malintencionado no pueda establecerlo en false
. ¡Un +1 para ti, señor!

Es la forma del codex, pero en la práctica he visto a gente configurando esa bandera en su tema, así que esta solución es buena si quieres saber si deberías comportarte como si fuera ajax, pero puede no ser la mejor si realmente necesitas saber si es una solicitud ajax.

Buenas noticias, la función ya está disponible.
Archivo: /wp-includes/load.php
1037: /**
1038: * Determina si la solicitud actual es una solicitud Ajax de WordPress.
1039: *
1040: * @since 4.7.0
1041: *
1042: * @return bool Verdadero si es una solicitud Ajax de WordPress, falso en caso contrario.
1043: */
1044: function wp_doing_ajax() {
1045: /**
1046: * Filtra si la solicitud actual es una solicitud Ajax de WordPress.
1047: *
1048: * @since 4.7.0
1049: *
1050: * @param bool $wp_doing_ajax Indica si la solicitud actual es una solicitud Ajax de WordPress.
1051: */
1052: return apply_filters( 'wp_doing_ajax', defined( 'DOING_AJAX' ) && DOING_AJAX );
1053: }
Para recapitular, el archivo admin-ajax.php
define algo como esto.
Archivo: /wp-admin/admin-ajax.php
11: /**
12: * Ejecutando proceso Ajax.
13: *
14: * @since 2.1.0
15: */
16: define( 'DOING_AJAX', true );
17: if ( ! defined( 'WP_ADMIN' ) ) {
18: define( 'WP_ADMIN', true );
19: }

La solución Fuxias devuelve false
incluso para las solicitudes AJAX realizadas desde el panel de administración. Sin embargo, estas solicitudes deberían devolver true
, ya que los datos solicitados están destinados a una vista de administrador. Para solucionar este problema, puedes utilizar la siguiente función:
function saveIsAdmin() {
//Las solicitudes AJAX siempre se identifican como páginas de la interfaz administrativa
//así que comprobemos si estamos solicitando datos para el frontend o el backend
if (wp_doing_ajax()) {
$adminUrl = get_admin_url();
//Si el referente es una URL de administración, estamos solicitando datos para el backend
return (substr($_SERVER['HTTP_REFERER'], 0, strlen($adminUrl)) === $adminUrl);
}
//Si no es una solicitud AJAX, simplemente usamos la función normal
return is_admin();
}
