Le fichier functions.php est-il appelé au cours d'un appel AJAX? Débogage AJAX

22

Essayer de résoudre un problème rencontré par un collègue programmeur. Je me demandais si le fichier functions.php était appelé du tout lorsque vous exécutiez AJAX côté administrateur? 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 fichier functions.php est-il inclus dans cela?

La raison pour laquelle je pose la question est parce qu'il utilise la classe du plug-in Meta-Box et la charge en tant que thème. Il y a des AJAX dans cette classe qui ne renvoient 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?

    
posée Manny Fleurmond 20.04.2013 - 14:56

2 réponses

27

admin-ajax.php charge wp-load.php :

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

wp-load.php charge wp-config.php , et wp-settings.php est chargé.

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

Alors, oui, le functions.php du thème est 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 SHORTINIT est défini comme TRUE plus tôt, le thème ne sera pas chargé.

Vérifiez donc si SHORTINIT est TRUE pour une raison quelconque.

Une autre erreur courante est la mauvaise utilisation de is_admin() . Il s'agit toujours de TRUE dans admin-ajax.php . Par conséquent, les éléments suivants échoueront:

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

Débogage AJAX

Une méthode aussi primitive et efficace consiste à utiliser un 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
}

Cela ajoutera un bouton à l'interface frontale qui déclenchera une demande AJAX lorsque l'utilisateur cliquera dessus. Ouvrez la console réseau de votre navigateur et consultez les en-têtes de réponse de la requête:

    
réponse donnée fuxia 20.04.2013 - 15:00
1

Je suppose que votre problème était que AJAX fonctionnait si vous êtes connecté et qu'il ne fonctionnait pas lorsque vous êtes déconnecté, n'est-ce pas?
Il existe une fonction dans WordPress permettant d’accéder aux fichiers AJAX pour les utilisateurs non connectés: wp_ajax_nopriv , par 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');
    
réponse donnée Ishak Ali 20.05.2013 - 14:14

Lire d'autres questions sur les étiquettes