REST-API: Backbone und benutzerdefinierter Endpunkt

Ich versuche herauszufinden, wie ich einen benutzerdefinierten REST-API-Endpunkt vom JS-Code eines Plugins aus aufrufen soll. Hier ist der PHP-Code eines Beispiel-Plugins, das ich gerade geschrieben habe, um mein Problem zu zeigen. Der Dateiname lautet rest-api-sample.php :

 namespace, '/istermactive/', array('methods' => 'GET', 'callback' => array($this, 'istermactive') ) ); } public function enqueue_scripts() { $handle = "ies-rest-api"; $jsfileurl = plugin_dir_url( __FILE__ ) . '/ies.js'; wp_register_script($handle, $jsfileurl, array("underscore", "backbone", "wp-api")); $local_data = array('apiRoot' => get_rest_url(), "namespace" => $this->namespace); wp_localize_script($handle, "ies_rest", $local_data); wp_enqueue_script($handle); } } $ies_endpoint = new IESRestEndpoint(); 

Und hier ist der ies.js Code:

 (function( $ ) { 'use strict'; $(document).ready(function() { wp.api.init({'versionString' : ies_rest.namespace, 'apiRoot': ies_rest.apiRoot}).done(function() { wp.api.loadPromise.done(function () { wp.api.namespace(ies_rest.namespace).istermactive().done(function (active) { alert(active); }); }); }); }); })( jQuery ); 

Dieser JS-Code in WP 4.7.4 / 4.7.5 triggers jedoch nach dem Aufruf von wp.api.init() und vor dem Aufruf von wp.api.loadPromise() eine Ausnahme in der JS-Konsole aus:

 Uncaught TypeError: _.includes is not a function at wp-api.min.js?ver=4.7.4:1 at Function.h.each.h.forEach (underscore-min.js?ver=4.7.4:1) at Object.wp.api.utils.decorateFromRoute (wp-api.min.js?ver=4.7.4:1) at wp-api.min.js?ver=4.7.4:1 at Function.h.each.h.forEach (underscore-min.js?ver=4.7.4:1) at n.constructFromSchema (wp-api.min.js?ver=4.7.4:1) at n. (wp-api.min.js?ver=4.7.4:1) at n. (backbone.min.js?ver=1.2.3:1) at n. (underscore.min.js?ver=1.8.3:5) at _ (backbone.min.js?ver=1.2.3:1) 

