it-swarm.com.de

Wordpress Update Plugin Hook/Aktion? Seit 3.9

Ich habe dies ein paar Mal recherchiert, aber meine Suche zeigt nicht viel, außer benutzerdefinierten Code, der eine gute WordPress-Praxis sein kann oder nicht.

Ab den neuesten Versionen (WordPress 3.9 "Smith") wurde dem Plugin-Update-Prozess ein Hook hinzugefügt? Ich frage, weil es ein sehr grundlegendes Bedürfnis ist, aber ich sehe es (noch) nicht im Kodex. Wenn nicht, welche allgemeinen und bewährten Methoden setzen Entwickler ein?

BEARBEITEN: Nur um zu verdeutlichen, ich spreche nicht von Aktivierung, sondern von Aktualisierung auf diese Weise, wenn Änderungen in der Datenbank vorliegen oder auf andere Weise behoben werden können.

11
user1915665

Ich glaube nicht, dass eine Aktion hinzugefügt wurde. Sie können Versionsdetails anzeigen für jede Version und sehen, dass neue Aktionen hinzugefügt wurden.

Die WordPress-Methode zum Ausführen von Code beim Aktualisieren von Plugins ist beschrieben hier :

Der richtige Umgang mit einem Upgrade-Pfad besteht darin, ein Upgrade-Verfahren nur dann auszuführen, wenn dies erforderlich ist. Idealerweise würden Sie eine "Version" in der Datenbankoption Ihres Plugins und dann eine Version im Code speichern. Wenn sie nicht übereinstimmen, würden Sie Ihre Aktualisierungsprozedur auslösen und dann die Datenbankoption so einstellen, dass sie der Version im Code entspricht. So viele Plugins können Upgrades durchführen, und so funktioniert auch der Core.

und mit Codebeispiel hier :

function myplugin_update_db_check() {
    global $jal_db_version;
    if (get_site_option( 'jal_db_version' ) != $jal_db_version) {
        jal_install();
    }
}
add_action( 'plugins_loaded', 'myplugin_update_db_check' );
13
Milo

Seit WordPress 3.9 können Sie upgrader_process_complete hook verwenden.
Siehe Referenz 1 , 2

Hier ist ein Beispielcode:

<?php 
/**
 * Plugin Name: Test plugin 1
 * Plugin URI: http://rundiz.com
 * Description: A very simple plugin for testing. This plugin do nothing.
 * Version: 0.1.8
 * Author: Vee Winch
 * Author URI: http://rundiz.com
 * License: MIT
 * License URI: https://opensource.org/licenses/MIT
 * Text Domain: test-plugin1
 * Domain Path: 
 */


$wppstp1_version = '0.1.8';


add_action('upgrader_process_complete', 'wppstp1_upgrade', 10, 2);// will working only this plugin activated.
function wppstp1_upgrade(\WP_Upgrader $upgrader_object, $hook_extra)
{
    global $wppstp1_version;

    if (is_array($hook_extra) && array_key_exists('action', $hook_extra) && array_key_exists('type', $hook_extra) && array_key_exists('plugins', $hook_extra)) {
        // check first that array contain required keys to prevent undefined index error.
        if ($hook_extra['action'] == 'update' && $hook_extra['type'] == 'plugin' && is_array($hook_extra['plugins']) && !empty($hook_extra['plugins'])) {
            // if this action is update plugin.
            $this_plugin = plugin_basename(__FILE__);

            foreach ($hook_extra['plugins'] as $each_plugin) {
                if ($each_plugin == $this_plugin) {
                    // if this plugin is in the updated plugins.
                    // don't process anything from new version of code here, because it will work on old version of the plugin.
                    file_put_contents(WP_CONTENT_DIR . '/test.txt', 'v'.$wppstp1_version."\r\n", FILE_APPEND); // you will always get the previous version even you update to the new version.
                    // set transient to let it run later.
                    set_transient('wppstp1_updated', 1);
                }
            }// endforeach;
            unset($each_plugin);
        }// endif update plugin and plugins not empty.
    }// endif; $hook_extra
}// wppstp1_upgrade


add_action('plugins_loaded', 'wppstp1_runUpdatedPlugin');
function wppstp1_runUpdatedPlugin()
{
    global $wppstp1_version;

    if (get_transient('wppstp1_updated') && current_user_can('manage_options')) {
        // if plugin updated and current user is admin.
        file_put_contents(WP_CONTENT_DIR . '/test-update-by-transient.txt', 'v'.$wppstp1_version."\r\n", FILE_APPEND);// you will always get the updated version here.

        // update code here.

        // delete transient.
        delete_transient('wppstp1_updated');
    }
}// wppstp1_runUpdatedPlugin

Sobald das Plugin aktualisiert ist, setzt es die Aufgabe mit der Funktion set_transient() auf db. Es wird nicht empfohlen, beim Aufrufen von upgrader_process_complete hook den Aktualisierungscode hinzuzufügen.
Wenn Sie als Nächstes zu einer anderen Administrationsseite navigieren, funktioniert der Hook plugins_loaded und der Aktualisierungscode wird dort ausgeführt.

Bitte beachten Sie, dass dieses Plugin aktiviert sein muss, damit der Update-Hook funktioniert.
Dies funktioniert nicht beim Aktivieren des Plugins. Wenn Sie also den Code möchten, der beim Aktivieren des Plugins funktioniert, müssen Sie ihn in der Funktion register_activation_hook() codieren.

2
vee

Aus der Diskussion, in der sie beschlossen haben, keinen benutzerdefinierten Hook/keine spezielle Upgrade-Funktion hinzuzufügen , geht hervor, dass "die meisten Leute" (seit 4 Jahren) register_activation_hook verwenden, da dieser aufgerufen wird, wenn ein Plugin über den Administrator aktualisiert wird Seite; Die meisten Beispiele, die ich seitdem gesehen habe, folgen diesem Trend.

Für die meisten Anwendungen würde ich vorschlagen, plugins_loaded nicht zu verwenden, da er bei jedem Laden der Seite aufgerufen wird. Die Ausnahme dazu wird in der Diskussion erwähnt: Upgrade-Pfade über FTP/SVN sind 'Edge-Fälle', da WP keinen Mechanismus hätte, um zu wissen, dass das Plugin geändert wurde. In diesem Fall ist der vorherige Antwort könnte relevanter sein.

Unter https://Gist.github.com/zaus/c08288c68b7f487193d1 finden Sie ein einfaches Framework-Beispiel mit register_activation_hook .

2
drzaus