AJAX 호출 중에 functions.php 파일이 호출됩니까? AJAX 디버그


23

동료 프로그래머가 겪고있는 문제를 파악하려고합니다. functions.php관리자 측 AJAX를 할 때 파일이 전혀 호출 되지 않는지 궁금합니다 . AJAX 호출을 수행하면 WP의 일부가로드되어 호출을 처리하고 응답을 다시 보냅니다. 는 IS functions.php그에 포함 된 파일은?

내가 묻는 이유는 그가 Meta-Box 플러그인의 클래스를 사용하고 대신 테마의 일부로로드하기 때문입니다. 해당 클래스에는 빈 응답 만 반환하는 AJAX가 있으며 응답을 처리하는 코드가로드되지 않기 때문에 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(). 이것은 항상 TRUEadmin-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만큼이나 상세합니다. 코드가 끝에서 잘 실행될 때 디버깅하기가 어렵지만 다른 사람에게는 적합하지 않습니다. 문제를 재현 할 수 없지만 대답이 올바른 방향으로 보내질 것입니다.
매니 Fleurmond

@MannyFleurmond 디버그 도우미 플러그인을 추가했습니다. 문제를 찾는 데 도움이됩니다.
fuxia

9
Man, 당신은 철저합니다 :)
Manny Fleurmond

TEMPLATEPATH? ;)
kaiser

1

로그인 한 상태에서 로그 아웃 상태로 작동하지 않으면 AJAX가 작동하고 있다고 가정합니다.
비 로그인 한 사용자의 액세스 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');
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.