it-swarm.com.de

Automatische Updates im Plugin - nicht im WordPress-Repository gehostet

Ich programmiere ein Plugin, das wahrscheinlich in Zukunft aktualisiert wird, und ich möchte den automatischen Aktualisierungsmechanismus in WordPress nutzen.

Ich folgte diesem Tutorial :

Alles schien mir recht einfach zu sein, aber aus irgendeinem Grund funktioniert nichts. Die mit dem pre_set_site_transient_update_plugins-Filter verknüpfte Funktion wird nie aufgerufen.

Ich habe versucht, Schritt für Schritt voranzukommen und habe gerade ein "Hallo" und eine Protokollzeile an diesen Haken angehängt. Es wird einfach nicht aufgerufen, auch wenn ich versucht habe, die Update-Prüfungen zu erzwingen.

Gibt es einen Haken daran? Übrigens versuche ich das bei einer Installation mit mehreren Standorten.

Jede Hilfe wäre sehr dankbar.

Arnaldo

UPDATE: Ich habe die Funktion mit dem aufzurufenden pre_set_site_transient_update_plugins verknüpft. Seltsamerweise funktioniert es, wenn ich das Hooking im Konstruktor des Objekts durchführe, das die Prüffunktion hat, ansonsten nicht.

Beispiel (das funktioniert):

class XYZ {
    public function __construct() {
        add_filter('pre_set_site_transient_update_plugins', array($this, 'check_update'));
    }

    public function check_update($transient) {
        // logic here
    }
}

Wenn ich dies jedoch einfach in meiner Haupt-Plugin-Datei mache, funktioniert es nicht:

add_filter('pre_set_site_transient_update_plugins', array('XYZ', 'check_update')); 

Zunächst möchte ich verstehen, was der Unterschied zwischen den beiden Szenarien ist. Ansonsten musste ich tun

set_site_transient('update_plugins', null);

um den Aufruf des Hooks zu erzwingen, sonst müsste ich wohl auf den normalen WordPress-Update-Check warten, oder? Und jetzt ist ein anderes Problem aufgetaucht: Die Variable $transient, die an die Funktion check_update() übergeben wird, ist immer null! Liegt das an der Anweisung set_site_transient()? Wenn ja, wie kann ich die gesamte Lösung überprüfen, ohne mehrere Stunden zu leiden, um meine letzten Änderungen zu testen?

Nochmals vielen Dank, Arnaldo

UPDATE 2: @kaiser, das verhalten ist genau so wie ich es beschrieben habe, auch mit einer statischen methode. Das hatte ich schon probiert.

5
arnaldo2204

Sie haben dort tatsächlich mehrere Fragen, also beantworte ich sie nacheinander:

Wenn ich dies jedoch einfach in meiner Haupt-Plugin-Datei mache, funktioniert es nicht:

add_filter('pre_set_site_transient_update_plugins', array('XYZ', 'check_update'));

Zunächst möchte ich verstehen, was der Unterschied zwischen den beiden Szenarien ist.

Dies schlägt fehl, weil Sie die Methode statisch anstatt auf einer Instanz der Klasse aufrufen. Da die Methode für eine Instanz nicht aufgerufen wird, werden die Klasseneigenschaften nicht festgelegt. Wenn zum Beispiel check_update() versucht, $this->current_version zu verwenden, wird null ausgegeben. Aus diesem Grund geht die Funktion davon aus, dass kein Update verfügbar ist.

Ansonsten musste ich tun

set_site_transient('update_plugins', null);

um den Aufruf des Hooks zu erzwingen, sonst müsste ich wohl auf den normalen WordPress-Update-Check warten, oder?

Ja.

Und jetzt ist ein anderes Problem aufgetaucht: Die Variable $transient, die an die Funktion check_update() übergeben wird, ist immer null! Liegt das an der Anweisung set_site_transient()?

Ja, Sie setzen den Übergang auf null. Sie sollten also nicht erwarten, dass es danach nur noch null ist, es sei denn, dies ist aus irgendeinem Grund fehlgeschlagen.

[H] wie kann ich die gesamte Lösung überprüfen, ohne mehrere Stunden zu leiden, um meine letzten Änderungen testen zu können?

Ändern Sie es zu Testzwecken so, dass es sich in get_site_transient_update_plugins einhakt. Das wird jedes Mal aufgerufen, wenn der Transient abgerufen wird. Möglicherweise möchten Sie jedoch eine statische Variable oder etwas anderes festlegen, sodass Sie sie nicht mehr als einmal pro Seitenanforderung aufrufen.

4
J.D.

Dies könnte Ihr Problem nicht direkt lösen, aber ich möchte erwähnen, dass Sie, wenn Sie WordPress.org vermeiden möchten, Ihr Plugin auf GitHub (oder Bitbucket) hosten können.

Es gibt ein Updater-Plugin dafür und auf Tut + ist ein gutes Tutorial dafür: Verteilen Sie Ihre Plugins in GitHub mit automatischen Updates

2
obstschale