Message à la dés/activation – déinstallation d’un plugin (Créer un compte)

  • Statut : non résolu
15 sujets de 1 à 15 (sur un total de 30)
  • Auteur
    Messages
  • #506160
    luciole135
    Participant
    Maître WordPress
    13714 contributions

    Bonjour,

    Ma configuration WP actuelle
    – Version de WordPress :
    – Version de PHP/MySQL :
    – Thème utilisé :
    – Extensions en place :
    – Nom de l’hebergeur :
    – Adresse du site :

    Problème(s) rencontré(s) :

    Bonjour,
    Pour les plugins que j’entretiens, j’aimerai ajouter des fonctions lors de l’activation, de la désactivation et de la désintallation.
    J’ai voulu faire exactement comme indiqué sur ce lien recommandé par le CODEX mais, cela n’a pas du tout fonctionné.
    dés/activation désinstallation
    Alors, j’ai fait plus simple – sans les CLASS – la fonction est appelée directement lors de son activation

    register_activation_hook( __FILE__,’DailyStat_activate’);
    function DailyStat_activate()
    {
    global $wpdb, $DailyStat_Option;
    $table_name = DAILYSTAT_TABLE_NAME;

    if (($wpdb->get_var(« SHOW TABLES LIKE ‘$table_name' ») != $table_name) or ($DailyStat_Option[‘DailyStat_Version_DB’] <> DAILYSTAT_DB_VERSION))
    {$wpdb->query(« ALTER TABLE $table_name DROP COLUMN threat_score »);
    $wpdb->query(« ALTER TABLE $table_name DROP COLUMN threat_type »);
    $wpdb->query(« DELETE FROM $wpdb->options WHERE option_name LIKE ‘%dailystat%' »);
    $wpdb->query(‘OPTIMIZE TABLE ‘ . $wpdb->options);
    $DailyStat_Option[‘DailyStat_Version_DB’] = DAILYSTAT_DB_VERSION;
    update_option(‘DailyStat_Option’, $DailyStat_Option);
    luc_dailystat_CreateTable();
    //echo »DailyStat activé »;
    };

    Mais du coup, lorsque je veux écrire un message sur le tableau de bord pour dire « table crée, plugin activé’, cela génère une erreur « L’extension a généré 16 caractères d’affichage inattendu lors de l’activation. Si vous voyez un message « Les en-têtes ont déjà été envoyés », des problèmes avec les flux de syndication ou d’autres erreurs, essayez de désactiver ou enlever cette extension.« .

    Comment faire pour écrire un message sur le tableau de bord quand on active/désactive ou désinstalle un plugin sans générer d’erreurs ?

    Merci de votre aide.

    #818985
    Chouby
    Participant
    Chevalier WordPress
    416 contributions

    A mon avis, WordPress n’a pas prévu le cas. J’ai regardé un peu comment c’est géré et les messages sont tous codés en dur et affichés en fonction de la valeur de $_GET, sans possibilité d’en rajouter un.

    Une manière de tourner le problème (pour l’activation seulement) serait d’utiliser l’action ‘admin_notices’ comme le fait par exemple Akismet tant que tu n’as pas de clé d’activation. Un petit test peut te permettre de ne l’afficher qu’une fois. J’ai aussi trouvé l’action ‘pre_current_active_plugins’ qui a le mérite de n’être exécuté que sur la page d’affichage de la liste des plugins. Je ne connais pas d’exemple de son utilisation.

    Je n’ai pas de solution à te proposer pour la désactivation.

    #818986
    luciole135
    Participant
    Maître WordPress
    13714 contributions

    Merci de la piste, je vais étudier tout cela.

    :D

    #818987
    luciole135
    Participant
    Maître WordPress
    13714 contributions

    Oui, comme vous dites, ce n’est pas évident !

    Un appel à add_action par une fonction elle même appelée par un register_activation_hook ne fonctionne pas !

    Ainsi, il faut faire appel à add_action avant le hook d’activation pour que le message s’affiche en tout premier.

    J’ai pensé tester si ma variable globale global $DailyStat_Option existe ou pas.
    Elle est définie ainsi : $DailyStat_Option = get_option(‘DailyStat_Option’);

    Et là, c’est la galère, car au départ quand $DailyStat_Option n’existe pas (première création de la table de donnée), cette variable a pour type NULL, elle n’est ni un tableau, (ni autre chose, au moment où je la stocke dans les options, c’est un tableau ).

    En revanche, $dailyStat_Option est de type boolean qui est de surcroit VRAI ! 😉

    Ensuite quand le plugin a été activé une première fois, à la deuxième activation, c’est le même chose, rien ne change. Même si je stocke une valeur dans les options, je n’arrive pas à tester son INEXISTANCE.

    J’ai même des difficultés à tester sa valeur !😉

    Je stocke à la désactivation $DailyStat_Option = « 0.1 »;
    Et à l’activation suivante, même si cela vaut 0.1, le test indique que c’est toujours différent de 0.1 alors que je l’ai stocké à la désactivation et qu’avec PhpMyAdmin, je vois cette valeur dans la table wp_options !😉

    Le code :

    if ($DailyStat_Option[‘DailyStat_Version_DB’]== « 0.1 »)
    add_action(‘admin_notices’, ‘DailyStat_verify’);
    else
    add_action(‘admin_notices’, ‘DailyStat_create’);

    renvoit toujours vers le cas de création de la table alors même qu’à la désactivation j’ai fait ceci :

    function DailyStatInit_deactivate()
    {
    global $DailyStat_Option;
    $DailyStat_Option[‘DailyStat_Version_DB’] = « 0.1 »;
    update_option(‘DailyStat_Option’, $DailyStat_Option);
    remove_action(‘widget_dailystat_init’);
    }

    Et devrait, il me semble, logiquement fonctionner !

    Ainsi, il est très difficile de distinguer les cas de première activation et des autres activations.

    J’ai fait plein d’essai en utilisant isset(), empty(), array_key_exist(), is_null(), je ne suis pas encore arrivé à différencier les deux cas.

    Bref, je patauge dans la gadoue, pour l’instant la seule chose qui fonctionne bien, c’est tout sauf ça !

    😉

    #818988
    luciole135
    Participant
    Maître WordPress
    13714 contributions

    J’ai tenté de faire un test sur l’existance de la table de donnée, mais apparement,
    register_activation_hook( __FILE__,’DailyStat_activate’);
    est effectué en tout premier lieu, même si j’ai fait ce test avant de lancer le hook :

    if ($wpdb->get_var(« SHOW TABLES LIKE ‘$table_name' ») == $table_name)
    add_action(‘admin_notices’, ‘DailyStat_update’);
    else
    add_action(‘admin_notices’, ‘DailyStat_create’);

    car la table de donnée est toujours existante, même lorsque je l’ai supprimée !😉

    Et c’est dans tous les cas, le message de mise à jour qui s’affiche, pas celui de création, je me demande s’il est possible de séparer les 2 cas !😉

    J’en déduis donc que le hook se fait toujours en premier, même si les add_action précédent dans le code !

    Voilà qui ne m’arrange pas non plus !😉

    #818989
    Chouby
    Participant
    Chevalier WordPress
    416 contributions

    De ce que j’ai compris, register_activation_hook est la *seule* fonction du plugin exécutée au moment de l’activation puis exit juste derrière. Donc on ne peut pas ajouter d’autres actions ou filtres à l’intérieur. Mais une fois le plugin activé, WP se recharge, donc là tu peux éxécuter quelque chose.

    Donc ce que je ferais (mais je n’ai pas testé):
    Dans register_activation_hook: création d’une option

    Ailleurs dans le code (le constructeur si tu utilises les classes) :
    if (get_option(‘DailyStat_create’))
    add_action(‘admin_notices’, ‘DailyStat_create’);

    A l’intérieur de la fonction ‘DailyStat_create’ -> delete_option(‘DailyStat_create’);

    #818990
    Guy
    Participant
    Maître WordPress
    14817 contributions

    J’ai abandonné l’idée d’afficher quelque chose sur le hook d’activation, je le comprends comme une initialisation des paramètres et options, et c’est tout. On peut envoyer un message comme déjà suggéré en se greffant sur admin_notices ( vu avec askimet) ou plus simplement sur le premier chargement de l’extension, le hook sur l’activation permettant de positionner un indicateur de premier lancement, voir d’update.

    #818991
    luciole135
    Participant
    Maître WordPress
    13714 contributions

    Le plus étrange dans tout ça c’est que le code suivant fonctionne correctement mais ne permet pas de distinguer le cas de création de celui de mise à jour de la base de données :

    if ($DailyStat_Option[‘DailyStat_DB_Version’] != « 1.4 »)
    add_action(‘admin_notices’, ‘DailyStat_update’);

    Alors que le test $DailyStat_Option == « 1.1 » retourne toujours faux même si j’ai fait ceci à la désactivation :

    function DailyStatInit_deactivate()
    {
    global $DailyStat_Option;
    $DailyStat_Option[‘DailyStat_DB_Version’] = « 1.1 »;
    update_option(‘DailyStat_Option’, $DailyStat_Option);
    remove_action(‘widget_dailystat_init’);
    }

    C’est à ne rien y comprendre. Ainsi lorsque je rafraichis la page des extensions, le message de mise à jour n’apparait pas. Il n’apparait qu’une seule fois, à l’activation du plugin, sans distinguer les cas de création de la base de données de celui de mise à jour.

    C’est vraiment bizarre !😉

    Mais ça fonctionne quand même.

    Tout se passe comme si le test sur la version de la base de données du plugin n’était possible que lorsque le plugin est activé, étrange !

    #818992
    luciole135
    Participant
    Maître WordPress
    13714 contributions
    Guy wrote:
    plus simplement sur le premier chargement de l’extension, le hook sur l’activation permettant de positionner un indicateur de premier lancement, voir d’update.

    Je vais étudier cela, merci. :D

    #818993
    luciole135
    Participant
    Maître WordPress
    13714 contributions
    Chouby wrote:
    De ce que j’ai compris, register_activation_hook est la *seule* fonction du plugin exécutée au moment de l’activation puis exit juste derrière. Donc on ne peut pas ajouter d’autres actions ou filtres à l’intérieur. Mais une fois le plugin activé, WP se recharge, donc là tu peux éxécuter quelque chose.

    Donc ce que je ferais (mais je n’ai pas testé):
    Dans register_activation_hook: création d’une option

    Ailleurs dans le code (le constructeur si tu utilises les classes) :
    if (get_option(‘DailyStat_create’))
    add_action(‘admin_notices’, ‘DailyStat_create’);

    A l’intérieur de la fonction ‘DailyStat_create’ -> delete_option(‘DailyStat_create’);

    Je vais essayer, mais les CLASS, je n’y pige rien du tout et du coup je ne les utilise pas car la page que j’ai voulu copier (recommandée par le CODEX lui même) pour faire les activation/désactivation les utilisait et je n’ai même pas réussi à le faire fonctionner. :boulet:
    http://wordpress.stackexchange.com/questions/25910/uninstall-activate-deactivate-a-plugin-typical-features-how-to/33299#33299

    #818994
    Chouby
    Participant
    Chevalier WordPress
    416 contributions

    Ce n’est pas gênant. Tu mets ton add_action(‘admin_notices’, ‘DailyStat_create’); en dehors de toute fonction. D’ailleurs, de mémoire, c’est comme ça que c’est codé dans Akismet.

    #818995
    luciole135
    Participant
    Maître WordPress
    13714 contributions
    Chouby wrote:
    De ce que j’ai compris, register_activation_hook est la *seule* fonction du plugin exécutée au moment de l’activation puis exit juste derrière. Donc on ne peut pas ajouter d’autres actions ou filtres à l’intérieur. Mais une fois le plugin activé, WP se recharge, donc là tu peux éxécuter quelque chose.

    Donc ce que je ferais (mais je n’ai pas testé):
    Dans register_activation_hook: création d’une option

    Ailleurs dans le code (le constructeur si tu utilises les classes) :
    if (get_option(‘DailyStat_create’))
    add_action(‘admin_notices’, ‘DailyStat_create’);

    A l’intérieur de la fonction ‘DailyStat_create’ -> delete_option(‘DailyStat_create’);

    Ben, c’est exactement le même problème qu’avec la lecture de la version de la BD modifiée à la désactivation.

    Je met l’option crée à vrai dans le hook d’activation et à la lecture de l’option, cela le lit comme faux TOUT le temps !

    De même, en modifiant la version de la BD à la désactivation, à l’activation la lecture de l’option (qui est pourtant une variable globale) ne fonctionne pas, cela ne lit pas la valeur que j’ai stocké.

    C’est comme si on ne pouvez pas tester cette variable globale contenant les options la première fois (à l’activation) et qu’ensuite on pouvait la lire, c’est très étrange. 😉

    #818996
    Chouby
    Participant
    Chevalier WordPress
    416 contributions

    A mon avis, le plugin n’est pas chargé ni à l’activation, ni à la désactivation. Donc tout ce qui est fait en dehors de register_activation_hook n’est pas pris en compte. Ta variable globale étant crée ailleurs dans ton plugin, elle n’existe pas dans ta fonction. Par contre tu peux accéder à / modifier ta base de donnée. Donc tu peux faire un get_option / update_option.

    #818997
    luciole135
    Participant
    Maître WordPress
    13714 contributions
    Chouby wrote:
    A mon avis, le plugin n’est pas chargé ni à l’activation, ni à la désactivation. Donc tout ce qui est fait en dehors de register_activation_hook n’est pas pris en compte. Ta variable globale étant crée ailleurs dans ton plugin, elle n’existe pas dans ta fonction. Par contre tu peux accéder à / modifier ta base de donnée. Donc tu peux faire un get_option / update_option.

    Pourtant, je déclare la variable globale dans le hook et dans chaque fonction qui la modifie !
    De plus, si je crée une option à part de cette variable globale, le problème reste le même, la première lecture (à l’activation) n’arrive pas à lire correctement ce qui est stocké dans cette option lorsque j’ai modifié cette variable à la désactivation.
    Mais, si je ne modifie pas cette variable à la désactivation, alors, cette option est lue correctement.
    Pourtant, via PhpMyAdmin, la valeur stockée dans l’option à la désactivation est la bonne.

    Y’a comme un bug à la désactivation !

    Toutes les modifications sont faites, je les voie avec PhpMyAdmin, seulement, je n’arrive pas à lire correctement les options lors de l’activation.😉

    Bon, du coup, cela me permet de faire un message pour l’activation, mais je ne peux pas différencier la nouvelle création de la simple réactivation.🙂

    #818998
    Chouby
    Participant
    Chevalier WordPress
    416 contributions

    Comme ça ?

    register_activation_hook( __FILE__, ‘activate’ );
    function activate() {
    if (!get_option(‘activate’))
    update_option(‘activate’, 1);
    }
    if (get_option(‘activate’) == 1)
    add_action(‘admin_notices’, ‘message’);

    function message() {
    update_option(‘activate’, 2);
    echo ‘message’;
    }

15 sujets de 1 à 15 (sur un total de 30)
  • Vous devez être connecté pour répondre à ce sujet.