#1 楼
使用wp_die()
是这些选项中的最佳选择。 />它允许其他插件挂接到die
调用的操作。 )。它使测试您的代码成为可能。如果要为代码创建单元/集成测试,则将无法测试直接调用
exit
或wp_die()
的函数。它将按预期终止脚本。设置WordPress自己的测试来避免这种情况的方式(针对已测试的Ajax回调)是挂接到wp_die()
触发的动作并引发异常。这样可以在测试中捕获异常,并分析回调的输出(如果有)。唯一要使用
exit
或die
的时间是要绕过从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对象。使用0
和wp_send_json()
还将以标准格式发送成功/错误消息,该格式可以由WordPress提供的任何JS Ajax帮助器功能都可以理解(例如wp_die()
)。TL; DR:您应该可能始终使用
wp_send_json_success()
,无论是否在Ajax回调中。更好的是,与wp_send_json_error()
和朋友一起发回信息。 #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);
结束函数。无需echo
或die
。 $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-urlencoded
或multipart/form-data
或text/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
评论
您添加了一些好的观点。我用自己的想法更新了话题。您可以根据需要发表评论。 @ 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