¿Se llama alguna vez al archivo functions.php durante una llamada AJAX? Depurar AJAX

22

Intentando resolver un problema que está teniendo otro programador. Me preguntaba si se llamará al archivo functions.php cuando haga AJAX del lado del administrador. Sé que cuando haces una llamada AJAX, una parte de WP se carga para procesar la llamada y enviar una respuesta. ¿El archivo functions.php está incluido en eso?

La razón por la que pregunto es porque está usando la clase del complemento Meta-Box y, en su lugar, la está cargando como parte de un tema. Hay algunos AJAX en esa clase que solo devuelven respuestas vacías y creo que es porque el código que maneja la respuesta no se carga. ¿Existe alguna documentación de lo que se carga cuando WP maneja AJAX?

    
pregunta Manny Fleurmond 20.04.2013 - 14:56

2 respuestas

27

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

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

wp-load.php carga wp-config.php , y se carga wp-settings.php .

Y aquí encontramos esto:

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

Entonces, sí, se carga el functions.php del tema.

Hay una excepción en wp-settings.php :

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

Cuando SHORTINIT se define como TRUE anteriormente, el tema no se cargará.

Entonces, comprueba si SHORTINIT es TRUE por alguna razón.

Otro error común es el uso incorrecto de is_admin() . Esto siempre es TRUE en admin-ajax.php , por lo que fallará lo siguiente:

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

Depurando AJAX

Un método tan primitivo como eficiente es usar el encabezado HTTP para depurar AJAX.

Aquí hay una función de ayuda simple:

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

Y este complemento muestra cómo 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
}

Agregará un botón en la parte frontal que activa una solicitud AJAX cuando se hace clic. Abra la consola de red de su navegador y mire los encabezados de respuesta para la solicitud:

    
respondido por el fuxia 20.04.2013 - 15:00
1

Supongo que su problema era que AJAX estaba funcionando si estaba conectado y no estaba funcionando con el estado de cierre de sesión, ¿verdad?
Hay una función en WordPress para acceder a los archivos basados en AJAX para usuarios no registrados: wp_ajax_nopriv , por ejemplo

/* 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');
    
respondido por el Ishak Ali 20.05.2013 - 14:14

Lea otras preguntas en las etiquetas