So verwalten Sie Ajax-Aufrufe und JSON in WordPress

13

Ich habe einen benutzerdefinierten Beitragstyp, auf den ich über jQuery zugreifen möchte - vorzugsweise mit JSON.

Also das Wichtigste zuerst. Das Erstellen einer Funktion, die / echos json zurückgibt, ist einfach genug, aber wie würde ich über jquery darauf zugreifen.

Wie Mike in dieser Frage schreibt , platziert er sie - soweit ich das verstehe - in der WordPress-Wurzel. was würde es mit dem PHP-Dateinamen zugänglich machen - aber ist dies empfehlenswert? Ich würde es lieber in einen Plugin-Ordner legen.

Ich habe versucht, den WordPress-Codex zu lesen, aber die Art und Weise, wie Ajax-Aufrufe behandelt werden, verwirrt mich nur, da Sie jeden Ajax-Aufruf an admin-ajax.php senden, obwohl es sich nicht um eine Admin-Seite handelt.

Kann jemand bitte die Probleme klären, die ich habe?

/Sturm

bearbeiten

Das Problem, das ich hatte, war zu verstehen, wie Ajax-Anrufe in WordPress getätigt werden sollten und wo Sie Ihren PHP- und JS-Code platzieren müssen, um die Anrufe zu erledigen / zu bearbeiten.

Bei der anderen Frage, auf die ich verlinkt habe, haben Sie eine Funktion erstellt, mit der die Datei im WP-Stammverzeichnis abgelegt wird - das möchte ich nicht. Aber ich habe jetzt gelernt, wie man die wp_ajax_ (nopriv _) [Aktion] benutzt und kann effektiv auf den von mir erstellten json zugreifen. Das verbleibende Problem ist, wo ich den JS platzieren sollte, um den Anruf zu tätigen. Ich möchte es in die js-Datei des Plugins einfügen, aber da dies auf einer Seite dargestellt werden soll, nicht auf der Admin-Site, ist Ajaxurl nicht definiert, daher muss ich mit PHP nachhaken.

echo admin_url('admin-ajax.php');

So wird die Frage, wie ich dieses PHP mit dem Javascript kombinieren und wie ich es dann in die Warteschlange stellen soll, da es keine Datei oder ein Skript ist.

Sturm
quelle
Ich möchte den Titel Ihrer Frage bearbeiten, um einen aussagekräftigeren Titel zu erhalten, aber nach dem Lesen bin ich mir immer noch nicht 100% sicher, was Ihre Frage ist. Fragen Sie sich einfach, wie Sie auf einen JSON-Feed zugreifen können, der nicht mit benutzerdefinierten Beitragstypen zusammenhängt (ist der CPT für Ihre Frage nicht wirklich wichtig?). Ist es wichtig, dass er nicht im Stammverzeichnis enthalten ist? Ist es für die Admin-Funktionalität? Vielleicht hilft es, wenn Sie erklären, was Sie tatsächlich aus der Sicht des Endbenutzers erreichen wollen, zusätzlich zu dem technischen Ansatz, mit dem Sie zu kämpfen haben?
MikeSchinkel
Ja, ich kann sagen, dass der Titel nicht der aussagekräftigste ist, den es je gab. Ich habe einfach etwas dort hingelegt, weil ich zuerst etwas Schlimmeres gepostet habe. Bearbeiteter Beitrag mit mehr Info.
Sturm
Den benutzerdefinierten Post-Typ habe ich gerade hinzugefügt, da das anscheinend beliebte json-api-Plugin keine benutzerdefinierten Post-Typen abdeckt.
Sturm

Antworten:

17

Ajax Handler

Es ist in der Tat ein bisschen verwirrend, dass sich der Ajax-Handler im wp-admin/Verzeichnis befindet, aber ja, Sie können und sollten ihn auch für Nicht-Administrator-Anforderungen verwenden. Sie registrieren dann einen Handler für den wp_ajax_nopriv_[action]Hook anstelle des normalen wp_ajax_[action]. In diesem Fall müssen Sie nur den ersten Zeilen vonadmin-ajax.php folgen , da eine Anforderung eines nicht angemeldeten Benutzers die Seite bereits um Zeile 50 herum verlässt.

