WordPress ajax अनुरोध को समाप्त करने का सबसे अच्छा तरीका और क्यों?


16

इस तरह नियमित वर्डप्रेस ajax अनुरोधों को ध्यान में रखते हुए:

add_action( 'wp_ajax_merrychristmas_happynewyear', array( $this, 'merrychristmas_happynewyear' ) );
add_action( 'wp_ajax_nopriv_merrychristmas_happynewyear', array( $this, 'merrychristmas_happynewyear' ) );

यह अंत कार्य करने के लिए सबसे अच्छा होगा merrychristmas_happynewyearके साथ die(), die(0), wp_die(), या कुछ और है और क्यों?

जवाबों:


13

का उपयोग करना wp_die()उन विकल्पों में से सबसे अच्छा है।

के रूप में दूसरों का उल्लेख किया है, वहाँ कई कारण मैदान पर एक वर्डप्रेस-विशेष समारोह पसंद कर रहे हैं dieया exit:

  • यह अन्य प्लगइन्स द्वारा बुलाए गए कार्यों में हुक करने की अनुमति देता है wp_die()
  • यह एक विशेष हैंडलर को संदर्भ के आधार पर उपयोग करने के लिए बाहर निकलने की अनुमति देता है (व्यवहार के wp_die()आधार पर सिलवाया गया है कि क्या अनुरोध एक अजाक्स अनुरोध है या नहीं)।
  • यह आपके कोड का परीक्षण करना संभव बनाता है।

अंतिम एक अधिक महत्वपूर्ण है, यही वजह है कि मैंने उस नोट को कोडेक्स में जोड़ा है । यदि आप अपने कोड के लिए यूनिट / एकीकरण परीक्षण बनाना चाहते हैं , तो आप एक फ़ंक्शन का परीक्षण करने में सक्षम नहीं होंगे जो कॉल करता है exitया dieसीधे। यह स्क्रिप्ट को समाप्त कर देगा, जैसे कि यह माना जाता है। जिस तरह से वर्डप्रेस के स्वयं के परीक्षण इस से बचने के लिए स्थापित किए गए हैं (अजाक्स कॉलबैक के लिए जो इसके लिए परीक्षण हैं), wp_die()इसके द्वारा ट्रिगर किए गए कार्यों में हुक करना और एक अपवाद फेंकना है। यह अपवाद को परीक्षण के भीतर पकड़ा जा सकता है, और कॉलबैक (यदि कोई हो) के आउटपुट का विश्लेषण किया जा सकता है।

केवल वही समय जिसका आप उपयोग करेंगे dieया exitयदि आप किसी विशेष हैंडलिंग को बायपास करना चाहते हैं wp_die()और तुरंत निष्पादन को मार दें। कुछ ऐसे स्थान हैं जहां वर्डप्रेस ऐसा करता है (और अन्य स्थान जहां यह dieसीधे उपयोग कर सकता है क्योंकि इससे हैंडलिंग wp_die()महत्वपूर्ण नहीं है, या किसी ने भी कोड के एक टुकड़े के लिए परीक्षण बनाने का प्रयास नहीं किया है, इसलिए इसे अनदेखा किया गया था)। याद रखें कि यह आपके कोड को परीक्षण करने के लिए और अधिक कठिन बना देता है, इसलिए यह आमतौर पर केवल उस कोड में उपयोग किया जाएगा जो किसी भी तरह से फ़ंक्शन बॉडी में नहीं है (जैसे वर्डप्रेस करता है admin-ajax.php)। तो अगर से निपटने wp_die()विशेष रूप से वांछित नहीं है, या आप एहतियात के रूप में एक निश्चित बिंदु पर स्क्रिप्ट को मार रहे हैं (जैसेadmin-ajax.phpकरता है, उम्मीद है कि आम तौर पर एक अजाक्स कॉलबैक पहले से ही ठीक से बाहर हो जाएगा), तो आप dieसीधे उपयोग करने पर विचार कर सकते हैं।

