Deinstallieren, Aktivieren, Deaktivieren eines Plugins: typische functionen und Vorgehensweisen

Ich mache ein WordPress-Plugin. Was sind typische Dinge, die ich in die Deinstallationsfunktion einbeziehen sollte?

Zum Beispiel, sollte ich Tabellen löschen, die ich in der Installationsfunktion erstellt habe?

Säubere ich meine Optionsfelder?

Noch etwas?

Solutions Collecting From Web of "Deinstallieren, Aktivieren, Deaktivieren eines Plugins: typische functionen und Vorgehensweisen"

Es gibt drei verschiedene Haken. Sie lösen in folgenden Fällen aus:

  • Deinstallieren
  • Deaktivierung
  • Aktivierung

So lösen Sie functionen während der Szenarien sicher aus

Das Folgende zeigt die richtigen Möglichkeiten, um Callback-functionen sicher anzuhängen, die während der genannten Aktionen ausgetriggers werden.

Wie Sie diesen Code in einem Plugin verwenden können, das verwendet

  • einfache functionen,
  • eine class oder
  • eine externe class,

Ich werde drei verschiedene Demo-Plugins zeigen , die du inspizieren und dann später in deinen eigenen Plugins implementieren kannst.

Wichtiger Hinweis im Voraus!

Da dieses Thema äußerst schwierig und sehr detailliert ist und ein Dutzend Randfälle aufweist, wird diese Antwort niemals perfekt sein. Ich werde es mit der Zeit verbessern, also schau regelmäßig auf.

(1) Aktivieren / Deaktivieren / Deinstallieren von Plugins.

Die Callbacks für das Plugin-Setup werden vom Core ausgetriggers und Sie haben keinen Einfluss darauf, wie Core das macht. Es gibt einige Dinge zu beachten:

  • Niemals jemals während der Setup-callbacke irgendetwas (!) Das wird dazu führen, dass die headers already sent und der Core wird empfehlen, dein Plugin zu deaktivieren und zu löschen … frag nicht: Ich weiß …
  • Sie werden keine visuelle Ausgabe sehen. Aber ich habe exit() statementen zu allen verschiedenen Callbacks hinzugefügt, damit Sie ein paar Einblicke bekommen, was wirklich passiert. Ziehe sie einfach aus, um zu sehen, ob etwas funktioniert.
  • Es ist äußerst wichtig, dass Sie überprüfen, ob __FILE__ != WP_PLUGIN_INSTALL und (wenn nicht: abbrechen!), __FILE__ != WP_PLUGIN_INSTALL wirklich das Plugin deinstallieren. Ich würde empfehlen, während der Entwicklung einfach Callbacks on_deactivation() auszulösen, damit Sie sich die Zeit sparen, die Sie benötigen, um alles zurück zu bekommen. Zumindest mache ich das.
  • Ich mache auch etwas Sicherheit. Manche werden auch von Core gemacht, aber hey! Sicher ist sicher! .
    • Zuerst verbiete ich direkten Dateizugriff, wenn der Core nicht geladen ist: defined( 'ABSPATH' ) OR exit;
    • Dann überprüfe ich, ob der aktuelle Benutzer diese Aufgabe ausführen darf.
    • Als letzte Aufgabe überprüfe ich den Referrer. Hinweis: Es kann zu unerwarteten Ergebnissen kommen, wenn ein wp_die() -Bildschirm nach korrekten Berechtigungen fragt (und wenn Sie es erneut versuchen wollen … ja, sicher ), wenn Sie einen Fehler bekommen haben. Dies passiert, wenn Core Sie umleitet, setzt den aktuellen $GLOBALS['wp_list_table']->current_action(); zu error_scrape und überprüft dann den Referrer auf check_admin_referer('plugin-activation-error_' . $plugin); , wobei $plugin $_REQUEST['plugin'] . Die Weiterleitung erfolgt also bei halber Seitenauslastung, und Sie erhalten diese verkabelte Bildlaufleiste und den Würfelbildschirm, der das gelbe Admin-Meldungs- / Meldungsfeld erkennt. Wenn das passiert: Bleiben Sie ruhig und suchen Sie einfach mit einigen exit() und Schritt-für-Schritt-Debugging nach dem Fehler.

