我尝试对此进行一些研究,但尚未发现任何可靠的方法。我有一个正在使用的插件,在上一个版本和新版本之间,我们对小部件进行了一些更新,以更改某些设置名称(在后端),并且在创建升级例程来执行此操作时遇到了麻烦。
到目前为止,我所做的似乎(大部分)工作是这样的:
$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 );
}
在我的大多数测试中,都可以,但是问题是旧的窗口小部件不再显示其输出。仅显示小部件的标题。我可以通过保存每个单独的小部件来解决此问题,然后它可以正常工作,但是我不想让我的用户这样做。
我认为这样可能有效:
$settings = $widgets->get_settings();
foreach( $settings as $s ) {
$s['setting1'] = $s['oldsetting1'];
$s['setting2'] = $s['oldsetting2'];
$widgets->save_settings( $s );
}
但是似乎save_settings()
调用一定是错误的,因为这会完全删除小部件。
我在为类似的事情找到任何标准时遇到麻烦,并且想听听您可能要做的类似事情,想法或链接。
在此先感谢您的帮助。
编辑:
这实际上不是有关跟踪未在WP repo上托管的许可证密钥或升级插件的问题。更重要的是,当用户升级时,将在插件的两个版本之间更新设置。
例:
1.0.0版有一个设置字段 name
在1.1.0版中,我们决定需要名字和姓氏,因此我们将旧设置更改为“ be” first_name
,然后添加新设置last_name
。
如果将这些选项保存为自定义帖子类型的帖子元,则转移这些选项没有问题:
$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' );
因此,这部分很容易。我遇到的麻烦似乎并不容易,但是对于WIDGET设置却要做同样的事情。
希望这可以消除任何混乱,并有助于使其更易于回答。
编辑2:
echo '<pre>' . print_r( $widget, true ) . '</pre>';
上面第一个代码块的结果:
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
)