wp_die()बनाम के संदर्भ में wp_die( 0 ), जिसे आपको उपयोग करना चाहिए, इस बात पर निर्भर करता है कि सामने के छोर पर उस अजाक्स अनुरोध की प्रतिक्रिया क्या है। यदि यह एक विशेष प्रतिक्रिया निकाय की उम्मीद कर रहा है, तो आपको उस संदेश (या पूर्णांक, इस मामले में) को पास करना होगा wp_die()। यदि यह सब सुन रहा है तो प्रतिक्रिया सफल हो रही है ( 200प्रतिक्रिया कोड या जो भी हो), तो इसके लिए कुछ भी पारित करने की आवश्यकता नहीं है wp_die()। हालांकि, मैं यह नोट करूंगा कि wp_die( 0 )यह प्रतिक्रिया डिफ़ॉल्ट admin-ajax.phpप्रतिक्रिया से अप्रभेद्य होगी । तो अंत के साथ आपको 0यह नहीं बताता है कि क्या आपका कॉलबैक ठीक से झुका हुआ था और वास्तव में भाग गया था। एक अलग संदेश बेहतर होगा।

जैसा कि अन्य उत्तरों में बताया गया है, आप अक्सर wp_send_json()एट अल पाएंगे । यदि आप JSON प्रतिक्रिया भेज रहे हैं तो सहायक होना, जो कि आम तौर पर एक अच्छा विचार है। यह केवल wp_die()एक कोड के साथ कॉल करने के लिए भी बेहतर है , क्योंकि यदि आप आवश्यक हैं, तो आप JSON ऑब्जेक्ट में बहुत अधिक जानकारी वापस कर सकते हैं। उपयोग करना wp_send_json_success()और wp_send_json_error()सफलता / त्रुटि संदेश को एक मानक प्रारूप में वापस भेज देगा जो कि वर्डप्रेस द्वारा प्रदान किए गए किसी भी जेएस अजाक्स सहायक कार्य को समझने में सक्षम होगा (जैसे wp.ajax)।

टीएल; डीआर: आपको शायद हमेशा उपयोग करना चाहिए wp_die(), चाहे अजाक्स कॉलबैक में हो या नहीं। इससे भी बेहतर, wp_send_json()दोस्तों के साथ जानकारी वापस भेजें ।


आपने कुछ अच्छे दृष्टिकोण जोड़े हैं। मैंने अपने विचारों से धागे को अद्यतन किया। आप चाहें तो टिप्पणी कर सकते हैं। @ जेडी
प्रोस्टी

@prosti धन्यवाद, मैं आप / वर्डप्रेस का उपयोग कर सकते कब और क्यों पर एक पैराग्राफ जोड़ दिया है dieबजाय wp_die()
JD

मैं आपके प्रयास की सराहना करता हूं, हालांकि, मुझे समझ नहीं आता कि वर्डप्रेस कोर कभी-कभी क्यों die()और कभी- कभी उपयोग किया जाता है wp_die()
प्रोस्टि

धन्यवाद @prosti जैसा कि वर्डप्रेस कभी-कभी क्यों उपयोग करता है die(), कुछ मामलों में यह सिर्फ विरासत कोड है, या die()स्क्रिप्ट को अंतिम उपाय के रूप में मारने के लिए उपयोग किया जा रहा है जब कुछ वास्तव में अप्रत्याशित हुआ और wp_die()बुलाया नहीं गया। अन्य मामलों में, किसी ने कोड के एक टुकड़े के लिए परीक्षण नहीं बनाया है, और विशेष से निपटने की wp_die()विशेष आवश्यकता नहीं है, इसलिए इसे अनदेखा किया गया है।
JD

13

प्लगइन्स में कोडेक्स AJAX से

add_action( 'wp_ajax_my_action', 'my_action_callback' );

function my_action_callback() {
    global $wpdb; // this is how you get access to the database

    $whatever = intval( $_POST['whatever'] );

    $whatever += 10;

        echo $whatever;

    wp_die(); // this is required to terminate immediately and return a proper response
}

के wp_die()बजाय die()या के उपयोग पर ध्यान दें exit()। अधिकांश समय आपको wp_die()अपने अजाक्स कॉलबैक फ़ंक्शन में उपयोग करना चाहिए । यह वर्डप्रेस के साथ बेहतर एकीकरण प्रदान करता है और आपके कोड का परीक्षण करना आसान बनाता है।


ccodex जो आपने नोट किया है वह बहुत अच्छा है, लेकिन वर्डप्रेस कोर इसका पालन नहीं करता है। उस के बारे में कैसा है?
प्रोस्टी

3
सभी wp_send_json_*फ़ंक्शन सभी का उपयोग करते हैं wp_send_jsonजो अभी भी कॉल करते हैंwp_die
Tunji

लेकिन क्यों, मुझे यहां कुछ याद आ रहा है। क्या आपने इन कार्यों का विश्लेषण किया है और निष्कर्ष के साथ आए हैं?
प्रोस्टी

