Gibt es eine JavaScript-API? Wie greife ich in JS auf öffentliche und private Daten zu?

8

Laut diesem Beitrag gibt es keine integrierte JavaScript-API für Wordpress. Daher scheinen Entwickler, die auf AJAX aufbauen möchten, alle ihre eigene Lösung zu finden, die mir nicht richtig erscheint.

Was ich wirklich vermisse, abgesehen vom Abrufen von Posts oder anderen Daten mit einer integrierten API, ist ein kleiner Satz von JavaScript-Funktionen für die Back-End- und Front-End-Oberfläche. Ist in Bezug auf dieses Problem etwas geplant?

Zum Beispiel würde ich das gerne wissen

  • Das linke Hauptmenü ist reduziert.
  • Welcher Benutzer ist angemeldet?
  • welche Gruppe er ist,
  • sogar Kundendaten wie Browser

und so weiter.

Stackoverclan
quelle
1
Nur eine Anfrage, dies ist nicht Ihr erster Beitrag. Bitte verwenden Sie Zeilenumbrüche und Absätze. Machen Sie Ihre Beiträge für andere lesbarer. Alles in einem großen Paragrahp zu schreiben ist ein bisschen zu viel und man neigt dazu, Leser und mögliche Helfer auf diese Weise zu verlieren. Vielen Dank
Pieter Goosen
danke, sorry, war ein wenig in eiligkeit, wird nicht wieder vorkommen!
Stackoverclan
2
Wer auch immer dafür gestimmt hat, dies als primär meinungsbasiert zu schließen : Bitte lesen Sie die Frage, bevor Sie eine Stimme abgeben.
Fuxia
1
Kein Problem. Es ist nur ein Tipp, um Ihnen in Zukunft zu helfen . Es ist eine Tatsache, dass gut geschriebene klare Fragen gute Antworten bekommen :-). Zum Glück habe ich nicht gewählt, diesmal bin ich unschuldig, lol :-)
Pieter Goosen

Antworten:

6

TL; DR

Es gibt keine JavaScript-API im WordPress-Kern und niemand ist geplant, aber tatsächlich besteht keine Notwendigkeit dafür.

Backend

Nehmen wir zunächst an, dass in Bezug auf das Backend einige nützliche Informationen aus bereits vorhandenen globalen JavaScript-Variablen abgerufen werden können (WordPress liebt alle globalen Varianten).

Z.B

  • ajaxurlfür die admin-ajax.phpURL, die in Ajax-Aufrufen verwendet werden soll
  • pagenow für den aktuellen Admin-Seiten-Slug, z. B. 'Dashboard'
  • adminpage für aktuelle Admin-Seitendatei, zB 'index-php' (Punkte werden durch hiphens ersetzt)
  • typenowfür aktuellen Post - Typen , während in edit.php, post.phpoderpost-new.php
  • userSettings kann verwendet werden, um Informationen über den aktuell angemeldeten Benutzer abzurufen

Diese Informationen geben Ihnen einen "Kontext" des Anwendungsstatus, während Sie sich im Backend befinden.

Für andere in der Frage erwähnte Dinge benötigen Sie keine "API", da supereinfache jQuery-Funktionen den Trick ausführen können. Um beispielsweise zu wissen, ob das Admin-Menü geschlossen ist, können Sie nach der "gefalteten" Klasse in body suchen:

if ( $(body).hasClass('folded') ) {
  alert( 'Admin left menu is closed!' );
} else {
  alert( 'Admin left menu is open!' );
}

Dokumentationsmangel

Für Dinge wie die vorherigen Snippets lohnt es sich nicht, Funktionen zu erstellen. WP hat bereits zu viele Funktionen in PHP. Ich hoffe wirklich, dass zusätzliche Funktionen wie diese nicht zum Kern hinzugefügt werden.

Was JavaScript in WordPress wirklich benötigt, ist mehr Dokumentation für vorhandene Funktionen: Keines der Dinge, die ich oben geschrieben habe, ist in offiziellen Dokumenten wie dem Codex oder in Quelldateien dokumentiert.

Vorderes Ende?

Bis hierher habe ich nur über das Backend gesprochen.

