考虑像这样的常规WordPress ajax请求:

#1 楼

使用wp_die()是这些选项中的最佳选择。 />它允许其他插件挂接到die调用的操作。 )。
它使测试您的代码成为可能。如果要为代码创建单元/集成测试,则将无法测试直接调用exitwp_die()的函数。它将按预期终止脚本。设置WordPress自己的测试来避免这种情况的方式(针对已测试的Ajax回调)是挂接到wp_die()触发的动作并引发异常。这样可以在测试中捕获异常,并分析回调的输出(如果有)。

唯一要使用exitdie的时间是要绕过从wp_die()进行特殊处理并立即终止执行。在某些地方WordPress可以执行此操作(在其他地方它可能直接使用die只是因为exit的处理不重要,或者没有人尝试为一段代码创建测试,因此被忽略了)。请记住,这也使您的代码更加难以测试,因此通常只能用于不在函数体内的代码中(就像WordPress在wp_die()中一样)。因此,如果特别不希望通过die进行处理,或者作为预防措施在某个时候终止了脚本(如wp_die()那样,希望通常已经正确退出Ajax回调),那么您可以考虑直接使用admin-ajax.php

wp_die()admin-ajax.php而言,您应该使用哪个取决于前端处理该Ajax请求的响应的方式。如果期望特定的响应主体,则需要将该消息(在这种情况下为整数)传递给die。如果它仅侦听响应成功(wp_die()响应代码或其他内容),则无需将任何内容传递给wp_die( 0 )。不过,我要指出的是,以wp_die()结尾的响应会使响应与默认的200响应无法区分。因此,以wp_die()结尾并不能告诉您回调是否正确连接并实际运行。

如其他答案所指出,您经常会发现wp_die( 0 )等。如果您要发回JSON响应,这会很有帮助,通常这是个好主意。这也优于仅用代码调用admin-ajax.php,因为如果需要,您可以将更多信息传递回JSON对象。使用0wp_send_json()还将以标准格式发送成功/错误消息,该格式可以由WordPress提供的任何JS Ajax帮助器功能都可以理解(例如wp_die())。

TL; DR:您应该可能始终使用wp_send_json_success(),无论是否在Ajax回调中。更好的是,与wp_send_json_error()和朋友一起发回信息。

评论


您添加了一些好的观点。我用自己的想法更新了话题。您可以根据需要发表评论。 @ J.D

–prosti
17年2月7日在13:12

@prosti谢谢,我添加了一段有关何时/为什么您/ WordPress可能使用die而不是wp_die()的段落。

– J.D.
17年2月7日在14:25

感谢您的努力,但是,我不明白为什么WordPress核心有时使用die()有时使用wp_die()。

–prosti
17年2月10日在9:27

谢谢@prosti。至于为什么WordPress有时会使用die()的原因,在某些情况下,它只是遗留代码,或者当确实发生意外情况且未调用wp_die()时,使用die()作为最后的手段来杀死脚本。在其他情况下,没有人为一段代码创建测试,并且wp_die()的特殊处理不是特别需要的,因此它被忽略了。

– J.D.
17年2月10日在13:49

#2 楼

从插件的Codex 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()。大多数情况下,应该在Ajax回调函数中使用wp_die()。该
提供与WordPress更好的集成,并使测试代码更容易。


评论


您记下的ccodex很棒,但是WordPress核心并没有遵循它。那个怎么样?

–prosti
16/12/25在17:23



所有wp_send_json_ *函数都使用wp_send_json,该函数仍会调用wp_die

–同济
16 Dec 25 '18:27

但是为什么,我在这里错过了一些东西。您是否分析了这些功能并得出了结论?

–prosti
17年2月3日在17:02

您介意将有关wp_send_json的注释添加到答案中吗?

–马克·卡普伦
17年2月3日,17:18



哪个是正确的? wp_die(0)或wp_die()?

– Anwer AR
17年2月4日在6:01

#3 楼

您还可以将法典中描述的wp_send_json()用作send a JSON response back to an AJAX request, and die().

,因此,如果必须返回数组,则只能使用wp_send_json($array_with_values);结束函数。无需echodie

$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在发生异常的情况下可能返回false,在那种情况下该怎么办?

–prosti
16 Dec 25 '17:21

如果第三个参数(深度)小于0,则会引发异常。

– RRikesh
16/12/26在6:43

因此,您认为wp_send_json()是最好的方法吗?为什么?

–prosti
17-2-3在17:04



@prosti wp_send_json()为我们做了一些工作。这个问题也涉及wp_send_json()。

– RRikesh
17年2月4日在12:49

这正是@RRikesh的原因,为什么我要问WP内核使用该功能。那为什么呢?这样更好吗?

–prosti
17年2月4日在14:03

#4 楼

使用wordpress ajax / woo commerce ajax的一般语法如下: wp_die()函数。因此,如果不包含wp_die(),则任何使用该过滤器的插件都可能无法使用。此外die()和其他函数会立即终止PHP执行,而无需考虑终止执行时应考虑的任何wordpress函数。
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_send_json(),则不必在末尾使用wp_die()。因为wordpress本身会在wp_send_json()函数内部安全地使用wp_die()函数。

#5 楼

这只是别人所说的补充。选择wp_die的原因是内核可以在那里触发操作,插件可以正确完成诸如跟踪,监视或缓存之类的操作。

通常,如果有一个可用的API,则通常应该优先选择一个核心API,因为它很可能会增加一些PHP直接调用无法获得的价值(缓存,插件集成或其他)。

#6 楼

我不会接受这个答案,这不公平。我只是想在我认为重要的项目上创建轮廓和可能的提示:

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



通常,我们从ajax调用中得到一些
响应可能是用json编码的,也可能不是用json编码的。

如果我们需要json outupt wp_send_json或两个卫星是个好主意。

但是,我们可能会返回x-www-form-urlencodedmultipart/form-datatext/xml或任何其他编码类型。在这种情况下,我们不使用wp_send_json
 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();


两种格式都使用wp_die()die()。你能解释为什么吗?

最后这是wp_die()返回admin-ajax.php

为什么不die( '0' );的原因?

#7 楼

使用wp_die()。最好尽可能多地使用WordPress函数。

#8 楼

如果使用echo,它将迫使您使用die()die(0)wp_die()

如果您不使用echo,则JavaScript可以处理。

然后,您应该使用更好的方法返回数据:wp_send_json()。要在回调中发送数据(采用json格式),可以使用以下代码:
wp_send_json()

wp_send_json_success()

wp_send_json_error()

他们都会为你而死。无需退出或死掉。

UPDATE

如果不需要json作为输出格式,则应使用:

wp_die($response)

它会在死亡之前返回您的回复。根据法典:


函数wp_die()旨在在死之前提供输出
,以避免空响应或超时响应。


请在此处阅读完整的法典文章。

评论


谢谢,您有什么建议要代替回声?

–prosti
17年2月9日在15:12

需要注意的是,JavaScript不处理回声。 wp_send_json_ *使用echo并为您退出。客户端和服务器之间存在混乱。

– Brian Fegter
17年2月9日在15:58

@prosti wp_send_json()

–Faisal Alvi
17年2月9日在16:43

谢谢,以防万一我们不需要json作为输出格式?

–prosti
17年2月9日在16:46

@prosti比您应该使用wp_die($ response)更好,因为根据法典:函数wp_die()旨在在输出即将死之前提供输出,以避免空响应或超时响应。

–Faisal Alvi
17年2月9日在16:59