1
क्या आपको wp_send_jsonजवाब में नोट जोड़ने का मन है ?
मार्क कप्लून

1
क्या सही है? wp_die (0) या wp_die ()?
एवर एआर

5

आप wp_send_json()कोडेक्स में वर्णित के रूप में भी उपयोग कर सकते हैंsend a JSON response back to an AJAX request, and die().

इसलिए, यदि आपको कोई सरणी वापस करनी है, तो आपके पास केवल अपना फ़ंक्शन समाप्त करना होगा wp_send_json($array_with_values);। की आवश्यकता नहीं है echoया die

आपको दो सहायक सहायक कार्य भी मिलते हैं wp_send_json_success()और wp_send_json_error()जो एक कुंजी का नाम देता है successजो क्रमशः trueया falseक्रमशः होगा।

उदाहरण के लिए:

$array_val = range( 1,10 );
var_dump( wp_send_json_error( $array_val ) ); # Output: {"success":false,"data":[1,2,3,4,5,6,7,8,9,10]}
echo 'Hey there'; # Not executed because already died.

wp_json_encodeअपवाद के मामले में गलत हो सकता है, उस मामले में क्या?
प्रोस्टि

यदि तीसरा तर्क (गहराई) 0. से कम है तो इसका अपवाद फेंकता है।
RRikesh

तो आप मानते हैं कि wp_send_json()सबसे अच्छा तरीका है? क्यों?
प्रोस्टी

@prosti हमारे लिए wp_send_json() कुछ सामान करता है। यह सवाल भी निपटाता है wp_send_json()
RRikesh

यह वास्तव में @Rikesh है कि मैं WP कोर का उपयोग क्यों कर रहा हूं। तो ऐसा क्यों? क्या यह बेहतर है?
प्रोस्टी

3

WordPress ajax / woo वाणिज्य का उपयोग करने के लिए ajax सामान्य वाक्यविन्यास निम्नानुसार है:

add_action( 'wp_ajax_my_action', 'my_action_callback' );
add_action( 'wp_ajax_nopriv_my_action', 'my_action_callback' );
function my_action_callback()
{
// your code goes here

wp_die();

}

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

यदि आप अपने अंदर wp_send_json () का उपयोग कर रहे हैं तो इस तरह से कार्य करें

       function my_action_callback()
    {
    // your code goes here

      wp_send_json();

    //wp_die(); not necessary to use wp_die();

    }

यदि आप कॉलबैक फ़ंक्शन के अंदर wp_send_json () को शामिल करते हैं तो अंत में wp_die () का उपयोग करना आवश्यक नहीं है । क्योंकि वर्डप्रेस स्वयं wp_dend_json () फ़ंक्शन के अंदर सुरक्षित रूप से wp_die () फ़ंक्शन का उपयोग करता है।


2

यह सिर्फ दूसरों के कहे अनुसार है। पसंद करने का कारण यह wp_dieहै कि कोर वहां कार्रवाई कर सकता है और प्लगइन्स सही तरीके से ट्रेसिंग, मॉनिटरिंग या कैशिंग जैसी चीजों को पूरा कर सकता है।

सामान्य तौर पर आपको हमेशा एक कोर एपीआई कॉल को प्राथमिकता देनी चाहिए, यदि कोई उपलब्ध हो, तो यह संभव है कि कुछ मूल्य (कैशिंग, प्लगइन एकीकरण या जो भी हो) जो आपको सीधे PHP कॉल से न मिले।


2

मैं इस उत्तर को स्वीकार नहीं करूंगा, यह उचित नहीं होगा। मैं केवल उन वस्तुओं पर एक रूपरेखा और संभावित संकेत बनाना चाहता था जो मुझे महत्वपूर्ण लगे:

Wp-die की मुख्य परिभाषा ()

