问题描述
考虑到常规的 WordPress ajax 请求,如下所示:
add_action( 'wp_ajax_merrychristmas_happynewyear', array( $this, 'merrychristmas_happynewyear' ) );
add_action( 'wp_ajax_nopriv_merrychristmas_happynewyear', array( $this, 'merrychristmas_happynewyear' ) );
最好是用 die()
,die(0)
,wp_die()
或其他什么来结束功能 merrychristmas_happynewyear
?
最佳解决方案
使用 wp_die()
是最好的选择。
正如其他人所指出的,在普通的 die
或 exit
上有更多的理由选择 WordPress-specific 功能:
-
它允许其他插件挂接
wp_die()
调用的操作。 -
它允许基于上下文使用特殊处理程序进行退出 (
wp_die()
的行为是根据请求是否是 Ajax 请求进行调整) 。 -
它可以测试你的代码。
最后一个更重要,这就是为什么 I added that note to the Codex 。如果您想要 create unit/integration tests 代码,您将无法直接测试调用 exit
或 die
的功能。它将终止脚本,就像它应该的那样。 WordPress 自己的测试的设置方式是为了避免这种情况 (对于它已经测试的 Ajax 回调),是挂钩 wp_die()
触发的动作并抛出异常。这允许异常被捕获在测试中,并且回调的输出 (如果有的话) 被分析。
您将使用 die
或 exit
的唯一时间是要绕过 wp_die()
的任何特殊处理,并立即执行执行操作。有些地方,WordPress 这样做 (和其他地方,它可能直接使用 die
直接,因为从 wp_die()
的处理不重要,或者没有人试图为一段代码创建测试,所以它被忽视) 。请记住,这也使您的代码更难测试,所以通常只能用于不在函数体中的代码 (如 admin-ajax.php
中的 WordPress) 。因此,如果 wp_die()
的处理是特别不希望的,或者您正在以某种方式杀死脚本 (如 admin-ajax.php
,希望通常 Ajax 回调已经正确退出),则可以考虑直接使用 die
。
就 wp_die()
与 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
) 。
长话短说:您应该总是使用 wp_die()
,无论是否在 Ajax 回调中。更好的发送信息回 wp_send_json()
和朋友。
次佳解决方案
从插件中的代码 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
}
Notice the use of
wp_die()
, instead ofdie()
orexit()
. Most of the time you should be usingwp_die()
in your Ajax callback function. This provides better integration with WordPress and makes it easier to test your code.
第三种解决方案
您还可以使用 Codec 中描述的 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.
参考文献
注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。