400 solicitud incorrecta en admin-ajax.php solo usando el gancho de acción wp_enqueue_scripts
3 respuestas
- votos
-
- 2018-01-17
Creo que lo único quefalta aquíes quenecesitasmover
add_action('wp_ajax_nopriv_ajaxlogin','ajax_login');
fuera deajax_login_init
.Ese código registra su controlador Ajax,pero cuando solo loejecutaen
wp_enqueue_scripts
,yaes demasiadotarde y losganchos dewp_ajax_nopriv_
yaestánejecutados.Entonces,¿haprobado algo comoesto?
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(); }
<×Editar:×
Ahoraestámás claro que solo desea cargar JavaScripten esapáginaen particular. Esto significa que debeponer su
is_page()
dentro deajax_login_init()
. Actualicéel códigoen consecuencia.Ahora,¿por quénofuncionó su solución?
La verificación
is_page()
significaba que su archivo defunciones solo se cargóen esapáginaespecífica. Se llama aajax_login_init()
y sus scripts seponenen cola. Hasta ahoratodobien.Ahora su secuencia de comandos realiza la llamada ajax. Como semencionaen los comentarios,las llamadas ajaxno son conscientes de lapágina actualen la que seencuentra. Hay una razónpor la queel archivo seencuentraen
wp-admin/admin-ajax.php
. No hayWP_Query
y,por lotanto,is_page()
nofunciona durante una solicitud ajax.Dado queesonofunciona,
sw18_page_specific_functions()
no haránadaen un contexto ajax. Esto significa que su archivo defuncionesnoestá cargado y su controlador ajaxnoexiste.Esporeso que siempre debeincluirese archivo defunciones ymoveresamarca de
is_page()
dentro deajax_login_init()
.Entonces,en lugar de
sw18_page_specific_functions() { … }
simplementeejecuteinclude_once dirname(__FILE__).'/includes/my-page-test-functions.php';
directamente . Sinninguna llamadaadd_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.-
Buena sugerencia.He cambiadoeso (sigue siendoelmismoerror),peroelproblema sigue siendo queel archivo que contiene lasfunciones se cargará demasiadotarde.Peronecesito unaforma de distinguir quépágina se usa.- Actualmenteintentoesto conis_page () como se describe arriba.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
-
¿Estáintentandoejecutar `is_page ()` desde dentro de `ajax_login ()` o desde dentro de `ajax_login_init ()`.Elprimeronopuedefuncionarporqueestáen un contexto 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
-
Heenumerado los archivosen los que seencuentran lasfunciones,comotexto descriptivo anterior.Is_page () se usaen functions.php y sirveparaincluirel archivo con lasfunciones ajax solo cuandoesnecesario.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 Nuevamente,`is_page ()`nofuncionaen un contexto Ajax.He actualizadomi respuestaen consecuencia.@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
Recuerde agregarelnombre de lafunción 'acción' a laetiqueta
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);
-
-
Hola Zee Xhan.Bienvenido al sitio.Tu respuestanecesita algunas revisiones.Primero,si su respuestaes un código,nopublique una captura depantalla.En su lugar,publiqueel código como unfragmento yformatéelo como código (useelbotón {}).Esaesprobablemente la razónpor la que su respuestafue rechazada yno aceptada.Además,sería útil unpocomás deexplicación,como "por qué" simplementeescriba die (),y ¿a dónde vaexactamenteestoen relación conel códigoen el OP (publicación original)?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
-
Heestadotrabajandoen ajax últimamente. Lostutoriales queencuentrasen la red sontodosmuy similares ybastantefáciles deimplementar. Pero siempre recibo una solicitudincorrecta 400 en mi archivo
ajax-admin.php
.Después de unabúsqueda largae intensa,descubrí que se debe altiempo deintegración.
Si utilizoelenlace de acción
init
parainicializarel script ywp_localize_script
,todofuncionabien. Entonces,el códigoen sí debe ser correcto.my-page-test-functions.php
Pero si uso,p.ej.
wp_enqeue_scripts
gancho de acción Siempre recibo la solicitudincorrecta.Elproblema conestoes:
Megustaríatener lasfuncionesen un archivophp adicional y cargarlas solo si sonnecesariasen unapáginaen particular. Paraestonecesito,porejemplo,
is_page ()
. Perois_page ()
funciona lo antesposible cuandoengancho lafunción con lainclusiónen elgancho de acciónparse_query
:functions.php
Entonces,lasfuncionesenlazadas a
init
enlaceen el archivomy-page-test-functions.php
no se activan,supongo,porqueinit
viene antes deparse_query
.¿Existe algunapráctica recomendadapara organizaresto,para quefuncione? ¿O cómopuedo solucionar la solicitudincorrecta
admin-ajax.php
cuando utilizoelgancho de acciónwp_enqeue_scripts
?