问题描述
试图找出一个程序员的问题。我想知道当您执行管理员端 AJAX 时 functions.php
文件是否被调用?我知道,当你做一个 AJAX 调用时,WP 的一部分被加载来处理该呼叫并发回一个响应。那是 functions.php
档案吗?
我问的原因是因为他正在使用 Meta-Box 插件的类,而是加载它作为主题的一部分。该类中有一些 AJAX 只返回空的响应,我认为它是因为处理响应的代码不会被加载。当 WP 处理 AJAX 时,是否有任何文档加载?
最佳解决方案
admin-ajax.php
加载 wp-load.php
:
/** Load WordPress Bootstrap */
require_once( dirname( dirname( __FILE__ ) ) . '/wp-load.php' );
wp-load.php
加载 wp-config.php
,并加载 wp-settings.php
。
在这里我们发现:
// 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' );
}
所以,是的,主题的 functions.php
被加载。
wp-settings.php
有一个例外:
// Stop most of WordPress from being loaded if we just want the basics.
if ( SHORTINIT )
return false;
当 SHORTINIT
更早被定义为 TRUE
时,主题将不会被加载。
因此,由于某些原因检查 SHORTINIT
是否为 TRUE
。
另一个常见的错误是 is_admin()
的错误使用。这是 admin-ajax.php
中的 TRUE
,所以以下将失败:
if ( ! is_admin() )
// register or execute AJAX stuff
调试 AJAX
使用 HTTP 头来调试 AJAX 的一种方法是最原始的。
这是一个简单的帮助函数:
function send_debug_header( $msg )
{
static $counter = 1;
header( "X-Debug-Ajax-$counter: $msg" );
$counter += 1;
}
这个插件显示如何使用它:
<?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
}
它将在前端添加一个按钮,在单击时触发 AJAX 请求。打开浏览器的网络控制台并查看请求的响应标头:
参考文献
注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。