IT-Swarm.Net

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

Momentan benutze ich für mein Plugin in_admin(), um festzustellen, ob sich der Benutzer im Frontend der Site oder im Administrationsbereich befindet. Das Problem tritt jedoch auf, wenn Plugins admin-ajax.php zum Verarbeiten von Ajax-Anforderungen verwenden.

Ich brauche eine Möglichkeit, Hooks und Plugins nur zu registrieren, wenn ich eine admin-ajax.php-Datei oder im Frontend der Site bearbeite. Was ist der beste Weg, dies zu tun?

26
Extrakun

Ü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, definieren diese Konstante an unerwarteten Stellen , daher können Sie auch eine Prüfung auf is_admin() einschließen.

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
}
58
fuxia

Schnelles, zuverlässiges und kostengünstiges Cloud-Hosting

Registrieren Sie sich und erhalten Sie innerhalb von 30 Tagen einen Bonus von $50!

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, der admin-ajax.php definiert 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: }
5
prosti

Die Fuxias-Lösung gibt false auch für Ajax-Anforderungen zurück, die über das Admin-Panel gesendet wurden. Diese Anforderungen sollten jedoch true zurückgeben, 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();
}
1
GM_Alex