Wird die Datei functions.php jemals während eines AJAX-Aufrufs aufgerufen? Debuggen Sie AJAX

23

Der Versuch, ein Problem herauszufinden, das ein Programmierkollege hat. Ich habe mich gefragt, ob die functions.phpDatei überhaupt aufgerufen wird, wenn Sie AJAX auf der Admin-Seite ausführen. Ich weiß, dass bei einem AJAX-Aufruf ein Teil von WP geladen wird, um den Anruf zu verarbeiten und eine Antwort zurückzusenden. Ist die functions.phpDatei darin enthalten?

Ich frage ihn, weil er die Klasse aus dem Meta-Box-Plugin verwendet und sie stattdessen als Teil eines Themas lädt. Es gibt einige AJAX in dieser Klasse, die nur leere Antworten zurückgeben, und ich denke, es liegt daran, dass der Code, der die Antwort verarbeitet, nicht geladen wird. Gibt es eine Dokumentation zu dem, was geladen wird, wenn WP AJAX handhabt?

Manny Fleurmond
quelle

Antworten:

28

admin-ajax.phpBelastungen wp-load.php:

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

wp-load.php Ladungen wp-config.php , und es wp-settings.phpwird geladen.

Und hier finden wir das:

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

Also ja, das Thema functions.php ist geladen.


Es gibt eine Ausnahme in wp-settings.php:

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

Wann SHORTINIT wie TRUEzuvor definiert , wird das Thema nicht geladen.

Überprüfen Sie also, ob dies der Fall SHORTINITistTRUE aus irgendeinem Grund der .


Ein weiterer häufiger Fehler ist die falsche Verwendung von is_admin(). Dies ist immer TRUEin admin-ajax.php, so dass Folgendes fehlschlägt:

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

Debuggen von AJAX

Eine ebenso einfache wie effiziente Methode ist die Verwendung des HTTP-Headers zum Debuggen von AJAX.

Hier ist eine einfache Hilfsfunktion:

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

Und dieses Plugin zeigt, wie man es benutzt:

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

Dem Frontend wird eine Schaltfläche hinzugefügt, die beim Klicken eine AJAX-Anforderung auslöst. Öffnen Sie die Netzwerkkonsole Ihres Browsers und überprüfen Sie die Antwortheader für die Anforderung:

Bildbeschreibung hier eingeben

fuxia
quelle
So detailliert wie immer, @toscho. Es ist besonders schwer zu debuggen, wenn der Code auf Ihrer Seite gut läuft, aber nicht für jemand anderen. Ich kann das Problem scheinbar nicht reproduzieren, aber Ihre Antwort wird mich wahrscheinlich in die richtige Richtung schicken.
Manny Fleurmond
@MannyFleurmond Ich habe ein Debug-Helfer-Plugin hinzugefügt. Das sollte helfen, das Problem zu finden.
Fuxia
9
Mann, Sie sind gründlich :)
Manny Fleurmond
TEMPLATEPATH? ;)
Kaiser
1

Ich gehe davon aus, dass Ihr Problem darin bestand, dass AJAX funktioniert hat, wenn Sie angemeldet sind und es im Status "Abgemeldet" nicht funktioniert hat, oder?
In WordPress gibt es eine Funktion, um auf AJAX-basierte Dateien für nicht angemeldete Benutzer zuzugreifen: wp_ajax_noprivzum Beispiel

/* 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');
Ishak Ali
quelle