Il file functions.php viene mai chiamato durante una chiamata AJAX?Eseguire il debug di AJAX
2 risposta
- voti
-
- 2013-04-20
admin-ajax.php
caricawp-load.php
:/** Load WordPress Bootstrap */ require_once( dirname( dirname( __FILE__ ) ) . '/wp-load.php' );
wp-load.php
caricawp-config.php
e lì viene caricatowp-settings.php
.E quitroviamo questo:
// 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' ); }
Quindi,sì,il
functions.php
deltema viene caricato.
C'è un'eccezionein
wp-settings.php
:// Stop most of WordPress from being loaded if we just want the basics. if ( SHORTINIT ) return false;
Quando
SHORTINIT
è stato definitoin precedenza comeTRUE
,iltemanon verrà caricato.Quindi controlla se
SHORTINIT
èTRUE
per qualchemotivo.
Un altroerrore comune è l'uso sbagliato di
is_admin()
. Questo è sempreTRUE
inadmin-ajax.php
,quindi quanto seguefallirà:if ( ! is_admin() ) // register or execute AJAX stuff
Debug di AJAX
Unmetodotantoprimitivo quantoefficiente è usare l'intestazione HTTPpereseguireil debug di AJAX.
Ecco una semplicefunzione di supporto:
function send_debug_header( $msg ) { static $counter = 1; header( "X-Debug-Ajax-$counter: $msg" ); $counter += 1; }
E questopluginmostra come 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 }
Aggiungerà unpulsante alfront-end che attiva una richiesta AJAX quando viene cliccato. Apri la console di rete deltuobrowsere guarda leintestazioni di rispostaper la richiesta:
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:
-
Più dettagliato chemai,@toscho.Èparticolarmente difficileeseguireil debug quandoil codicefunziona correttamente dapartetuamanonper qualcun altro.Non riesco a riprodurreilproblema,ma latua rispostaprobabilmentemi manderànellagiusta direzione.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 Ho aggiunto unplugin di supportoperil debug.Questo dovrebbe aiutare atrovareilproblema.@MannyFleurmond I have added a debug helper plugin. That should help finding the problem.
- 0
- 2013-04-20
- fuxia
-
Amico,sei accurato :)Man, you are thorough :)
- 9
- 2013-04-20
- Manny Fleurmond
-
"TEMPLATEPATH"?;)`TEMPLATEPATH`? ;)
- 0
- 2013-07-14
- kaiser
-
- 2013-05-20
Presumo cheiltuoproblemafosse che AJAXfunzionava se haieffettuato l'accessoe nonfunzionavanello stato disconnesso,giusto?
C'è unafunzionein WordPressper accedere aifilebasati su AJAXpergli utentinon registrati:wp_ajax_nopriv
,adesempio/* 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');
Sto cercando di capire unproblema che sta riscontrando un collegaprogrammatore.Mi chiedevo seilfile
functions.php
venga chiamato quandoesegui AJAX lato amministratore?So che quandoesegui una chiamata AJAX unaparte di WP viene caricataperelaborare la chiamatae inviare una risposta.Ilfilefunctions.php
èinclusoin questo?Ilmotivoper cui lo chiedo èperché sta usando la classe dalplugin Meta-Box`e invece la carica comeparte di untema.C'è unpo 'di AJAXin quella classe che restituisce solo risposte vuotee penso che siaperchéil codice chegestisce la rispostanon viene caricato.Esiste documentazione su cosa viene caricato quando WPgestisce AJAX?