AJAX In WordPress

In the last few years, AJAX has crept onto websites and slowly become the way to create dynamic, user-friendly, responsive websites. AJAX is the technology that lets you update the contents of a page without actually having to reload the page in the browser. For example, Google Docs utilizes this technology when saving your work every few minutes.


While there are a number of ways to use AJAX in WordPress — and all are “correct,” in the loose sense of the word — there is one method that you should follow for a few reasons: WordPress supports it, it is future-proof, it is very logical, and it gives you numerous options right out of the box.

What Is AJAX?

If you’re not familiar with AJAX, I suggest continuing to the end of this article and then reading the Wikipedia article on AJAX, followed by some tutorials. This is a rare case when I recommend reading as little about it as possible before trying it out, because it confused the heck out of me at first; and the truth is, you will rarely interact with AJAX in its “raw” state — you will usually use helpers such as jQuery.

In a nutshell, AJAX is a combination of HTML, CSS and JavaScript code that enables you to send data to a script and then receive and process the script’s response without needing to reload the page.

If you are creating a page on your website where users can modify their profile, you could use AJAX to update a user’s profile without needing to constantly reload the page whenever they submit the form. When the user clicks the button, the data they have entered into the form is sent via AJAX to the processing script, which saves the data and returns the string “data saved.” You can then output that data to the user by inserting it onto the page.

The thing to grasp about AJAX is how not different it is from what you’re already doing. If you have a contact form, chances are that the form is marked up with HTML, some styles are applied to it, and a PHP script processes the information. The only difference between this and AJAX is how the information that the user inputs gets to the script and back to the user — everything else is the same.

To exploit the full potential of AJAX and get the most out of this article, you will need to be familiar with JavaScript (jQuery will suffice), as well as HTML, CSS and PHP. If your JavaScript knowledge is a bit iffy, don’t worry; you’ll still be able to follow the logic. If you need a hand, just submit a comment, and I’ll try to help out.

How Not To Use AJAX

One method that has been around, and which I used myself back in the bad old days, is to simply load the wp-load.php file at the top of your PHP script. This let’s you use WordPress functions, detect the current user and so on. But this is basically a hack and so is not future-proof. It is much less secure and does not give you some of the cool options that the WordPress system does.

How AJAX Works In WordPress Natively

Because AJAX is already used in WordPress’ back end, it has been basically implemented for you. All you need to do is use the functions available. Let’s look at the process in general before diving into the code.

Every AJAX request goes through the admin-ajax.php file in the wp-admin folder. That this file is named admin-ajax might be a bit confusing. I quite agree, but this is just how the development process turned out. So, we should use admin-ajax.php for back-end and user-facing AJAX.

Each request needs to supply at least one piece of data (using the GET or POST method) called action. Based on this action, the code in admin-ajax.php creates two hooks, wp_ajax_my_action and wp_ajax_nopriv_my_action, where my_action is the value of the GET or POST variable action.

Adding a function to the first hook means that that function will fire if a logged-in user initiates the action. Using the second hook, you can cater to logged-out users separately.

Implementing AJAX In WordPress

Let’s build a rudimentary voting system as a quick example. First, create an empty plugin and activate it. If you need help with this part, look at the tutorial on creating a plugin. Also, find your theme’s single.php file, and open it.

Preparing to Send the AJAX Call

Let’s create a link that enables people to give a thumbs up to our articles. If a user has JavaScript enabled, it will use JavaScript; if not, it will follow the link. Somewhere in your single.php file, perhaps near the article’s title, add the following code:

    $votes = get_post_meta($post->ID, "votes", true)
    $votes = ($votes == "") ? 0 : $votes;
This post has <div id='vote_counter'><?php echo $votes ?></div> votes<br>

    $nonce  = wp_create_nonce("my_user_vote_nonce");
    $link   = admin_url('admin-ajax.php?action=my_user_vote&post_id='.$post->ID.'&nonce='.$nonce);
    echo '<a data-nonce="' . $nonce . '" data-post_id="' . $post->ID . '" href="' . $link . '">vote for this article</a>';

First, let’s pull the value of the votes meta key related to this post. This meta field is where we will store the total vote count. Let’s also make sure that if it doesn’t exist (i.e. its value is an empty string), we show 0.

We’ve also created an ordinary link here. The only extra bit is a pinch of security, using nonces, to make sure there is no foul play. Otherwise, this is simply a link pointing to the admin-ajax.php file, with the action and the ID of the post that the user is on specified in the form of a query string.

To cater to JavaScript users, we have added a user_vote class, to which we will attach a click event, and a data-post_id property, which contains the ID of the post. We will use these to pass the necessary information to our JavaScript.

Handling the Action Without JavaScript

If you click this link now, you should be taken to the admin-ajax.php script, which will output -1. This is because no function has been created yet to handle our action. So, let’s get cracking!

In your plugin, create a function, and add it to the new hook that was created for us. Here’s how:

