क्या AJAX कॉल के दौरान फ़ंक्शन.php फ़ाइल को कभी भी कॉल किया जाता है? डिबग AJAX


23

एक साथी प्रोग्रामर एक समस्या का पता लगाने की कोशिश कर रहा है। मैं सोच रहा था कि functions.phpजब आप AJAX की ओर से फाइल करते हैं तो फाइल बिल्कुल ही कॉल हो जाती है? मुझे पता है कि जब आप एक AJAX कॉल करते हैं तो WP का एक हिस्सा कॉल को संसाधित करने और प्रतिक्रिया भेजने के लिए लोड हो जाता है। क्या functions.phpउसमें फ़ाइल शामिल है?

कारण मैं पूछ रहा हूँ क्योंकि वह मेटा-बॉक्स `प्लगइन से वर्ग का उपयोग कर रहा है और इसे एक विषय के भाग के रूप में लोड कर रहा है। उस वर्ग में कुछ 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 डिबगिंग

AJAX को डिबग करने के लिए HTTP हेडर का उपयोग कुशल के रूप में एक विधि।

यहाँ एक सरल सहायक कार्य है:

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। यह विशेष रूप से कठिन डिबग करने के लिए जब कोड आपके अंत में ठीक चलता है, लेकिन किसी और के लिए नहीं। समस्या को पुन: उत्पन्न करने के लिए प्रतीत नहीं कर सकते, लेकिन आपका जवाब शायद मुझे सही दिशा में भेज देगा।
मैन्नी फ्लेममंड

@MannyFleurmond मैंने एक डीबग सहायक प्लग इन जोड़ा है। उस समस्या को खोजने में मदद करनी चाहिए।
FUXIA

9
यार, तुम पूरी तरह से :)
मैन्नी फ्लेममंड

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');
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.