Eu fiz um teste rápido em apenas mudar a opção e parece funcionar.
O que eu fiz é:
- Escreveu um widget que tem apenas dois campos: "Título" e "Nome". Adicione várias instâncias deste widget às minhas barras laterais. Tenha certeza de que eles são exibidos corretamente no frontend.
- Editou a turma para usar 3 campos: "Título" e "Nome" (para substituir "Nome") e adicionou "Sobrenome".
-
Editou a função que registra o widget em
'widgets_init'
para chamar uma função que atualiza as opções do widget:add_action( 'widgets_init', 'my_example_widget_register' ); function my_example_widget_register() { $widget_name = 'my_example_widget'; // <-- You will probably replace this $options = get_option("widget_{$widget_name}"); // if the widget is not updated, run a function that updates it if ($options && ! get_option("is_{$widget_name}_updated")) { // use class below to update options $updater = new MyExampleWidgetUpdater($widget_name, $options); $updater->update(); } register_widget('My_Example_Widget'); // <-- You will probably replace this }
-
Escreveu uma classe simples para atualizar as opções de widgets:
class MyExampleWidgetUpdater { private $name; private $options; public function __construct($name, $options) { $this->name = $name; $this->options = $options; } public function update() { // loop all the options array_walk($this->options, function(&$option, $key) { if (is_array($option) && is_numeric($key)) { $option = $this->getOption($option); } }); // update all options in DB update_option("widget_{$this->name}", $this->options); // set the widget as updated update_option("is_{$this->name}_updated", 1); } private function getOption($options) { if (!isset($options['name'])) { return $options; } $options['first_name'] = $options['name']; $options['last_name'] = ''; unset($options['name']); return $options; } }
-
Eu editei a classe widget para salvar a opção
"is_{$widget_name}_updated"
dentro do métodoupdate()
, desta forma a classe do atualizador nunca será chamada para novos usuários que nunca instalaram o widget antigoclass My_Example_Widget { ... public function update($new_instance, $old_instance) { ... $widget_name = 'my_example_widget'; update_option("is_{$widget_name}_updated", 1); } }
-
Eu visitei meu site e os widgets salvos com opções antigas são exibidos sem problemas usando novas opções. (Claro que "sobrenome" está sempre vazio).
Uma boa ideia pode ser substituir a opção "is_{$widget_name}_updated"
, com uma opção que armazena a versão real do widget, desta forma será útil na próxima vez que você precisar de uma atualização.