函数.php文件在AJAX调用期间会被调用吗?调试AJAX

时间:2013-04-20 作者:Manny Fleurmond

试图找出一个程序员同伴遇到的问题。我想知道functions.php 当您执行管理端AJAX时,是否会调用文件?我知道,当您进行AJAX调用时,会加载WP的一部分来处理调用并返回响应。是functions.php 包含在其中的文件?

我之所以这么问,是因为他使用了Meta Box插件中的类,并将其作为主题的一部分加载。该类中有一些AJAX只返回空响应,我认为这是因为处理响应的代码没有加载。WP处理AJAX时会加载什么,是否有任何文档?

2 个回复
最合适的回答,由SO网友:fuxia 整理而成

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 之前,将不会加载主题。

所以检查一下SHORTINITTRUE 出于某种原因。

另一个常见错误是is_admin(). 这总是TRUE 在里面admin-ajax.php, 因此,以下操作将失败:

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请求。打开浏览器的网络控制台,查看请求的响应标头:

enter image description here

SO网友:Ishak Ali

我假设您的问题是,如果您已登录,而它在注销状态下不工作,AJAX就正常工作了,对吗
WordPress中有一个功能,可以为未登录的用户访问基于AJAX的文件:wp_ajax_nopriv, 例如

/* 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\');

结束