is_admin () gibt true zurück, wenn admin-ajax.php aus dem Front-End-Skript verwendet wird

7

Hatte heute eine Situation, in der ich admin-ajax.php aus einem Front-End-Skript verwendete. Soweit ich weiß, ist dies die wp-Methode, um Ajax-Aufrufe zu tätigen (Registrierung meiner Funktion beim Hook wp_ajax_nopriv_myfunction).

Da admin-ajax.php sich auf der Admin-Seite befindet, gibt is_admin () true zurück, während mein Skript es von der Front-End-Seite aus aufruft.

Dies verursacht ein Problem mit einem von mir verwendeten Plugin, das die Dinge auf der Front- und Administratorseite unterschiedlich macht.

Also habe ich mich gefragt, ob ich etwas falsch gemacht habe

Gibt es eine Möglichkeit, Ajax im Front-End auf wp-Weise zu verwenden und is_admin () zu haben, um false zurückzugeben?

hoffe ich konnte mich verständlich machen

Thomas
quelle
Recht. Sie können die Funktion wp_doing_ajax () verwenden, die überprüft, ob eine AJAX-Anforderung ausgeführt wird oder nicht.
Maheshwaghmare

Antworten:

5

WordPress setzt is_admin()für alle Ajax-Anfragen (Front-End oder Admin-Seite) auf true. (Siehe Codex ).

Es gibt keine Möglichkeit, dies zu überwinden (und Sie sollten es sowieso nicht tun). Wenn Ihre Ajax-Anfrage sowohl vom Front-End als auch vom Administrator ausgelöst werden kann, möchten Sie möglicherweise angeben, ob es sich um einen Administrator handelt, wenn Sie die Daten veröffentlichen. Aber ohne Details zu den "Problemen", die es mit Ihrem Plug-In verursacht, ist es schwierig, einen Work-Aroudn anzubieten.

Stephen Harris
quelle
1

is_admin()kehrt immer truefür jeden AJAX-Aufruf zurück. Wenn Sie AJAX-Aufrufe nur vom Frontend aus validieren möchten, kann dies eine Problemumgehung sein:

if (!isset($GLOBALS['current_screen']) && !is_customize_preview()) {
    // AJAX calls from frontend, excludes customize preview screen.
}
SarahCoding
quelle
0

Ich weiß, dass dies alt ist, aber für den Fall, dass es jemand anderem hilft, der darüber stolpert ...

Normalerweise setze ich in meinen Frontend-Formularen eine Art Flag, um anzuzeigen, dass die eingehende Anfrage Ajax ist.

<input type="hidden" id="my_ajax_flag" name="my_ajax_flag" value="false" />

Anfangs ist dies auf "false" gesetzt, was ich dann auf "true" umschalte, während ich anfange, den Ajax zu verarbeiten.

$('#my_ajax_flag').val('true'); // example using jQuery

Dann überprüfe ich auf der Admin-Seite meines Codes diesen Parameter und füge dann entweder meine Ajax-Hooks hinzu oder führe meine regulären Nicht-Ajax-Admin-Aufgaben aus. Also zum Beispiel:

if ( isset( $_REQUEST['my_ajax_flag'] ) && $_REQUEST['my_ajax_flag'] == 'true' ) {
    add_action('wp_ajax_my_ajax_function', 'my_ajax_function');     
    add_action('wp_ajax_no_priv_my_ajax_function', 'my_ajax_function');
} else {
    // regular non-ajax stuff
}

Je nachdem, was Sie tun müssen, gibt es mehrere Variationen dieser Idee. Sie können jedoch verhindern, dass Ihr regulärer Administrationscode beim Ausführen von Ajax-Anforderungen stört oder ausgelöst wird.

Eine weitere Empfehlung, die nützlich sein kann, ist das Festlegen des WordPress-Attributs "noheader" in Ihren Formularen.

<input type="hidden" name="noheader" value="true" />

Wenn Sie eine Backend-Verarbeitung durchführen, die letztendlich zu einer Umleitung führt (empfohlen, um die gefürchtete Übermittlung von Doppelformularen zu vermeiden), müssen Sie in seltenen Randfällen auf wp-Hooks zugreifen, die normalerweise nach "bereits gesendeten Headern" auftreten würden.

br3nt
quelle
3
Nicht benötigt: Einfach prüfen defined( 'DOING_AJAX' ) && DOING_AJAX.
Fuxia
Oder wenn Ihr Code WooCommerce erweitert, verwenden Sie deren Funktion is_ajax(). Ja, es wird nur das erwähnte bedingte @toscho überprüft, aber ein Hauch kürzer.
James Jones
Abhängig von einer Methode eines Drittanbieters, die sich jederzeit ändern kann, um ein paar Bytes Code zu sparen, ist dies nur eine schlechte Praxis. Sei nicht faul und mach das. Wenn überhaupt, bauen Sie diese Methode in Ihr eigenes Basisframework ein, wenn Sie darauf bestehen, einige Bytes zu speichern.
Hybrid Web Dev
0

Ich wollte die Protokollierung am Frontend und am Administrator über eine Dashboard-Menüschaltfläche aktivieren / deaktivieren. Ich habe einfach eine Klasse zu meiner Menüschaltfläche hinzugefügt und dann den Status der Administrationsseite mit jQuery abgefragt

https://codex.wordpress.org/Class_Reference/WP_Admin_Bar/add_menu

Fügen Sie einen Menüpunkt mit dem Administratorstatus als Klasse hinzu

$wp_admin_bar -> add_menu(
  array(
        'title'     => '<span class="ab-icon"></span><span class="ab-label">' . __( 'Console Logging' , 'console-logging' ) . '</span>',
        'id'        => 'your-custom-id',
        'parent'    => false,
        'href'      => '',
        'meta'      => array('class' => 'is-admin-'.is_admin())//GET ACTUAL ADMIN OR NOT in php before page load
));

Holen Sie sich den Menüpunkt mit jQuery in Javascript und verwenden Sie ihn:

 //'is-admin-1' when is_admin() is true
 //'is-admin-0' when is_admin() is false

var is_admin = $('#wp-admin-bar-your-custom-id').hasClass('is-admin-1');

if(is_admin){
    //You are actually on an admin page
}else{
    //You are on a front end page
}
Chris Sprague
quelle