Wie überprüfe ich, ob ich in admin-ajax.php bin?

27

Momentan prüfe ich mit meinem Plugin, in_admin()ob sich der Benutzer im Frontend der Site oder im Administrationsbereich befindet. Das Problem tritt jedoch auf, wenn Plugins admin-ajax.phpzur Verarbeitung von Ajax-Anforderungen verwendet werden.

Ich brauche eine Möglichkeit, Hooks und Plugins nur beim Verarbeiten von admin-ajax.phpDateien oder im Frontend der Site zu registrieren . Was ist der beste Weg, dies zu tun?

Extrakun
quelle

Antworten:

61

Überprüfen Sie die Konstante DOING_AJAX. Seine Definition ist der erste Arbeitscode in wp-admin/admin-ajax.php. Einige sehr seltsame Plugins, wie Jetpack, werden definiert , die konstant an unerwarteten Orten , so dass Sie einen Scheck enthalten könnte is_admin()auch.

Beispiel:

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

Ich habe vor langer Zeit nach einem einfacheren Weg gefragt, dies zu überprüfen , und dies wurde schließlich in 4.7.0 implementiert.

Für WP 4.7 und höher können Sie also Folgendes verwenden:

if ( wp_doing_ajax() )
{
    // do something
}
fuxia
quelle
4
if ( defined( 'DOING_AJAX' ) )ist genug für sich. Die Konstante wird nur festgelegt, admin-ajax.phpdamit Sie nicht nach einem Wert suchen müssen.
John Reid
5
@ JohnReid Es ist eine globale Konstante, die jeder auf einen beliebigen Wert setzen kann, einschließlich FALSE.
Fuxia
Guter Punkt. Es gibt nirgendwo im WP-Core, der diesen Wert festlegt, aber ich nehme an, dass dies nicht bedeutet, dass ein Rogue-Plug-In ihn nicht falsestattdessen festlegt . Ein +1 für Sie, Sir!
John Reid
1
Es ist der Codex-Weg, aber in der Praxis habe ich gesehen, dass Leute diese Flagge in ihrem Thema gesetzt haben. Diese Lösung ist also gut, wenn Sie wissen möchten, ob Sie sich wie Ajax verhalten sollten, aber möglicherweise nicht die beste, wenn Sie tatsächlich wissen müssen, ob Es ist eine Ajax-Anfrage.
Mark Kaplun
5

Gute Nachricht, die Funktion ist jetzt da.

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

Um es noch einmal zusammenzufassen, das admin-ajax.phpdefiniert so etwas.

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
quelle
Danke für das Update! Ich habe das in den 4.7 Release Notes verpasst.
Tom Auger
Hey @ TomAuger, cool. Diese Funktion ist ein Michael Jordan von Ajax. Danke 23
Prosti
1

Die Fuxias-Lösung kehrt falseauch für eine Ajax-Anfrage zurück, die über das Admin-Panel gesendet wurde . Diese Anforderungen sollten jedoch zurückgegeben werden true, da die von Ihnen angeforderten Daten für eine Administratoransicht bereitgestellt werden. Um dieses Problem zu lösen, können Sie die folgende Funktion verwenden:

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

DOING_AJAX ständige Überprüfung, ob Sie in sind admin-ajax.php

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