web-dev-qa-db-fra.com

Mises à jour automatiques dans le plugin - non hébergées sur le référentiel wordpress

Je code un plugin qui aura probablement des mises à jour dans le futur, et je veux profiter du mécanisme de mise à jour automatique de Wordpress.

J'ai suivi ce tutoriel :

Tout me semblait assez simple, mais pour une raison quelconque, rien ne fonctionne. La fonction liée au filtre pre_set_site_transient_update_plugins n'est jamais appelée.

J'ai essayé d'aller étape par étape et je viens d'ajouter un "Bonjour" et une ligne de journal sur ce crochet. Il ne s'appelle tout simplement pas, même lorsque j'ai essayé de forcer les vérifications de mise à jour.

Y at-il un piège à ce sujet? Au fait, j'essaye ça sur une installation multisite.

Toute aide serait grandement appréciée.

Arnaldo

UPDATE: J'ai appelé la fonction accrochée au pre_set_site_transient_update_plugins. Bizarrement, si je fais le hooking à l'intérieur du constructeur de l'objet qui a la fonction de contrôle ça marche, sinon ça ne marche pas.

Exemple (ça marche):

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

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

Cependant, si je le fais simplement sur mon fichier de plugin principal, cela ne fonctionne pas:

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

Tout d'abord, j'aimerais comprendre quelle est la différence entre les deux scénarios. En plus de cela, je devais faire

set_site_transient('update_plugins', null);

pour obliger le crochet à être appelé, sinon je pense que je devrais attendre le cycle normal de vérification de la mise à jour de wordpress, non? Et maintenant, un autre problème est apparu: la variable $transient qui est transmise à la fonction check_update() est toujours nulle! Est-ce à cause de l'instruction set_site_transient()? Si tel est le cas, comment puis-je vérifier la totalité de la solution sans souffrir pendant plusieurs heures pour pouvoir tester mes dernières modifications?

Merci encore, Arnaldo

UPDATE 2: @kaiser, le comportement est exactement tel que je l'ai décrit, même en utilisant une méthode statique. J'avais déjà essayé ça.

5
arnaldo2204

Vous avez en fait plusieurs questions, donc je vais y répondre une à une:

Cependant, si je le fais simplement sur mon fichier de plugin principal, cela ne fonctionne pas:

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

Tout d'abord, j'aimerais comprendre quelle est la différence entre les deux scénarios.

Cela échoue car vous appelez la méthode de manière statique, et non sur une instance de la classe. Comme la méthode n'est pas appelée sur une instance, les propriétés de la classe ne sont pas définies. Ainsi, par exemple, lorsque check_update() a essayé d'utiliser $this->current_version, il obtiendra null. Pour cette raison, la fonction supposera qu'aucune mise à jour n'est disponible.

En plus de cela, je devais faire

set_site_transient('update_plugins', null);

pour obliger le crochet à être appelé, sinon je pense que je devrais attendre le cycle normal de vérification de la mise à jour de wordpress, non?

Oui.

Et maintenant, un autre problème est apparu: la variable $transient qui est transmise à la fonction check_update() est toujours null! Est-ce à cause de l'instruction set_site_transient()?

Oui, vous définissez le transitoire sur null. Donc, vous ne devriez pas vous attendre à ce que ce soit autre chose que null après, sauf si cela a échoué pour une raison quelconque.

[C] est-ce que je peux vérifier toute la solution sans souffrir pendant plusieurs heures pour pouvoir tester mes dernières modifications?

Pour le test, changez-le pour accrocher à get_site_transient_update_plugins à la place. Cela sera appelé chaque fois que le transitoire sera récupéré. Vous souhaiterez peut-être définir une variable statique ou autre chose, afin de ne pas l'appeler plus d'une fois par demande de page.

4
J.D.

Cela pourrait ne pas résoudre votre problème directement, mais je voudrais mentionner que si vous voulez éviter WordPress.org, vous pouvez héberger votre plugin sur GitHub (ou Bitbucket).

Il existe un plugin de mise à jour pour cela et Tut + est un bon tutoriel pour cela: Distribuer vos plugins dans GitHub avec des mises à jour automatiques

2
obstschale