Будет ли когда-либо вызываться файл functions.php во время вызова AJAX? Отладка AJAX

23

Попытка выяснить проблему, которую имеет коллега-программист. Мне было интересно, если functions.phpфайл вызывается вообще, когда вы делаете AJAX на стороне администратора? Я знаю, что когда вы делаете AJAX-вызов, часть WP загружается для обработки вызова и отправки ответа. Является ли functions.phpфайл в этом?

Я спрашиваю, потому что он использует класс из плагина Meta-Box` и загружает его как часть темы. В этом классе есть некоторый AJAX, который возвращает только пустые ответы, и я думаю, что это потому, что код, который обрабатывает ответ, не загружается. Есть ли документация о том, что загружается, когда WP обрабатывает AJAX?

Мэнни Флермонд
источник

Ответы:

28

admin-ajax.phpнагрузки wp-load.php:

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

wp-load.phpзагружается wp-config.php, а там wp-settings.phpзагружается.

И вот мы находим это:

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

Так что да, тема functions.phpзагружена.


Есть одно исключение в wp-settings.php:

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

Когда SHORTINITопределено как TRUEранее, тема не будет загружена.

Поэтому проверить , если SHORTINITэто TRUEпо какой - то причине.


Другая распространенная ошибка - неправильное использование is_admin(). Это всегда TRUEв admin-ajax.php, так что следующее потерпит неудачу:

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

Отладка AJAX

Один из самых простых и эффективных методов - использовать HTTP-заголовок для отладки AJAX.

Вот простая вспомогательная функция:

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

И этот плагин показывает, как его использовать:

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

Он добавит кнопку во внешний интерфейс, которая при нажатии вызывает AJAX-запрос. Откройте сетевую консоль вашего браузера и посмотрите заголовки ответа на запрос:

введите описание изображения здесь

Фуксия
источник
Как всегда подробно, @toscho. Особенно трудно отлаживать, когда код работает нормально с вашей стороны, но не для кого-то еще. Не могу воспроизвести проблему, но ваш ответ, вероятно, отправит меня в правильном направлении.
Мэнни Флермонд
@MannyFleurmond Я добавил плагин помощника отладки. Это должно помочь найти проблему.
fuxia
9
Человек, ты тщательно :)
Мэнни Флермонд
TEMPLATEPATH? ;)
Кайзер
1

Я предполагаю, что ваша проблема была в том, что AJAX работал, если вы вошли в систему и не работали в состоянии выхода из системы, верно?
В WordPress есть функция для доступа к файлам на основе AJAX для не зарегистрированных пользователей: wp_ajax_noprivнапример,

/* 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');
Ишак Али
источник