web-dev-qa-db-de.com

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

Ich hatte heute eine Situation, in der ich admin-ajax.php aus einem Front-End-Skript verwendete. So wie ich es verstehe, ist dies die wp-Methode, um Ajax-Aufrufe durchzuführen (Registrieren meiner Funktion mit dem wp_ajax_nopriv_myfunction-Hook)

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

Dies verursacht ein Problem mit einem Plugin, das ich verwende und das Dinge auf der Front- und der Administratorseite anders macht.

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

gibt es eine Möglichkeit, Ajax im Front-End auf die Weise von WP zu verwenden und mit is_admin () false zurückzugeben?

hoffe ich konnte mich verständlich machen

7
Thomas

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

Es ist nicht zu überspringen (und du solltest es sowieso nicht tun). Wenn Ihre Ajax-Anforderung sowohl vom Front-End als auch vom Administrator aus ausgelöst werden kann, möchten Sie möglicherweise beim Posten der Daten angeben, ob es sich um eine Administratoranforderung handelt oder nicht. Ohne nähere Angaben zu den Problemen, die durch Ihr Plug-in verursacht werden, ist es jedoch schwierig, eine Problemlösung anzubieten.

5
Stephen Harris

Ich wollte die Protokollierung am Front-End und den 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 Administratorseite mit jQuery abgefragt

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

Fügen Sie einen Menüeintrag 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 das Menüelement mit jQuery in Javascript und verwenden Sie es:

 //'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
}
0
Chris Sprague

Ich weiß, das ist alt, aber falls 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 beginne, 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-fähigen Admin-Aufgaben durch. 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
}

abhängig davon, was Sie tun müssen, gibt es mehrere Variationen dieser Idee, aber Sie können damit verhindern, dass Ihr regulärer Admin-Code während der Ausführung von Ajax-Anforderungen stört oder ausgelöst wird.

eine andere Empfehlung, die nützlich sein kann, ist das Setzen des WordPress-Attributs "Noheader" in Ihren Formularen.

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

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

0
br3nt