ไฟล์ 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 มันยากที่จะดีบั๊กเมื่อโค้ดทำงานได้ดีที่ส่วนท้ายของคุณ แต่ไม่ใช่สำหรับคนอื่น ดูเหมือนจะไม่สามารถทำซ้ำปัญหา แต่คำตอบของคุณอาจส่งฉันไปในทิศทางที่ถูกต้อง
Manny Fleurmond

@MannyFleurmond ฉันได้เพิ่มปลั๊กอินตัวช่วยแก้จุดบกพร่อง ที่จะช่วยในการค้นหาปัญหา
fuxia

9
ชายคุณเป็นอย่างละเอียด :)
แมนนี่ Fleurmond

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');
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.