व्यवस्थापक- ajax.php पर 400 ख़राब अनुरोध केवल wp_enqueue_scripts एक्शन हुक का उपयोग करके


16

मैं ajax पर हाल ही में काम कर रहा हूँ। नेट पर आपको जो ट्यूटोरियल मिलते हैं, वे सभी बहुत समान हैं और लागू करने में काफी आसान हैं। लेकिन मुझे हमेशा अपनी फ़ाइल पर 400 का खराब अनुरोध मिलता है ajax-admin.php

एक लंबी और गहन खोज के बाद, मुझे अब पता चला है कि एकीकरण के समय के कारण।

यदि मैं initस्क्रिप्ट को आरंभ करने के लिए एक्शन हुक का उपयोग करता हूं और wp_localize_script, सब कुछ ठीक काम करता है। तो कोड ही सही होना चाहिए।

मेरे पृष्ठ के परीक्षण-functions.php

function ajax_login_init(){
   wp_register_script('ajax-login-script',get_stylesheet_directory_uri().'/js/ajax-login-script.js',array('jquery'));
   wp_enqueue_script('ajax-login-script');
   wp_localize_script('ajax-login-script','ajax_login_object',array('ajaxurl' => admin_url('admin-ajax.php'),'redirecturl' => 'REDIRECT_URL_HERE','loadingmessage' => __('Sending user info, please wait...')));
   add_action('wp_ajax_nopriv_ajaxlogin','ajax_login');
}

if(!is_user_logged_in()){
   add_action('init','ajax_login_init');
}

function ajax_login(){
    //nonce-field is created on page
    check_ajax_referer('ajax-login-nonce','security');
    //CODE
    die();
}

लेकिन अगर मैं उदाहरण के लिए wp_enqeue_scriptsएक्शन हुक का उपयोग करता हूं तो मुझे हमेशा खराब अनुरोध मिलता है।

if(!is_user_logged_in()){
    add_action('wp_enqueue_scripts','ajax_login_init');
}

इसके साथ समस्या यह है:

मैं एक अतिरिक्त php फ़ाइल में कार्य करना चाहते हैं और उन्हें केवल तभी लोड करना होगा जब उन्हें किसी विशेष पृष्ठ पर आवश्यक हो। उदाहरण के लिए मुझे इसकी आवश्यकता है is_page()। लेकिन is_page()जल्द से जल्द काम करता है जब मैं समारोह को parse_queryएक्शन हुक में शामिल करता हूं :

functions.php

function sw18_page_specific_functions(){
    if(is_page('page-test')){
        include_once dirname(__FILE__).'/includes/my-page-test-functions.php';
    }
}

add_action('parse_query','sw18_page_specific_functions');

तो फिर फ़ाइल initमें हुक करने के लिए हुक किए गए कार्य my-page-test-functions.phpट्रिगर नहीं होते हैं, मुझे लगता है, क्योंकि initपहले आता है parse_query

क्या इसे व्यवस्थित करने के लिए सबसे अच्छा अभ्यास है, इसलिए यह काम करता है? या एक्शन हुक admin-ajax.phpका उपयोग करते समय मैं खराब अनुरोध को कैसे ठीक कर सकता हूं wp_enqeue_scripts?

जवाबों:


13

मुझे लगता है कि यहां केवल एक चीज गायब है, जिसे आपको add_action('wp_ajax_nopriv_ajaxlogin','ajax_login');बाहर ले जाने की जरूरत है ajax_login_init

यह कोड आपके अजाक्स हैंडलर को पंजीकृत करता है, लेकिन जब आप इसे केवल चलाते हैं wp_enqueue_scripts, तो पहले ही बहुत देर हो चुकी होती है और wp_ajax_nopriv_हुक पहले से ही चलाए जाते हैं।

तो, क्या आपने कुछ इस तरह की कोशिश की है:

function ajax_login_init(){
  if ( ! is_user_logged_in() || ! is_page( 'page-test' ) ) {
    return;
  }

  wp_register_script('ajax-login-script',get_stylesheet_directory_uri().'/js/ajax-login-script.js',array('jquery'));
  wp_enqueue_script('ajax-login-script');
  wp_localize_script('ajax-login-script','ajax_login_object',array('ajaxurl' => admin_url('admin-ajax.php'),'redirecturl' => 'REDIRECT_URL_HERE','loadingmessage' => __('Sending user info, please wait...')));
}

add_action( 'wp_enqueue_scripts','ajax_login_init' );

add_action( 'wp_ajax_nopriv_ajaxlogin','ajax_login' );

function ajax_login(){
  //nonce-field is created on page
  check_ajax_referer('ajax-login-nonce','security');
  //CODE
  die();
}