Dies liegt daran, dass so ziemlich alle Dinge, die im Frontend passieren, mit dem aktuell verwendeten Thema zusammenhängen. Stellen wir uns vor, es gibt eine von WordPress bereitgestellte JavaScript-Datei, die Funktionen zum Abrufen von Informationen zum aktuellen Anwendungsstatus enthält. Wenn ein Thema diese JS-Datei nicht in die Warteschlange stellt, sind diese Funktionen nicht verfügbar, und es wäre absolut falsch , ein Thema zu zwingen, ein solches Skript in die Warteschlange zu stellen.

Keine (andere) API erforderlich

In WordPress können jedoch alle Informationen, die Sie über PHP erhalten, problemlos auch in JavaScript und ohne AJAX-Anfrage verwendet werden. Die Funktion, die dies ermöglicht, ist wp_localize_script().

Angenommen, Sie möchten den aktuellen Benutzer und die Benutzerdaten wie die Benutzerrolle in Ihrem JavaScript abrufen und möchten auch die auf der aktuellen Seite verwendeten Abfragevariablen kennen. Sie können Folgendes tun:

$data = array(
  'user'       => wp_get_current_user(),
  'query_vars' => $GLOBALS['wp']->query_vars
);

wp_localize_script( 'myscript', 'MyScriptData', $data );

In Ihrem Skript ist die MyScriptData.userVariable ein JavaScript-Objekt mit allen Benutzerinformationen und allen Abfragevariablen.

Dies gilt für Backend- und Frontend-Skripte (mit anderen Worten: für beide "Seiten"). Es ist keine zusätzliche JavaScript-API erforderlich , um diese Informationen abzurufen. PHP ist ausreichend, wenn Sie die richtigen Methoden verwenden, um Informationen von PHP an JS zu übergeben.

Backbone.js

Backbone.js ist ein JavaScript-Framework, das eine (Art) MVC- Entwicklungsmuster mit JavaScript ermöglicht. Es war im Kern von WP 3.5 enthalten - hauptsächlich für die Mediengalerie.

Diese Bibliothek ist keine WordPress-JavaScript-API, da sie sicherlich eine leistungsfähigere JavaScript-Entwicklung ermöglicht, aber dieser Bibliothek wurde keine einzige WordPress-spezifische Funktion hinzugefügt, und sie ist die einzige aktuelle Kernverwendung von Backbone.js. Die Medienbibliothek ist mehr oder weniger undokumentiert und hat keine öffentliche API. Und AFAIK ist es nicht geplant, diese Lücke zu schließen. (Mehr als glücklich, diese Aussage zu ändern / zu entfernen - wenn jemand mir das Gegenteil beweisen kann).

WP-API

Wie von Rarst und Brian Fegter hervorgehoben , wird die WP-API Teil des Kerns sein (wahrscheinlich beginnend mit WP 4.1).

Aber ich muss sagen, dass es keine JavaScript-API ist. Es ist lediglich möglich, eine HTTP-Anforderung mit einem Anwendungsendpunkt zu verbinden, der von der WP-API gesteuert wird. Die API ruft Daten aus der Datenbank ab und gibt sie dort JSON-formatiert zurück. Beispiel aus den Dokumenten:

Möchten Sie die Beiträge Ihrer Website erhalten? Senden Sie einfach eine GETAnfrage an /wp-json/posts. Benutzer mit ID aktualisieren 4? Senden Sie eine POSTAnfrage an /wp-json/users/4. Alle Beiträge mit dem Suchbegriff "awesome" erhalten? GET /wp-json/posts?filter[s]=awesome.

Da HTTP-Anforderungen und zugehörige JSON-Antworten mit jeder Sprache verarbeitet werden können , die HTTP-Anforderungen und das JSON-Datenformat unterstützt (darunter PHP, Ruby, Python, ASP usw.), besteht das Hauptziel der WP-API darin , das Abrufen und Festlegen von WordPress-Daten zu ermöglichen von Nicht-WP-Anwendungen. Das heißt, aus jeder Anwendung heraus , nicht nur aus WordPress.

