Tập tin tests.php có bao giờ được gọi trong khi gọi AJAX không? Gỡ lỗi AJAX


23

Cố gắng tìm ra một vấn đề mà một lập trình viên đồng nghiệp đang gặp phải. Tôi đã tự hỏi nếu functions.phptập tin được gọi ở tất cả khi bạn làm quản trị viên AJAX? Tôi biết rằng khi bạn thực hiện cuộc gọi AJAX, một phần của WP sẽ được tải lên để xử lý cuộc gọi và gửi lại phản hồi. Là functions.phptập tin bao gồm trong đó?

Lý do tôi hỏi là vì anh ấy đang sử dụng lớp từ plugin Meta-Box` và tải nó như một phần của chủ đề thay thế. Có một số AJAX trong lớp đó chỉ trả về các phản hồi trống và tôi nghĩ đó là vì mã xử lý phản hồi không được tải. Có tài liệu nào cho những gì được tải khi WP xử lý AJAX không?

Câu trả lời:


28

admin-ajax.phptải wp-load.php:

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

wp-load.phptải wp-config.php, và có wp-settings.phptải.

Và ở đây chúng tôi tìm thấy điều này:

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

Vì vậy, có, chủ đề functions.phpđược tải.


Có một ngoại lệ trong wp-settings.php:

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

Khi SHORTINITđược xác định là TRUEsớm hơn, chủ đề sẽ không được tải.

Vì vậy, kiểm tra nếu SHORTINITTRUEvì một số lý do.


Một lỗi phổ biến khác là sử dụng sai is_admin(). Điều này luôn TRUEở trong admin-ajax.php, vì vậy những điều sau đây sẽ thất bại:

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

Gỡ lỗi AJAX

Một phương pháp nguyên thủy là hiệu quả là sử dụng tiêu đề HTTP để gỡ lỗi AJAX.

Đây là một chức năng trợ giúp đơn giản:

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

Và plugin này cho thấy cách sử dụng nó:

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

Nó sẽ thêm một nút vào giao diện người dùng để kích hoạt yêu cầu AJAX khi được nhấp. Mở bảng điều khiển mạng của trình duyệt của bạn và xem các tiêu đề phản hồi cho yêu cầu:

nhập mô tả hình ảnh ở đây


Càng chi tiết hơn bao giờ hết, @toscho. Nó đặc biệt khó gỡ lỗi khi mã chạy tốt về phía bạn nhưng không dành cho người khác. Dường như không thể tái tạo vấn đề nhưng câu trả lời của bạn có thể sẽ gửi cho tôi đúng hướng.
Manny Fleurmond

@MannyFleurmond Tôi đã thêm một plugin trợ giúp gỡ lỗi. Điều đó sẽ giúp tìm ra vấn đề.
fuxia

9
Man, bạn thật kỹ :)
Manny Fleurmond

TEMPLATEPATH? ;)
kaiser

1

Tôi cho rằng vấn đề của bạn là AJAX đã hoạt động nếu bạn đăng nhập và nó không hoạt động trong trạng thái đăng xuất, phải không?
Có một chức năng trong WordPress để truy cập các tệp dựa trên AJAX cho người dùng không đăng nhập: wp_ajax_noprivví dụ:

/* 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');
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.