Question: Is there any reason to use admin-ajax.php for ajax requests versus a custom page template?

I didn't know about admin-ajax.php until recently, so what I had been doing is creating a custom page template like this:

```
<?php
/**
 * Template Name: API
 */

if ( isset( $_GET['ajax_request'] ) ) {
// do stuff
}

```

And the ajax call would be to the URL <http://mysite.com/api/>, which is where I've published a blank page using my API page template. This seems to give me access to all my WordPress functions and spit out data.

However, recently I've read up on admin-ajax.php and understand another way to connect to the WordPress database is to call the URL <http://mysite.com/wp-admin/admin-ajax.php> and have functions like this:

```
add_action( 'wp_ajax_nopriv_action', 'my_do_stuff' );
add_action( 'wp_ajax_show_action', 'my_do_stuff' );

function my_do_stuff() {
// do stuff
}

```

Is it wrong to connect the first way? Does admin-ajax.php provide extra security or something? Thanks any input!

Answer: 
First, the obvious drawback to the first method is that it depends on your specific page, template, and permalink structure to all work correctly. Using `admin-ajax.php` will work correctly in any context, theme or plugin, where proper WordPress best practices are followed.

The less obvious drawback to the first method is that it uses more memory than doing WordPress-enabled AJAX calls, since the whole WordPress environment is loaded, as it's presumed that a front-end or admin page will be output.

The addition of NONCEs with `admin-ajax.php` provides easy, built-in security.
`admin-ajax.php` isn't always the right way to go. If you're looking to fetch a post, for example, you may actually better off using something like `template_redirect()` to load a custom template that returns JSON (or whatever you need returned).

Why? Caching. When you use `admin-ajax.php` you're basically eliminating the opportunity for some cache systems to save the output of the server response (generally admin URLs, and specifically admin-ajax.php, should not be cached). Using `template_redirect()` on the other hand allows for maintaining separate URLs that many cache plugins and HTTP accelerators would be likely to use to keep the data. Even some back-end caching systems may not involve themselves in `admin-ajax.php` if they're configured to avoid caching when `is_admin()`.

Of course, if you're not getting something fairly static like a post, caching could actually be a really bad thing... in which case `admin-ajax.php` is a far better choice.