400 richiesta errata su admin-ajax.php usando solo l'action hook wp_enqueue_scripts
3 risposta
- voti
-
- 2018-01-17
Penso che l'unica cosa chemanca qui è che devi spostare
add_action('wp_ajax_nopriv_ajaxlogin','ajax_login');
all'esterno diajax_login_init
.Quel codice registrailtuogestore Ajax,ma quando loesegui solo su
wp_enqueue_scripts
,ègiàtroppotardie gli hookwp_ajax_nopriv_
sonogiàin esecuzione.Allora,haiprovato qualcosa di simile:
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(); }
<"Modifica:"
Ora èpiù chiaro che vuoi caricare solo JavaScript su quellaparticolarepagina. Ciò significa che devimettere latua
is_page()
all'interno diajax_login_init()
. Ho aggiornatoil codice di conseguenza.Ora,perché latua soluzionenon hafunzionato?
Il controllo
is_page()
significava cheilfile dellefunzioniera stato caricato solo su quellapagina specifica.ajax_login_init()
viene chiamatoe gli script vengono accodati. Fin quituttobene.Orailtuo scripteffettua la chiamata ajax. Come accennatonei commenti,le chiamate ajaxnon sono a conoscenza dellapagina correntein cuiti trovi. C'è unmotivoper cuiilfile sitrovain
wp-admin/admin-ajax.php
. Non c'èWP_Query
e quindiis_page()
nonfunziona durante una richiesta ajax.Dalmomento chenonfunziona,
sw18_page_specific_functions()
nonfarànullain un contesto ajax. Ciò significa cheiltuofile difunzioninon è caricatoe iltuogestore ajaxnonesiste.Eccoperché ènecessarioincludere sempreilfile difunzionie spostareil controllo
is_page()
all'interno diajax_login_init()
.Quindi,invece di
sw18_page_specific_functions() { … }
esegui direttamenteinclude_once dirname(__FILE__).'/includes/my-page-test-functions.php';
direttamente . Senza alcuna chiamata aadd_action( 'parse_query' )
.I think the only thing missing here is that you need to move
add_action('wp_ajax_nopriv_ajaxlogin','ajax_login');
outsideajax_login_init
.That code registers your Ajax handler, but when you only run it on
wp_enqueue_scripts
, it's already too late andwp_ajax_nopriv_
hooks are already run.So, have you tried something like this:
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(); }
Edit:
Now it's more clear that you only want to load the JavaScript on that particular page. This means you need to put your
is_page()
insideajax_login_init()
. I've updated the code accordingly.Now, why didn't your solution work?
The
is_page()
check meant that your functions file was only loaded on that specific page.ajax_login_init()
gets called and your scripts enqueued. So far so good.Now your script makes the ajax call. As mentioned in the comments, ajax calls are not aware of the current page you're on. There's a reason the file sits at
wp-admin/admin-ajax.php
. There's noWP_Query
and thusis_page()
does not work during an ajax request.Since that does not work,
sw18_page_specific_functions()
won't do anything in an ajax context. This means your functions file is not loaded and your ajax handler does not exist.That's why you need to always include that functions file and move that
is_page()
check insideajax_login_init()
.So instead of
sw18_page_specific_functions() { … }
just runinclude_once dirname(__FILE__).'/includes/my-page-test-functions.php';
directly. Without anyadd_action( 'parse_query' )
call.-
Buon suggerimento.L'ho cambiato (sempre lo stessoerrore),mailproblema è cheilfile contenente lefunzioni verrà caricatotroppotardi.Ma hobisogno di unmodoper distinguere qualepagina viene utilizzata.- attualmente loprovo conis_page () come descritto sopra.Good suggestion. I have changed that (still the same error), but the problem still is that the file containing the functions will load too late. But I need a way to distinguish which page is used. - currently I try this with is_page () as described above.
- 0
- 2018-01-17
- Sin
-
Staitentando dieseguire `is_page ()` da `ajax_login ()` o da `ajax_login_init ()`.Ilprimononpuòfunzionareperché èin un contesto Ajax.Are you trying to run `is_page()` from within `ajax_login()` or from within `ajax_login_init()`. The former can't work because it's in an Ajax context.
- 0
- 2018-01-17
- swissspidy
-
Hoenumeratoi filein cui sitrovano lefunzioni,cometesto descrittivo sopra.Is_page () è usatoin functions.phpe serveperincludereilfile con lefunzioni ajax solo quandonecessario.I have enumerated the files in which the functions are, as descriptive text above. The is_page() is used in the functions.php and serves to include the file with the ajax functions only when needed.
- 0
- 2018-01-17
- Sin
-
@Sin Again,`is_page ()`nonfunzionain un contesto Ajax.Ho aggiornato di conseguenza lamia risposta.@Sin Again, `is_page()` does not work in an Ajax context. I have updated my answer accordingly.
- 0
- 2018-01-17
- swissspidy
-
- 2019-04-14
Ricorda di aggiungereilnome dellafunzione "action" altag
wp_ajax_
.function fetchorderrows() { // Want to run this func on ajax submit // Do awesome things here all day long } add_action('wp_ajax_fetchorderrows', 'fetchorderrows', 0);
Remember to have the 'action' function name appended to the
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);
-
-
Ciao Zee Xhan.Benvenutonel sito.Latua rispostanecessita di alcune revisioni.Innanzitutto,se latua risposta èin codice,nonpubblicare uno screenshot.Pubblicainveceil codice come snippete formattalo come codice (usailpulsante {}).Questo èprobabilmenteilmotivoper cui latua risposta è stata sottovalutatae non accettata.Inoltre,unpo 'più di spiegazione sarebbe utile - come "perché" scrivi semplicemente die (),e dove vaesattamente questoin relazione al codicenell'OP (post originale)?Hi Zee Xhan. Welcome to the site. Your answer needs some revisions. First, if your answer is code, don't post a screenshot. Instead, post the code as a snippet and format it as code (use the {} button). That's likely the reason your answer was downvoted and not accepted. Also, a little more explanation would be helpful - like "why" just write die(), and where exactly does this go in relation to the code in the OP (original post)?
- 9
- 2018-11-12
- butlerblog
-
Ultimamente ho lavorato su ajax. Itutorial chetroviin rete sonotuttimolto similie abbastanzafacili daimplementare. Ma ricevo sempre una richiestaerrata 400 sulmiofile
ajax-admin.php
.Dopo una lungae intensa ricerca,ora ho scoperto che è dovuto altempo dell'integrazione.
Se utilizzo l'action hook
init
perinizializzare lo scriptewp_localize_script
,tuttofunziona correttamente. Quindiil codice stesso deveessere corretto.my-page-test-functions.php
Ma se utilizzo ades.
wp_enqeue_scripts
action hook Ricevo sempre la cattiva richiesta.Ilproblema con questo è:
Vorrei avere lefunzioniin unfilephp aggiuntivoe caricarle solo se sononecessariein una determinatapagina. Per questo hobisogno,adesempio,di
is_page ()
. Mais_page ()
funziona alpiùpresto quando aggancio lafunzione con l'inclusionenell'action hookparse_query
:functions.php
Quindi lefunzioni agganciate all'hook
init
nelfilemy-page-test-functions.php
non si attivano,suppongo,perchéinit
vieneprima diparse_query
.Esistonobestpracticeper organizzarlo,quindifunziona? O comeposso correggere la richiestaerrata
admin-ajax.php
quando utilizzo l'action hookwp_enqeue_scripts
?