400 richiesta errata su admin-ajax.php solo usando l'hook dell'azione wp_enqueue_scripts


15

Ho lavorato su Ajax ultimamente. I tutorial che trovi in ​​rete sono tutti molto simili e abbastanza facili da implementare. Ma ricevo sempre una cattiva richiesta 400 sul mio ajax-admin.phpfile.

Dopo una lunga e intensa ricerca, ora ho scoperto che è a causa del tempo di integrazione.

Se uso il initgancio di azione per inizializzare lo script e wp_localize_script, tutto funziona bene. Quindi il codice stesso deve essere corretto.

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();
}

Ma se uso ad es. Il wp_enqeue_scriptsgancio di azione ricevo sempre la cattiva richiesta.

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

Il problema con questo è:

Vorrei avere le funzioni in un file php aggiuntivo e caricarle solo se sono necessarie in una determinata pagina. Per questo ho bisogno, per esempio is_page(). Ma is_page()funziona al più presto quando aggancio la funzione con l'inclusione nel parse_querygancio di azione:

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');

Quindi , suppongo, quindi le funzioni agganciate per initagganciare il my-page-test-functions.phpfile non si attivano, perché initarrivano prima parse_query.

Esistono le migliori pratiche per organizzarlo, quindi funziona? O come posso risolvere la admin-ajax.phpcattiva richiesta quando uso il wp_enqeue_scriptsgancio di azione?

Risposte:


13

Penso che l'unica cosa che manca qui sia che devi spostarti add_action('wp_ajax_nopriv_ajaxlogin','ajax_login');all'esterno ajax_login_init.

Quel codice registra il tuo gestore Ajax, ma quando lo esegui solo wp_enqueue_scripts, è già troppo tardi e gli wp_ajax_nopriv_hook sono già eseguiti.

Quindi, hai provato qualcosa del genere:

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();
}

Modificare:

Ora è più chiaro che vuoi solo caricare JavaScript su quella particolare pagina. Questo significa che devi metterti is_page()dentro ajax_login_init(). Ho aggiornato il codice di conseguenza.

Ora, perché la tua soluzione non ha funzionato?

Il is_page()controllo ha significato che il file delle funzioni è stato caricato solo su quella pagina specifica. ajax_login_init()viene chiamato e i tuoi script accodati. Fin qui tutto bene.

Ora il tuo script effettua la chiamata Ajax. Come menzionato nei commenti, le chiamate ajax non sono a conoscenza della pagina corrente in cui ti trovi. C'è una ragione per cui si trova il file wp-admin/admin-ajax.php. Non c'è WP_Querye quindi is_page()non funziona durante una richiesta Ajax.

Dal momento che non funziona, sw18_page_specific_functions()non farà nulla in un contesto Ajax. Ciò significa che il file delle funzioni non è caricato e il gestore ajax non esiste.

Ecco perché è necessario includere sempre quel file di funzioni e spostare quel is_page()controllo all'interno ajax_login_init().

Quindi, invece di sw18_page_specific_functions() { … }eseguire include_once dirname(__FILE__).'/includes/my-page-test-functions.php';direttamente. Senza alcuna add_action( 'parse_query' )chiamata.


Buon consiglio L'ho modificato (sempre lo stesso errore), ma il problema è ancora che il file contenente le funzioni verrà caricato troppo tardi. Ma ho bisogno di un modo per distinguere quale pagina viene utilizzata. - attualmente provo questo con is_page () come descritto sopra.
Sin

Stai cercando di correre is_page()dall'interno ajax_login()o dall'interno ajax_login_init(). Il primo non può funzionare perché si trova in un contesto Ajax.
swissspidy,

Ho elencato i file in cui si trovano le funzioni, come testo descrittivo sopra. Is_page () è usato in function.php e serve per includere il file con le funzioni ajax solo quando necessario.
Sin

@ Ancora una volta, is_page()non funziona in un contesto Ajax. Ho aggiornato la mia risposta di conseguenza.
swissspidy,

0

Ricorda di aggiungere il nome della funzione "azione" al wp_ajax_tag.

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

add_action('wp_ajax_fetchorderrows', 'fetchorderrows', 0);

-3

basta scrivere die; alla fine come sotto ...inserisci qui la descrizione dell'immagine


8
Ciao Zee Xhan. Benvenuti nel sito. La tua risposta necessita di alcune revisioni. Innanzitutto, se la tua risposta è un codice, non pubblicare uno screenshot. Invece, pubblica il codice come snippet e formattalo come codice (usa il pulsante {}). Questo è probabilmente il motivo per cui la tua risposta è stata sottoposta a downgrade e non accettata. Inoltre, una spiegazione in più sarebbe utile - come "perché" basta scrivere die (), e dove va esattamente questo in relazione al codice nell'OP (post originale)?
Butlerblog,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.