Wie gehe ich am besten mit benutzerdefinierten Plug-in-Seitenaktionen um?

Ich stolperte ständig in den gleichen Ärger, also dachte ich, ich würde sehen, ob es irgendwelche Ideen oder Erfahrungen gibt …

Ich habe ein Plugin erstellt, das seine eigene Admin-Seite verwendet. Es muss. Jetzt, da ich das WP_List_Table () – Zeug aussortiert habe, muss ich sagen, dass es großartig ist … aber ….

Benutzerdefinierte Plugin-Seiten laden sich immer als admin.php?page=... sofern ich sie nicht direkt aus dem Plugin-Verzeichnis laden will, was ich nicht tue. Nun, wenn ich eine ‘Aktion’ von dieser Seite mache, muss ich das irgendwie verarbeiten und dann zurück auf die Seite ohne den Aktionsparameter redirect. Egal ob ich ein GET oder POST mache, wirklich.

Auf all seinen internen Seiten prüft WP dies auf der gleichen Seite, es prüft, ob es eine Aktion gibt, verarbeitet sie dann und leitet dann ohne die Aktion zu sich selbst weiter. Dies ist möglich, da auf diesen Seiten der admin-header noch nicht geladen wurde.

Wenn Sie es jedoch auf Ihrer eigenen Seite versuchen, wurde bereits die Hälfte der Admin-Schnittstelle an den Browser gesendet, so dass eine Weiterleitung nicht mehr möglich ist. Offensichtlich ist die Lösung, POST / GET direkt auf eine andere Seite zu laden, das WP-Framework darauf zu laden, die Verarbeitung durchzuführen und dann auf die ursprüngliche Seite umzuleiten … aber … das ist ein bisschen nervig, weil … mein Original Seite wird über einen Callback geladen, also läuft es innerhalb einer Methode meiner class. Das ist schön.

Wenn ich eine separate Seite lade, muss ich wp-load.php manuell wp-load.php und bin außerhalb meiner class, was nervig ist und in meinem speziellen Fall mich besonders ärgert, weil ich meine Plugin-class nur anonym installiere, so dass keine Von außen kann man darauf zugreifen.

Nach dieser langen Geschichte … hat jemand eine gute Lösung gefunden, um eine andere Seite über einen Callback zu laden, ohne dass die gesamte Admin-Oberfläche bereits eingerichtet wurde?

(Ich kenne eine Problemumgehung … ich kann eine function in load-.... haken, die nach dem Aktionsparameter sucht und die Verarbeitung und Weiterleitung durchführt. Aber ich frage mich, ob es einen besseren Weg gibt.)

Vielen Dank.

Solutions Collecting From Web of "Wie gehe ich am besten mit benutzerdefinierten Plug-in-Seitenaktionen um?"

Als Faustregel sollten Sie für die meisten Aktionen eine POST-Anfrage verwenden, um sicherzustellen, dass sie nicht versehentlich ausgeführt wird . Es ist jedoch auch eine gute Vorgehensweise, nach einer POST-Anforderung auf eine normale Seite umzuleiten, um eine doppelte Ausführung zu verhindern, wenn der Benutzer die Seite aktualisiert.

Der Ablauf ist also so:

  1. Ihre Plugin-Seite mit einem POST-Formular, das an
  2. Eine Seite, die die Anfrage verarbeitet, die zu umgeleitet wird
  3. Ihre Plugin-Seite, die das Ergebnis der Aktion anzeigt

Die mittlere Seite muss nicht Ihre Plugin-Seite sein. Dies bedeutet, dass Sie den “generischen POST-Handler” verwenden können , der vor drei Jahren 'admin_action_' . $_REQUEST['action'] wurde, die 'admin_action_' . $_REQUEST['action'] 'admin_action_' . $_REQUEST['action'] hook in admin.php .

Ein Beispiel für einen Benutzer ist das Akismet-Plugin . Wenn Sie es zuverlässig verwenden möchten, müssen Sie direkt an admin.php , nicht an eine andere Seite, die admin.php .

Hier ist ein sehr einfaches Beispiel, wie man es benutzt:

 add_action( 'admin_action_wpse10500', 'wpse10500_admin_action' ); function wpse10500_admin_action() { // Do your stuff here wp_redirect( $_SERVER['HTTP_REFERER'] ); exit(); } add_action( 'admin_menu', 'wpse10500_admin_menu' ); function wpse10500_admin_menu() { add_management_page( 'WPSE 10500 Test page', 'WPSE 10500 Test page', 'administrator', 'wpse10500', 'wpse10500_do_page' ); } function wpse10500_do_page() { ?> 
< ?php }

Ich habe das etwas anders angegangen, indem ich einfach noheader = true zur Aktions-URL auf der Seite hinzufüge, auf der der Benutzer die Aktion vornimmt

Mein Handler führt dann die Aktion aus (dh typischerweise ein Hinzufügen, Aktualisieren oder Löschen) und beendet dann mit wp_redirect () die nächste Seitenaktion (z. B. Seite hinzufügen -> Seite bearbeiten, Seite löschen -> Seite auflisten, Seite bearbeiten -> Seite bearbeiten ). Ich übergebe auch eine Nachricht über die URL, damit ich einen Status wie Update erfolgreich oder fehlgeschlagen anzeigen kann.

Dieser Ansatz behält alle Aktionen bei: Auflisten, Hinzufügen, Bearbeiten, Löschen, Massenlöschung usw. in derselben class und mit demselben Admin-Block, so dass es ziemlich einfach zu pflegen und zu verstehen ist.

Ein anderer Ansatz ist das Hinzufügen eines versteckten Eingabefeldes zum Formular:

  

Auf diese Weise scheint WordPress die Weiterleitung automatisch zu übernehmen.