Registrieren Sie also eine Funktion für den Hook wp_ajax_nopriv_get_custom_post_data, und sie wird aufgerufen, wenn Sie admin-ajax.phpmit dem actionParametersatz auf nachfragen get_custom_post_data. Rufen Sie die()am Ende Ihres Handlers unbedingt selbst an, da sonst die Standardeinstellung zurückgegeben die(-1)wird. Registrieren Sie auch die angemeldete Version wp_ajax_get_custom_post_data(für dieselbe Handlerfunktion kein Problem), da Sie den noprivHaken nicht treffen, wenn Sie an Ihrer Site angemeldet sind .

Serverseitige Konfiguration zu Javascript

Der Trick, serverseitige Konfigurationsdaten (wie die admin-ajax.phpURL) zu senden , ist wp_localize_script(). Sie übergeben ihm ein Array von Schlüsseln und Werten, die oben auf der Seite angezeigt werden. Dies wurde wahrscheinlich ursprünglich nur für lokalisierbare Zeichenfolgen erstellt, aber Sie können es auch zum Übergeben von Konfigurationsdaten verwenden.

wp_localize_script('storm_json_config', 'storm_config', array(
    'ajaxurl' => admin_url('admin-ajax.php'),
));

storm_json_configist der Handle-Name (falls Sie ihn später aus der Warteschlange entfernen möchten), storm_configder Name des Javascript-Objekts, das Ihre Daten enthält. So kann Ihre statische Javascript-Datei eine Zeile wie enthalten jQuery.post(storm_config.ajaxurl, ...).

Siehe auch die Antwort von bueltge auf eine ähnliche Frage .

Statisches Javascript aus dem Plugin-Verzeichnis

Um eine statische Javascript-Datei aus Ihrem eigenen Plugin-Verzeichnis zu laden, verwenden Sie wp_enqueue_script(). Das würde ungefähr so ​​aussehen:

wp_enqueue_script('storm_json', plugin_dir_url(__FILE__) . 'js/json.js', array('jquery'), '20101105');

Wo storm_jsonist wieder ein Handle-Name, dann geben Sie den Link zu der Datei, dann die Abhängigkeiten (können sein null) und dann eine Versionsnummer, die nach der Aufforderung hinzugefügt wird, Browser-Caches bei Updates zu schlagen.

Jan Fabry
quelle
gute Antwort. Dies war, was ich mich gefragt habe, und ich scheine es zum Laufen gebracht zu haben. Ich kann jetzt auf /wp-admin/admin-ajax.php?action=[action] zugreifen und ein json-Ergebnis erhalten. Mein Problem ist jetzt, wo ich die Js platzieren muss, um den Ajax-Aufruf auszuführen. Da muss ich echo admin_url ('admin-ajax.php') setzen; Wie die URL, kann ich es nicht in meine Plugins-JS-Datei setzen. Also, wie würde ich vorgehen, um es in die Warteschlange zu stellen? Ich möchte das Skript nicht einfach in die Mitte einer Seite drucken.
Sturm
@Storm: Ich habe meine Antwort mit erweitert, mit wp_localize_script()der Sie Konfigurationsdaten von der Serverseite an den Browser senden können. (Kleiner Tipp: Wenn Sie @einen Benutzernamen hinzufügen , erhält diese Person eine Benachrichtigung über Ihre Antwort. Stellen Sie also @Mike: I updated the titlesicher, dass sie Ihren Kommentar sieht.)
Jan Fabry
Vielen Dank Jan. Ich glaube jetzt, ich verstehe das ganze Paket. Ich werde ein bisschen damit herumspielen müssen, um es vollständig zu verstehen, aber du warst eine große Hilfe! Antwort akzeptiert =) Übrigens danke für die @ -Notiz. Aber wenn ich Ihre Antwort jetzt kommentiere, erhalten Sie trotzdem eine Warnung, oder?
Sturm
@Storm: Ja, die Warnung geht an den Autor der Frage oder Antwort, die Sie kommentieren, und kann auch an einen anderen Teilnehmer gesendet werden, den Sie in einem @ -Kommentar erwähnt haben. Also habe ich Ihre Benachrichtigung "kostenlos" erhalten, aber Sie würden keine für diese Nachricht erhalten, wenn ich Sie nicht mit einbeziehe. Auf der allgemeinen Meta-Site des Stack Exchange-Netzwerks finden Sie eine vollständige Erläuterung .
Jan Fabry