O arquivo functions.php já é chamado durante uma chamada AJAX?Depurar Ajax
2 respostas
- votos
-
- 2013-04-20
admin-ajax.php
cargaswp-load.php
:/** Carregue WordPress Bootstrap */ Require_Once (dirName (dirname (__file__)). '/wp-load.php');
wp-load.php
cargaswp-config.php
e láwp-settings.php
é carregado.e aquinós achamosisso:
//Carregue asfunçõespara otema ativo,para otemapaie filho,se aplicável. if (! Definido ('WP_INSTALLING')|| 'wp-active.php'===$ Pagenow) { if (mododpath!==StylesheetPath & amp; & amp;file_exists (stylesheetpath. '/functions.php')) incluir (estiloestilo. '/functions.php'); if (file_exists (mododpath. '/functions.php')) incluir (templatepath '.'/functions.php '); }
Então,sim,otema
funções.php
é carregado.
Há umaexceçãoem
wp-settings.php
://pare amaiorparte do WordPress de ser carregado se quisermos apenas obásico. if (shortinit) retornafalso;
Quando
shortinit
é definido comoverdadeiro
anteriormente,otemanão será carregado.Então,verifique se
shortinit
éverdadeiro
por algummotivo.
Outroerro comum é o usoerrado de
is_admin ()
. Este é sempreTrue
emAdmin-Ajax.php
,então o seguintefalhará:se (! IS_Admin ()) //registrar ouexecutar coisas ajax
Depuração Ajax
Ummétodo comoprimitivo comoeficiente é usar o cabeçalho HTTPpara depurar Ajax.
Aquiestá umafunção de auxiliar simples:
Função Send_Debug_Header ($msg) { $ counter=1; cabeçalho ("x-debug-Ajax- $ contador: $msg"); $ contador +=1; }
e estepluginmostra como usá-lo:
& lt;? PHP # - * - Codificação: UTF-8 - * - /** * Nome doplugin: debug Ajaxpor http * Descrição: Olhepara os cabeçalhos HTTPno console de rede do seunavegador */ //A constantejáestá definida quando osplugins são carregados. //provam quefomos chamados. if (definido ('fazer_ajax') & amp; & amp;fazendo_ajax) send_debug_header ('arquivo "'. __file__. '"foi chamadoem uma solicitação Ajax.'); Função Send_Debug_Header ($msg) { $ counter=1; cabeçalho ("x-debug-Ajax- $ contador: $msg"); $ contador +=1; } add_action ('wp_ajax_debug_test','t5_debug_test'); add_action ('wp_ajax_nopriv_debug_test','t5_debug_test'); Funçãot5_debug_test () { $in=is_user_logged_in ()? '' : 'não '; send_debug_header ('Função "'. __Function__. '"foi chamadoe o usuário é'. $in. 'logado'. '); print_r (debug_backtrace ()); morrer (1); } add_action ('wp_enqueue_scripts','t5_enqueue_jquery'); Funçãot5_enqueue_jquery () { wp_enqueue_script ('jquery'); } add_action ('wp_footer','t5_debug_ajax_test_button',0); Funçãot5_debug_ajax_test_button () { ? > & lt;entradatipo="enviar"id="t5debugajax" valor="debug Ajax" > & lt; script > jquery (função ($) { var sendfeedback=função (resposta) { console.log (resposta); }; $ ("#t5debugajax"). Em ("clique",função () { $ .POST ( "& lt;"phpecho admin_url ('admin-ajax.php');? > ", { Ação: "debug_test" }, enviar comentários ); }); }); & lt;/script > & lt;?php }
Adicionará umbotão àfront-end que aciona uma solicitação Ajax quando clicado. O console de rede do seunavegadore analise os cabeçalhos de respostapara a solicitação:
admin-ajax.php
loadswp-load.php
:/** Load WordPress Bootstrap */ require_once( dirname( dirname( __FILE__ ) ) . '/wp-load.php' );
wp-load.php
loadswp-config.php
, and therewp-settings.php
is loaded.And here we find this:
// Load the functions for the active theme, for both parent and child theme if applicable. if ( ! defined( 'WP_INSTALLING' ) || 'wp-activate.php' === $pagenow ) { if ( TEMPLATEPATH !== STYLESHEETPATH && file_exists( STYLESHEETPATH . '/functions.php' ) ) include( STYLESHEETPATH . '/functions.php' ); if ( file_exists( TEMPLATEPATH . '/functions.php' ) ) include( TEMPLATEPATH . '/functions.php' ); }
So, yes, the theme’s
functions.php
is loaded.
There is one exception in
wp-settings.php
:// Stop most of WordPress from being loaded if we just want the basics. if ( SHORTINIT ) return false;
When
SHORTINIT
is defined asTRUE
earlier, the theme will not be loaded.So check if
SHORTINIT
isTRUE
for some reason.
Another common error is the wrong usage of
is_admin()
. This is alwaysTRUE
inadmin-ajax.php
, so the following will fail:if ( ! is_admin() ) // register or execute AJAX stuff
Debugging AJAX
One method as primitive as efficient is using HTTP header to debug AJAX.
Here is a simple helper function:
function send_debug_header( $msg ) { static $counter = 1; header( "X-Debug-Ajax-$counter: $msg" ); $counter += 1; }
And this plugin shows how to use it:
<?php # -*- coding: utf-8 -*- /** * Plugin Name: Debug AJAX per HTTP * Description: Look at the HTTP headers in your browser's network console */ // The constant is already defined when plugins are loaded. // Prove we have been called. if ( defined( 'DOING_AJAX' ) && DOING_AJAX ) send_debug_header( 'File "' . __FILE__ . '" was called on an AJAX request.' ); function send_debug_header( $msg ) { static $counter = 1; header( "X-Debug-Ajax-$counter: $msg" ); $counter += 1; } add_action( 'wp_ajax_debug_test', 't5_debug_test' ); add_action( 'wp_ajax_nopriv_debug_test', 't5_debug_test' ); function t5_debug_test() { $in = is_user_logged_in() ? '' : 'not '; send_debug_header( 'Function "' . __FUNCTION__ . '" was called and the user is ' . $in . 'logged in.' ); print_r( debug_backtrace() ); die(1); } add_action( 'wp_enqueue_scripts', 't5_enqueue_jquery' ); function t5_enqueue_jquery() { wp_enqueue_script( 'jquery' ); } add_action( 'wp_footer', 't5_debug_ajax_test_button', 0 ); function t5_debug_ajax_test_button() { ?> <input type="submit" id="t5debugajax" value="Debug AJAX"> <script> jQuery( function($){ var sendFeedBack = function( response ){ console.log( response ); }; $("#t5debugajax").on("click", function(){ $.post( "<?php echo admin_url( 'admin-ajax.php' ); ?>", { action: "debug_test" }, sendFeedBack ); }); }); </script> <?php }
It will add a button to the front end that triggers an AJAX request when clicked. The open your browser’s network console and look at the response headers for the request:
-
Tão detalhado como sempre,@Toscho.Éespecialmente difícil de depurar quando o códigofuncionabem em suaextremidade,masnãopara outrapessoa.Não consegue se reproduzir oproblema,mas sua respostaprovavelmenteme enviarána direção certa.As detailed as ever, @toscho. Its especially hard to debug when the code runs fine on your end but not for someone else. Can't seem to reproduce the problem but your answer will probably send me in the right direction.
- 0
- 2013-04-20
- Manny Fleurmond
-
@Mannyfleurmond Eu adicionei umplugin auxiliar de depuração.Isso deve ajudar aencontrar oproblema.@MannyFleurmond I have added a debug helper plugin. That should help finding the problem.
- 0
- 2013-04-20
- fuxia
-
Homem,você é completo :)Man, you are thorough :)
- 9
- 2013-04-20
- Manny Fleurmond
-
`Templatepath`?;)`TEMPLATEPATH`? ;)
- 0
- 2013-07-14
- kaiser
-
- 2013-05-20
Eu suponho que seuproblemafoi o AJAXestavafuncionando se vocêestiver logadoe nãoestavafuncionandoem status logado,certo?
Há umafunçãono WordPresspara acessar arquivosbaseadosem AJAXpara usuáriosnão registrados:wp_ajax_nopriv
,porexemplo/* works for logged users */ add_action( 'wp_ajax_my_action', 'my_action_callback'); /* works for non logged users */ add_action( 'wp_ajax_nopriv_my_action', 'my_action_callback');
I assume your problem was AJAX was working if your are logged in and it was not working in logged out status, right?
There is a function in WordPress to access AJAX-based files for non logged users:wp_ajax_nopriv
, for example/* works for logged users */ add_action( 'wp_ajax_my_action', 'my_action_callback'); /* works for non logged users */ add_action( 'wp_ajax_nopriv_my_action', 'my_action_callback');
Tentando descobrir uma questão que um colegaprogramadorestátendo.Eu queria saber se o arquivo
functions.php
ficam chamados quando vocêfaz o administrador lado AJAX?Eu sei que quando vocêfaz uma chamada AJAX,umaparte do WP é carregadaparaprocessar a chamadae enviar uma resposta.É o arquivofunctions.php
incluídonisso?A razãopela qualestouperguntando éporqueeleestá usando a aula doplugin dometa-box`e carregando-o comoparte de umtema.Há algum Ajaxnessa classe que apenas retorna respostas vaziase acho que éporque o código que lida com a respostanão é carregado.Existe alguma documentaçãopara o que é carregado quando o WP lida com Ajax?