JSON API allows you to retrieve and manipulate WordPress content using HTTP requests. There are three main goals:
Provide a simple, consistent external interface
Create a stable, understandable internal implementation
Enable new types of extensions for WordPress
This plugin was created at The Museum of Modern Art for the weblog Inside/Out, which is served from Ruby on Rails. Instead of reimplementing the site templates as a WordPress theme, we opted for a Rails front-end that displays content served from a WordPress back-end. JSON API provides the necessary interface for retrieving content and accepting comment submissions.
See the Other Notes section for the complete documentation.
Installation
Upload the json-api folder to the /wp-content/plugins/ directory or install directly through the plugin installer.
Activate the plugin through the 'Plugins' menu in WordPress or by using the link provided by the plugin installer.
Requests use a simple REST-style HTTP GET or POST. To invoke the API, include a non-empty query value for json in the URL.
JSON API operates in two modes:
Implicit mode is triggered by setting the json query var to a non-empty value on any WordPress page. The content that would normally appear on that page is returned in JSON format.
Explicit mode is triggered by setting json to a known method string. See Section 2: Request methods for a complete method listing.
Further reading
See Section 3: Request arguments for more information about request arguments to modify the response.
1.2. Controllers
The 1.0 release of JSON API introduced a modular controller system. This allows developers to flexibly add features to the API and give users more control over which methods they have enabled.
The Core controller
Most of the methods available prior to version 1.0 have been moved to the Core controller. The two exceptions are submit_comment and create_post which are now available from the Respond and Posts controllers, respectively. The Core controller is the only one enabled by default. All other functionality must be enabled from the JSON API Settings page (under Settings in the WordPress admin menu).
Specifying a controller
There are a few ways of specifying a controller, depending on how you are calling the API:
http://www.example.org/?json=get_recent_posts (core controller is implied, method is get_recent_posts)
http://www.example.org/api/info/ (core controller is implied)
http://www.example.org/api/core/get_category_posts/ (core controller can also be explicitly specified)
Legacy compatibility
JSON API retains support for its pre-1.0 methods. For example, if you invoke the method create_post without a controller specified, the Posts controller is chosen instead of Core.
Available controllers
The current release includes three controllers: Core, Posts, and Respond. Developers are encouraged to suggest or submit additional controllers.
Further reading
See Section 2: Request methods for a complete reference of available controllers and methods. For documentation on extending JSON API with new controllers see Section 5.2: Developing JSON API controllers.
1.3. Responses
The standard response format for JSON API is (as you may have guessed) JSON.
Here is an example response from http://localhost/wordpress/?json=1 called on a default WordPress installation (formatted for readability):
{
"status": "ok",
"count": 1,
"count_total": 1,
"pages": 1,
"posts": [
{
"id": 1,
"type": "post",
"slug": "hello-world",
"url": "http:\/\/localhost\/wordpress\/?p=1",
"title": "Hello world!",
"title_plain": "Hello world!",
"content": "<p>Welcome to WordPress. This is your first post. Edit or delete it, then start blogging!<\/p>\n",
"excerpt": "Welcome to WordPress. This is your first post. Edit or delete it, then start blogging!\n",
"date": "2009-11-11 12:50:19",
"modified": "2009-11-11 12:50:19",
"categories": [],
"tags": [],
"author": {
"id": 1,
"slug": "admin",
"name": "admin",
"first_name": "",
"last_name": "",
"nickname": "",
"url": "",
"description": ""
},
"comments": [
{
"id": 1,
"name": "Mr WordPress",
"url": "http:\/\/wordpress.org\/",
"date": "2009-11-11 12:50:19",
"content": "<p>Hi, this is a comment.<br \/>To delete a comment, just log in and view the post's comments. There you will have the option to edit or delete them.<\/p>\n",
"parent": 0
}
],
"comment_count": 1,
"comment_status": "open"
}
]
}
2. Request methods
Request methods are available from the following controllers:
Core controller - basic introspection methods
Posts controller - data manipulation methods for posts
Returns an array of recent posts. You can invoke this from the WordPress home page either by setting json to a non-empty value (i.e., json=1) or from any page by setting json=get_recent_posts.
Optional arguments
count - determines how many posts per page are returned (default value is 10)
page - return a specific page number from the results
Invoking the JSON API implicitly (i.e., ?json=1) on a post URL
id or post_id - set to the post's ID
slug or post_slug - set to the post's URL slug
Optional arguments
post_type - used to retrieve custom post types
Response
{
"status": "ok",
"post": { ... }
}
Method: get_page
Returns a single page object.
One of the following is required
Invoking the JSON API implicitly (i.e., ?json=1) on a page URL
id or page_id - set to the page's ID
slug or page_slug - set to the page's URL slug
Optional arguments
children - set to a non-empty value to include a recursive hierarchy of child pages
post_type - used to retrieve custom post types
Response
{
"status": "ok",
"page": { ... }
}
Method: get_date_posts
Returns an array of posts/pages in a specific date archive (by day, month, or year).
One of the following is required
Invoking the JSON API implicitly (i.e., ?json=1) on a date archive page
date - set to a date in the format YYYY or YYYY-MM or YYYY-MM-DD (non-numeric characters are stripped from the var, so YYYYMMDD or YYYY/MM/DD are also valid)
Optional arguments
count - determines how many posts per page are returned (default value is 10)
page - return a specific page number from the results