Wordpress Update Plugin Hook / Aktion? Seit 3.9

15

Ich habe dies einige Male recherchiert, aber meine Suche zeigt nur benutzerdefinierten Code, der eine gute WordPress-Praxis sein kann oder nicht.

Wurde seit den neuesten Versionen (WordPress 3.9 "Smith") ein Hook zum Plugin-Update-Prozess 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 Verfahren setzen Entwickler ein?

EDIT: Nur um zu verdeutlichen, ich spreche nicht von Aktivierung, sondern von Aktualisierung auf diese Weise, wenn es Änderungen in der Datenbank gibt oder auf andere Weise behoben werden kann.

user1915665
quelle
@drzaus Antwort vorausgesetzt, es gibt keine gute Praxis.
Rens Tillmann
@RensTillmann Abgesehen davon, dass dies ohnehin 2 Jahre veraltet ist, hat das verknüpfte Q / A im Grunde die gleiche Antwort, liegt jedoch um weitere 2 Jahre vor dieser Frage, daher das 'Duplikat'.
Drzaus

Antworten:

15

Ich glaube nicht, dass eine Aktion hinzugefügt wurde. Du kannst die Versionsdetails für jede Version anzeigen und sehen, ob neue Aktionen hinzugefügt wurden.

Die WordPress-Methode zum Ausführen von Code beim Plugin-Update wird beschrieben hier :

Der richtige Weg, um einen Upgrade-Pfad zu handhaben, besteht darin, ein Upgrade-Verfahren nur bei Bedarf auszuführen. Idealerweise würden Sie eine "Version" in der Datenbankoption Ihres Plugins und dann eine Version im Code speichern. Wenn sie nicht übereinstimmen, lösen Sie Ihr Upgrade-Verfahren aus und setzen die Datenbankoption so, dass sie der Version im Code entspricht. So viele Plugins verarbeiten Upgrades, und so funktioniert auch der Kern.

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' );
Milo
quelle
Danke - dann verwende ich einfach diese Methode. WP muss wirklich eine Aktion hinzufügen: D
user1915665
8
Technisch gesehen sollten Sie verwenden register_activation_hook, da in den meisten Fällen ein Plugin deaktiviert / aktiviert wird, wenn Sie es vom Administrator aktualisieren. Wenn Sie sich einbinden, plugins_loadedüberprüfen Sie jede Seite (einschließlich Frontend). Es wurde über die Einführung gesprochen register_update_hook, aber es wurde vor einiger Zeit als WONTFIX markiert . Die Diskussion dort ist hilfreich.
Drzaus
4
Es ist wichtig zu verstehen, dass ein Massen-Plugin-Update KEINE Aktivierungs-Hooks ausführt - es SOLLTE, aber nicht bei 3.9.2. Mit "Massenaktualisierung" meine ich eine Aktualisierung, die über die Dashboard-Aktualisierungsseite durchgeführt wurde. Einzelne Updates, die auf der Plugin-Seite vorgenommen wurden, führen die Hooks einwandfrei aus.
Brian C
4
Die Sache ist, dass Plugins auch über FTP aktualisiert werden können, was bedeutet, dass der Hook auf keinen Fall ausgelöst wird. Aus diesem Grund müssen Sie auf die in der Datenbank gespeicherte Option zurückgreifen.
Giraffe
4
Um den Kommentar von @ giraff zu erweitern, gilt dies auch für Personen, die ihren Code mit Quellcodeverwaltung wie SVN oder Git verwalten. Dieser Grund, diese Antwort ist der beste Weg , Upgrades zu handhaben .
Doublesharp
3

Von dem Diskussion, in der sie beschlossen haben, keinen benutzerdefinierten Hook / keine benutzerdefinierte Funktion für das Upgrade hinzuzufügen , klingt es so, als würden "die meisten Leute" ( register_activation_hookseit 4 Jahren) es verwenden , da es aufgerufen wird, wenn ein Plugin über die Administrationsseite aktualisiert wird. Die meisten Beispiele, die ich seitdem gesehen habe, folgen diesem Trend.

Für die meisten Anwendungen würde ich empfehlen, nicht durchzuhaken plugins_loaded , da dies bei jedem Laden der Seite aufgerufen wird. Die Ausnahme hiervon wird in der Diskussion erwähnt: Upgrade-Pfade über FTP / SVN sind "Randfälle", da WP keinen Mechanismus hätte, um zu wissen, dass das Plugin geändert wurde. In diesem Fall die vorherige Antwort relevanter sein.

Unter https://gist.github.com/zaus/c08288c68b7f487193d1 finden Sie ein Beispiel für ein einfaches Framework register_activation_hook.

drzaus
quelle
register_activation_hookEs wird nicht garantiert, dass Updates ausgeführt werden, siehe make.wordpress.org/core/2010/10/27/…
Flimm
Sehr viel - NICHT verwenden plugins_loaded- läuft jede Last und kann lästig / langsam sein.
cale_b
3

Seit WordPress 3.9 können Sie upgrader_process_completeHook 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 wurde, wird die Aufgabe mithilfe der set_transient()Funktion in db gesetzt . Es wird nicht empfohlen, beim Aufrufen von upgrader_process_completehook Update-Code hinzuzufügen .
Wenn Sie als Nächstes zu einer anderen Administrationsseite navigieren, plugins_loadedfunktioniert der Hook und der Update-Code funktioniert dort.

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 zum Aktivieren des Plugins verwenden möchten, müssen Sie ihn in der register_activation_hook()Funktion codieren .

vee
quelle