问题描述

考虑到常规的 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()是最好的选择。

正如其他人所指出的,在普通的 dieexit 上有更多的理由选择 WordPress-specific 功能:

  • 它允许其他插件挂接 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()的处理不重要,或者没有人试图为一段代码创建测试,所以它被忽视) 。请记住,这也使您的代码更难测试,所以通常只能用于不在函数体中的代码 (如 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 of die() or exit(). Most of the time you should be using wp_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); 结束你的功能。不需要 echodie

您还可以获得两个帮助帮助函数 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 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。