Como verificar se estou no admin-ajax.php?

27

No momento, no meu plugin, estou usando in_admin()para determinar se o usuário está no frontend do site ou na área de administração. No entanto, o problema ocorre quando os plug-ins são usados admin-ajax.phppara processar solicitações de ajax.

Eu preciso de uma maneira de registrar ganchos e plugins apenas ao processar admin-ajax.phparquivos ou no front-end do site. Qual é a melhor maneira de fazer isso?

Extrakun
fonte

Respostas:

61

Verifique a constante DOING_AJAX. Sua definição é o primeiro código de trabalho em wp-admin/admin-ajax.php. Alguns plugins muito estranhos, como o Jetpack, estão definindo essa constante em locais inesperados , portanto você pode incluir uma verificação is_admin()também.

Exemplo:

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

Eu pedi uma maneira mais simples de verificar isso há muito tempo, e isso foi finalmente implementada em 4.7.0.

Portanto, para o WP 4.7 e superior, você pode usar:

if ( wp_doing_ajax() )
{
    // do something
}
fuxia
fonte
4
if ( defined( 'DOING_AJAX' ) )é suficiente por si só. A constante é definida apenas admin-ajax.phppara que você não precise verificar um valor.
John Reid
5
@JohnReid É uma constante global, qualquer pessoa pode configurá-la com qualquer valor, inclusive FALSE.
fuxia
Bom ponto. Não há nenhum lugar no núcleo do WP que defina esse valor, mas suponho que isso não significa que algum plug-in não autorizado possa não defini-lo false. Um +1 para você, senhor!
John Reid
11
É a maneira do códice, mas na prática eu vi pessoas definindo essa bandeira em seu tema, então essa solução é boa se você quiser saber se deve se comportar como se fosse ajax, mas pode não ser a melhor se você realmente precisa saber se é uma solicitação ajax.
Mark Kaplun
5

Boas notícias, a função está lá agora.

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

Apenas para recapitular, o admin-ajax.phpdefine algo como isto.

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
fonte
Obrigado pela atualização! Eu perdi essa nas notas de versão 4.7.
Tom Auger #
Olá, TomAuger, legal. Esta função é um Michael Jordan do ajax. Obrigado, 23
prosti
1

A solução Fuxias retorna falsetambém para a solicitação de ajax feita no painel de administração. Mas essas solicitações devem retornar true, porque os dados que você está solicitando são fornecidos para uma visualização de administrador. Para resolver esse problema, você pode usar a seguinte função:

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
fonte
0

DOING_AJAX verificações constantes se você estiver em admin-ajax.php

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