File: wp-includes/functions.php
2607: /**
2608:  * Kill WordPress execution and display HTML message with error message.
2609:  *
2610:  * This function complements the `die()` PHP function. The difference is that
2611:  * HTML will be displayed to the user. It is recommended to use this function
2612:  * only when the execution should not continue any further. It is not recommended
2613:  * to call this function very often, and try to handle as many errors as possible
2614:  * silently or more gracefully.
2615:  *
2616:  * As a shorthand, the desired HTTP response code may be passed as an integer to
2617:  * the `$title` parameter (the default title would apply) or the `$args` parameter.
2618:  *
2619:  * @since 2.0.4
2620:  * @since 4.1.0 The `$title` and `$args` parameters were changed to optionally accept
2621:  *              an integer to be used as the response code.
2622:  *
2623:  * @param string|WP_Error  $message Optional. Error message. If this is a WP_Error object,
2624:  *                                  and not an Ajax or XML-RPC request, the error's messages are used.
2625:  *                                  Default empty.
2626:  * @param string|int       $title   Optional. Error title. If `$message` is a `WP_Error` object,
2627:  *                                  error data with the key 'title' may be used to specify the title.
2628:  *                                  If `$title` is an integer, then it is treated as the response
2629:  *                                  code. Default empty.
2630:  * @param string|array|int $args {
2631:  *     Optional. Arguments to control behavior. If `$args` is an integer, then it is treated
2632:  *     as the response code. Default empty array.
2633:  *
2634:  *     @type int    $response       The HTTP response code. Default 200 for Ajax requests, 500 otherwise.
2635:  *     @type bool   $back_link      Whether to include a link to go back. Default false.
2636:  *     @type string $text_direction The text direction. This is only useful internally, when WordPress
2637:  *                                  is still loading and the site's locale is not set up yet. Accepts 'rtl'.
2638:  *                                  Default is the value of is_rtl().
2639:  * }
2640:  */
2641: function wp_die( $message = '', $title = '', $args = array() ) {
2642: 
2643:   if ( is_int( $args ) ) {
2644:       $args = array( 'response' => $args );
2645:   } elseif ( is_int( $title ) ) {
2646:       $args  = array( 'response' => $title );
2647:       $title = '';
2648:   }
2649: 
2650:   if ( wp_doing_ajax() ) {
2651:       /**
2652:        * Filters the callback for killing WordPress execution for Ajax requests.
2653:        *
2654:        * @since 3.4.0
2655:        *
2656:        * @param callable $function Callback function name.
2657:        */
2658:       $function = apply_filters( 'wp_die_ajax_handler', '_ajax_wp_die_handler' );
2659:   } elseif ( defined( 'XMLRPC_REQUEST' ) && XMLRPC_REQUEST ) {
2660:       /**
2661:        * Filters the callback for killing WordPress execution for XML-RPC requests.
2662:        *
2663:        * @since 3.4.0
2664:        *
2665:        * @param callable $function Callback function name.
2666:        */
2667:       $function = apply_filters( 'wp_die_xmlrpc_handler', '_xmlrpc_wp_die_handler' );
2668:   } else {
2669:       /**
2670:        * Filters the callback for killing WordPress execution for all non-Ajax, non-XML-RPC requests.
2671:        *
2672:        * @since 3.0.0
2673:        *
2674:        * @param callable $function Callback function name.
2675:        */
2676:       $function = apply_filters( 'wp_die_handler', '_default_wp_die_handler' );
2677:   }
2678: 
2679:   call_user_func( $function, $message, $title, $args );
2680: }

wp_send_json

File: wp-includes/functions.php
3144: /**
3145:  * Send a JSON response back to an Ajax request.
3146:  *
3147:  * @since 3.5.0
3148:  * @since 4.7.0 The `$status_code` parameter was added.
3149:  *
3150:  * @param mixed $response    Variable (usually an array or object) to encode as JSON,
3151:  *                           then print and die.
3152:  * @param int   $status_code The HTTP status code to output.
3153:  */
3154: function wp_send_json( $response, $status_code = null ) {
3155:   @header( 'Content-Type: application/json; charset=' . get_option( 'blog_charset' ) );
3156:   if ( null !== $status_code ) {
3157:       status_header( $status_code );
3158:   }
3159:   echo wp_json_encode( $response );
3160: 
3161:   if ( wp_doing_ajax() ) {
3162:       wp_die( '', '', array(
3163:           'response' => null,
3164:       ) );
3165:   } else {
3166:       die;
3167:   }
3168: }

wp_doing_ajax

File: wp-includes/load.php
1044: /**
1045:  * Determines whether the current request is a WordPress Ajax request.
1046:  *
1047:  * @since 4.7.0
1048:  *
1049:  * @return bool True if it's a WordPress Ajax request, false otherwise.
1050:  */
1051: function wp_doing_ajax() {
1052:   /**
1053:    * Filters whether the current request is a WordPress Ajax request.
1054:    *
1055:    * @since 4.7.0
1056:    *
1057:    * @param bool $wp_doing_ajax Whether the current request is a WordPress Ajax request.
1058:    */
1059:   return apply_filters( 'wp_doing_ajax', defined( 'DOING_AJAX' ) && DOING_AJAX );
1060: }

