admin-ajax.php
banyak wp-load.php
:
/** Load WordPress Bootstrap */
require_once( dirname( dirname( __FILE__ ) ) . '/wp-load.php' );
wp-load.php
banyak wp-config.php
, dan ada wp-settings.php
dimuat.
Dan di sini kita temukan ini:
// 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' );
}
Jadi, ya, temanya functions.php
dimuat.
Ada satu pengecualian di wp-settings.php
:
// Stop most of WordPress from being loaded if we just want the basics.
if ( SHORTINIT )
return false;
Ketika SHORTINIT
didefinisikan sebagai TRUE
sebelumnya, tema tidak akan dimuat.
Jadi memeriksa apakah SHORTINIT
ini TRUE
untuk beberapa alasan.
Kesalahan umum lainnya adalah penggunaan yang salah dari is_admin()
. Ini selalu TRUE
di admin-ajax.php
, sehingga berikut ini akan gagal:
if ( ! is_admin() )
// register or execute AJAX stuff
Debugging AJAX
Salah satu metode primitif dan efisien adalah menggunakan header HTTP untuk men-debug AJAX.
Berikut adalah fungsi pembantu sederhana:
function send_debug_header( $msg )
{
static $counter = 1;
header( "X-Debug-Ajax-$counter: $msg" );
$counter += 1;
}
Dan plugin ini menunjukkan cara menggunakannya:
<?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
}
Ini akan menambahkan tombol ke ujung depan yang memicu permintaan AJAX ketika diklik. Buka konsol jaringan browser Anda dan lihat header respons untuk permintaan:
TEMPLATEPATH
? ;)Saya berasumsi bahwa masalah Anda adalah AJAX berfungsi jika Anda masuk dan tidak bekerja dalam status keluar, kan?
Ada fungsi di WordPress untuk mengakses file berbasis AJAX untuk pengguna yang tidak login:,
wp_ajax_nopriv
misalnyasumber