最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

theme development - Does the functions.php file ever get called during an AJAX call? Debug AJAX

programmeradmin0浏览0评论

Trying to figure out an issue a fellow programmer is having. I was wondering if the functions.php file get called at all when you do admin side AJAX? I know that when you do an AJAX call a part of WP gets loaded up to process the call and send back a response. Is the functions.php file included in that?

The reason I'm asking is because he's using the class from the Meta-Box` plugin and loading it as part of a theme instead. There is some AJAX in that class that only returns empty responses and I think its because the code that handles the response doesn't get loaded. Is there any documentation to what gets loaded when WP handles AJAX?

Trying to figure out an issue a fellow programmer is having. I was wondering if the functions.php file get called at all when you do admin side AJAX? I know that when you do an AJAX call a part of WP gets loaded up to process the call and send back a response. Is the functions.php file included in that?

The reason I'm asking is because he's using the class from the Meta-Box` plugin and loading it as part of a theme instead. There is some AJAX in that class that only returns empty responses and I think its because the code that handles the response doesn't get loaded. Is there any documentation to what gets loaded when WP handles AJAX?

Share Improve this question edited Apr 25, 2013 at 9:39 fuxia 107k38 gold badges255 silver badges459 bronze badges asked Apr 20, 2013 at 12:56 Manny FleurmondManny Fleurmond 7,4344 gold badges42 silver badges55 bronze badges
Add a comment  | 

2 Answers 2

Reset to default 30

admin-ajax.php loads wp-load.php:

/** Load WordPress Bootstrap */
require_once( dirname( dirname( __FILE__ ) ) . '/wp-load.php' );

wp-load.php loads wp-config.php, and there wp-settings.php is loaded.

And here we find this:

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

So, yes, the theme’s functions.php is loaded.


There is one exception in wp-settings.php:

// Stop most of WordPress from being loaded if we just want the basics.
if ( SHORTINIT )
    return false;

When SHORTINIT is defined as TRUE earlier, the theme will not be loaded.

So check if SHORTINIT is TRUE for some reason.


Another common error is the wrong usage of is_admin(). This is always TRUE in admin-ajax.php, so the following will fail:

if ( ! is_admin() )
    // register or execute AJAX stuff

Debugging AJAX

One method as primitive as efficient is using HTTP header to debug AJAX.

Here is a simple helper function:

function send_debug_header( $msg )
{
    static $counter = 1;
    header( "X-Debug-Ajax-$counter: $msg" );
    $counter += 1;
}

And this plugin shows how to use it:

<?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
}

It will add a button to the front end that triggers an AJAX request when clicked. The open your browser’s network console and look at the response headers for the request:

I assume your problem AJAX was working if your are logged in and it was not working in logged out status, right?
There is a function in WordPress to access AJAX-based files for non logged users: wp_ajax_nopriv, for example

/* 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');
发布评论

评论列表(0)

  1. 暂无评论