आमतौर पर जो हमें अजाक्स कॉल से मिलता है, वह किसी प्रकार की प्रतिक्रिया है। प्रतिक्रिया को जुबान में एन्कोड किया जा सकता है या जोंस में एनकोड नहीं किया जा सकता है।

मामले में हमें jsonविस्फोट की जरूरत है wp_send_jsonया दो उपग्रह महान विचार हैं।

हालांकि, हम वापस आ सकते हैं x-www-form-urlencodedया multipart/form-dataया text/xmlया किसी अन्य एन्कोडिंग प्रकार। उस स्थिति में हम उपयोग नहीं करते हैं wp_send_json

हम पूरे html को वापस कर सकते हैं और उस स्थिति में wp_die()पहले और दूसरे पैरामीटर का उपयोग करने की समझ है , अन्यथा ये पैरामीटर खाली होना चाहिए।

 wp_die( '', '', array(
      'response' => null,
 ) );

लेकिन wp_die()मापदंडों के बिना कॉल करने का क्या लाभ है ?


अंतिम, यदि आप महान WP कोर की जाँच करें जो आपको मिल सकता है

File: wp-includes/class-wp-ajax-response.php
139:    /**
140:     * Display XML formatted responses.
141:     *
142:     * Sets the content type header to text/xml.
143:     *
144:     * @since 2.1.0
145:     */
146:    public function send() {
147:        header( 'Content-Type: text/xml; charset=' . get_option( 'blog_charset' ) );
148:        echo "<?xml version='1.0' encoding='" . get_option( 'blog_charset' ) . "' standalone='yes'?><wp_ajax>";
149:        foreach ( (array) $this->responses as $response )
150:            echo $response;
151:        echo '</wp_ajax>';
152:        if ( wp_doing_ajax() )
153:            wp_die();
154:        else
155:            die();

दोनों स्वरूपों उपयोग किया जाता है die()और wp_die()। क्या आप व्यख्या कर सकते हैं?

अंत में यहाँ क्या admin-ajax.phpरिटर्न हैdie( '0' );

क्यों नहीं wp_die(...)?


1

का उपयोग करें wp_die()। जितना हो सके वर्डप्रेस फंक्शन्स का इस्तेमाल करना बेहतर है।


1

आप का उपयोग करते हैं echo, तो यह आपको उपयोग करने के लिए बाध्य करेगा die()या die(0)या wp_die()

यदि आप उपयोग नहीं करते हैं echo, तो जावास्क्रिप्ट संभाल सकता है।

फिर आपको डेटा वापस करने के लिए एक बेहतर तरीके का उपयोग करना चाहिए wp_send_json():।

अपने कॉलबैक में डेटा भेजने के लिए ( jsonप्रारूप में), आप अनुसरण का उपयोग कर सकते हैं:

wp_send_json()

wp_send_json_success()

wp_send_json_error()

वे सब तुम्हारे लिए मरेंगे। बाद में बाहर निकलने या मरने की जरूरत नहीं है।

अपडेट करें

और अगर आपको jsonआउटपुट स्वरूप की आवश्यकता नहीं है , तो आपको उपयोग करना चाहिए:

wp_die($response)

मरने से पहले यह आपकी प्रतिक्रिया लौटा देगा। कोडेक्स के अनुसार:

फ़ंक्शन wp_die()को खाली या टाइम-आउट प्रतिक्रियाओं से बचने के लिए मरने से ठीक पहले आउटपुट देने के लिए डिज़ाइन किया गया है।

कृपया यहाँ पूरा कोडेक्स लेख पढ़ें ।


1
धन्यवाद, आप इसके बजाय क्या सुझाव देते हैं echo?
prosti

1
नोट करने के लिए, जावास्क्रिप्ट हैंडल नहीं करता है echowp_send_json_*आपके लिए उपयोग करता है echoऔर बाहर निकलता है। क्लाइंट और सर्वर के बीच यहां भ्रम है।
ब्रायन फीगर

@prosti wp_send_json ()
फैसल अल्वी

धन्यवाद, और मामले में हमें jsonआउटपुट प्रारूप की आवश्यकता नहीं है ?
prosti

1
@prosti की तुलना में आपको wp_die ($ प्रतिक्रिया) का उपयोग करना चाहिए क्योंकि कोडेक्स के अनुसार: फ़ंक्शन wp_die () को खाली या समय से बाहर निकलने से बचने के लिए मरने से ठीक पहले आउटपुट देने के लिए डिज़ाइन किया गया है।
फैसल अल्वी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.