Wird die Datei functions.php jemals während eines AJAX-Aufrufs aufgerufen?Debuggen Sie AJAX
2 Antworten
- Stimmen
-
- 2013-04-20
admin-ajax.php
lädtwp-load.php
:/** Load WordPress Bootstrap */ require_once( dirname( dirname( __FILE__ ) ) . '/wp-load.php' );
wp-load.php
lädtwp-config.php
und dort wirdwp-settings.php
geladen.Und hierfinden wir Folgendes:
// 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' ); }
Ja,die
functions.php
des Themas wirdgeladen.
In
wp-settings.php
gibt eseine Ausnahme:// Stop most of WordPress from being loaded if we just want the basics. if ( SHORTINIT ) return false;
Wenn
SHORTINIT
früher alsTRUE
definiert wurde,wird das Themanichtgeladen.Überprüfen Sie daher ausirgendeinem Grund,ob
SHORTINIT
TRUE
ist.
Ein weiterer häufiger Fehlerist diefalsche Verwendung von
is_admin()
. Diesistinadmin-ajax.php
immerTRUE
,daher schlägt Folgendesfehl:if ( ! is_admin() ) // register or execute AJAX stuff
AJAX debuggen
Eineebensoprimitive wieeffiziente Methodeist die Verwendung des HTTP-Headers zum Debuggen von AJAX.
Hieristeine einfache Hilfsfunktion:
function send_debug_header( $msg ) { static $counter = 1; header( "X-Debug-Ajax-$counter: $msg" ); $counter += 1; }
Und dieses Plugin zeigt,wiemanesbenutzt:
<?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 }
Es wirdeine Schaltfläche zum Frontend hinzugefügt,diebeim Klickeneine AJAX-Anforderung auslöst. Öffnen Sie die Netzwerkkonsole Ihres Browsers und sehen Sie sich die Antwortheaderfür die Anforderung an:
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:
-
So detailliert wieimmer,@toscho.Esistbesonders schwer zu debuggen,wenn der Code auf Ihrer Seitegut läuft,abernichtfürjemand anderen.Kann das Problemnicht reproduzieren,aber Ihre Antwort wirdmich wahrscheinlichin die richtige Richtung schicken.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 Ich habeein Debug-Helfer-Plugin hinzugefügt.Das sollte helfen,das Problem zufinden.@MannyFleurmond I have added a debug helper plugin. That should help finding the problem.
- 0
- 2013-04-20
- fuxia
-
Mann,dubistgründlich :)Man, you are thorough :)
- 9
- 2013-04-20
- Manny Fleurmond
-
`TEMPLATEPATH`?;)`TEMPLATEPATH`? ;)
- 0
- 2013-07-14
- kaiser
-
- 2013-05-20
Ichgehe davon aus,dass Ihr Problem darinbestand,dass AJAXfunktioniert hat,wenn Sie angemeldet sind und der Status "Abgemeldet"nichtfunktioniert hat,oder?
In WordPressgibt eseine Funktionfür den Zugriff auf AJAX-basierte Dateienfürnichtprotokollierte Benutzer:wp_ajax_nopriv
,zum Beispiel/* 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');
Der Versuch,ein Problem herauszufinden,dasein Programmierkollege hat.Ich habemichgefragt,ob die Datei
functions.php
überhaupt aufgerufen wird,wenn Sie AJAX auf der Administratorseite ausführen.Ich weiß,dassbei einem AJAX-Anrufein Teil von WPgeladen wird,um den Anruf zu verarbeiten undeine Antwort zurückzusenden.Ist die Dateifunctions.php
darinenthalten?Der Grund,denichfrage,ist,dasser die Klasse aus dem Meta-Box-Plugin verwendet und sie stattdessen als Teileines Themas lädt.Esgibt einige AJAXin dieser Klasse,dienur leere Antworten zurückgeben,undich denke,das liegt daran,dass der Code,der die Antwort verarbeitet,nichtgeladen wird.Gibteseine Dokumentation darüber,wasgeladen wird,wenn WP AJAX verarbeitet?