Da JavaScript eine Sprache ist, die sowohl HTTP-Anforderungen als auch das JSON-Format verarbeiten kann, können Sie die WP-API auch in WordPress JavaScript verwenden. Jemand arbeitet auch an einem WP js-Client für diese API, aber

  • mit wp_enqueue_script()+ die Ajax API + Wordpress PHP - Funktionen ist es möglich , alle Informationen , die Sie ohne zusätzliche API benötigen abzurufen. Und da alle drei "Inhaltsstoffe" WP-etablierte Standards sind, ist ihre Verwendung keine "eigene Lösung". Es werden lediglich Standardlösungen verwendet, um benutzerdefinierte (und allgemeine) Aufgaben zu erledigen. Darum geht es bei dieser Plugin-Entwicklung.

  • Es ist sogar möglich, JavaScript zur Verwendung der WP-API zu verwenden. Nur weil die WP-API JSON zurückgibt, wird sie nicht zu einer JavaScript-API. Es ist keine JavaScript-Funktion beteiligt (eine HTTP-Anforderung wird gesendet und ein JSON-Reposnse wird zurückgegeben. Ähnlich wie bei Verwendung der AJAX-API). Andernfalls sollte jeder Dienst, der JSON zurückgibt, als WordPress JS-API betrachtet werden. Die WP-API sollte als externe Service-API betrachtet werden , die JSON zurückgibt. Möglicherweise ist die Site, die diesen JSON-Service verwendet, dieselbe, die ihn bereitstellt.

  • Mit der WP-API kann nichts erreicht werden, was nicht auch mit der AJAX-API möglich ist. Mit der AJAX-API können jedoch viele Dinge getan werden. aber nicht mit der WP-API.

Ein Hinweis zur WP-API + Backbone.js

Mit Backbone.js ist es möglich, Informationen in Anwendungen abzurufen und zu speichern, die RESTful HTTP-Anforderungen unterstützen.

Das Problem ist, dass WordPress sowohl in "regulären" als auch in AJAX-Anfragen alles andere als REST-fähig ist: Es unterstützt $_GETund $_POSTfordert standardmäßig nur Anfragen an, und die Verwendung der einen oder anderen mit derselben URl führt zu ... demselben Ergebnis .

Im Gegenteil, die WP-API ist REST-fähig, sodass Backbone-basierte Anwendungen sie für leistungsstarke JavaScript-Anwendungen nutzen können. Ich würde mich jedoch davon fernhalten, Backbone- oder WP-API oder Backbone + WP-API als JavaScript-API für WordPress zu definieren über.

gmazzap
quelle
gute Arbeit! Vielen Dank für die ausführliche Antwort. Das gibt mir viele Einblicke und Anweisungen, obwohl ich einigen Teilen wie "keine Notwendigkeit" nicht zustimme. Das ist jedoch DIE Antwort!
Stackoverclan
Wie in der Antwort erwähnt, kann WP API + Backbone, auch wenn IMHO nicht als JS-API betrachtet werden kann, Ihnen viel Leistung beim Erstellen sehr komplexer js-basierter Anwendungen geben. Im Backbone-Wiki auf GitHub gibt es eine Sammlung erweiterter Apps, die es verwenden . Die WP-API kann eine RESTful- Schnittstelle zu WordPress-Daten bereitstellen , die erforderlich ist, um die gesamte Leistung von Backbone zu nutzen. Schauen Sie sich auch diese Folien über Backbone + WordPress an. @ mc007
gmazzap
Der AJAX-Einstiegspunkt dauert viel zu lange, um eine schnelle App zu erstellen. Es ist eigentlich ein No Go!
Stackoverclan
1
@stackoverclan AJAX-Einstiegspunkt ist langsam, da die gesamte WordPress-Umgebung geladen wird. Aber auch die WP-API, sodass Sie damit keinen perfekten Nutzen erzielen. Auf dem Land können SHORTINITSie mit Ajax viel schneller machen. Dasselbe mit der WP-API zu tun, wäre viel schwieriger. Btp, was für eine wirklich bissige App? Tipp: Verwenden Sie kein WordPress.
gmazzap
4

Die JSON-REST-API, die in die Version 4.1 integriert werden soll, hat einige Entwicklungen erfahren . Ich glaube, es wird offiziell als "WP API" bezeichnet. Sie können mit der Code - Basis jetzt und halten mit den neuesten Entwicklungen beginnen hier , bis es zu Kern bekommt. Ryan McCue und Team haben ein paar ziemlich gute Dokumentation konkretisiert hier .

Brian Fegter
quelle
3

