发布新的插件版本,如何重命名旧的选项键?

时间:2012-04-20 作者:brasofilo

我已经准备好发布我的插件的新版本,但最后一个问题仍然存在。。。

旧版本的键选项名称没有命名约定。

选项越来越多,为了更好的编码实践和我自己的理智,我使用前缀对它们进行了重命名。

我曾想过在描述和变更日志中添加一个警告,但我认为如果我可以创建一个内部导入方法,会更温和一些。

这就是问题所在:

如何在插件更新上运行函数

  • 以及如何检查$myOptions[\'old\\u key\']是否存在,将其值传递给$myOptions[\'new\\u key\',最后删除旧的\\u key,谢谢,

  • 3 个回复
    最合适的回答,由SO网友:mor7ifer 整理而成

    您应该在数据库中存储插件的版本号(如果尚未存储,请立即添加),使用该版本号可以执行此操作(请注意,这是伪代码):

    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() 管理更新等等。

    我只想指出(好吧,真的,重申一下),你应该只在你的犯罪更新中使用这个结构。您应该完全期望此代码只运行一次,因此请确保您正在更新数据库版本等。

    SO网友:onetrickpony

    这里有一种更好、更自动化的方法(如下所示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() 将对您的选项进行所有必要的更新。唯一需要调整的是常量/$默认值变量。

    SO网友:brasofilo

    下面是我如何解决这个问题的总结。更新选项的触发器是检查是否存在新选项“版本”。从现在起,如果需要,我可以进行版本比较。

    (我不确定回答我自己的问题是否正确,或者更新问题是否更好……)

    class MyPlugin {
        var $adminOptionsName = "MyPlugin";
    
        function MyPlugin() {
        }
    
        function init() {
            $this->getAdminOptions();
        }
    
        function getAdminOptions() {
    
            // New options and values
            $theNewOptions = array(
                \'option_1\' => 0,
                \'option_2\' => \'\',
                \'version\'  => \'1.0\'
            );
    
            // Grab the options in the database
            $theOptions = get_option($this->adminOptionsName);
    
            // Check if options need update
            if( !isset($theOptions[\'version\']) && !empty($theOptions) ) {
                foreach( $theOptions as $key => $value ) {
                    if( $key == \'not_needed\' ) {
                        unset( $theOptions[$key] );
                    }
                    if( $key == \'old_option_1\') {
                        $theOptions[\'option_1\'] = $value;
                        unset( $theOptions[$key] );
                    }
                    // etc...
                }
            }
    
            // Proceed to the normal Options check
            if (!empty($theOptions)) {
                foreach ($theOptions as $key => $option) {
                    $theNewOptions[$key] = $option;
                }
            }
    
            update_option($this->adminOptionsName, $theNewOptions);
    
        }
    }
    

    结束

    相关推荐

    有没有更快的方法来Git-SVN从Subversion库中克隆一个WordPress插件?

    当用git SVN克隆SVN repo时,它会费力地在每个修订版中搜索相关的更改(至少在我的理解中是这样)。有没有办法让这个过程更快?我找到了以下链接:https://stackoverflow.com/questions/747075/how-to-git-svn-clone-the-last-n-revisions-from-a-subversion-repository 这意味着有可能限制修订的数量,只需要弄清楚要追溯多远以及如何找到该数字