it-swarm.com.de

Wird die Datei functions.php jemals während eines AJAX Anruf? Debuggen AJAX

Der Versuch, ein Problem herauszufinden, das ein Programmierkollege hat. Ich habe mich gefragt, ob die functions.php-Datei überhaupt aufgerufen wird, wenn Sie AJAX für Administratoren 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.php Datei 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, das liegt daran, dass der Code, der die Antwort verarbeitet, nicht geladen wird. Gibt es eine Dokumentation zu dem, was geladen wird, wenn WP AJAX verarbeitet?

23
Manny Fleurmond

admin-ajax.php lädt wp-load.php:

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

wp-load.php lädt wp-config.php und dort wird wp-settings.php 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' );
}

Ja, der functions.php des Themas wird geladen.


In wp-settings.php gibt es eine Ausnahme:

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

Wenn SHORTINIT zuvor als TRUE definiert wurde, wird das Design nicht geladen.

Überprüfen Sie daher, ob SHORTINIT aus irgendeinem Grund TRUE ist.


Ein weiterer häufiger Fehler ist die falsche Verwendung von is_admin(). Dies ist in admin-ajax.php immer TRUE, daher schlägt Folgendes fehl:

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
}

Es wird eine Schaltfläche am Front-End 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:

 enter image description here 

28
fuxia

Ich nehme an, Ihr Problem war, dass AJAX funktioniert hat, wenn Sie angemeldet sind und es im Status "Abgemeldet" nicht funktioniert hat, oder?
In WordPress gibt es eine Funktion für den Zugriff auf AJAX-basierte Dateien für nicht angemeldete Benutzer: wp_ajax_nopriv, zum 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');
1
Ishak Ali