web-dev-qa-db-de.com

Wie gehe ich am besten mit benutzerdefinierten Pluginseitenaktionen um?

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 als admin.php?page=... geladen, es 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 zurück auf die Seite ohne den Aktionsparameter leiten. Egal ob ich ein GET oder POST mache, wirklich.

Auf allen internen Seiten überprüft WP, ob eine Aktion vorhanden ist, verarbeitet sie und leitet sie 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 Administrationsoberfläche an den Browser gesendet, sodass eine Weiterleitung nicht mehr möglich ist. Es ist klar, dass die Lösung darin besteht, 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 ... meine ursprüngliche Seite über einen Rückruf geladen wird, so läuft sie innerhalb einer Methode meiner Klasse. Das ist schön.

Wenn ich eine separate Seite lade, muss ich wp-load.php manuell einfügen und bin außerhalb meiner Klasse, was ärgerlich ist und mich in meinem speziellen Fall besonders stört, weil ich meine Plugin-Klasse nur anonym instanziiere, damit niemand darauf zugreifen kann es von außen.

Also, nach dieser langen Geschichte ... hat sich jemand eine gute Lösung ausgedacht, um eine andere Seite über einen Rückruf zu laden ohne und die gesamte Administrationsoberfläche bereits darauf eingerichtet zu haben?

(Ich kenne eine Problemumgehung ... ich kann eine Funktion in load-.... einbinden, die nach dem Aktionsparameter sucht und die Verarbeitung und Umleitung vornimmt. Aber ich frage mich, ob es einen besseren Weg gibt.)

Vielen Dank.

21
wyrfel

Als Faustregel sollten Sie für die meisten Aktionen eine POST -Anforderung verwenden, um sicherzustellen, dass sie nicht aus Versehen 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:

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

Die mittlere Seite muss nicht Ihre Pluginseite sein. Dies bedeutet, dass Sie den "generic POST handler" verwenden können, der vor drei Jahren enthalten war, den 'admin_action_' . $_REQUEST['action'] hook in admin.php .

Ein Beispielbenutzer ist das Akismet-Plugin . Wenn Sie es zuverlässig verwenden möchten, müssen Sie direkt an admin.php senden , nicht an eine andere Seite, die admin.php enthält.

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()
{
?>
<form method="POST" action="<?php echo admin_url( 'admin.php' ); ?>">
    <input type="hidden" name="action" value="wpse10500" />
    <input type="submit" value="Do it!" />
</form>
<?php
}
28
Jan Fabry

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 pflegen und zu verstehen ist.

3

Ein anderer Ansatz ist das Hinzufügen eines ausgeblendeten Eingabefelds zum Formular:

<input type="hidden" name="page" value="your-page-slug" />

Auf diese Weise scheint WordPress die Umleitung automatisch zu handhaben.

0