it-swarm.com.de

400 schlechte Anfrage auf admin-ajax.php nur mit dem Aktions-Hook wp_enqueue_scripts

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 für meine ajax-admin.php Datei.

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

Wenn ich den Aktions-Hook init verwende, um Skript und wp_localize_script zu initialisieren, 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 z. wp_enqeue_scripts action hook Ich bekomme 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. Dazu brauche ich zum Beispiel is_page(). Aber is_page() funktioniert frühestens, wenn ich die Funktion mit dem Include in den Aktions-Hook parse_query einbinde:

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 werden dann Funktionen, die mit init hook in my-page-test-functions.php file verknüpft sind, vermutlich nicht ausgelöst, da init vor parse_query steht.

Gibt es eine bewährte Methode, um dies zu organisieren, damit es funktioniert? Oder wie kann ich die fehlerhafte admin-ajax.php-Anfrage beheben, wenn ich den Aktions-Hook wp_enqeue_scripts verwende?

12
Sin

Ich denke, das einzige, was hier fehlt, ist, dass Sie add_action('wp_ajax_nopriv_ajaxlogin','ajax_login'); außerhalb von ajax_login_init verschieben müssen.

Dieser Code registriert Ihren Ajax-Handler, aber wenn Sie ihn nur mit wp_enqueue_scripts ausführen, 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 Ihre is_page() in ajax_login_init() einfügen müssen. Ich habe den Code entsprechend aktualisiert.

Warum hat Ihre Lösung nicht funktioniert?

Die Prüfung is_page() 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 unter wp-admin/admin-ajax.php befindet. Es gibt keinen WP_Query und daher funktioniert is_page() nicht während einer Ajax-Anfrage.

Da dies nicht funktioniert, wird sw18_page_specific_functions() in einem Ajax-Kontext nichts tun. 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 in ajax_login_init() verschieben.

Führen Sie statt sw18_page_specific_functions() { … } einfach include_once dirname(__FILE__).'/includes/my-page-test-functions.php'; direkt aus. Ohne einen add_action( 'parse_query' )-Aufruf.

11
swissspidy

Denken Sie daran, den Funktionsnamen 'action' an das Tag wp_ajax_ 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);
0