Functions.php dosyası bir AJAX araması sırasında hiç çağrılıyor mu? AJAX hata ayıklama


23

Diğer bir programcının sahip olduğu bir sorunu çözmeye çalışmak. Eğer functions.phpyönetici tarafı AJAX yaptığınızda dosya hiç çağrılıp çağrılmayacağını merak ediyordum ? Bir AJAX araması yaptığınızda, WP'nin bir kısmının çağrıyı işlemek ve bir yanıt geri göndermek için yüklendiğini biliyorum. Mı functions.phpo dahil dosya?

Sormamın nedeni sınıfı Meta-Box eklentisinden kullanıyor ve bunun yerine temanın bir parçası olarak yüklüyor. Bu sınıfta sadece boş cevaplar veren bazı AJAX var ve bence bunun cevabı ele alan kod yüklenmiyor. WP AJAX ile ilgilendiğinde ne yüklendiğine dair herhangi bir belge var mı?

Yanıtlar:


28

admin-ajax.phpyükler wp-load.php:

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

wp-load.phpyükler wp-config.phpve wp-settings.phpyüklü.

Ve burada şunu buluyoruz:

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

Yani, evet, tema functions.phpyüklü.


Bir istisna var wp-settings.php:

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

Daha önce SHORTINITtanımlandığı zaman , TRUEtema yüklenmeyecek.

Öyleyse kontrol SHORTINIT olduğunu TRUEnedense.


Başka bir yaygın hata ise yanlış kullanımdır is_admin(). Bu her zaman olduğu TRUEiçinde admin-ajax.phpşu başarısız olur, böylece:

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

Hata ayıklama AJAX

Verimli olan ilkel yöntemlerden biri, AJAX'in hatalarını ayıklamak için HTTP üstbilgisini kullanmaktır.

İşte basit bir yardımcı fonksiyon:

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

Ve bu eklenti nasıl kullanılacağını gösterir:

<?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 ucuna, tıklandığında bir AJAX isteğini tetikleyen bir düğme eklenir. Tarayıcınızın ağ konsolunu açın ve isteğin yanıt başlıklarına bakın:

görüntü tanımını buraya girin


Her zaman olduğu gibi detaylı, @toscho. Kodun ucunda bir sorun çıkarsa hata ayıklaması özellikle zor ama başkası için değil. Sorunu yeniden oluşturacak gibi görünmüyorsunuz ama cevabınız muhtemelen beni doğru yöne yollayacaktır.
Manny Fleurmond

@ MannyFleurmond Bir hata ayıklama yardımcı eklenti ekledik. Bu sorunu bulmaya yardımcı olmalı.
fuxia

9
Dostum, çok
iyisin

TEMPLATEPATH? ;)
kaiser

1

Sanırım, giriş yaptıysanız ve giriş yapmış durumda değilse, AJAX çalışıyordu, değil mi?
WordPress'te oturum açmamış kullanıcılar için AJAX tabanlı dosyalara erişen bir işlev var: wp_ajax_noprivörneğin

/* 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');
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.