He intentado investigar un poco sobre esto, pero todavía no he encontrado nada sólido. Tengo un complemento en el que estoy trabajando y, entre la última versión y la nueva versión, realizamos algunas actualizaciones al widget que cambia algunos de los nombres de configuración (en el back-end) y tengo problemas para crear una rutina de actualización para hacer esto.
Lo que he hecho hasta ahora que parece funcionar (principalmente) es esto:
$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 );
}
En la mayoría de mis pruebas, esto funciona bien, pero el problema es que el widget antiguo ya no muestra su salida. Solo se mostrará el título del widget. Puedo solucionar esto yendo y guardando cada widget individual y luego funcionará bien, pero no quiero hacer que mis usuarios hagan eso.
Pensé que algo como esto podría funcionar:
$settings = $widgets->get_settings();
foreach( $settings as $s ) {
$s['setting1'] = $s['oldsetting1'];
$s['setting2'] = $s['oldsetting2'];
$widgets->save_settings( $s );
}
Pero parece que la save_settings()
llamada debe ser incorrecta porque esto elimina el widget por completo.
Tengo problemas para encontrar cualquier tipo de estándar para algo como esto y me gustaría escuchar cualquier pensamiento, idea o enlace que pueda tener para hacer algo como esto.
Gracias de antemano por cualquier ayuda.
EDITAR:
En realidad, no se trata de rastrear claves de licencia o actualizar complementos que no están alojados en el repositorio de WP. De lo que se trata más es de actualizar la configuración entre 2 versiones de un complemento cuando un usuario actualiza.
Ejemplo:
la versión 1.0.0 tiene un campo de configuración name
Bueno, en la versión 1.1.0 decidimos que necesitamos tanto el nombre como el apellido, por lo que cambiamos la configuración anterior para que sea first_name
y luego agregamos una nueva configuración last_name
.
Transferir estas opciones si se guarda como metadato de publicación para un tipo de publicación personalizada no es un problema:
$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' );
Entonces esa parte es fácil. Lo que tengo problemas con eso parece no ser fácil es hacer lo mismo pero con la configuración WIDGET.
Esperemos que esto aclare cualquier confusión y ayude a que esto sea más fácil de responder.
EDITAR 2:
Resultado del echo '<pre>' . print_r( $widget, true ) . '</pre>';
primer fragmento de código anterior:
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
)