Ich versuche, einen benutzerdefinierten API-Endpunkt in WordPress zu erstellen, und ich muss Anforderungen an eine virtuelle Seite im Stammverzeichnis von WordPress auf eine aktuelle Seite umleiten, die mit meinem Plug-in geliefert wird. Grundsätzlich werden also alle Anforderungen an die eine Seite an die andere weitergeleitet.
Beispiel:
http://mysite.com/my-api.php
=>http://mysite.com/wp-content/plugins/my-plugin/my-api.php
Das Ziel ist es, die URL für den API-Endpunkt so kurz wie möglich zu halten (ähnlich wie http://mysite.com/xmlrpc.php
bei der Auslieferung der eigentlichen API-Endpunktdatei mit dem Plug-in, anstatt dass der Benutzer Dateien in seiner Installation und / oder seinem Hack-Core verschieben muss) .
Mein erster Versuch war das Hinzufügen einer benutzerdefinierten Regel zum Umschreiben. Dies hatte jedoch zwei Probleme.
- Der Endpunkt hatte immer einen abschließenden Schrägstrich. Es wurde
http://mysite.com/my-api.php/
- Meine Umschreiberegel wurde immer nur teilweise angewendet. Es würde nicht umleiten
wp-content/plugins...
, es würde umleitenindex.php&wp-content/plugins...
. Dies führte dazu, dass WordPress entweder einen Fehler bei der Anzeige einer nicht gefundenen Seite oder nur die Startseite als Standard anzeigt.
Ideen? Vorschläge?
quelle
get_query_vars()
my-api.php nicht auf übergebene Abfragevariablen zugreifen. Ich habe überprüft, welche Variablen geladen sind. Und die einzige Variable, die gesetzt wird, ist aaWP object
called$wp
. Wie kann ich darauf zugreifen oder es in einWP_Query
Objekt umwandeln, damit ich mit auf die übergebenen Variablen zugreifen kannget_query_vars()
?include
eine Datei erstellen, wird sie im aktuellen Bereich ausgeführt. In diesem Fall ist es diewpse9870_parse_request
Funktion, die nur den$wp
Parameter hat. Es ist möglich, dass das globale$wp_query
Objekt zu diesem Zeitpunkt noch nicht festgelegt wurde und daherget_query_var()
nicht funktioniert. Sie haben jedoch Glück: Ist$wp
die Klasse, die dasquery_vars
Mitglied enthält, das Sie benötigen - ich benutze es selbst im obigen Code.Das hat bei mir funktioniert. Ich habe die Rewrite-API nie angerührt, bin aber immer bereit, neue Wege einzuschlagen. Folgendes funktionierte auf meinem Testserver für 3.0 in einem Unterordner von localhost. Ich sehe kein Problem, wenn WordPress im Webroot installiert ist.
Legen Sie diesen Code einfach in einem Plugin ab und laden Sie die Datei "taco-kittens.php" direkt in den Plugin-Ordner hoch. Sie müssen einen Hard Flush für Ihre Permalinks schreiben. Ich denke, sie sagen, dass die beste Zeit dafür die Aktivierung des Plugins ist.
Beste Grüße, -Mike
quelle
add_rewrite_rule( 'taco-kittens', 'wp-content/plugins/taco-kittens.php', 'top' );
Gibt es einen Grund dafür, nicht stattdessen so etwas zu tun?
http://meinesite.com/?my-api=1
Dann binde dein Plugin einfach in 'init' ein und überprüfe, ob die Variable 'get' ist. Wenn es existiert, tue was dein Plugin tun muss und sterbe ()
quelle
Ich verstehe Ihre Fragen möglicherweise nicht vollständig, aber würde ein einfacher Shortcode Ihr Problem lösen?
Schritte:
Die neue Seite fungiert als API-Endpunkt und Ihr Shortcode sendet Anfragen an Ihren Plugin-Code unter http://mysite.com/wp-content/plugins/my-plugin/my-api.php
(Das bedeutet natürlich, dass in my-api.php der Shortcode definiert ist.)
Sie können wahrscheinlich die Schritte 1 und 2 über das Plugin automatisieren.
quelle
Ich habe noch nicht so viel mit dem Umschreiben zu tun gehabt, daher ist dies wahrscheinlich etwas rau, aber es scheint zu funktionieren:
Es funktioniert, wenn Sie dies in 'generate_rewrite_rules' einbinden, aber es muss einen besseren Weg geben, da Sie nicht bei jedem Laden der Seite .htaccess neu schreiben möchten.
Scheint so, als ob ich nicht aufhören kann, meine eigenen Beiträge zu bearbeiten ... es sollte wahrscheinlich eher darum gehen, den Rückruf zu aktivieren und stattdessen auf globales $ wp_rewrite zu verweisen. Entfernen Sie dann den Eintrag aus non_wp_rules und geben Sie ihn erneut in .htaccess aus, indem Sie den Rückruf deaktivieren.
Und schließlich sollte das Schreiben in .htaccess etwas raffinierter sein. Sie möchten nur den WordPress-Abschnitt dort ersetzen.
quelle
Ich hatte eine ähnliche Anforderung und wollte mehrere Endpunkte basierend auf einzigartigen Slugs erstellen, die auf den vom Plugin generierten Inhalt verweisen.
Schauen Sie sich die Quelle für mein Plugin an: https://wordpress.org/extend/plugins/picasa-album-uploader/
Die Technik, die ich verwendet habe, beginnt mit dem Hinzufügen eines Filters
the_posts
, um die eingehende Anforderung zu untersuchen. Wenn das Plugin damit umgehen soll, wird ein Dummy-Post generiert und eine Aktion für hinzugefügttemplate_redirect
.Wenn die
template_redirect
Aktion aufgerufen wird, muss der gesamte Inhalt der anzuzeigenden Seite ausgegeben und beendet werden. Andernfalls wird keine Ausgabe generiert. Lesen Sie den Code inwp_include/template-loader.php
und Sie werden sehen warum.quelle
Ich benutze einen anderen Ansatz, der darin besteht , die Homepage zum Laden eines benutzerdefinierten Titels, Inhalts und einer Seitenvorlage zu zwingen .
Die Lösung ist sehr ordentlich, da sie implementiert werden kann, wenn ein Benutzer einem benutzerfreundlichen Link folgt, z. B. http://example.com/ ? Plugin_page = myfakepage
Es ist sehr einfach zu implementieren und sollte unbegrenzte Seiten ermöglichen.
Code und Anweisungen hier: Erstellen Sie eine benutzerdefinierte / gefälschte / virtuelle Wordpress-Seite im Handumdrehen
quelle
Ich benutze einen ähnlichen Ansatz wie Xavi Esteve oben, der aufgrund eines WordPress-Upgrades nicht mehr funktionierte, soweit ich in der zweiten Jahreshälfte 2013 feststellen konnte.
Es ist hier ausführlich dokumentiert: https://stackoverflow.com/questions/17960649/wordpress-plugin-generating-virtual-pages-and-using-theme-template
Der wichtigste Teil meines Ansatzes ist die Verwendung der vorhandenen Vorlage, sodass die resultierende Seite aussieht, als wäre sie Teil der Website. Ich wollte, dass es mit allen Themen so kompatibel wie möglich ist, hoffentlich über alle WordPress-Versionen hinweg. Die Zeit wird zeigen, ob ich Recht hatte!
quelle
Es ist ein Beispiel für eine readey-Produktion. Erstellen Sie zunächst eine virtuelle Seitenklasse:
Setzen Sie im nächsten Schritt einen Haken
template_redirect
und bearbeiten Sie Ihre virtuelle Seite wie folgtquelle