Wordpress - Best way to end WordPress ajax request and why?
Using wp_die()
is the best of those options.
As others have noted, there are many reasons to prefer a WordPress-specific function over the plain die
or exit
:
- It allows other plugins to hook into the actions called by
wp_die()
. - It allows a special handler for exiting to be used based on context (the behavior of
wp_die()
is tailored based on whether the request is an Ajax request or not). - It makes it possible to test your code.
The last one is more important, which is why I added that note to the Codex. If you want to create unit/integration tests for your code, you will not be able to test a function that calls exit
or die
directly. It will terminate the script, like it is supposed to. The way that WordPress's own tests are set up to avoid this (for the Ajax callbacks that it has tests for), is to hook into the actions triggered by wp_die()
and throw an exception. This allows the exception to be caught within the test, and the output of the callback (if any) to be analyzed.
The only time that you would use die
or exit
is if you want to bypass any special handling from wp_die()
and kill the execution immediately. There are some places where WordPress does this (and other places where it might use die
directly just because the handling from wp_die()
is not important, or nobody has attempted to create tests for a piece of code yet, so it was overlooked). Remember that this also makes your code more difficult to test, so it would generally only be used in code that isn't in a function body anyway (like WordPress does in admin-ajax.php
). So if the handling from wp_die()
is specifically not desired, or you are killing the script at a certain point as a precaution (like admin-ajax.php
does, expecting that usually an Ajax callback will have already properly exited), then you might consider using die
directly.
In terms of wp_die()
vs wp_die( 0 )
, which you should use depends on what is handling the response of that Ajax request on the front end. If it is expecting a particular response body, then you need to pass that message (or integer, in this case) to wp_die()
. If all it is listening for is the response being successful (200
response code or whatever), then there is no need to pass anything to wp_die()
. I would note, though, that ending with wp_die( 0 )
would make the response indistinguishable from the default admin-ajax.php
response. So ending with 0
does not tell you whether your callback was hooked up properly and actually ran. A different message would be better.
As pointed out in other answers, you will often find wp_send_json()
et al. to be helpful if you are sending a JSON response back, which is generally a good idea. This is also superior to just calling wp_die()
with a code, because you can pass much more information back in a JSON object, if needed. Using wp_send_json_success()
and wp_send_json_error()
will also send the success/error message back in a standard format that any JS Ajax helper functions provided by WordPress will be able to understand (like wp.ajax
).
TL;DR: You should probably always use wp_die()
, whether in an Ajax callback or not. Even better, send information back with wp_send_json()
and friends.
From the codex AJAX in Plugins
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.
You can also use wp_send_json()
described in the Codex as send a JSON response back to an AJAX request, and die().
So, if you have to return an array, you only have end your function with wp_send_json($array_with_values);
. No need to echo
or die
.
You also get two help helper functions wp_send_json_success()
and wp_send_json_error()
which adds a key named success
which will be true
or false
respectively.
For example:
$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.