Il file Functions.php viene mai chiamato durante una chiamata AJAX? Debug AJAX


23

Cercando di capire un problema che sta riscontrando un collega programmatore. Mi chiedevo se il functions.phpfile viene chiamato affatto quando si esegue AJAX lato amministratore? So che quando fai una chiamata AJAX una parte di WP viene caricata per elaborare la chiamata e rispedire una risposta. Il functions.phpfile è incluso in questo?

Il motivo per cui lo sto chiedendo è perché sta usando la classe dal plugin Meta-Box` e la sta caricando come parte di un tema. C'è qualche AJAX in quella classe che restituisce solo risposte vuote e penso che sia perché il codice che gestisce la risposta non viene caricato. Esiste una documentazione su ciò che viene caricato quando WP gestisce AJAX?

Risposte:


28

admin-ajax.phpcarichi wp-load.php:

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

wp-load.phpcarichi wp-config.php, e non wp-settings.phpv'è caricato.

E qui troviamo questo:

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

Quindi, sì, il tema functions.phpè caricato.


C'è un'eccezione in wp-settings.php:

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

Se SHORTINITdefinito come TRUEprecedente, il tema non verrà caricato.

Quindi controlla se SHORTINITè TRUEper qualche motivo.


Un altro errore comune è l'uso errato di is_admin(). Questo è sempre TRUEpresente admin-ajax.php, quindi non riuscirà:

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

Debug di AJAX

Un metodo tanto efficace quanto primitivo è l'utilizzo dell'intestazione HTTP per il debug di AJAX.

Ecco una semplice funzione di supporto:

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

E questo plugin mostra come usarlo:

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

Aggiungerà un pulsante al front-end che attiva una richiesta AJAX quando si fa clic. Apri la console di rete del tuo browser e osserva le intestazioni di risposta per la richiesta:

inserisci qui la descrizione dell'immagine


Più dettagliato che mai, @toscho. È particolarmente difficile eseguire il debug quando il codice viene eseguito correttamente da parte tua ma non per qualcun altro. Non riesco a riprodurre il problema, ma la tua risposta probabilmente mi manderà nella giusta direzione.
Manny Fleurmond,

@MannyFleurmond Ho aggiunto un plug-in di supporto per il debug. Ciò dovrebbe aiutare a trovare il problema.
fuxia

9
Amico, sei accurato :)
Manny Fleurmond,

TEMPLATEPATH? ;)
kaiser,

1

Presumo che il tuo problema fosse che AJAX funzionava se hai effettuato l'accesso e non funzionava nello stato disconnesso, giusto?
Esiste una funzione in WordPress per accedere ai file basati su AJAX per utenti non registrati: wp_ajax_noprivad esempio

/* 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');
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.