400 Pedido ruim no admin-ajax.php apenas usando wp_enqueue_scripts action gancho
3 respostas
- votos
-
- 2018-01-17
Eu acho que a única coisa quefalta aqui é que vocêprecisamover
add_action('wp_ajax_nopriv_ajaxlogin','ajax_login');
foraajax_login_init
.Esse código registra seumanipulador Ajax,mas quando você sóexecutá-loem
wp_enqueue_scripts
,já étarde demaisewp_ajax_nopriv_
ganchosjáestãoexecutados.Então,vocêjátentou algo assim:
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:
Agora émais claro que você só quer carregar ojavascriptnessapáginaespecífica. Isso significa que vocêprecisa colocar o seu
is_page()
dentroajax_login_init()
. Atualizei o código de acordo.Agora,por que sua soluçãonãofuncionou?
O
is_page()
marca significa que seu arquivo defunçõesfoi carregado apenasnessapáginaespecífica.ajax_login_init()
é chamadoe seus scriptsfechados. Até agoratãobom.Agora,seu scriptfaz a chamada do Ajax. Comomencionadonos comentários,as chamadas AJAXnãoestão cientes dapágina atualem que vocêestá. Há uma razãopela qual o arquivoficaem
wp-admin/admin-ajax.php
. Não háWP_Query
e,portanto,is_page()
nãofunciona durante uma solicitação AJAX.Comoissonãofunciona,
sw18_page_specific_functions()
nãofaránadaem um contexto Ajax. Isso significa que seu arquivo defunçõesnão é carregadoe seumanipulador Ajaxnãoexiste.Éporisso que vocêprecisa sempreincluiresse arquivo defunçõese mover que
.is_page()
Verifique dentroajax_login_init()
.Então,em vez de
sw18_page_specific_functions() { … }
apenasexecutarinclude_once dirname(__FILE__).'/includes/my-page-test-functions.php';
diretamente . Sem qualqueradd_action( 'parse_query' )
chamada.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.-
Boa sugestão.Eumudeiisso (ainda omesmoerro),mas oproblema ainda é que o arquivo contendo asfunções carregarátarde demais.Maseupreciso de umamaneira de distinguir qualpágina é usada.- Atualmenteeutentoisso com IS_Page () como descrito acima.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
-
Vocêestátentandoexecutar "is_page ()" de dentro do "Ajax_login ()" ou de dentro do `ajax_login_init ()`.Oprimeironãopodefuncionarporqueestáem um 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
-
Euenumerei os arquivosnos quais asfunções são,comotexto descritivo acima.O IS_Page () é usadonasfunções.phpe serveparaincluir o arquivo com asfunções AJAX somente quandonecessário.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
-
@Sinnovamente,`is_page ()`nãofuncionaem um contexto Ajax.Eu atualizeiminha resposta de acordo.@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
Lembre-se deter onome defunção 'ação' anexado ao
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);
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);
-
-
Oi Zee Xhan.Bem vindo ao site.Sua respostaprecisa de algumas revisões.Primeiro,se sua respostafor código,nãoposte uma captura detela.Em vez disso,poste o código como um snippete formate-o como código (use obotão {}).Éprovável que a razãopela qual sua respostafoi downvotede não aceite.Além disso,umpoucomais deexplicação seria útil - como "por que" apenasescrevermorrer (),e ondeexatamenteisso aconteceem relação ao códigono OP (post 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
-
Eutenhotrabalhadono Ajax ultimamente. Ostutoriais que vocêencontrananet sãotodosmuito semelhantese muitofáceis deimplementar. Maseu sempre recebo um solicitação ruim 400 nomeu
Ajax-admin.php
arquivo.Após umapesquisa longae intensiva,descobri que épor causa dotempo deintegração.
Seeu usar ogancho de ação
parainicializar o scripte
wp_localize_script
,tudofuncionabem. Então o códigoem si deveestar correto.my-page-test-functions.php
Mas seeu usar,e.
wp_enqeue_scripts
gancho de ação Eu sempre recebo opedido ruim.Oproblema comisso é:
Eugostaria deter asfunçõesem um arquivo PHPextrae carregá-los apenas seforemnecessáriosem uma determinadapágina. Paraisso,eupreciso,porexemplo,
is_page ()
. Masis_page ()
funciona omais cedo quandoeugozo afunção com o Incluirno Gancho de Ação:funções.php
Portanto,então asfunções conectadaspara
init
ganchoemmy-page-functions.php
arquivonão acionado,suponho,porqueinit
vem antesparse_Query
.Existe umaprática recomendadapara organizarisso,porissofunciona? Ou comoposso corrigir o
admin-ajax.php
má solicitação ao usar owp_enqeue_scripts
gancho de ação?