(A) Plain-functionen-Plugin

Denken Sie daran, dass dies möglicherweise nicht funktioniert, wenn Sie die Callbacks vor der functionsdefinition anhängen.

 < ?php defined( 'ABSPATH' ) OR exit; /** * Plugin Name: (WCM) Activate/Deactivate/Uninstall - Functions * Description: Example Plugin to show activation/deactivation/uninstall callbacks for plain functions. * Author: Franz Josef Kaiser/wecodemore * Author URL: http://unserkaiser.com * Plugin URL: http://wordpress.stackexchange.com/questions/25910/uninstall-activate-deactivate-a-plugin-typical-features-how-to/25979#25979 */ function WCM_Setup_Demo_on_activation() { if ( ! current_user_can( 'activate_plugins' ) ) return; $plugin = isset( $_REQUEST['plugin'] ) ? $_REQUEST['plugin'] : ''; check_admin_referer( "activate-plugin_{$plugin}" ); # Uncomment the following line to see the function in action # exit( var_dump( $_GET ) ); } function WCM_Setup_Demo_on_deactivation() { if ( ! current_user_can( 'activate_plugins' ) ) return; $plugin = isset( $_REQUEST['plugin'] ) ? $_REQUEST['plugin'] : ''; check_admin_referer( "deactivate-plugin_{$plugin}" ); # Uncomment the following line to see the function in action # exit( var_dump( $_GET ) ); } function WCM_Setup_Demo_on_uninstall() { if ( ! current_user_can( 'activate_plugins' ) ) return; check_admin_referer( 'bulk-plugins' ); // Important: Check if the file is the one // that was registered during the uninstall hook. if ( __FILE__ != WP_UNINSTALL_PLUGIN ) return; # Uncomment the following line to see the function in action # exit( var_dump( $_GET ) ); } register_activation_hook( __FILE__, 'WCM_Setup_Demo_on_activation' ); register_deactivation_hook( __FILE__, 'WCM_Setup_Demo_on_deactivation' ); register_uninstall_hook( __FILE__, 'WCM_Setup_Demo_on_uninstall' ); 

(B) Eine klassenbasierte / OOP-Architektur

Dies ist das häufigste Beispiel in heutigen Plugins.

 < ?php defined( 'ABSPATH' ) OR exit; /** * Plugin Name: (WCM) Activate/Deactivate/Uninstall - CLASS * Description: Example Plugin to show activation/deactivation/uninstall callbacks for classes/objects. * Author: Franz Josef Kaiser/wecodemore * Author URL: http://unserkaiser.com * Plugin URL: http://wordpress.stackexchange.com/questions/25910/uninstall-activate-deactivate-a-plugin-typical-features-how-to/25979#25979 */ register_activation_hook( __FILE__, array( 'WCM_Setup_Demo_Class', 'on_activation' ) ); register_deactivation_hook( __FILE__, array( 'WCM_Setup_Demo_Class', 'on_deactivation' ) ); register_uninstall_hook( __FILE__, array( 'WCM_Setup_Demo_Class', 'on_uninstall' ) ); add_action( 'plugins_loaded', array( 'WCM_Setup_Demo_Class', 'init' ) ); class WCM_Setup_Demo_Class { protected static $instance; public static function init() { is_null( self::$instance ) AND self::$instance = new self; return self::$instance; } public static function on_activation() { if ( ! current_user_can( 'activate_plugins' ) ) return; $plugin = isset( $_REQUEST['plugin'] ) ? $_REQUEST['plugin'] : ''; check_admin_referer( "activate-plugin_{$plugin}" ); # Uncomment the following line to see the function in action # exit( var_dump( $_GET ) ); } public static function on_deactivation() { if ( ! current_user_can( 'activate_plugins' ) ) return; $plugin = isset( $_REQUEST['plugin'] ) ? $_REQUEST['plugin'] : ''; check_admin_referer( "deactivate-plugin_{$plugin}" ); # Uncomment the following line to see the function in action # exit( var_dump( $_GET ) ); } public static function on_uninstall() { if ( ! current_user_can( 'activate_plugins' ) ) return; check_admin_referer( 'bulk-plugins' ); // Important: Check if the file is the one // that was registered during the uninstall hook. if ( __FILE__ != WP_UNINSTALL_PLUGIN ) return; # Uncomment the following line to see the function in action # exit( var_dump( $_GET ) ); } public function __construct() { # INIT the plugin: Hook your callbacks } } 

(C) Eine klassenbasierte / OOP-Architektur mit einem externen Setup-Objekt

Dieses Szenario setzt voraus, dass Sie eine Haupt-Plugin-Datei und eine zweite Datei namens setup.php in einem Unterverzeichnis des Plugins namens inc : ~/wp-content/plugins/your_plugin/inc/setup.php . Dies funktioniert auch, wenn der Plugin-Ordner außerhalb der Standard-WP-Ordnerstruktur liegt, wenn das Inhaltsverzeichnis umbenannt wird oder wenn die Setup-Datei anders benannt wird. Nur der Ordner " inc " muss den gleichen Namen und den gleichen relativen Speicherort wie das Plug-in-Stammverzeichnis haben.

Hinweis: Sie können einfach die drei register_*_hook()* -functionen und die classn verwenden und sie in Ihr Plugin einfügen.

Die Haupt-Plugin-Datei:

 < ?php defined( 'ABSPATH' ) OR exit; /** * Plugin Name: (WCM) Activate/Deactivate/Uninstall - FILE/CLASS * Description: Example Plugin * Author: Franz Josef Kaiser/wecodemore * Author URL: http://unserkaiser.com * Plugin URL: http://wordpress.stackexchange.com/questions/25910/uninstall-activate-deactivate-a-plugin-typical-features-how-to/25979#25979 */ register_activation_hook( __FILE__, array( 'WCM_Setup_Demo_File_Inc', 'on_activation' ) ); register_deactivation_hook( __FILE__, array( 'WCM_Setup_Demo_File_Inc', 'on_deactivation' ) ); register_uninstall_hook( __FILE__, array( 'WCM_Setup_Demo_File_Inc', 'on_uninstall' ) ); add_action( 'plugins_loaded', array( 'WCM_Setup_Demo_File', 'init' ) ); class WCM_Setup_Demo_File { protected static $instance; public static function init() { is_null( self::$instance ) AND self::$instance = new self; return self::$instance; } public function __construct() { add_action( current_filter(), array( $this, 'load_files' ), 30 ); } public function load_files() { foreach ( glob( plugin_dir_path( __FILE__ ).'inc/*.php' ) as $file ) include_once $file; } } 

Die Setup-Datei:

 < ?php defined( 'ABSPATH' ) OR exit; class WCM_Setup_Demo_File_Inc { public static function on_activation() { if ( ! current_user_can( 'activate_plugins' ) ) return; $plugin = isset( $_REQUEST['plugin'] ) ? $_REQUEST['plugin'] : ''; check_admin_referer( "activate-plugin_{$plugin}" ); # Uncomment the following line to see the function in action # exit( var_dump( $_GET ) ); } public static function on_deactivation() { if ( ! current_user_can( 'activate_plugins' ) ) return; $plugin = isset( $_REQUEST['plugin'] ) ? $_REQUEST['plugin'] : ''; check_admin_referer( "deactivate-plugin_{$plugin}" ); # Uncomment the following line to see the function in action # exit( var_dump( $_GET ) ); } public static function on_uninstall() { if ( ! current_user_can( 'activate_plugins' ) ) return; check_admin_referer( 'bulk-plugins' ); // Important: Check if the file is the one // that was registered during the uninstall hook. if ( __FILE__ != WP_UNINSTALL_PLUGIN ) return; # Uncomment the following line to see the function in action # exit( var_dump( $_GET ) ); } } 

(2) Plugin-Updates

Wenn Sie ein Plug-in schreiben, das eine eigene DB-Tabelle oder Optionen besitzt, gibt es möglicherweise Szenarien, in denen Sie Dinge ändern oder aktualisieren müssen.

Leider gibt es bisher keine Möglichkeit etwas über Plugin / Theme-Installation oder Update / Upgrade zu starten. Gerne gibt es einen Workaround: Hook eine benutzerdefinierte function zu einer benutzerdefinierten Option (ja, es ist lahm - aber es funktioniert).

 function prefix_upgrade_plugin() { $v = 'plugin_db_version'; $update_option = null; // Upgrade to version 2 if ( 2 !== get_option( $v ) ) { if ( 2 < get_option( $v ) ) { // Callback function must return true on success $update_option = custom_upgrade_cb_fn_v3(); // Only update option if it was an success if ( $update_option ) update_option( $v, 2 ); } } // Upgrade to version 3, runs just after upgrade to version 2 if ( 3 !== get_option( $v ) ) { // re-run from beginning if previous update failed if ( 2 < get_option( $v ) ) return prefix_upgrade_plugin(); if ( 3 < get_option( $v ) ) { // Callback function must return true on success $update_option = custom_upgrade_cb_fn_v3(); // Only update option if it was an success if ( $update_option ) update_option( $v, 3 ); } } // Return the result from the update cb fn, so we can test for success/fail/error if ( $update_option ) return $update_option; return false; } add_action('admin_init', 'prefix_upgrade_plugin' ); 

Quelle

Diese Update-function ist ein nicht so schönes / gut geschriebenes Beispiel, aber wie gesagt: Es ist ein Beispiel und die Technik funktioniert gut. Wird das mit einem späteren Update verbessern.

Um das aktuelle System auf benötigte Features wie PHP-Version oder installierte Erweiterungen zu testen, können Sie Folgendes verwenden:

 < ?php # -*- coding: utf-8 -*- /** * Plugin Name: T5 Check Plugin Requirements * Description: Test for PHP version and installed extensions * Plugin URI: * Version: 2013.03.31 * Author: Thomas Scholz * Author URI: http://toscho.de * Licence: MIT * License URI: http://opensource.org/licenses/MIT */ /* * Don't start on every page, the plugin page is enough. */ if ( ! empty ( $GLOBALS['pagenow'] ) && 'plugins.php' === $GLOBALS['pagenow'] ) add_action( 'admin_notices', 't5_check_admin_notices', 0 ); /** * Test current system for the features the plugin needs. * * @return array Errors or empty array */ function t5_check_plugin_requirements() { $php_min_version = '5.4'; // see http://www.php.net/manual/en/extensions.alphabetical.php $extensions = array ( 'iconv', 'mbstring', 'id3' ); $errors = array (); $php_current_version = phpversion(); if ( version_compare( $php_min_version, $php_current_version, '>' ) ) $errors[] = "Your server is running PHP version $php_current_version but this plugin requires at least PHP $php_min_version. Please run an upgrade."; foreach ( $extensions as $extension ) if ( ! extension_loaded( $extension ) ) $errors[] = "Please install the extension $extension to run this plugin."; return $errors; } /** * Call t5_check_plugin_requirements() and deactivate this plugin if there are error. * * @wp-hook admin_notices * @return void */ function t5_check_admin_notices() { $errors = t5_check_plugin_requirements(); if ( empty ( $errors ) ) return; // Suppress "Plugin activated" notice. unset( $_GET['activate'] ); // this plugin's name $name = get_file_data( __FILE__, array ( 'Plugin Name' ), 'plugin' ); printf( '

%1$s

%2$s has been deactivated.

', join( '

', $errors ), $name[0] ); deactivate_plugins( plugin_basename( __FILE__ ) ); }

Testen Sie mit einem Check für PHP 5.5:

Bildbeschreibung hier eingeben