Es ist vielleicht neu für Sie, aber es gibt eine nette Ressource namens Quotes on Design, die interessante Zitate *über Design* bereitstellt, kuratiert von unserem eigenen Chris Coyier.
Bis zu diesem Zeitpunkt verwendete Quotes on Design (QoD) ein wenig benutzerdefinierten Code, um die WordPress-Datenbank abzufragen und Zitate bereitzustellen. Dies wurde für die Website selbst und für ihre API verwendet, um die Nutzung auf externen Websites zu ermöglichen. Angesichts der Begeisterung rund um die bevorstehende WordPress JSON REST API dachten wir, es wäre lustig, die Website neu zu erstellen, um die WP-API anstelle unseres eigenen benutzerdefinierten Codes zu verwenden.

Hier ist, was wir behandeln werden
- Einrichten der API
- Abfragen der API, um ein zufälliges Zitat abzurufen
- Etwas Interessantes mit diesem Zitat machen
- Anpassen der API, um nicht verwendete Informationen zu entfernen
- Verwenden der neuen QoD JSON REST API, um nette Zitate für Ihre Website abzurufen
Warnung! Die WP JSON REST API befindet sich noch in der Entwicklung, und die Abfrageschnittstelle kann sich bis zur endgültigen Version ändern. Wir werden unser Bestes tun, um dieses Tutorial zu aktualisieren, wenn sich etwas ändert. Wir würden nicht empfehlen, die WP-API noch für extrem wichtige Websites zu verwenden, es sei denn, Sie sind ein ultra-professioneller WordPress-Entwickler, in diesem Fall können Sie diesen Artikel wahrscheinlich überspringen, richtig?
Installieren der WP-API
Die WP-API wird als Plugin, im WordPress.org Plugin-Repository verfügbar, ausgeliefert. Das bedeutet, Sie können
- Öffnen Sie Ihr WordPress-Dashboard
- Gehen Sie zu Plugins → Neu hinzufügen
- Suchen Sie nach "WP API"
- Installieren, aktivieren, und Sie sind fertig
Lassen Sie uns eintauchen!
Abrufen eines zufälligen Beitrags
Für QoD wollten wir der Homepage eine einfache Funktionalität hinzufügen: Klicke auf einen Button und ein zufälliges Zitat wird von der API neu geladen.
Die WP-API enthält mehrere Endpunkte, die Sie zum Lesen von Informationen aus der Datenbank verwenden können, darunter Metadaten, Anhänge, Benutzer – im Grunde ist alles, was in der Standard-WP-Datenbank gespeichert ist, bis zu einem gewissen Grad zugänglich.
Für unseren Anwendungsfall mussten wir nur einen zufälligen Beitrag abrufen. Wir begannen mit dem Endpunkt /wp-json/posts, der im Wesentlichen einem WP_Query entspricht, wenn Sie mit der WordPress-Entwicklung vertraut sind. Hier ist die Basis-Endpunkt-URL
http://quotesondesign.com/wp-json/posts
Das Besuchen dieser URL ohne Abfrageparameter gibt die Standardliste der Beiträge im JSON-Format zurück – im Wesentlichen dieselbe Liste von Beiträgen, die Sie auf der Blog-Seite sehen würden
[
{
"ID": 2328,
"content": "<p>Everything we do communicates.</p>\n",
/* ...snip most of the fields... */
"title": "Pete Episcopo",
"type": "post"
},
{
"ID": 2326,
"content": "<p>The only “intuitive” interface is the nipple. After that it’s all learned.</p>\n",
/* ...snip most of the fields... */
"title": "Bruce Ediger",
"type": "post"
},
{
"ID": 2323,
"content": "<p>Only show work you like, or you’ll end up being hired to do things you don’t like.</p>\n",
/* ...snip most of the fields... */
"title": "Victoria Pater",
"type": "post"
}
]
Beachten Sie, dass die IDs der Zitate sequenziell sind: Sie stellen die drei neuesten Zitate auf der Website dar.
Für unser Design benötigen wir nur einen Beitrag und möchten, dass er zufällig ausgewählt wird. Wir müssen die Ergebnisse *filtern*, und das können wir mit denselben Argumenten tun, die wir bei Aufrufen von WP_Query oder get_posts verwenden würden.
In diesem Fall benötigen wir zwei Argumente
- Das Argument
orderbymussrandsein, um einen zufälligen Beitrag abzurufen - Das Argument
posts_per_pagemuss1sein, um die Ergebnisse auf einen einzigen Beitrag zu beschränken
Sehen Sie eine Liste aller verfügbaren Parameter im WP_Query-Codex-Eintrag.
Wir übergeben diese Argumente über die URL, indem wir die Abfragevariable filter als Array verwenden, wie folgt
http://quotesondesign.com/wp-json/posts?filter[orderby]=rand&filter[posts_per_page]=1
Hier ist, was wir von der WP-API mit unserer gefilterten URL erhalten
[
{
"ID": 2153,
"author": {
"ID": 2,
"URL": "https://css-tricks.de",
"avatar": "http://0.gravatar.com/avatar/8081b26e05bb4354f7d65ffc34cbbd67?s=96",
"description": "",
"first_name": "Chris",
"last_name": "Coyier",
/* ...snip some fields... */
},
"comment_status": "closed",
"content": "<p>Wonderfully designed > beautifully designed. Any day.</p>\n",
"date": "2013-06-27T08:34:04",
"date_gmt": "2013-06-27T16:34:04",
"date_tz": "Etc/GMT-8",
"excerpt": "<p>Wonderfully designed > beautifully designed. Any day.</p>\n",
"featured_image": null,
"format": "standard",
"guid": "http://quotesondesign.com/?p=2153",
"link": "http://quotesondesign.com/daniel-burka-2/",
"menu_order": 0,
"meta": {
/* ...snip some fields... */
},
"modified": "2013-06-27T08:34:04",
"modified_gmt": "2013-06-27T16:34:04",
"modified_tz": "Etc/GMT-8",
"parent": null,
"ping_status": "closed",
"slug": "daniel-burka-2",
"status": "publish",
"sticky": false,
"terms": {
/* ...snip some fields... */
},
"title": "Daniel Burka",
"type": "post"
}
]
Jedes Mal, wenn wir unsere gefilterte URL aktualisieren, erhalten wir ein anderes Zitat. Großartig!
Sie werden bemerken, dass ich in der letzten Codezeile mehr von der WP-API JSON-Antwort eingefügt habe. Dort gibt es *sehr* viele Informationen – selbst wenn ich die Metadaten, den Autor und die Begriffe ausblende.
Für unsere Zwecke benötigen wir die meisten dieser Informationen nicht. Außerdem ist es bandbreiteneffizienter, nicht alles einzubeziehen – also schneiden wir es aus!
Felder aus der JSON-Antwort entfernen
Ein Leser schrieb, um zu sagen, dass Sie dies alles nicht mehr tun müssen, da es ein _filter-Argument in der API gibt.
Wir müssen die von der API zurückgegebenen Daten filtern, und glücklicherweise bietet uns die WP-API genau den Filter, den wir benötigen, namens json_prepare_post. Um ihn zu verwenden, erstellen wir ein neues Plugin mit dem folgenden Code-Snippet
function qod_remove_extra_data( $data, $post, $context ) {
// We only want to modify the 'view' context, for reading posts
if ( $context !== 'view' || is_wp_error( $data ) ) {
return $data;
}
// Here, we unset any data we don't want to see on the front end:
unset( $data['author'] );
unset( $data['status'] );
// continue unsetting whatever other fields you want
return $data;
}
add_filter( 'json_prepare_post', 'qod_remove_extra_data', 12, 3 );
Durch die Aktivierung unseres Plugins erhalten wir eine viel kleinere JSON-Antwort, die nur die Informationen enthält, die wir für unseren Anwendungsfall benötigen
[
{
"ID": 686,
"content": "<p>My secret is being not terrible at a lot of things. </p>\n",
"link": "http://quotesondesign.com/moby/",
"title": "Moby"
}
]
Felder zur JSON-Antwort hinzufügen
Nachdem wir nun unnötige Informationen aus den JSON-Daten entfernt haben, ist es nur passend, dass wir unsere eigenen benutzerdefinierten Felder hinzufügen, um im Gleichgewicht zu bleiben. Wachs rein, wachs raus.
Einige der Zitate haben ein benutzerdefiniertes Meta-Feld namens "Source", das Chris verwendet, um auf die ursprüngliche Quelle des Zitats zu verlinken, falls es online verfügbar ist. Fügen wir diese Metadaten der JSON-Antwort hinzu, indem wir denselben json_prepare_post-Filter verwenden, den wir zuvor zum *Entfernen* von Daten verwendet haben. Im selben Plugin fügen wir die folgende Funktion hinzu
function qod_add_custom_meta_to_posts( $data, $post, $context ) {
// We only want to modify the 'view' context, for reading posts
if ( $context !== 'view' || is_wp_error( $data ) ) {
return $data;
}
$source = get_post_meta( $post['ID'], 'Source', true );
if ( ! empty( $source ) ) {
$data['custom_meta'] = array( 'Source' => $source );
}
return $data;
}
add_filter( 'json_prepare_post', 'qod_add_custom_meta_to_posts', 10, 3 );
Mit diesem zusätzlichen Feld hier ist eine JSON-Antwort
[
{
"ID": 2039,
"content": "<p>Communication that doesn’t take a chance doesn’t stand a chance.</p>\n",
"custom_meta": {
"Source": "<a href="http://altpick.com/spot/segura/segura.php">article</a>"
},
"link": "http://quotesondesign.com/carlos-segura/",
"title": "Carlos Segura"
}
]
Nachdem wir nun *genau* die benötigten Informationen haben, verwenden wir die JSON-API, um ein zufälliges Zitat über AJAX auf der Homepage zu laden.
Daten von der JSON-API abrufen und verwenden
Auf der Homepage von QoD gibt es einen Button, um ein weiteres Zitat abzurufen

