¿Cómo verificar si estoy en admin-ajax.php?

27

En este momento para mi complemento, estoy usando in_admin()para determinar si el usuario está en la parte frontal del sitio o en el área de administración. Sin embargo, el problema ocurre cuando los complementos se utilizan admin-ajax.phppara procesar solicitudes ajax.

Necesito una forma de registrar ganchos y complementos solo cuando proceso admin-ajax.phparchivos o en la interfaz del sitio. ¿Cuál es la mejor manera de hacerlo?

Extrakun
fuente

Respuestas:

61

Verifica la constante DOING_AJAX. Su definición es el primer código de trabajo en wp-admin/admin-ajax.php. Algunos complementos muy extraños, como Jetpack, definen esa constante en lugares inesperados , por lo que también puede incluir una verificación is_admin().

Ejemplo:

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

Hace mucho tiempo que solicité una forma más simple de verificar esto , y finalmente se implementó en 4.7.0.

Entonces, para WP 4.7 y superior puede usar:

if ( wp_doing_ajax() )
{
    // do something
}
fuxia
fuente
44
if ( defined( 'DOING_AJAX' ) )Es suficiente por sí mismo. La constante solo se establece admin-ajax.phppara que no necesite verificar un valor.
John Reid
55
@JohnReid Es una constante global, cualquiera puede establecerlo en cualquier valor, incluido FALSE.
fuxia
Buen punto. No hay ningún lugar en el núcleo de WP que establezca este valor, pero supongo que no significa que algún complemento no autorizado no lo configure en su falselugar. Un +1 para usted, señor!
John Reid
1
Es la forma del códice, pero en la práctica vi personas que configuraban esa bandera en su tema, por lo que esta solución es buena si quieres saber si debes comportarte como si fuera ajax, pero podría no ser mejor si realmente necesitas saber si Es una solicitud ajax.
Mark Kaplun
5

Buenas noticias, la función está ahí ahora.

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

Solo para recapitular, el admin-ajax.phpdefine algo como esto.

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: }
prosti
fuente
¡Gracias por la actualización! Me perdí esa en las notas de la versión 4.7.
Tom Auger
Hola @TomAuger, genial. Esta función es un Michael Jordan de ajax. Gracias 23
prosti 01 de
1

La solución Fuxias falsetambién se devuelve para la solicitud ajax realizada desde el panel de administración. Pero estas solicitudes deben devolverse true, porque los datos que está solicitando se proporcionan para una vista de administrador. Para resolver este problema, puede usar la siguiente función:

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

DOING_AJAX controles constantes si estás en admin-ajax.php

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