Le fichier functions.php est-il jamais appelé lors d'un appel AJAX? Déboguer AJAX

23

Essayer de comprendre un problème rencontré par un collègue programmeur. Je me demandais si le functions.phpfichier était appelé du tout quand vous faites du côté administrateur AJAX? Je sais que lorsque vous effectuez un appel AJAX, une partie de WP est chargée pour traiter l'appel et renvoyer une réponse. Le functions.phpfichier est-il inclus dans cela?

La raison pour laquelle je demande, c'est parce qu'il utilise la classe du plugin Meta-Box et le charge à la place dans un thème. Il y a de l'AJAX dans cette classe qui ne renvoie que des réponses vides et je pense que c'est parce que le code qui gère la réponse n'est pas chargé. Existe-t-il une documentation sur ce qui est chargé lorsque WP gère AJAX?

Manny Fleurmond
la source

Réponses:

28

admin-ajax.phpcharges wp-load.php:

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

wp-load.phpcharges wp-config.php, et il wp-settings.phpest chargé.

Et ici, nous trouvons ceci:

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

Donc, oui, le thème functions.phpest chargé.


Il existe une exception dans wp-settings.php:

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

Lorsque SHORTINITest défini comme TRUEprécédemment, le thème ne sera pas chargé.

Vérifiez donc si SHORTINITc'est TRUEpour une raison quelconque.


Une autre erreur courante est la mauvaise utilisation de is_admin(). Ceci est toujours TRUEen admin-ajax.php, donc ce qui suit échouera:

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

Débogage AJAX

Une méthode aussi primitive qu'efficace utilise l'en-tête HTTP pour déboguer AJAX.

Voici une fonction d'assistance simple:

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

Et ce plugin montre comment l'utiliser:

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

Il ajoutera un bouton à la partie frontale qui déclenche une demande AJAX lorsque vous cliquez dessus. Ouvrez la console réseau de votre navigateur et regardez les en-têtes de réponse pour la demande:

entrez la description de l'image ici

fuxia
la source
Toujours aussi détaillé, @toscho. C'est particulièrement difficile à déboguer lorsque le code fonctionne bien de votre côté, mais pas pour quelqu'un d'autre. Je n'arrive pas à reproduire le problème mais votre réponse m'enverra probablement dans la bonne direction.
Manny Fleurmond
@MannyFleurmond J'ai ajouté un plugin d'aide au débogage. Cela devrait aider à trouver le problème.
fuxia
9
Mec, tu es minutieux :)
Manny Fleurmond
TEMPLATEPATH? ;)
kaiser
1

Je suppose que votre problème était AJAX fonctionnait si vous êtes connecté et qu'il ne fonctionnait pas en état déconnecté, non?
Il existe une fonction dans WordPress pour accéder aux fichiers basés sur AJAX pour les utilisateurs non connectés: wp_ajax_noprivpar exemple

/* 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
la source