I’m attempting to build out a simple TODO plugin using Backbone and have run into an issue with the AJAX API. In order to get the correct AJAX call back you have to pass in the “action” parameter like this:
admin-ajax.php?action=get_todos
which works fine for the GET method in Backbone. However, when using DELETE Backbone will use a URL like this by default:
admin-ajax.php?action=get_todos/9
where “9” is the ID of the todo being deleted. By adding on this ID it breaks the AJAX call on the WordPress side. I can manually override the URLs for each of the methods but I’d like to know if there’s a more elegant way to get the AJAX API to work with Backbone.
I’ve created a demo plugin which shows the specific issue I’ve run in to. Load the settings page and click on any of the X’s while watching your Network inspector to see the 0 value AJAX results coming from WordPress.
https://github.com/hereswhatidid/wordpress-todo-backbone-demo
You need to override the
Backbone.sync
function to change the URL used for the AJAX call. You can learn from the plugin wp-backbone does this and more. Below you can see from it how it changes all the actions into eitherPOST
orGET
, create the parameters, add theaction
parameter and more.You don’t need to override
Backbone.sync
since Backbone.sync will override its own $.ajax request with the parameters you pass as options. See this link for a walkthrough of howBackbone.sync
works internally: http://backbonejs.org/docs/backbone.html#section-141You can add something like the following in your model or collection:
And then process the data as regular post data on the server side (with your model/models in
$_POST['payload']
).This method does:
emulateJSON
param: it makes for a leaner syntax on both the frontend and backend. You would have to use JSON.stringify on the ‘data’ param otherwise.$_POST['payload']
then contains an array of all your Backbone data.