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

23

Intentando resolver un problema que tiene un compañero programador. Me preguntaba si el functions.phparchivo recibe alguna llamada cuando haces 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 functions.phparchivo está incluido en eso?

La razón por la que pregunto es porque está usando la clase del complemento Meta-Box` y la carga 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. ¿Hay alguna documentación sobre lo que se carga cuando WP maneja AJAX?

Manny Fleurmond
fuente

Respuestas:

28

admin-ajax.phpcargas wp-load.php:

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

wp-load.phpcargas wp-config.php, y hay wp-settings.phpcargado.

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í, el tema functions.phpestá cargado.


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 SHORTINITse define como TRUEanteriormente, el tema no se cargará.

Entonces verifique si SHORTINITes TRUEpor alguna razón.


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

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

Depuración de AJAX

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

Aquí hay una función auxiliar 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 al front-end 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:

ingrese la descripción de la imagen aquí

fuxia
fuente
Tan detallado como siempre, @toscho. Es especialmente difícil de depurar cuando el código funciona bien en su extremo, pero no para otra persona. Parece que no puedo reproducir el problema, pero su respuesta probablemente me enviará en la dirección correcta.
Manny Fleurmond el
@MannyFleurmond He agregado un complemento auxiliar de depuración. Eso debería ayudar a encontrar el problema.
fuxia
99
Hombre, eres minucioso :)
Manny Fleurmond
TEMPLATEPATH? ;)
kaiser
1

Supongo que su problema era que AJAX funcionaba si estaba conectado y no funcionaba en estado desconectado, ¿verdad?
Hay una función en WordPress para acceder a archivos basados ​​en AJAX para usuarios no registrados: wp_ajax_noprivpor 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');
Ishak Ali
fuente