Last active
August 29, 2015 14:01
-
-
Save ralphcrisostomo/0e15b7f80ce7e9b9b672 to your computer and use it in GitHub Desktop.
I would have done it as following, I am sure experts here will have a better way but following is what I could come up with in hurry. First create your controller file in your theme directory (or any other if you like) with the following content. For this example the file name is korkmaz.php UPDATE 1: Please replace the previous korkmaz.php beca…
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// Add a custom controller | |
add_filter('json_api_controllers', 'add_my_controller'); | |
function add_my_controller($controllers) { | |
$controllers[] = 'Korkmaz'; | |
return $controllers; | |
} | |
// Register the source file for our controller | |
add_filter('json_api_korkmaz_controller_path', 'korkmaz_controller_path'); | |
function korkmaz_controller_path($default_path) { | |
return get_stylesheet_directory() . '/korkmaz.php'; | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// most of the functions here are rewrite of json-api functions | |
class JSON_API_Korkmaz_Controller { | |
public function get_recent_posts() { | |
global $json_api; | |
$posts = $json_api->introspector->get_posts(); | |
foreach ($posts as $jpost) { | |
$this->add_taxonomies( $jpost ); | |
} | |
return $this->posts_result($posts); | |
} | |
protected function posts_result($posts) { | |
global $wp_query; | |
return array( | |
'count' => count($posts), | |
'count_total' => (int) $wp_query->found_posts, | |
'pages' => $wp_query->max_num_pages, | |
'posts' => $posts | |
); | |
} | |
protected function add_taxonomies( $post ) { | |
$taxonomies = get_object_taxonomies( $post->type ); | |
foreach ($taxonomies as $tax) { | |
$post->$tax = array(); | |
$terms = wp_get_object_terms( $post->id, $tax ); | |
foreach ( $terms as $term ) { | |
$post->{$tax}[] = $term->name; | |
} | |
} | |
return true; | |
} | |
public function get_taxonomy_posts() { | |
global $json_api; | |
$taxonomy = $this->get_current_taxonomy(); | |
if (!$taxonomy) { | |
$json_api->error("Not found."); | |
} | |
$term = $this->get_current_term( $taxonomy ); | |
$posts = $json_api->introspector->get_posts(array( | |
'taxonomy' => $taxonomy, | |
'term' => $term->slug | |
)); | |
foreach ($posts as $jpost) { | |
$this->add_taxonomies( $jpost ); | |
} | |
return $this->posts_object_result($posts, $taxonomy, $term); | |
} | |
protected function get_current_taxonomy() { | |
global $json_api; | |
$taxonomy = $json_api->query->get('taxonomy'); | |
if ( $taxonomy ) { | |
return $taxonomy; | |
} else { | |
$json_api->error("Include 'taxonomy' var in your request."); | |
} | |
return null; | |
} | |
protected function get_current_term( $taxonomy=null ) { | |
global $json_api; | |
extract($json_api->query->get(array('id', 'slug', 'term_id', 'term_slug'))); | |
if ($id || $term_id) { | |
if (!$id) { | |
$id = $term_id; | |
} | |
return $this->get_term_by_id($id, $taxonomy); | |
} else if ($slug || $term_slug) { | |
if (!$slug) { | |
$slug = $term_slug; | |
} | |
return $this->get_term_by_slug($slug, $taxonomy); | |
} else { | |
$json_api->error("Include 'id' or 'slug' var for specifying term in your request."); | |
} | |
return null; | |
} | |
protected function get_term_by_id($term_id, $taxonomy) { | |
$term = get_term_by('id', $term_id, $taxonomy); | |
if ( !$term ) return null; | |
return new JSON_API_Term( $term ); | |
} | |
protected function get_term_by_slug($term_slug, $taxonomy) { | |
$term = get_term_by('slug', $term_slug, $taxonomy); | |
if ( !$term ) return null; | |
return new JSON_API_Term( $term ); | |
} | |
protected function posts_object_result($posts, $taxonomy, $term) { | |
global $wp_query; | |
return array( | |
'count' => count($posts), | |
'pages' => (int) $wp_query->max_num_pages, | |
'taxonomy' => $taxonomy, | |
'term' => $term, | |
'posts' => $posts | |
); | |
} | |
} | |
// Generic rewrite of JSON_API_Tag class to represent any term of any type of taxonomy in WP | |
class JSON_API_Term { | |
var $id; // Integer | |
var $slug; // String | |
var $title; // String | |
var $description; // String | |
function JSON_API_Term($term = null) { | |
if ($term) { | |
$this->import_wp_object($term); | |
} | |
} | |
function import_wp_object($term) { | |
$this->id = (int) $term->term_id; | |
$this->slug = $term->slug; | |
$this->title = $term->name; | |
$this->description = $term->description; | |
$this->post_count = (int) $term->count; | |
} |
Now goto Json API settings page and enable your korkmaz controller.
Now you can access your custom post types with all of the associated taxonomies at the following url: http://example.com/api/korkmaz/get_recent_posts/?post_type=myposttype
You can query any type of taxonomy (including custom taxonomies) using the following example: http://example.com/api/korkmaz/get_taxonomy_posts/?taxonomy=my_custom_taxonomy&slug=my_term_slug
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
I would have done it as following, I am sure experts here will have a better way but following is what I could come up with in hurry.
First create your controller file in your theme directory (or any other if you like) with the following content. For this example the file name is korkmaz.php
UPDATE 1: Please replace the previous korkmaz.php because extending introspector was dangerous many unwanted functions were exposed via URI. Now we have a new JSON_API_Korkmaz_Controller class which does not extend any other class and We have removed the JSON_API_CustomPost class.
UPDATE 2: Now supports querying custom taxonomies, see the example at the bottom. Includes new model class JSON_API_Term to represent term of any type of taxonomy.