wordpress json custom taxonomy problem

I created 1 custom post type with 2 custom taxonomy. Installed http://wordpress.org/extend/plugins/json-api/ and tried to reach result with:
http://example.com/api/get_recent_posts?dev=1&post_type=myposttype

well it gives me custom posts but not giving those post’s custom taxonomies

Read More

“categories”: [],
“tags”: [],

How can i query custom taxonomies with json api?

Actually i am trying to create a simple iphone app with jquery mobile + phonegap. Maybe you know a better way then json api?

Related posts

Leave a Reply

3 comments

  1. 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.

    // 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 add following to your theme’s functions.php

    // 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';
    }
    

    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

  2. I have just tested this (I am doing the exact same thing for a project) and it worked fine for me.

    Added tags to a custom post type, ran this:

    http://example.com/?json=get_recent_posts&post_type=custompost
    

    And the json file looked like so:

    {
        "status":"ok",
        "count":10,
        "count_total":11,
        "pages":2,
        "posts":[
        {
            "id":80,
            "type":"custompost",
            "slug":"custompost-12",
            "url":"http://example.com/?custompost=custompost-12",
            "status":"publish",
            "title":"custompost 12",
            "title_plain":"custompost 12",
            "content":"<p>12</p>n",
            "excerpt":"12",
            "date":"2011-05-26 12:32:59",
            "modified":"2011-05-26 13:54:03",
            "categories":[],
            "tags":[
                {"id":4,"slug":"tag1","title":"tag1","description":"","post_count":10},
                {"id":6,"slug":"tag2","title":"tag2","description":"","post_count":6},
                etc...
    

    Are you sure that you added the custom taxonomies to the Custom Post Type?

    add_action( 'init', 'create_my_post_types' );   
    function create_my_post_types() {
        register_post_type( 'custompost',
            array(
                ...
                'taxonomies' => array( 'category', 'post_tag' ),
                ...etc
    

    If you are looking to do something more complex, like define a hierarchical structure of custom taxonomies, this link might help you.