¿Se llama alguna vez al archivo functions.php durante una llamada AJAX?Depurar AJAX
2 respuestas
- votos
-
- 2013-04-20
admin-ajax.php
cargawp-load.php
:/** Load WordPress Bootstrap */ require_once( dirname( dirname( __FILE__ ) ) . '/wp-load.php' );
wp-load.php
cargawp-config.php
,y allí se cargawp-settings.php
.Y aquíencontramosesto:
// 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' ); }
Entonces,sí,el
functions.php
deltemaestá cargado.
Hay unaexcepciónen
wp-settings.php
:// Stop most of WordPress from being loaded if we just want the basics. if ( SHORTINIT ) return false;
Cuando
SHORTINIT
se define comoTRUE
anteriormente,eltemano se cargará.Portanto,compruebe si
SHORTINIT
esTRUE
por alguna razón.
Otroerror comúnesel usoincorrecto de
is_admin()
. Esto siempreesTRUE
enadmin-ajax.php
,por lo que lo siguientefallará:if ( ! is_admin() ) // register or execute AJAX stuff
Depuración de AJAX
Unmétodotanprimitivo comoeficientees usarelencabezado HTTPpara depurar AJAX.
Aquí hay unafunción auxiliar simple:
function send_debug_header( $msg ) { static $counter = 1; header( "X-Debug-Ajax-$counter: $msg" ); $counter += 1; }
Yeste complementomuestra cómo usarlo:
<?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 }
Agregará unbotón a lainterfaz que activa una solicitud AJAX cuando se hace clicen él. Abre la consola de red detunavegador ymira losencabezados de respuestapara la solicitud:
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:
-
Tan detallado como siempre,@toscho.Esespecialmente difícil de depurar cuandoel código seejecutabien en suextremo,peronopara otrapersona.Parece quenopuedo reproducirelproblema,pero su respuestaprobablementeme enviaráen la dirección correcta.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 He agregado un complemento auxiliar de depuración.Eso debería ayudar aencontrarelproblema.@MannyFleurmond I have added a debug helper plugin. That should help finding the problem.
- 0
- 2013-04-20
- fuxia
-
Hombre,eresminucioso :)Man, you are thorough :)
- 9
- 2013-04-20
- Manny Fleurmond
-
`TEMPLATEPATH`?;)`TEMPLATEPATH`? ;)
- 0
- 2013-07-14
- kaiser
-
- 2013-05-20
Supongo que suproblemaera que AJAXfuncionaba siinició sesión ynofuncionabaen elestado de desconexión,¿verdad?
Hay unafunciónen WordPresspara acceder a archivosbasadosen AJAXpara usuariosno registrados:wp_ajax_nopriv
,porejemplo/* 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');
Intentando averiguar unproblema quetiene un compañeroprogramador.Mepreguntaba si se llama al archivo
functions.php
cuando se utiliza AJAX del lado del administrador.Sé que cuando haces una llamada AJAX,unaparte de WP se cargaparaprocesar la llamada yenviar una respuesta.¿El archivofunctions.php
estáincluidoen eso?La razónpor la quepreguntoesporqueestá usando la clase del complemento Meta-Box` y laestá cargando comoparte de untema.Hay algo de AJAXen esa clase que solo devuelve respuestas vacías y creo queesporqueel código quemaneja la respuestano se carga.¿Hay alguna documentación sobre lo que se carga cuando WPmaneja AJAX?