register_uninstall_hook () vs uninstall.php - welcher ist der bessere Weg, um das Plugin-Deinstallationsskript zu handhaben?

7

Als ich heute in WP Codex nachgesehen habe, habe ich zwei Möglichkeiten gesehen, um Plugins zur Deinstallation von Plugins zu handhaben (wie Löschungen, Optionen, Daten, Tabellen usw.). Eine Möglichkeit ist die Verwendung register_uninstall_hook()und die andere die Verwendung der einfachen uninstall.php.

Die Codex-Seite enthält zwar viele Informationen zu beiden, sagt jedoch nicht aus, was der Vorteil einer Verwendung gegenüber der anderen ist.

Da es hier so viele WP-Gurus gibt, dachte ich, ich sollte diese Frage stellen, welche Option der bessere Weg ist, um das Deinstallationsskript zu handhaben. Verwenden von register_uninstall_hook()oder uninstall.php?

Hoffe, jemand wird klären. Danke im Voraus.

iSaumya
quelle

Antworten:

5

Der Vorteil uninstall.phpund der Grund für die Einführung besteht darin, dass Sie Ihren Deinstallationscode vom Rest des Plugin-Codes isolieren können. Dies bedeutet, dass Ihr gesamtes Plugin bei der Deinstallation nicht geladen werden muss. Dies minimiert die Wahrscheinlichkeit, dass Ihr Plugin während der Deinstallation versehentlich Code ausführt, der nur ausgeführt werden soll, wenn das Plugin aktiv ist. Im Allgemeinen sollten Sie jedoch ohnehin keinen beliebigen Code in Ihren Plugin-Dateien ausführen. Fast alles sollte nur ausgeführt werden, wenn dies durch einen Hook ausgelöst wird.

Aus den im ursprünglichen Commit enthaltenen Dokumenten :

Das Plugin sollte bei der Registrierung des Deinstallations-Hooks keinen beliebigen Code außerhalb von Funktionen ausführen. Um mit dem Hook ausgeführt werden zu können, muss das Plugin enthalten sein. Dies bedeutet, dass Code, der außerhalb einer Funktion liegt, während des Deinstallationsvorgangs ausgeführt wird. Das Plugin sollte den Deinstallationsprozess nicht behindern.

Wenn das Plugin nicht geschrieben werden kann, ohne dass Code innerhalb des Plugins ausgeführt wird, sollte das Plugin eine Datei mit dem Namen 'uninstall.php' im Basis-Plugin-Ordner erstellen ...

TL; DR: Ihr Plugin sollte wirklich in so strukturiert sein , dass sie nicht haben , um den Einsatz unisntall.php, aber es trotzdem mit fügt einen zusätzlichen Schutz gegen versehentliches laufen die Dinge bei der Deinstallation.

In einigen Fällen müssen Sie natürlich möglicherweise Teile Ihres Plugins laden, um es trotzdem ordnungsgemäß zu deinstallieren. Wenn Sie jedoch uninstall.phpdiese Dateien verwenden, ist dies eine bewusste Entscheidung, die Sie treffen. Daher ist es schwieriger, versehentlich eine Datei Ihres Plugins zu laden, in der beliebiger Code ausgeführt wird.

Das einzige Mal, dass ich die register_uninstall_hook()Methode verwenden würde, wäre ein sehr einfaches Plugin für einzelne Dateien, in dem der gesamte Code in einer einzigen Klasse gekapselt war.


Beachten Sie, dass uninstall_plugin()der Aktions-Hook pre_uninstall_plugin und uninstall_{$plugin_file} [Bearbeiten: uninstall_{$plugin_file}wird nur ausgeführt, wenn er register_uninstall_hook()verwendet wird] ausgeführt wird , unabhängig davon, welche Methode Sie verwenden. (Siehe Ticket Nr. 34569. )

JD
quelle
Tolle Antwort. Eigentlich arbeite ich an einem neuen Plugin, in dem ich Optionen erstellen und Daten in wp-Tabellen einfügen muss. Es liegt also in meiner Verantwortung, die Datenbank bei der Deinstallation zu bereinigen. Also überlegte ich, welchen Weg ich einschlagen sollte, um die unregister_settings, delete_option usw. auszuführen. Sollte ich den Weg des Deinstallations-Hooks oder den Weg der Deinstallationsdatei einschlagen? Aber nachdem Sie Ihre Antwort gelesen haben, denke ich, dass Deinstallieren der Datei eine gute Option wäre. Was denken Sie?
iSaumya
1
@iSaumya Ja, ich würde die Deinstallationsdatei verwenden, wenn ich es wäre. Die Deinstallations-Hook-Methode eignet sich möglicherweise gut für sehr einfache Plugins für einzelne Dateien, bei denen der gesamte Code in einer einzelnen Klasse gekapselt ist. In jedem anderen Fall würde ich die uninstall.phpDatei verwenden.
JD
1
@iSaumya Ich habe gerade festgestellt, dass ich mich in Bezug auf den uninstall_{$plugin_file}Haken in beiden Fällen geirrt habe . @the_dramatist ist richtig, dass es nur ausgeführt wird, wenn register_uninstall_hook()es verwendet wird. Beachten Sie jedoch, dass alles, was sich in die Deinstallation des Plugins einbinden möchte, wahrscheinlich pre_uninstall_pluginstattdessen verwendet werden sollte (was tatsächlich für beide ausgeführt wird). Siehe Ticket Nr. 34569 . Ich würde das also nicht zu einem entscheidenden Faktor machen, für welchen von diesen Sie sich entscheiden.
JD
1

Nun, es kommt darauf an, was Sie wollen. register_uninstall_hook()Erstellt Hooks und wird ausgeführt, wenn auf den uninstallLink geklickt wird. Das heißt, es wird tatsächlich ein Hook erstellt, der beim Klicken auf den Deinstallationslink aufgerufen wird. Angenommen, Sie haben ein Plugin entwickelt und basierend auf diesem Plugin möchten Sie andere Plugins erstellen. Diese Add-On-Plugins müssen für die Deinstallation des basierten Plugins ausgeführt werden. Dann ist dieser Hook hilfreich. Hier erhalten Sie einen vollständigen Überblick.

Und uninstall.phpist ein generisches Deinstallationsprogramm für Ihr Plugin. Es wird bei der Deinstallation Ihres Plugins ausgelöst. Standardmäßig wird jedoch kein Hook bereitgestellt.

Weitere Informationen finden Sie hier .

CodeMascot
quelle
2
Sie können jedoch auch Hooks in Ihre uninstall.php einfügen. Der Link ist der gleiche wie in der Frage. Gibt es eine Referenz für Ihre Best Practice?
Andy Macaulay-Brook
1
Ja. Wir können Haken setzen uninstall.php. Aber ich sagte, dass es nicht standardmäßig bereitgestellt wird. Und für Referenzen schauen Sie bitte auf WordPress Plugin Development Boilerplateoder irgendwelche Kesselplatten. Hier ist der Boilerplate-Link von Tom McFarlin, github.com/DevinVinson/WordPress-Plugin-Boilerplate . Und wenn Sie Hooks durch bereitstellen möchten uninstall.php, können Sie dies tun. Aber als Kontext seiner Frage bevorzugte ich die register_uninstall_hook().
CodeMascot
1
@the_dramatist Es ist nicht möglich, beide anzugeben, siehe Quelle vonuninstall_plugin() . Die uninstall.phpDatei hat Vorrang, und jeder Deinstallations-Hook wird ignoriert und die uninstall_{$plugin_file}Aktion wird nicht ausgelöst.
JD