J'ai essayé de faire des recherches à ce sujet mais je n'ai encore rien trouvé de solide. J'ai un plugin sur lequel je travaille et entre la dernière version et la nouvelle version, nous avons fait quelques mises à jour du widget qui modifie certains noms de paramètres (sur le backend) et j'ai du mal à créer une routine de mise à niveau pour ce faire.
Ce que j'ai fait jusqu'à présent et qui semble (surtout) fonctionner est le suivant:
$widget = get_option( 'widget_name' );
if( is_array( $widget ) && ! empty( $widget ) ) {
foreach( $widget as $a => $b ) {
if( ! is_array( $b ) ) {
continue;
}
foreach( $b as $k => $v ) {
$widget[$a]['setting1'] = $widget[$a]['oldsetting1'];
$widget[$a]['setting2'] = $widget[$a]['oldsetting2'];
}
}
update_option( 'widget_name', $widget );
}
Dans la plupart de mes tests, cela fonctionne bien, mais le problème devient que l'ancien widget n'affiche plus sa sortie. Seul le titre du widget s'affichera. Je peux résoudre ce problème en enregistrant chaque widget individuel, puis cela fonctionnera correctement, mais je ne veux pas que mes utilisateurs le fassent.
Je pensais que quelque chose comme ça pourrait fonctionner:
$settings = $widgets->get_settings();
foreach( $settings as $s ) {
$s['setting1'] = $s['oldsetting1'];
$s['setting2'] = $s['oldsetting2'];
$widgets->save_settings( $s );
}
Mais il semble que l' save_settings()
appel doit être incorrect car cela supprime complètement le widget.
J'ai du mal à trouver une sorte de norme pour quelque chose comme ça et je voudrais juste entendre les pensées, les idées ou les liens que vous pourriez avoir pour faire quelque chose comme ça.
Merci d'avance pour votre aide.
ÉDITER:
Il ne s'agit en fait pas d'une question sur le suivi des clés de licence ou la mise à niveau des plugins qui ne sont pas hébergés sur le dépôt WP. Il s'agit plus de mettre à jour les paramètres entre 2 versions d'un plugin lors de la mise à niveau d'un utilisateur.
Exemple:
la version 1.0.0 a un champ de réglage name
Eh bien, dans la version 1.1.0, nous décidons que nous avons besoin du prénom et du nom, nous changeons donc l'ancien paramètre first_name
et ajoutons un nouveau paramètre last_name
.
Le transfert de ces options si elles sont enregistrées en tant que méta-publication pour un type de publication personnalisé ne pose aucun problème:
$old_name = get_post_meta( $post->ID, 'name', true );
$first_name = update_post_meta ( $post->ID, 'first_name', true );
delete_post_meta( $post->ID, 'name' );
Donc, cette partie est facile. Ce que j'ai du mal avec cela ne semble pas être facile, c'est de faire la même chose, mais pour les paramètres WIDGET.
J'espère que cela dissipera toute confusion et contribuera à faciliter la réponse.
EDIT 2:
Résultat echo '<pre>' . print_r( $widget, true ) . '</pre>';
du premier bloc de code ci-dessus:
Array
(
[2] => Array
(
[title] => Class Schedule
[id] => 23
[display_type] => grid
[order] => asc
[display_title_text] => Events on
[paging] => 1
[list_max_num] => 7
[list_max_length] => days
[list_start_offset_num] => 0
[list_start_offset_direction] => back
[gce_per_page_num] => 7
[gce_events_per_page] => days
)
[3] => Array
(
[title] => Examples
[id] => 24
[display_type] => grid
[order] => asc
[display_title_text] => Events on
[paging] => 1
[list_max_num] => 7
[list_max_length] => days
[list_start_offset_num] => 0
[list_start_offset_direction] => back
[gce_per_page_num] => 7
[gce_events_per_page] => days
)
[_multiwidget] => 1
)
la source
Réponses:
J'ai fait un test rapide sur juste changer l'option et cela semble fonctionner.
Ce que j'ai fait c'est:
Modifié la fonction qui enregistre le widget
'widgets_init'
pour appeler une fonction qui met à jour les options du widget:A écrit une classe simple pour mettre à jour les options du widget:
J'ai édité la classe de widget pour enregistrer l'option
"is_{$widget_name}_updated"
dans laupdate()
méthode, de cette façon la classe de mise à jour ne sera jamais appelée pour les nouveaux utilisateurs qui n'ont jamais installé l'ancien widgetJ'ai visité mon site et les widgets enregistrés avec les anciennes options sont affichés sans problème en utilisant de nouvelles options. (Bien sûr, "nom" est toujours vide).
Une bonne idée peut être de remplacer l'
"is_{$widget_name}_updated"
option, par une option qui stocke la version réelle du widget, de cette façon, ce sera pratique la prochaine fois que vous aurez besoin d'une mise à jour.la source
update_option
correct? Je me demande maintenant si le crochet compte peut-être? Je l'accroche auinit
crochet. Y a-t-il une énorme différence en l'ajoutant auwidgets_init
crochet à la place? J'étais à peu près sûr qu'ils tiraient en même temps. Merci de votre aide.foreach
est faux.Juste pour peser sous un angle différent - plutôt que de mettre à jour automatiquement tous les paramètres lors de la mise à jour du plugin, vérifiez simplement un «ancien» paramètre et mappez-le à la «nouvelle» configuration à la volée:
la source
Tout en haut de ma tête, chaque instance d'un widget reçoit une sorte d'ID unique. Je veux dire que cela devient un prexfix pour les clés du widget.
Je me souviens d'avoir piqué ceci il y a quelque temps, mais je ne me souviens pas de la nature exacte, désolé.
la source