Derselbe Code, der WP 4.8beta2 verwendet, scheint zumindest so lange zu funktionieren, bis er den Aufruf von wp.api.namespace() erreicht.

 Uncaught TypeError: wp.api.namespace is not a function at Object. (https://www.virtualbit.it/wp-content/plugins/rest-api-sample//ies.js?ver=4.8-beta2:10:16) at i (https://www.virtualbit.it/wp-includes/js/jquery/jquery.js?ver=1.12.4:2:27449) at Object.add [as done] (https://www.virtualbit.it/wp-includes/js/jquery/jquery.js?ver=1.12.4:2:27748) at Object. (https://www.virtualbit.it/wp-content/plugins/rest-api-sample//ies.js?ver=4.8-beta2:8:26) at i (https://www.virtualbit.it/wp-includes/js/jquery/jquery.js?ver=1.12.4:2:27449) at Object.fireWith [as resolveWith] (https://www.virtualbit.it/wp-includes/js/jquery/jquery.js?ver=1.12.4:2:28213) at Object.e.(anonymous function) [as resolve] (https://www.virtualbit.it/wp-includes/js/jquery/jquery.js?ver=1.12.4:2:29192) at Object. (https://www.virtualbit.it/wp-includes/js/wp-api.min.js?ver=4.8-beta2:1:13404) at i (https://www.virtualbit.it/wp-includes/js/jquery/jquery.js?ver=1.12.4:2:27449) at Object.fireWith [as resolveWith] (https://www.virtualbit.it/wp-includes/js/jquery/jquery.js?ver=1.12.4:2:28213) 

Meine JS-Datei (ies.js) wird nicht einmal im Stack-Trace der 4.7.x-Ausnahme erwähnt, während sie in 4.8beta2 ein einfacher Syntaxerrors ist, aber ich weiß nicht, wie ich sonst meinen Endpunkt aufrufen soll.

Ich dachte, es könnte ein WP-Bug sein (vielleicht ein Dokumentationserrors), und ich habe einen Fehlerbericht geöffnet. Es stellte sich heraus, dass es sich nicht um einen WP-Bug handelt, also muss diese Frage noch beantwortet werden, aber Adam, der auf meinen Fehlerbericht geantwortet hat, gab uns einige wertvolle Informationen .

Was den Vorschlag angeht, den Birgire in Kommentaren gab, habe ich leider keine Ahnung, wie man den QUnit Code benutzt, vielleicht kannst du mich damit durchgehen?

Wenn Sie dieses Beispiel-Plugin ausprobieren möchten, können Sie es hier finden , und falls Sie interessiert sind, können Sie den JS-Code auf meiner Website-Homepage debuggen, wo dieses Beispiel-Plugin bereits installiert ist (WP-Version ist 4.8beta2 ab Zeitpunkt dieses Schreibens).

Solutions Collecting From Web of "REST-API: Backbone und benutzerdefinierter Endpunkt"

Es sieht so aus, als ob Sie versuchen, eine POST-Anfrage an den Endpunkt von / istermactive zu senden, ist das korrekt? (Ich denke, Sie möchten den Schrägstrich vom Endpunkt entfernen?)

Ich bin mir nicht wirklich sicher, ob der wp-api-Client das richtige Werkzeug für einen Standard-ajax-POST ist, vielleicht möchten Sie jQuery.ajax verwenden oder den WordPress-Helper wp-ajax verwenden .

Der wp-api-Client unterstützt Sie, wenn Sie mit einer Sammlung von Elementen oder einem einzelnen Objekt (z. B. Posts oder Posts) interagieren möchten, wenn diese aus der WP-API abgerufen werden. Es erstellt Backbone-Modelle und -Sammlungen, indem das API-Schema analysiert wird. Hier finden Sie einige Dokumente (die einige Updates benötigen).

vorherige Antwort:

Es scheint, dass Ihr JS nicht geladen ist. Sie haben das Skript registriert, es jedoch nicht in die Warteschlange eingereiht. Fügen Sie wp_enqueue_script hinzu, nachdem Sie es registriert haben. Sie können auch wp_localize_script verwenden , um Abhängigkeiten zu Ihrem Skript zu übergeben und ihm Variablen aus Ihrem PHP zur Verfügung zu stellen.

Beide oben verlinkt mit Codex auf diesen functionen.

Es scheint, dass der erste Fehler mit Underscore.js zusammenhängt . Sie sollten versuchen, Unterstreichung (und Backbone) als Abhängigkeit Ihres Skripts hinzuzufügen:

 wp_register_script($handle, $jsfileurl, array("underscore", "backbone", "wp-api")); 

Die Lösung für das, was ich versuche, wie es die Bounty-Beschreibung verlangt (zB backbone.js), existiert nicht. Laut Adam Silverstein (core-WP-Entwickler) antworte hier und durch private Nachrichten habe ich jetzt verstanden, dass:

  1. namespace() einfach nicht in dem WP gebündelten Rest Api Client (backbone.js) und wenn ich an eine PHP function POST senden möchte, muss ich Standard Ajax Aufrufe verwenden
  2. Wenn ich Backbone verwende, sollte ich die wp.api.init und wp.api.loadPromise , zB loadPromise vor init .
  3. Mein PHP-Code, wenn ich backbone.js verwenden möchte, muss Modelle und Sammlungen definieren
  4. Allerdings kann ich auch denselben Client, den ich in den WP-API-Plugin- Tagen mit der aktuellen Rest-API verwendet habe, verwenden, und ich bekomme meine namespace() -function zurück.

Danke Adam, du verdienst die Belohnung.