संपादित करें:

अब यह अधिक स्पष्ट है कि आप केवल उस विशेष पेज पर जावास्क्रिप्ट लोड करना चाहते हैं। इसका मतलब है कि आपको अपने is_page()अंदर डालने की जरूरत है ajax_login_init()। मैंने तदनुसार कोड अपडेट किया है।

अब, आपके समाधान ने काम क्यों नहीं किया?

is_page()जांच का मतलब है कि आपके कार्यों फ़ाइल केवल वह विशिष्ट पृष्ठ पर लोड किया गया था। ajax_login_init()बुलाया जाता है और आपकी लिपियों को कल्पना की जाती है। अब तक सब ठीक है।

अब आपकी स्क्रिप्ट अजाक्स कॉल करती है। जैसा कि टिप्पणियों में उल्लेख किया गया है, ajax कॉल उस चालू पृष्ठ से अवगत नहीं हैं जो आप कर रहे हैं। वहाँ एक कारण फ़ाइल पर बैठता है wp-admin/admin-ajax.php। कोई भी नहीं है WP_Queryऔर इस तरह से is_page()अजाक्स अनुरोध के दौरान काम नहीं करता है।

चूंकि यह काम नहीं करता है, sw18_page_specific_functions()अजाक्स के संदर्भ में कुछ भी नहीं करेगा। इसका मतलब है कि आपकी फ़ंक्शंस फ़ाइल लोड नहीं हुई है और आपके ajax हैंडलर का अस्तित्व नहीं है।

इसलिए आपको हमेशा उस फ़ंक्शन फ़ाइल को शामिल करना होगा और उस is_page()चेक को अंदर ले जाना होगा ajax_login_init()

इसलिए इसके बजाय sw18_page_specific_functions() { … }सिर्फ include_once dirname(__FILE__).'/includes/my-page-test-functions.php';सीधे दौड़ें । बिना किसी add_action( 'parse_query' )बुलावे के।


अच्छा सुझाव। मैंने इसे (अभी भी वही त्रुटि) बदल दिया है, लेकिन समस्या अभी भी यह है कि फ़ंक्शन वाली फ़ाइल बहुत देर से लोड होगी। लेकिन मुझे यह पता लगाने के लिए एक तरीका चाहिए कि किस पृष्ठ का उपयोग किया जाए। - वर्तमान में मैं ऊपर वर्णित के रूप में is_page () के साथ यह कोशिश करता हूं।
पाप

क्या आप is_page()भीतर से ajax_login()या भीतर से चलाने की कोशिश कर रहे हैं ajax_login_init()। पूर्व काम नहीं कर सकता क्योंकि यह अजाक्स संदर्भ में है।
स्वस्सपिंड

मैंने उन फ़ाइलों की गणना की है जिसमें फ़ंक्शन, ऊपर वर्णनात्मक पाठ के रूप में हैं। Is_page () का उपयोग फ़ंक्शंस में किया जाता है। एफपी और आवश्यक होने पर ही अजाक्स फ़ंक्शंस के साथ फ़ाइल को शामिल करने के लिए कार्य करता है।
पाप

@ साइन फिर, is_page()अजाक्स संदर्भ में काम नहीं करता है। मैंने उसी हिसाब से अपना जवाब अपडेट किया है।
स्वस्सपिंड

0

याद रखें कि 'एक्शन' फ़ंक्शन नाम wp_ajax_टैग के साथ जोड़ा गया है ।

function fetchorderrows() { // Want to run this func on ajax submit
  // Do awesome things here all day long
}

add_action('wp_ajax_fetchorderrows', 'fetchorderrows', 0);

-3

बस मरो लिखो; नीचे की तरह अंत में ...यहाँ छवि विवरण दर्ज करें


8
हाय ज़ी ज़हन। साइट पर आपका स्वागत है। आपके उत्तर को कुछ संशोधनों की आवश्यकता है। पहला, यदि आपका उत्तर कोड है, तो स्क्रीनशॉट पोस्ट न करें। इसके बजाय, कोड को स्निपेट के रूप में पोस्ट करें और इसे कोड के रूप में प्रारूपित करें ({} बटन का उपयोग करें)। संभवत: यही कारण है कि आपका उत्तर अस्वीकृत हो गया और स्वीकार नहीं किया गया। इसके अलावा, थोड़ा और स्पष्टीकरण उपयोगी होगा - जैसे "क्यों" सिर्फ राइट डाई () लिखते हैं, और ओपी (मूल पोस्ट) में कोड के संबंध में यह वास्तव में कहां जाता है?
बटलरब्लॉग
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.