Apakah file functions.php pernah dipanggil selama panggilan AJAX? Debug AJAX


23

Mencoba menemukan masalah yang dialami sesama programmer. Saya bertanya-tanya apakah functions.phpfile dipanggil sama sekali ketika Anda melakukan sisi admin AJAX? Saya tahu bahwa ketika Anda melakukan panggilan AJAX, bagian dari WP dimuat untuk memproses panggilan dan mengirim kembali respons. Apakah functions.phpfile tersebut termasuk di dalamnya?

Alasan saya bertanya adalah karena dia menggunakan kelas dari plugin Meta-Box` dan memuatnya sebagai bagian dari tema. Ada beberapa AJAX di kelas itu yang hanya mengembalikan respons kosong dan saya pikir itu karena kode yang menangani respons tidak dimuat. Apakah ada dokumentasi untuk apa yang dimuat ketika WP menangani AJAX?

Jawaban:


28

admin-ajax.phpbanyak wp-load.php:

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

wp-load.phpbanyak wp-config.php, dan ada wp-settings.phpdimuat.

Dan di sini kita temukan ini:

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

Jadi, ya, temanya functions.phpdimuat.


Ada satu pengecualian di wp-settings.php:

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

Ketika SHORTINITdidefinisikan sebagai TRUEsebelumnya, tema tidak akan dimuat.

Jadi memeriksa apakah SHORTINITini TRUEuntuk beberapa alasan.


Kesalahan umum lainnya adalah penggunaan yang salah dari is_admin(). Ini selalu TRUEdi admin-ajax.php, sehingga berikut ini akan gagal:

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

Debugging AJAX

Salah satu metode primitif dan efisien adalah menggunakan header HTTP untuk men-debug AJAX.

Berikut adalah fungsi pembantu sederhana:

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

Dan plugin ini menunjukkan cara menggunakannya:

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

Ini akan menambahkan tombol ke ujung depan yang memicu permintaan AJAX ketika diklik. Buka konsol jaringan browser Anda dan lihat header respons untuk permintaan:

masukkan deskripsi gambar di sini


Sedetail sebelumnya, @toscho. Terutama sulit untuk debug ketika kode berjalan dengan baik di pihak Anda tetapi tidak untuk orang lain. Tampaknya tidak dapat mereproduksi masalah tetapi jawaban Anda mungkin akan mengirim saya ke arah yang benar.
Manny Fleurmond

@MannyFleurmond Saya telah menambahkan plugin pembantu debug. Itu akan membantu menemukan masalah.
fuxia

9
Man, kau teliti :)
Manny Fleurmond

TEMPLATEPATH? ;)
kaiser

1

Saya berasumsi bahwa masalah Anda adalah AJAX berfungsi jika Anda masuk dan tidak bekerja dalam status keluar, kan?
Ada fungsi di WordPress untuk mengakses file berbasis AJAX untuk pengguna yang tidak login:, wp_ajax_noprivmisalnya

/* 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');
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.