结束WordPress AJAX请求的最佳方式?为什么?

时间:2016-12-24 作者:prosti

考虑到常见的WordPress 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(), 或者别的什么,为什么?

8 个回复
最合适的回答,由SO网友:J.D. 整理而成

使用wp_die() 是这些选项中最好的。

正如其他人所指出的那样,有很多理由认为WordPress的特定功能优于普通功能dieexit:

它允许其他插件连接到wp_die().wp_die() 根据请求是否为Ajax请求进行定制)I added that note to the Codex. 如果你想的话create unit/integration tests 对于您的代码,您将无法测试调用exitdie 直接地它会像预期的那样终止脚本。WordPress自己的测试是为了避免这种情况而设置的(对于它有测试的Ajax回调),其方法是连接到wp_die() 并引发异常。这允许在测试中捕获异常,并分析回调的输出(如果有)。

你唯一会用的时间dieexit 如果您想绕过wp_die() 并立即终止死刑。有些地方WordPress可以做到这一点(还有其他可能使用的地方die 直接因为wp_die() 是不重要的,或者还没有人尝试为一段代码创建测试,所以它被忽略了)。请记住,这也会使您的代码更难测试,因此通常只在不在函数体中的代码中使用(就像WordPress在admin-ajax.php). 因此,如果wp_die() 是特别不需要的,或者作为预防措施,您在某个特定点终止脚本(如admin-ajax.php 是的,希望通常Ajax回调已经正确退出),那么您可以考虑使用die 直接地

依据wp_die() vs公司wp_die( 0 ), 您应该使用哪个取决于前端处理Ajax请求响应的方式。如果它需要一个特定的响应主体,那么您需要将该消息(在本例中为整数)传递给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() 还将以标准格式发送成功/错误消息,WordPress提供的任何JS Ajax助手函数都可以理解该格式(如wp.ajax).

TL;DR: 您可能应该始终使用wp_die(), 无论是否在Ajax回调中。更好的方法是,使用wp_send_json() 还有朋友。

SO网友:Tunji

来自法典AJAX in Plugins

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() 在Ajax回调函数中。这提供了与WordPress更好的集成,并使测试代码更容易。

SO网友:RRikesh

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

因此,如果必须返回一个数组,则只需使用wp_send_json($array_with_values);. 不需要echodie.

您还可以获得两个help helper函数wp_send_json_success()wp_send_json_error() 它添加了一个名为success 这将是truefalse 分别地

例如:

$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.

SO网友:Saran

使用wordpress ajax/woo commerce 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\\u die()。因为wordpress内部使用filter 在wp\\u die()函数期间。因此,如果我们不包含wp\\u die(),任何使用该过滤器的插件都可能无法工作。此外,die()和其他函数会立即终止PHP执行,而不考虑终止执行时应考虑的任何wordpress函数。

如果在函数中使用wp\\u send\\u json(),则如下所示

       function my_action_callback()
    {
    // your code goes here

      wp_send_json();

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

    }
Its not necessary to use wp_die() at the end if you include wp_send_json() inside callback function. 因为wordpress本身在wp\\u send\\u json()函数中安全地使用wp\\u die()函数。

SO网友:Mark Kaplun

这只是对其他人所说的话的补充。选择的原因wp_die 核心可以触发那里的操作,插件可以正确地完成跟踪、监视或缓存之类的事情。

一般来说,您应该总是喜欢核心API调用,而不是可用的API调用,因为它很可能会增加一些直接PHP调用无法获得的价值(缓存、插件集成或其他)。

SO网友:prosti

我不会接受这个答案,这是不公平的。我只是想就我认为重要的项目创建一个大纲和可能的提示:

wp-模具()的主要定义

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\\u send\\u 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\\u do\\u 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.

我们可以返回整个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(...)?

SO网友:Greeso

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

SO网友:Faisal Alvi

如果您使用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() 设计用于在输出即将结束之前提供输出,以避免空响应或超时响应。

请阅读完整的codex文章here.

相关推荐

尝试在WordPress中实现AJAX注释,遇到WP错误

我试图在WordPress中为我的评论实现Ajax,使用this tutorial. 但我在将教程中的代码集成到自己的预构建主题时遇到了问题。问题是,我要么得到一个WP错误“检测到重复注释;看来你已经说过了!”或标准500错误。以下是我得到的:下面是我对ajax的评论。js文件如下所示: * Let\'s begin with validation functions */ jQuery.extend(jQuery.fn, { /* * check i