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