Während WP historisch gesehen Back-End-zentriert war, wurde seit Jahren erklärt, dass es zu einer starken JS-Nutzung übergehen soll. In Anbetracht der Verpflichtungen zur Abwärtskompatibilität ist es fraglich, ob JS bald Parität erreichen oder PHP übernehmen wird (meiner Meinung nach), aber es wurden einige Fortschritte erzielt.

Der WordPress-Administrator wird jetzt mit Backbone und Underscore ausgeliefert, die einen großen Teil der neuesten Iteration der Medienbibliothek ausmachten. Leider sind die Einzelheiten der Implementierung kritisch undokumentiert, und die Verwendung durch Dritte war relativ unbeliebt.

Das REST-API- Plugin wird als "Feature-Plugin" entwickelt, mit der offiziellen Absicht, in Zukunft in den WordPress-Kern aufgenommen zu werden.

Selten
quelle
Super, der Link 'Feature Plugin' hilft mir sehr zu verstehen, was eigentlich los ist, definitiv ein Muss, bevor ich auf die Jagd gehe
;-)
3

Um Ihre Aussage zu beantworten:

[...] Es gibt keine integrierte Javascript-API für Wordpress. Daher scheinen Entwickler, die auf Ajax aufbauen möchten, alle ihre eigene Lösung zu finden, die mir nicht richtig erscheint.

Es gibt keine "eigene Lösung". Sie können Dinge erleichtern , indem Sie ATP mitajax_template_part() von @GM oder ähnlichem Plugins und abkürzen, aber immer noch gibt es keine Nicht-Standard - Art und Weise mit AJAX in Wordpress zu gehen. Diese "eigenen Lösungen" / Wege (meistens) machen es falsch . AJAX-Aufrufe werden (ungefähr) folgendermaßen ausgeführt:

  1. Registrieren Sie den AJAX-Rückruf am kontextsensitiven Hook (öffentlich oder privat / angemeldet).
  2. Registrieren, Einreihen und Lokalisieren von Skripten
  3. Verwenden Sie jQuery $.ajax()und ähnliche Funktionen, um auf Benutzerinteraktionen zu reagieren. Arbeiten Sie mit dem globalen (lokalisierten) JS-Objekt, um Daten an den PHP-Rückruf zurückzugeben.
  4. Innerhalb der PHP-cb validieren, filtern und bereinigen Sie Daten, suchen nach Nonces und Referrern, erledigen Ihre DB-Aufgaben und geben JSONifications-Daten mit wp_send_json_success()ähnlichen Funktionen zurück.

Wenn ein Plugin oder Theme dies nicht so macht, hat der Autor die Dinge nicht gelesen oder sich keine Beispiele angesehen. Es gibt ein Skelett für das, was verwendet werden sollte.

Weitere und detaillierte Informationen zum Umgang mit AJAX in WP finden Sie im Community-Buch "WordPressTheRightWay" .

Was ich wirklich vermisse, abgesehen vom Abrufen von Posts oder anderen Daten mit einer integrierten API, ist ein kleiner Satz von Javascript-Funktionen, die sich mit der Back-End- und Front-End-Schnittstelle befassen. [...] Zum Beispiel würde ich gerne wissen, dass das linke Hauptmenü ausgeblendet ist oder welcher Benutzer angemeldet ist oder welche Gruppe er ist, oder sogar Kundendaten wie Browser und so weiter.

WordPress ist einfach nicht spezifisch, was Sie mit AJAX tun müssen. Aus diesem Grund können Sie so ziemlich alles in ein lokalisiertes / globalisiertes Array packen und für Ihre AJAX-Aufrufe verfügbar machen. Und das passt perfekt zur Funktionsweise von Backbone: Sie müssen Dinge tun, die Sie möchten , und Sie möchten sie tun.

Wenn Sie ein eigenwilliges JavaScript-MVC-Framework wie AngularJs verwenden möchten, sind Sie am falschen Ort. Es gibt andere CMS wie OctoberCMS, Drupal8 usw., die viel besser darin sind, eine Basis dafür bereitzustellen. In WordPress müssen Sie einen benutzerdefinierten Satz von Rewrite-Endpunkten erstellen, an dem Sie Datensätze für Ihre JS-Controller zurückgeben können.

Kaiser
quelle
Hallo, danke für die ausführlichere Antwort. Ich mag es, weil Sie bereits eine Anleitung und Best Practice gefunden haben.
Stackoverclan