Mit jQuery-Event-Handlern und der Funktion jQuery.ajax holen wir ein Zitat und aktualisieren das HTML mit dem folgenden Snippet
jQuery( function( $ ) {
$( '#get-another-quote-button' ).on( 'click', function ( e ) {
e.preventDefault();
$.ajax( {
url: '/wp-json/posts?filter[orderby]=rand&filter[posts_per_page]=1',
success: function ( data ) {
var post = data.shift(); // The data is an array of posts. Grab the first one.
$( '#quote-title' ).text( post.title );
$( '#quote-content' ).html( post.content );
// If the Source is available, use it. Otherwise hide it.
if ( typeof post.custom_meta !== 'undefined' && typeof post.custom_meta.Source !== 'undefined' ) {
$( '#quote-source' ).html( 'Source:' + post.custom_meta.Source );
} else {
$( '#quote-source' ).text( '' );
}
},
cache: false
} );
} );
} );
Jetzt wird bei jedem Drücken des Buttons ein neues zufälliges Zitat automatisch geladen. Probieren Sie es aus.
Verwendung der API auf Ihrer Website
Sie können Quotes on Design über die API abfragen, um nette Zitate für Ihre eigene Website anzuzeigen. Wir haben die API-Seite aktualisiert, um die neue WP JSON API zu verwenden. Wie bereits erwähnt, unterliegt die WP-API Änderungen, verlassen Sie sich also noch nicht auf diese API für überaus wichtige Websites.
Mehr API-Güte kommt
Die Entwicklung der WP-API ist im Gange, und es ist viel Aufregung zu sehen, was die Leute damit bauen können. Unser Beispiel ist ziemlich einfach, aber der Gedanke an eine JSON-API hat unsere Ideen schon auf die Möglichkeiten gebracht.
Schauen Sie sich Quotes on Design an und teilen Sie Ihre Gedanken und Fragen in den Kommentaren. Und wenn Sie ein tolles Zitat haben, das Sie auf der Website sehen möchten, reichen Sie es ein!
Hey Andy, danke fürs Teilen! Es ist schön, ein Beispiel für die API in Aktion zu sehen.
Fwiw, aus praktischer Sicht ist die API tatsächlich bei Version 1.2.x für die stabile Version und die Version, die für die Kernaufnahme vorgeschlagen werden *sollte*, wird Version 2.x sein, und 2.0 ist gerade in der Beta. Der Artikel bemerkt, dass sie noch nicht bei 1.0 ist, was nicht korrekt ist.
Es gibt viele fantastische potenzielle Anwendungsfälle für die API und ich bin begeistert, dies als eine weitere Möglichkeit zu sehen, wie Leute sie nutzen. Ich nutze sie tatsächlich auf meiner eigenen Website für ein Anzeigenlieferungssystem. Ich denke, wir werden in Zukunft alle möglichen aufregenden Anwendungsfälle sehen.
Danke Brian, Sie haben absolut Recht: 1.0 ist alte Nachrichten. Korrigiert!
Dies war ein ziemlich einfaches Beispiel für die API, und ich bin sicher, wir werden anfangen, von dem überwältigt zu sein, was die Leute damit tun.
Ohne abfällig sein zu wollen – anstatt der üblichen WordPress-Artikel von letzter Zeit – wenn hier Code nicht-CSS-bezogen in dieser Sphäre sein soll, hätte ich gerne, dass er sich auf statische Seitengeneratoren bezieht. Ich würde es wirklich lieben, wenn mehr Webdesigner/Entwickler damit vertraut wären, damit wir vielleicht ein paar mehr Leute von WordPress und seinesgleichen wegbekommen und die wiederholten Schwärme von Botnetzen, die aus ihren Sicherheitslücken resultieren (und die noch häufigeren Schwachstellen in ihren schlecht geschriebenen Plugins), abschalten können.
das ist ein valider Punkt. Deshalb plane ich, nur das WordPress-Backend zu nutzen und ein Frontend zu erstellen, frei von WP-Plugins, Themes und Sicherheitslücken), wie in diesem anderen Beitrag auf CSS-Tricks https://css-tricks.de/thoughts-on-an-api-first-wordpress/
Ich habe eine Frage zu seiner Methode.
Jedes Mal, wenn Sie auf den Button auf der Website klicken, wird eine HTTP-Anfrage an die WP-API gestellt. Habe ich Recht?
Ich plane, WordPress als API für meine Website(s) zu verwenden, aber ich kann mir das nicht vorstellen. Denn sagen wir, die Website von Quotes on Design wird sehr beliebt. So beliebt, dass zum Beispiel 4000+ Leute gleichzeitig und wiederholt auf den Button klicken. Die API-Aufrufe würden wahrscheinlich den Server, auf dem WordPress installiert ist, zum Absturz bringen.
Was wäre eine gute Lösung, um diese API-Aufrufe zu "cachen"? Sollten wir uns vorstellen, einen CRON-Job einzurichten, der automatisch alle (und dann nur neue Zitate) abruft und sie in einer lokalen Datenbank oder einem Dateispeicher ablegt? und die zufällige Auswahl des Zitats direkt auf dem Server von QoD durchführt?
Gibt es bereits ein System, das mir helfen kann, API-Aufrufe auf diese Weise zu verwalten?
Vielen Dank!
Ja, Sie würden wahrscheinlich jeden eindeutigen URL-Cache wollen und den Cache ungültig machen, wenn Beiträge, die sich auf diese URL beziehen, aktualisiert werden. Ich weiß nicht, ob bestehende Caching-Plugins API-URLs auf Anhieb handhaben, aber ich würde erwarten, dass sie API-URLs verarbeiten, sobald die API mehr an Zugkraft gewinnt.
Danke für den Artikel!
Ich wollte nur hinzufügen, dass ich in meinen Gedanken zu einem API-ersten WordPress hier auf CSS-Tricks einige Funktionen erwähnt habe, die ich in der WP-API nicht finden konnte und die mich dazu brachten, an meiner benutzerdefinierten Lösung zu arbeiten, und die wichtigste davon war die Möglichkeit, mehrere Inhaltsstapel mit einer einzigen Anfrage anzufordern.
Für diejenigen, die daran interessiert sind, die WP-API zu verwenden und dennoch diese Funktion zu haben, habe ich ein Plugin erstellt, das die WP-API erweitert und diese Funktionalität implementiert. Es ist auf GitHub verfügbar.
Hallo,
Ich versuche, Ihren Code mit WP-API v 2.0 auszuführen, und er funktioniert nicht. Ich habe gerade versucht, einige Schlüssel aus dem $data-Objekt zu entfernen, aber wenn ich den Endpunkt aufrufe, werden sie immer noch zurückgegeben.
Wir verwenden die neueste stabile Version. 2.0 ist noch in der Entwicklung – aber wir werden versuchen, diesen Beitrag zu aktualisieren, wenn 2.0 herauskommt!
Fantastische Ressource. Ich sehe eine Menge Dokumentation zur REST-API, aber es ist schön, etwas auf einem Niveau zu finden, das API-Novizen wie mir tatsächlich ein funktionierendes Projekt ausprobieren lässt.
Es wird Spaß machen zu sehen, wie einfach ich das in ein Angular-Projekt integrieren kann.
Hallo Andy,
Sehr schöne Idee. Aber ich frage mich, wie ich meine benutzerdefinierten Zitate hier verwenden kann.
Hallo Daniel,
Sie müssten wahrscheinlich Ihre eigene "Quotes on Design" WordPress-Website einrichten – es sei denn, ich missverstehe Ihr Ziel?
Das ist sehr hilfreich, wäre es möglich, etwas Licht darauf zu werfen, wie Sie die hübschen URLs bei jedem Klick erreicht haben? da ich die Methode im Code nicht sehen konnte.
Was hier interessant ist, ist, dass ich dachte, diese Methode wäre für SEO nicht so gut, da die Seiten möglicherweise nicht indexiert werden, aber es scheint, dass ich mich geirrt habe. Ich habe eine schnelle Suche mit "site:http://quotesondesign.com/" auf Google durchgeführt und alle Zitate scheinen indexiert zu sein, was eine großartige Nachricht ist.
Ich frage mich, ob Yoast sich darum gekümmert hat?
Ich glaube, dieser Teil wurde von Chris erledigt – jedes Zitat hat seine eigene URL, aber er hat etwas JS verwendet, um die URL zu ersetzen.
Ich möchte Ihnen dieses Addon mitteilen, an dem wir gerade arbeiten. Es dient dazu, WordPress als Backend für Ember zu verwenden.
https://www.npmjs.com/package/ember-cli-to-wp-theme
Ich wollte nur kurz Bescheid geben, dass die Tweet-Links auf QoS fehlschlagen, wenn das Zitat ein nicht maskiertes Apostroph enthält – Beispiel: http://quotesondesign.com/nate-simpson/
Ich korrigiere mich… Das Verhalten ist eigentlich etwas seltsam. Wenn ich ein Zitat lade und auf den Tweet-Link klicke, wird nicht der vollständige Auszug angezeigt. Wenn ich jedoch die Seite neu lade und erneut auf den Tweet-Link klicke, wird der Tweet korrekt ausgefüllt. Der Tweet funktioniert auch richtig, wenn ich die Seite einmal neu lade, bevor ich klicke.
Danke für diesen Beitrag. Sehr nützlich!
Eine Sache, die mir aufgefallen ist: Während die URL aktualisiert wird (was cool ist), funktioniert der Zurück-Button nicht, was auch schön wäre, um zum letzten Zitat zurückkehren zu können.
Hey Andy! Das ist ein sehr hilfreicher Beitrag, ich hatte einen Fehler beim Abrufen von Daten mit der WP-API, aber Ihr Beitrag hat mein Problem gelöst. Danke, dass Sie diesen Beitrag mit uns teilen.
Hallo Andy,
Sehr, sehr hilfreicher Beitrag, vielen Dank.
Aber ich habe nur ein Problem mit der WP-API: Ich muss einen privaten Abfragefilter verwenden, um den Offset-Parameter zu nutzen, aber ich verstehe die Authentifizierung nicht. Wenn Sie eine Lösung haben, wäre das sehr hilfreich.
danke
Ich glaube nicht, dass ich viel helfen kann, außer auf die WP API-Dokumentation zur Authentifizierung zu verweisen. Sie könnten auch Ihre Frage auf der WordPress StackExchange stellen – stellen Sie einfach sicher, dass Sie viele Details angeben.
Vielen Dank
bezüglich: Ja, Sie würden wahrscheinlich jeden eindeutigen URL-Cache wollen,
Ist es möglich, Transients mit der API zu verwenden? Bei "kleinen" wiederholten Anfragen bevorzuge ich es normalerweise, die Ergebnisse transient zu machen, damit ich nicht immer wieder auf die Datenbank zugreifen muss.
Ja, absolut! Sie könnten auch ein Caching-Plugin verwenden (das eine DB-Abfrage für einen Transient vermeiden würde), vorausgesetzt, Ihre eindeutigen API-URLs liefern bei jeder Anfrage denselben Inhalt.
Hallo Andy,
Ich habe versucht, Ihren Code zu verwenden, aber ich kann die Autor-Daten nicht entfernen. Ich kann einfache Schlüssel:Wert-Daten entfernen, aber wenn es sich um ein Array handelt, wie bei Autor – Ihre Methode funktioniert nicht. Haben Sie eine Ahnung?
Hey Lucas! Ich habe keine Ahnung – ich würde vermuten,
unsetwürde den Trick machen. Können Sie ein Snippet hier oder auf Gist posten, damit wir es uns ansehen können?Hey Lucas, ich habe auf dem Gist kommentiert. Scheint bei mir zu funktionieren, aber wir können es uns genauer ansehen!
Hallo – hier ist mein Code: https://gist.github.com/anonymous/1375b3f28d125354e5ff
Hallo Andy, ich frage mich, ob Sie wissen, wie man $data für einen bestimmten Beitragstyp unset. Der obige Ansatz funktioniert für Beiträge, aber wenn ich den Beitragstyp hinzufüge, funktioniert das Unset nicht. D.h. /posts/?type=post_type
Sind Sie sicher, dass Ihr Code ausgeführt wird? Versuchen Sie,
var_dump( $data ); exit;an der Stelle einzufügen, an der Sie unsetten möchten, und besuchen Sie die Seite. Ist der Code dort angekommen? Wenn nicht, wo stoppt er? Wenn ja, wie ist der Zustand der$data-Variable? Dort würde ich anfangen.Entschuldigung, ich versuche, bestimmte Werte für einen Curl zu unset. Ich habe einen var dump gemacht und der gesamte Inhalt wird durchlaufen. Ich verwende diese Zeile: curl -i localhost/wp-json/posts?type=custom_post_type. Custom Post Type ist ein von mir erstellter benutzerdefinierter Beitragstyp. Wenn ich nur einen curl auf posts mache, werden die unset-Inhalte entfernt, aber wenn ich die Version mit ?type=custom_post_type mache, werden die unset-Werte immer noch angezeigt.
Ich gehe davon aus, dass der var dump nicht auf /posts?type=custom_post_type funktioniert. Ich weiß nur nicht warum oder ob es etwas Spezielles gibt, das ich der oben genannten Funktion hinzufügen muss, damit sie mit bestimmten Beitragstypen funktioniert.