admin-ajax.php
Belastungen wp-load.php
:
/** Load WordPress Bootstrap */
require_once( dirname( dirname( __FILE__ ) ) . '/wp-load.php' );
wp-load.php
Ladungen wp-config.php
, und es wp-settings.php
wird geladen.
Und hier finden wir das:
// 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' );
}
Also ja, das Thema functions.php
ist geladen.
Es gibt eine Ausnahme in wp-settings.php
:
// Stop most of WordPress from being loaded if we just want the basics.
if ( SHORTINIT )
return false;
Wann SHORTINIT
wie TRUE
zuvor definiert , wird das Thema nicht geladen.
Überprüfen Sie also, ob dies der Fall SHORTINIT
istTRUE
aus irgendeinem Grund der .
Ein weiterer häufiger Fehler ist die falsche Verwendung von is_admin()
. Dies ist immer TRUE
in admin-ajax.php
, so dass Folgendes fehlschlägt:
if ( ! is_admin() )
// register or execute AJAX stuff
Debuggen von AJAX
Eine ebenso einfache wie effiziente Methode ist die Verwendung des HTTP-Headers zum Debuggen von AJAX.
Hier ist eine einfache Hilfsfunktion:
function send_debug_header( $msg )
{
static $counter = 1;
header( "X-Debug-Ajax-$counter: $msg" );
$counter += 1;
}
Und dieses Plugin zeigt, wie man es benutzt:
<?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
}
Dem Frontend wird eine Schaltfläche hinzugefügt, die beim Klicken eine AJAX-Anforderung auslöst. Öffnen Sie die Netzwerkkonsole Ihres Browsers und überprüfen Sie die Antwortheader für die Anforderung:
TEMPLATEPATH
? ;)Ich gehe davon aus, dass Ihr Problem darin bestand, dass AJAX funktioniert hat, wenn Sie angemeldet sind und es im Status "Abgemeldet" nicht funktioniert hat, oder?
In WordPress gibt es eine Funktion, um auf AJAX-basierte Dateien für nicht angemeldete Benutzer zuzugreifen:
wp_ajax_nopriv
zum Beispielquelle