Czy plik funkcji.php jest kiedykolwiek wywoływany podczas wywołania AJAX? Debuguj AJAX

23

Próbuję rozwiązać problem, który ma inny programista. Zastanawiałem się, czy functions.phpplik zostanie w ogóle wywołany, gdy administrujesz AJAX? Wiem, że kiedy wykonujesz połączenie AJAX, część WP jest ładowana w celu przetworzenia połączenia i odesłania odpowiedzi. Czy functions.phpplik jest w to włączony?

Pytam dlatego, że korzysta z klasy z wtyczki Meta-Box i ładuje ją jako część motywu. W tej klasie jest AJAX, który zwraca tylko puste odpowiedzi i myślę, że to dlatego, że kod, który obsługuje odpowiedź, nie jest ładowany. Czy istnieje dokumentacja dotycząca tego, co jest ładowane, gdy WP obsługuje AJAX?

Manny Fleurmond
źródło

Odpowiedzi:

28

admin-ajax.phpobciążenia wp-load.php:

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

wp-load.phpładuje wp-config.phpi wp-settings.phpjest ładowany.

I tutaj znajdujemy to:

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

Tak, motyw functions.phpjest załadowany.


Jest jeden wyjątek w wp-settings.php:

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

Gdy SHORTINITzostanie zdefiniowany jak TRUEwcześniej, motyw nie zostanie załadowany.

Więc sprawdzić, czy SHORTINITto TRUEz jakiegoś powodu.


Innym częstym błędem jest nieprawidłowe użycie is_admin(). To jest zawsze TRUEw admin-ajax.php, więc dodaje się niepowodzeniem:

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

Debugowanie AJAX

Jedną z metod tak prymitywnych, jak wydajnych jest użycie nagłówka HTTP do debugowania AJAX.

Oto prosta funkcja pomocnika:

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

A ta wtyczka pokazuje, jak z niej korzystać:

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

Dodaje przycisk do interfejsu, który uruchamia żądanie AJAX po kliknięciu. Otwórz konsolę sieciową przeglądarki i spójrz na nagłówki odpowiedzi na żądanie:

wprowadź opis zdjęcia tutaj

fuxia
źródło
Jak najbardziej szczegółowy @toscho. Jest to szczególnie trudne do debugowania, gdy kod działa poprawnie na twoim końcu, ale nie dla kogoś innego. Nie mogę odtworzyć problemu, ale Twoja odpowiedź prawdopodobnie skieruje mnie we właściwym kierunku.
Manny Fleurmond
@MannyFleurmond Dodałem wtyczkę pomocnika debugowania. To powinno pomóc w znalezieniu problemu.
fuxia
9
Człowieku, jesteś dokładny :)
Manny Fleurmond
TEMPLATEPATH? ;)
kaiser
1

Zakładam, że masz problem, że AJAX działał, jeśli jesteś zalogowany i nie działał w stanie wylogowania, prawda?
W WordPress jest funkcja dostępu do plików opartych na AJAX dla niezalogowanych użytkowników: wp_ajax_noprivna przykład

/* 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
źródło