- Statut : non résolu
- Ce sujet contient 29 réponses, 3 participants et a été mis à jour pour la dernière fois par luciole135, le il y a 12 années et 10 mois.
-
AuteurMessages
-
24 février 2012 à 21 h 47 min #506160
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 activationregister_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.
25 février 2012 à 18 h 03 min #818985A 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.
25 février 2012 à 19 h 01 min #818986Merci de la piste, je vais étudier tout cela.
25 février 2012 à 21 h 51 min #818987Oui, 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 !
😉
26 février 2012 à 8 h 21 min #818988J’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 !😉
26 février 2012 à 9 h 16 min #818989De 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 optionAilleurs 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’);
26 février 2012 à 9 h 20 min #818990J’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.
26 février 2012 à 10 h 03 min #818991Le 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 !
26 février 2012 à 10 h 08 min #818992Guy 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.
26 février 2012 à 10 h 53 min #818993Chouby 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 optionAilleurs 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#3329926 février 2012 à 13 h 16 min #818994Ce 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.
26 février 2012 à 16 h 53 min #818995Chouby 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 optionAilleurs 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. 😉
26 février 2012 à 17 h 15 min #818996A 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.
26 février 2012 à 18 h 20 min #818997Chouby 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.🙂
26 février 2012 à 18 h 49 min #818998Comme ç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’;
} -
AuteurMessages
- Vous devez être connecté pour répondre à ce sujet.