WordPress JSON benutzerdefinierte Taxonomie Problem

7

Ich habe 1 benutzerdefinierten Beitragstyp mit 2 benutzerdefinierten Taxonomien erstellt. Installierte http://wordpress.org/extend/plugins/json-api/ und versuchte, das Ergebnis zu erreichen mit: http://example.com/api/get_recent_posts?dev=1&post_type=myposttype

Nun, es gibt mir benutzerdefinierte Beiträge, aber nicht die benutzerdefinierten Taxonomien dieser Beiträge

"Kategorien": [], "Tags": [],

Wie kann ich benutzerdefinierte Taxonomien mit json api abfragen?

Eigentlich versuche ich eine einfache iPhone App mit jquery mobile + phonegap zu erstellen. Vielleicht kennen Sie einen besseren Weg als json api?

Ünsal Korkmaz
quelle

Antworten:

10

Ich hätte es wie folgt gemacht: Ich bin sicher, dass Experten hier einen besseren Weg haben werden, aber das Folgende ist das, was ich mir in Eile einfallen lassen könnte.

Erstellen Sie zuerst Ihre Controller-Datei in Ihrem Themenverzeichnis (oder einem anderen, wenn Sie möchten) mit dem folgenden Inhalt. In diesem Beispiel lautet der Dateiname korkmaz.php

UPDATE 1: Bitte ersetzen Sie die vorherige Datei korkmaz.php, da das Erweitern des Introspektors gefährlich war. Viele unerwünschte Funktionen wurden über URI verfügbar gemacht. Jetzt haben wir eine neue JSON_API_Korkmaz_Controller Klasse , die nicht erstreckt andere Klasse und wir haben die JSON_API_CustomPost Klasse entfernt .

UPDATE 2: Unterstützt jetzt das Abfragen benutzerdefinierter Taxonomien (siehe Beispiel unten). Enthält die neue Modellklasse JSON_API_Term zur Darstellung von Begriffen jeder Art von Taxonomie.

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

}

Fügen Sie nun Folgendes zur Datei functions.php Ihres Themas hinzu

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

Gehen Sie nun zur Seite mit den Json-API-Einstellungen und aktivieren Sie Ihren Korkmaz-Controller.

Jetzt können Sie unter der folgenden URL auf Ihre benutzerdefinierten Beitragstypen mit allen zugehörigen Taxonomien zugreifen: http://example.com/api/korkmaz/get_recent_posts/?post_type=myposttype

Sie können jede Art von Taxonomie (einschließlich benutzerdefinierter Taxonomien) anhand des folgenden Beispiels abfragen: http://example.com/api/korkmaz/get_taxonomy_posts/?taxonomy=my_custom_taxonomy&slug=my_term_slug

Hameedullah Khan
quelle
Gut gemacht! Das funktioniert wirklich gut. Wenn jemand daran interessiert ist, wie man "posts_per_page" oder "offset" oder etwas anderes hinzufügt, muss man es nur dem Array hinzufügen, das mit "get_posts ()" in den Funktionen gesendet wird. Also, was ich getan habe, war im Grunde, wenn $ _GET (['post_per_page']) gesetzt und nicht leer war, habe ich es einfach dem Array hinzugefügt
envysea
brillante Lösung :)
Selten P.
staging.thewindow.barneys.com/api_v2/city/get_taxonomy_posts/… Hallo, ich bekomme das , als ich oben versuchte, was das Problem sein könnte, bitte helfen Sie
Melvin
1

Ich habe das gerade getestet (ich mache genau das Gleiche für ein Projekt) und es hat gut für mich funktioniert.

Tags zu einem benutzerdefinierten Beitragstyp hinzugefügt, führte Folgendes aus:

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

Und die JSON-Datei sah so aus:

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

Sind Sie sicher, dass Sie die benutzerdefinierten Taxonomien zum benutzerdefinierten Beitragstyp hinzugefügt haben?

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

Wenn Sie etwas Komplexeres tun möchten, z. B. eine hierarchische Struktur benutzerdefinierter Taxonomien definieren, kann Ihnen dieser Link helfen .

Edzillion
quelle
Downvotes ohne Kommentare? Was mache ich hier genau falsch?
Edzillion
/?json=get_recent_posts&post_type=customposthat für mich gearbeitet, danke!
IvanRF