400 Fehlerhafte Anfrage für admin-ajax.php nur mit dem Aktions-Hook wp_enqueue_scripts

15

Ich habe in letzter Zeit an Ajax gearbeitet. Die Tutorials, die Sie im Internet finden, sind alle sehr ähnlich und recht einfach zu implementieren. Aber ich bekomme immer eine schlechte Anfrage 400 in meiner ajax-admin.phpAkte.

Nach langer und intensiver Suche habe ich nun herausgefunden, dass dies an der Zeit der Integration liegt.

Wenn ich den initAktions-Hook verwende, um das Skript und zu initialisieren wp_localize_script, funktioniert alles einwandfrei. Der Code selbst muss also korrekt sein.

my-page-test-functions.php

function ajax_login_init(){
   wp_register_script('ajax-login-script',get_stylesheet_directory_uri().'/js/ajax-login-script.js',array('jquery'));
   wp_enqueue_script('ajax-login-script');
   wp_localize_script('ajax-login-script','ajax_login_object',array('ajaxurl' => admin_url('admin-ajax.php'),'redirecturl' => 'REDIRECT_URL_HERE','loadingmessage' => __('Sending user info, please wait...')));
   add_action('wp_ajax_nopriv_ajaxlogin','ajax_login');
}

if(!is_user_logged_in()){
   add_action('init','ajax_login_init');
}

function ajax_login(){
    //nonce-field is created on page
    check_ajax_referer('ajax-login-nonce','security');
    //CODE
    die();
}

Aber wenn ich zB wp_enqeue_scriptsAction Hook benutze bekomme ich immer die schlechte Anfrage.

if(!is_user_logged_in()){
    add_action('wp_enqueue_scripts','ajax_login_init');
}

Das Problem dabei ist:

Ich möchte die Funktionen in einer zusätzlichen PHP-Datei haben und sie nur laden, wenn sie auf einer bestimmten Seite benötigt werden. Dafür brauche ich zum Beispiel is_page(). Funktioniert aber is_page()frühestens, wenn ich die Funktion mit dem Include in den parse_queryAction-Hook einhänge:

functions.php

function sw18_page_specific_functions(){
    if(is_page('page-test')){
        include_once dirname(__FILE__).'/includes/my-page-test-functions.php';
    }
}

add_action('parse_query','sw18_page_specific_functions');

Also dann werden funktionen zum initeinhängen der my-page-test-functions.phpdatei nicht ausgelöst, nehme ich an, da initkommt das schon mal vor parse_query.

Gibt es Best Practices, um dies zu organisieren, damit es funktioniert? Oder wie kann ich die admin-ajax.phpfehlerhafte Anfrage bei Verwendung des wp_enqeue_scriptsAktions-Hooks beheben ?

Sünde
quelle

Antworten:

13

Ich denke, das einzige, was hier fehlt, ist, dass Sie nach add_action('wp_ajax_nopriv_ajaxlogin','ajax_login');draußen gehen müssen ajax_login_init.

Dieser Code registriert Ihren Ajax-Handler, aber wenn Sie ihn nur ausführen wp_enqueue_scripts, ist es bereits zu spät und wp_ajax_nopriv_Hooks werden bereits ausgeführt.

Also, hast du so etwas probiert:

function ajax_login_init(){
  if ( ! is_user_logged_in() || ! is_page( 'page-test' ) ) {
    return;
  }

  wp_register_script('ajax-login-script',get_stylesheet_directory_uri().'/js/ajax-login-script.js',array('jquery'));
  wp_enqueue_script('ajax-login-script');
  wp_localize_script('ajax-login-script','ajax_login_object',array('ajaxurl' => admin_url('admin-ajax.php'),'redirecturl' => 'REDIRECT_URL_HERE','loadingmessage' => __('Sending user info, please wait...')));
}

add_action( 'wp_enqueue_scripts','ajax_login_init' );

add_action( 'wp_ajax_nopriv_ajaxlogin','ajax_login' );