01 add_action("wp_ajax_my_user_vote", "my_user_vote");
02 add_action("wp_ajax_nopriv_my_user_vote", "my_must_login");
04 function my_user_vote() {
06    if ( !wp_verify_nonce( $_REQUEST['nonce'], "my_user_vote_nonce")) {
07       exit("No naughty business please");
08    }  
10    $vote_count = get_post_meta($_REQUEST["post_id"], "votes", true);
11    $vote_count = ($vote_count == '') ? 0 : $vote_count;
12    $new_vote_count = $vote_count + 1;
14    $vote = update_post_meta($_REQUEST["post_id"], "votes", $new_vote_count);
16    if($vote === false) {
17       $result['type'] = "error";
18       $result['vote_count'] = $vote_count;
19    }
20    else {
21       $result['type'] = "success";
22       $result['vote_count'] = $new_vote_count;
23    }
25    if(!empty($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest') {
26       $result = json_encode($result);
27       echo $result;
28    }
29    else {
30       header("Location: ".$_SERVER["HTTP_REFERER"]);
31    }
33    die();
35 }
37 function my_must_login() {
38    echo "You must log in to vote";
39    die();
40 }

First of all, we’ve verified the nonce to make sure that the request is nice and legit. If it isn’t, we simply stop running the script. Otherwise, we move on and get the vote count from the database; make sure to set it to 0 if there is no vote count yet. We then add 1 to it to find the new vote count.

Using the update_post_meta() function, we add the new vote count to our post. This function creates the post’s meta data if it doesn’t yet exist, so we can use it to create, not just update. The function returns true if successful and false for a failure, so let’s create an array for both cases.

I like to create these result arrays for all actions because they standardize action handling, giving us good debugging information. And, as we’ll see in a second, the same array can be used in AJAX and non-AJAX calls, making error-handling a cinch.

This array is rudimentary. It contains only the type of result (error or success) and the vote count. In the case of failure, the old vote count is used (discounting the user’s vote, because it was not added). In the case of success, we include the new vote count.

Finally, we detect whether the action was initiated through an AJAX call. If so, then we use the json_encode() function to prepare the array for our JavaScript code. If the call was made without AJAX, then we simply send the user back to where they came from; obviously, they should be shown the updated vote count. We could also put the array in a cookie or in a session variable to return it to the user the same way, but this is not important for this example.

Always end your scripts with a die() function, to ensure that you get back the proper output. If you don’t include this, you will always get back a -1 string along with the results.

The function to handle logged-out users is obviously poor, but it is meant merely as an example. You can expand on it by having it redirect the user to a registration page or by displaying more useful information.

Adding JavaScript to the Mix

Because we’ve now handled the user’s action using regular methods, we can start building in the JavaScript. Many developers prefer this order because it ensures graceful degradation. In order for our system to use AJAX, we will need to add jQuery, as well as our own JavaScript code. To do this, WordPress-style, just go to your plugin and add the following.

01 add_action( 'init', 'my_script_enqueuer' );
03 function my_script_enqueuer() {
04    wp_register_script( "my_voter_script", WP_PLUGIN_URL.'/my_plugin/my_voter_script.js', array('jquery') );
05    wp_localize_script( 'my_voter_script', 'myAjax', array( 'ajaxurl' => admin_url( 'admin-ajax.php' )));       
07    wp_enqueue_script( 'jquery' );
08    wp_enqueue_script( 'my_voter_script' );
10 }

This is the WordPress way of including JavaScript files. First, we register the JavaScript file, so that WordPress knows about it (so make sure to create the file and place it somewhere in the plugin). The first argument to the wp_register_script() function is the “handle” of our script, which is a unique identifier. The second is the location of the script. The third argument is an array of dependencies. Our script will require jQuery, so I have added it as a dependency. WordPress has already registered jQuery, so all we needed to add was its handle. For a detailed list of the scripts that WordPress registers, look at the WordPress Codex.

Localizing the script is not strictly necessary, but it is a good way to define variables for our script to use. We need to use the URL of our admin-ajax.php file, but because this is different for every domain, we need to pass it to the script. Instead of hard-coding it in, let’s use the wp_localize_script() function. We add the script handle as the first argument, an object name as the second argument, and we can add object members as an array in the third parameter. What this all boils down to is that, in our my_voter_script.js file, we will be able to use myAjax.ajaxurl, which contains the URL of our admin-ajax.php file.

Once our scripts have been registered, we can actually add them to our pages by enqueueing them. We don’t need to follow any particular order; WordPress will use the correct order based on the dependencies.

Once that’s done, in the my_voter_script.js JavaScript file, paste the following code:

01 jQuery(document).ready( function() {
03    jQuery(".user_vote").click( function() {
04       post_id = jQuery(this).attr("data-post_id")
05       nonce = jQuery(this).attr("data-nonce")
07       jQuery.ajax({
08          type : "post",
09          dataType : "json",
10          url : myAjax.ajaxurl,
11          data : {action: "my_user_vote", post_id : post_id, nonce: nonce},
12          success: function(response) {
13             if(response.type == "success") {
14                jQuery("#vote_counter").html(response.vote_count)
15             }
16             else {
17                alert("Your vote could not be added")
18             }
19          }
20       })  
22    })
24 })

Let’s go back to the basics. This would be a good time for those of us who are new to AJAX to grasp what is going on. When the user clicks the vote button without using JavaScript, they open a script and send it some data using the GET method (the query string). When JavaScript is used, it opens the page for them. The script is given the URL to navigate to and the same parameters, so apart from some minor things, from the point of view of the script being run, there is no difference between the user clicking the link and an AJAX request being sent.

Using this data, the my_user_vote() function defined in our plugin should process this and then send us back the JSON-encoded result array. Because we have specified that our response data should be in JSON format, we can use it very easily just by using the response as an object.

In our example, all that happens is that the vote counter changes its value to show the new vote count. In reality, we should also include some sort of success message to make sure the user gets obvious feedback. Also, the alert box for a failure will be very ugly; feel free to tweak it to your liking.


This concludes our quick tutorial on using AJAX in WordPress. A lot of functionality could still be added, but the main point of this article was to show how to properly add AJAX functionality itself to plugins. To recap, the four steps involved are:

  1. Make the AJAX call;
  2. Create the function, which will handle the action;
  3. Add the function to the hook, which was dynamically created for us with the action parameter;
  4. Create success handlers as needed.

As mentioned, make sure everything works well without JavaScript before adding it, so that the website degrades properly for people who have disabled it.

Keep in mind that, because we are using hooks, we can also tie existing WordPress functions to our AJAX calls. If you already have an awesome voting function, you could just tie it in after the fact by attaching it to the action. This, and the ease with which we can differentiate between logged-in states, make WordPress’ AJAX-handling system very powerful indeed.


jQuery code hinting in Notepad++

’m sure if you’re reading this then you, like me, are a fan of Notepad++ for all your text-editing needs. I often use Notepad++ for editing JavaScript, and I often have the auto-completion feature enabled, which is great, but not so great when the file you’re working on is full of jQuery methods. Fortunately, it’s possible to define your own languages, auto-complete method signatures and all.

So that’s what I’ve done. Now, obviously jQuery isn’t a language in its own right, so I’ve tried to bring the normal Notepad++ JavaScript styles into this as well. There are also a couple of notable exceptions. I’ve not included the live or die methods, due to the fact that they are deprecated as of jQuery 1.7. I’ve also not managed to find a reliable way of including any selectors, and I have’t yet added any methods that don’t belong to jQuery itself (such as those of the new Callback object).

But other than those small omissions, I personally think this is quite useful and will be using it myself. Feel free to comment if you notice anything I’ve missed out or got wrong.

jquery.zip – Contains userDefineLang_jQuery.xml and jquery.xml


  1. Download the .zip file
  2. Unzip the file you just downloaded
  3. Open your Notepad++ installation directory, and find userDefineLang.xml
  4. Open that file for editing. If you don’t have any user defined languages saved already, you can simply rename userDefineLang_jQuery.xml to userDefineLang.xml and copy it into the Notepad++ installation directory. If you do have other custom languages, you need to merge the existing file and the new jQuery one. Simply copy the contents of userDefineLang_jQuery.xml and paste it into the bottom of userDefineLang.xml, and be sure to remove the extra </NotepadPlus><NotepadPlus> at the point where you pasted in the new content.
  5. Save and close, and open up the plugins/APIs directory.
  6. Copy jquery.xml into this folder, and start up Notepad++
  7. You should be able to select “jQuery” from the bottom of the Language menu. Great, you’re done! If you don’t see it, continue to the next step…
  8. If jQuery is not available in your language list, click on “View”, then “User-Defined Dialogue…”
  9. When the User-Defined Dialogue opens, click “Import” and select the userDefineLang.xml file.
  10. Close the User-Defined Dialogue and restart Notepad++. jQuery should now be an option in the Language menu.

Source: http://www.jamesallardice.com/2011/11/26/jquery-code-hinting-in-notepad/

Zen Coding: A Speedy Way To Write HTML/CSS Code

In this post we present a new speedy way of writing HTML code using CSS-like selector syntax — a handy set of tools for high-speed HTML and CSS coding. It was developed by our author Sergey Chikuyonok and released for Smashing Magazine and its readers.

How much time do you spend writing HTML code: all of those tags, attributes, quotes, braces, etc. You have it easier if your editor of choice has code-completion capabilities, but you still do a lot of typing.

We had the same problem in JavaScript world when we wanted to access a specific element on a Web page. We had to write a lot of code, which became really hard to support and reuse. And then JavaScript frameworks came along, which introduced CSS selector engines. Now, you can use simple CSS expressions to access DOM elements, which is pretty cool.

But what if you could use CSS selectors not just to style and access elements, but to generate code? For example, what if you could write this…


…and see this as the output?

<div id="content">

Today, we’ll introduce you to Zen Coding, a set of tools for high-speed HTML and CSS coding. Originally proposed by Vadim Makeev (article in Russian) back in April 2009, it has been developed by yours truly (i.e. me) for the last few months and has finally reached a mature state. Zen Coding consists of two core components: an abbreviation expander (abbreviations are CSS-like selectors) and context-independent HTML-pair tag matcher. Watch this demo video to see what they can do for you.