Ich bin ständig auf die gleiche Störung gestoßen, also dachte ich, ich würde sehen, ob es da draußen irgendwelche Ideen oder Erfahrungen gibt ...
Ich habe ein Plugin erstellt, das eine eigene Admin-Seite verwendet. Es muss. Jetzt, wo ich das WP_List_Table () - Zeug aussortiert habe, muss ich sagen, dass es großartig ist ... aber ...
Benutzerdefinierte Pluginseiten werden immer geladen, es admin.php?page=...
sei denn, ich möchte sie direkt aus dem Plugin-Verzeichnis laden, was ich nicht tue. Wenn ich nun von dieser Seite aus eine 'Aktion' mache, muss ich das irgendwie verarbeiten und dann ohne den Aktionsparameter zurück auf die Seite leiten . Egal ob ich ein GET oder POST mache, wirklich.
Auf allen internen Seiten von WP wird dies auf derselben Seite ausgeführt. Es wird überprüft, ob eine Aktion vorhanden ist. Wenn dies der Fall ist, wird sie verarbeitet und ohne die Aktion an sich selbst weitergeleitet. Dies ist möglich, da auf diesen Seiten die admin-header
noch nicht geladen wurden.
Wenn Sie es jedoch auf Ihrer eigenen Seite versuchen, wurde bereits die Hälfte der Administrationsoberfläche an den Browser gesendet, sodass eine Weiterleitung nicht mehr möglich ist. Natürlich besteht die Lösung darin, direkt auf eine andere Seite zu POSTEN / GETEN, das WP-Framework darauf zu laden, die Verarbeitung durchzuführen und dann zur ursprünglichen Seite zurückzukehren ... aber ... das ist ein bisschen ärgerlich, weil ... mein Original Die Seite wird über einen Rückruf geladen, sodass sie innerhalb einer Methode meiner Klasse ausgeführt wird. Das ist schön.
Wenn ich eine separate Seite lade, muss ich manuell einschließen wp-load.php
und bin außerhalb meiner Klasse, was ärgerlich ist, und in meinem speziellen Fall nervt es mich besonders, weil ich meine Plugin-Klasse nur anonym instanziiere, damit niemand darauf zugreifen kann von außen.
Also, nach dieser langen Geschichte ... hat jemand eine gute Lösung gefunden, um eine andere Seite über einen Rückruf zu laden, ohne dass die gesamte Administrationsoberfläche bereits eingerichtet ist?
(Ich kenne eine Problemumgehung ... Ich kann eine Funktion load-....
einbinden, die nach dem Aktionsparameter sucht und die Verarbeitung und Umleitung durchführt. Aber ich frage mich, ob es einen besseren Weg gibt.)
Vielen Dank.
[plugin-wp-pagenavi]
?[plugin-development]
ist hier sicher willkommen.plugin-wp-pagenavi
ist ... ich habe angenommen, dass es um die Korrelation zwischen Plugins und dem Admin-Menü geht. Da meine Frage damit zusammenhängt, habe ich diesen Tag ausgewählt.[admin-menu]
hier gebrauchen , aber ich glaube nicht, dass es wirklich damit zusammenhängt. Ich habe die Tags so geändert, wie ich es für passend halte. Sie können sie natürlich wieder bearbeiten.Antworten:
Als Faustregel sollten Sie für die meisten Aktionen eine POST-Anforderung verwenden, um sicherzustellen, dass sie nicht versehentlich ausgeführt werden . Es empfiehlt sich jedoch auch, nach einer POST-Anforderung auf eine normale Seite umzuleiten, um eine doppelte Ausführung zu verhindern, wenn der Benutzer die Seite aktualisiert.
Der Ablauf sieht also so aus:
Die mittlere Seite muss nicht Ihre Pluginseite sein. Das bedeutet, dass Sie mit dem "generischen POST-Handler" , der vor drei Jahren mitgeliefert wurde, das
'admin_action_' . $_REQUEST['action']
Hook-In durchführen könnenadmin.php
.Ein Beispielbenutzer ist das Akismet-Plugin . Wenn Sie es zuverlässig verwenden möchten, müssen Sie es
admin.php
direkt an senden und nicht an eine andere Seite, die es zufällig enthältadmin.php
.Hier ist ein sehr einfaches Beispiel, wie man es benutzt:
quelle
admin.php
direkt anzurufen ist der "Trick", den mir die Akismet-Quelle beigebracht hat. Sie haben Recht, wenn Sie ein Formular anzeigen und es im Fehlerfall erneut anzeigen möchten: Dann wäre es einfach, wenn das Ziel Ihre Pluginseite, aber der Hook irgendwo am Anfang ist (Sie könnten also bei Erfolg umleiten oder das anzeigen) Wenn nicht, bitte erneut mit Fehlermeldungen ausfüllen. Vielleicht in einem Trac-Ticket vorschlagen?'load-<pagehook>'
Hook funktioniert ... er wird aufgerufen, bevor die Seite geladen wird ... aber dasadmin_action_...
Konzept scheint viel netter und spezifischer zu sein. Außerdem sind die Fehlermeldungen nach wie vor problematisch, wenn Sie POSTs durchführen und beim erneuten Laden keine Neuveröffentlichung vornehmen möchten, aber das ist ein anderes Thema.admin_action_
Haken vor dem Plugin-Seitenlader verschoben würde.Ich habe dies etwas anders angegangen, indem ich der Aktions-URL auf der Seite, auf der der Benutzer die Aktion durchführt, einfach noheader = true hinzugefügt habe
Mein Handler führt dann die Aktion aus (dh normalerweise ein Hinzufügen, Aktualisieren oder Löschen) und endet dann mit einem wp_redirect () zur nächsten Seitenaktion (z. B. Seite hinzufügen -> Seite bearbeiten, Seite löschen -> Listenseite, Seite bearbeiten -> Seite bearbeiten) ). Ich übergebe auch eine Nachricht an die URL, damit ich einen Status wie "Aktualisierung erfolgreich" oder "Fehlgeschlagen" anzeigen kann.
Dieser Ansatz behält alle Aktionen bei: Auflisten, Hinzufügen, Bearbeiten, Löschen, Massenlöschen usw. in derselben Klasse und mit demselben Administrations-Slug, so dass es ziemlich einfach zu warten und zu verstehen ist.
quelle
Ein anderer Ansatz ist das Hinzufügen eines ausgeblendeten Eingabefelds zum Formular:
Auf diese Weise scheint WordPress die Umleitung automatisch zu handhaben.
quelle