function ajax_login(){
  //nonce-field is created on page
  check_ajax_referer('ajax-login-nonce','security');
  //CODE
  die();
}

Bearbeiten:

Jetzt ist klarer, dass Sie nur das JavaScript auf dieser bestimmten Seite laden möchten. Dies bedeutet, dass Sie Ihr is_page()Inneres setzen müssen ajax_login_init(). Ich habe den Code entsprechend aktualisiert.

Warum hat Ihre Lösung nicht funktioniert?

Die is_page()Überprüfung bedeutete, dass Ihre Funktionsdatei nur auf dieser bestimmten Seite geladen wurde. ajax_login_init()wird aufgerufen und Ihre Skripte in die Warteschlange gestellt. So weit, ist es gut.

Jetzt führt Ihr Skript den Ajax-Aufruf aus. Wie in den Kommentaren erwähnt, wissen Ajax-Anrufe nicht, auf welcher Seite Sie sich gerade befinden. Es gibt einen Grund, warum sich die Datei befindet wp-admin/admin-ajax.php. Es gibt keine WP_Queryund is_page()funktioniert daher nicht während einer Ajax-Anfrage.

Da dies nicht funktioniert, sw18_page_specific_functions()wird in einem Ajax-Kontext nichts unternommen. Dies bedeutet, dass Ihre Funktionsdatei nicht geladen ist und Ihr Ajax-Handler nicht existiert.

Aus diesem Grund müssen Sie diese Funktionsdatei immer einschließen und diese is_page()Prüfung nach innen verschieben ajax_login_init().

Also anstatt sw18_page_specific_functions() { … }einfach include_once dirname(__FILE__).'/includes/my-page-test-functions.php';direkt zu laufen . Ohne irgendeinen add_action( 'parse_query' )Anruf.

swissspidy
quelle
Guter Vorschlag. Ich habe das geändert (immer noch der gleiche Fehler), aber das Problem ist immer noch, dass die Datei mit den Funktionen zu spät geladen wird. Aber ich brauche eine Möglichkeit, um zu unterscheiden, welche Seite verwendet wird. - derzeit versuche ich das mit is_page () wie oben beschrieben.
Sin
Versuchen Sie , laufen is_page()von innen ajax_login()oder von innen ajax_login_init(). Ersteres kann nicht funktionieren, da es sich um einen Ajax-Kontext handelt.
swissspidy
Ich habe die Dateien, in denen sich die Funktionen befinden, als Beschreibungstext oben aufgeführt. Die is_page () wird in der functions.php verwendet und dient dazu, die Datei mit den Ajax-Funktionen nur bei Bedarf einzuschließen.
Sin
@Sin Funktioniert erneut is_page()nicht in einem Ajax-Kontext. Ich habe meine Antwort entsprechend aktualisiert.
swissspidy
0

Denken Sie daran, den Funktionsnamen 'action' an das wp_ajax_Tag anzuhängen.

function fetchorderrows() { // Want to run this func on ajax submit
  // Do awesome things here all day long
}

add_action('wp_ajax_fetchorderrows', 'fetchorderrows', 0);
Mohd Abdul Mujib
quelle
-3

schreibe einfach die; am ende wie unten ...Bildbeschreibung hier eingeben

ZEe XhAn
quelle
8
Hallo Zee Xhan. Willkommen auf der Seite. Ihre Antwort bedarf einiger Überarbeitungen. Wenn Ihre Antwort Code ist, veröffentlichen Sie zunächst keinen Screenshot. Stellen Sie den Code stattdessen als Snippet bereit und formatieren Sie ihn als Code (verwenden Sie die Schaltfläche {}). Das ist wahrscheinlich der Grund, warum Ihre Antwort abgelehnt und nicht akzeptiert wurde. Auch eine etwas ausführlichere Erklärung wäre hilfreich - wie "warum" schreibe ich einfach die (), und wo genau hängt das mit dem Code im OP zusammen (Originalbeitrag)?
Butlerblog