問題描述

考慮到常規的 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 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。