问题描述
我有一切准备发布我的插件的新版本,但最后一个问题是…
旧版本没有关键选项名称的命名约定。
选项增长,我更名为所有,使用前缀为了良好的编码实践和我自己的理智。
我想在说明和更改日志中发出警告,但我认为如果我可以进行内部导入方法,那将会变得更加温和。
那就是这个问题:
-
如何运行插件更新功能?
-
如何检查 $ myOptions [‘old_key’] 是否存在,将其传递给 $ myOptions [‘new_key’],最后删除 old_key
谢谢,
最佳解决方案
你应该在数据库中存储你的插件的版本号 (如果你还没有,添加这个 pronto),使用它可以这样做 (注意这是伪代码):
if( $db_version < {your desired version} ) {
// previous updates and such
$db_version = $new_version; //put that in the database
}
if( $db_version < $current_version ) {
create $options array
foreach( $option as $o ) {
if( get_option( $o['old_name'] ) ) {
update_option( $o['new_name'], get_option( $o['old_name'] ) );
delete_option( $o['old_name'] ); //clean up behind yourself
}
}
and then update your database version again
}
然后,当您发布下一次更新时,将 $current_version
更改为发生更改的版本。使用这种方法的原因是,如果你的更新是永远的 (也就是说,你不能从 1.1 到 1.9,你必须打到 1.3 和 1.5 之间或类似的东西),你将有一个结构到位来管理。如果它变得复杂,我会经常保持代码干净,只需要 if
语句执行类似 wpse49717_plugin_release_150()
,并管理更新等。
我只想注意 (真的,重申),你应该只使用这个结构来进行不必要的更新。您应该完全期望此代码只能运行 ONCE,因此请确保您正在更新数据库版本等。
次佳解决方案
这是一个更好,更自动化的方法 (以下 this 答案):
class MyPlugin{
const
OPTION_NAME = 'my_plugin_options',
VERSION = '1.0';
protected
$options = null,
// default options and values go here
$defaults = array(
'version' => self::VERSION, // this one should not change
'test_option' => 'abc',
'another_one' => 420,
);
public function getOptions(){
// already did the checks
if(isset($this->options))
return $this->options;
// first call, get the options
$options = get_option(self::OPTION_NAME);
// options exist
if($options !== false){
$new_version = version_compare($options['version'], self::VERSION, '!=');
$desync = array_diff_key($this->defaults, $options) !== array_diff_key($options, $this->defaults);
// update options if version changed, or we have missing/extra (out of sync) option entries
if($new_version || $desync){
$new_options = array();
// check for new options and set defaults if necessary
foreach($this->defaults as $option => $value)
$new_options[$option] = isset($options[$option]) ? $options[$option] : $value;
// update version info
$new_options['version'] = self::VERSION;
update_option(self::OPTION_NAME, $new_options);
$this->options = $new_options;
// no update was required
}else{
$this->options = $options;
}
// new install (plugin was just activated)
}else{
update_option(self::OPTION_NAME, $this->defaults);
$this->options = $this->defaults;
}
return $this->options;
}
}
首先致电 $this->getOptions()
将对您的选项进行所有必要的更新。你需要调整的唯一的事情是常量/$ defaults 变量。
参考文献
注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。