AJAX调用期间是否曾经调用过functions.php文件?调试AJAX


23

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

我问的原因是因为他正在使用Meta-Box`插件中的类,并将其加载为主题的一部分。该类中有一些AJAX仅返回空响应,我认为是因为处理响应的代码未加载。WP处理AJAX时加载的内容是否有任何文档?

Answers:


28

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

在此处输入图片说明


与以往一样详细,@ toscho。当代码在您的端上运行正常但对于其他人而言运行不佳时,尤其难以调试。似乎无法重现问题,但您的回答可能会向我指示正确的方向。
Manny Fleurmond

@MannyFleurmond我添加了一个调试助手插件。那应该有助于发现问题。
fuxia

9
伙计,你是彻底的:)
Manny Fleurmond

TEMPLATEPATH?;)
kaiser

1

我假设您的问题是,如果您已登录而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');
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.