wordpress json vấn đề phân loại tùy chỉnh


7

Tôi đã tạo 1 loại bài đăng tùy chỉnh với 2 phân loại tùy chỉnh. Đã cài đặt http://wordpress.org/extend/plugins/json-api/ và cố gắng đạt được kết quả với: http://example.com/api/get_recent_posts?dev=1&post_type=myposttype

tốt, nó cung cấp cho tôi các bài đăng tùy chỉnh nhưng không cung cấp cho các phân loại tùy chỉnh của bài đăng đó

"danh mục": [], "thẻ": [],

Làm thế nào tôi có thể truy vấn các nguyên tắc phân loại tùy chỉnh với json api?

Trên thực tế tôi đang cố gắng tạo một ứng dụng iphone đơn giản với jquery mobile + phonegap. Có lẽ bạn biết một cách tốt hơn sau đó json api?

Câu trả lời:


10

Tôi sẽ làm điều đó như sau, tôi chắc chắn các chuyên gia ở đây sẽ có cách tốt hơn nhưng sau đây là những gì tôi có thể đưa ra vội vàng.

Trước tiên hãy tạo tệp điều khiển của bạn trong thư mục chủ đề của bạn (hoặc bất kỳ tệp nào khác nếu bạn muốn) với nội dung sau. Trong ví dụ này, tên tệp là korkmaz.php

CẬP NHẬT 1: Vui lòng thay thế korkmaz.php trước đó vì mở rộng introspector là nguy hiểm, nhiều chức năng không mong muốn đã bị lộ qua URI. Bây giờ chúng ta có một lớp JSON_API_Korkmaz_Controller mớikhông mở rộng bất kỳ lớp khác và Chúng tôi đã loại bỏ các lớp JSON_API_CustomPost .

CẬP NHẬT 2: Bây giờ hỗ trợ truy vấn các nguyên tắc phân loại tùy chỉnh, xem ví dụ ở phía dưới. Bao gồm lớp mô hình mới JSON_API_Term để thể hiện thuật ngữ của bất kỳ loại phân loại nào.

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

}

Bây giờ thêm sau vào chức năng của chủ đề của bạn.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';
}

Bây giờ hãy cài đặt trang cài đặt API Json và bật trình điều khiển korkmaz của bạn.

Bây giờ bạn có thể truy cập các loại bài đăng tùy chỉnh của mình với tất cả các nguyên tắc phân loại được liên kết tại url sau: http://example.com/api/korkmaz/get_recent_posts/?post_type=myposttype

Bạn có thể truy vấn bất kỳ loại phân loại nào (bao gồm cả phân loại tùy chỉnh) bằng ví dụ sau: http://example.com/api/korkmaz/get_taxonomy_posts/?taxonomy=my_custom_taxonomy&slug=my_term_slug


Bạn đã làm rất tốt! Điều này hoạt động thực sự tốt. Nếu bất cứ ai quan tâm đến cách thêm "post_per_page" hoặc "offset" hoặc bất cứ điều gì khác, bạn chỉ cần thêm nó vào mảng được gửi với "get_posts ()" trong các hàm. Vì vậy, những gì tôi đã làm về cơ bản là nếu $ _GET (['post_per_page']) được đặt và không trống, tôi chỉ cần thêm nó vào mảng
envysea

giải pháp tuyệt vời :)
Rares P.

staging.thewindow.barneys.com/api_v2/city/get_taxonomy_posts/... hi tôi đang nhận được điều này khi tôi đã cố gắng trên, những gì có thể là vấn đề, xin vui lòng giúp đỡ
Melvin

1

Tôi vừa thử nghiệm điều này (tôi đang làm chính xác điều tương tự cho một dự án) và nó hoạt động tốt với tôi.

Đã thêm thẻ vào loại bài đăng tùy chỉnh, chạy này:

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

Và tập tin json trông giống như vậy:

{
    "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...

Bạn có chắc chắn rằng bạn đã thêm các nguyên tắc phân loại tùy chỉnh vào Loại bài đăng tùy chỉnh không?

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

Nếu bạn đang tìm cách làm một cái gì đó phức tạp hơn, như xác định cấu trúc phân cấp của các nguyên tắc phân loại tùy chỉnh, liên kết này có thể giúp bạn .


downvote không có ý kiến? whaddid tôi làm sai ở đây chính xác?
edzillion

/?json=get_recent_posts&post_type=custompostlàm việc cho tôi, cảm ơn!
IvanRF

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.