web-dev-qa-db-ja.com

新しいプラグインのバージョンをリリースする、古いオプションのキーの名前を変更する方法?

私は自分のプラグインの新しいバージョンを公開する準備ができていますが、最後の1つの問題は...

旧バージョンには、キーオプション名の命名規則がありませんでした。

オプションが増え、私はそれらすべての名前を変更しました。良いコーディング慣行と私自身の正気のために接頭辞を使用しました。

DescriptionとChangelogに警告を入れることを考えましたが、内部のインポート方法を作ることができればもっと穏やかになると思います。

だから、それが問題です:

  • プラグインのアップデート時に関数を実行する方法
  • そして$ myOptions ['old_key']が存在するかどうかをチェックし、その値を$ myOptions ['new_key']に渡して最後にold_keyを削除する方法

ありがとう、

6
brasofilo

データベースに自分のプラグインのバージョン番号を保存する必要があります(まだこのプロントを追加していない場合)。これを使用して(これが疑似コードであることに注意してください):

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()のようなものを実行させ、それを使って更新などを管理させるだけです。

私はあなたがあなたのインクリメンタルな更新のためにこの構造を使うべきであることに注意したいです(まあ、本当に、繰り返します)。このコードは1回しか実行されないと完全に予想できるはずなので、データベースのバージョンなどを更新していることを確認してください。

3
mor7ifer

これは、より良く、より自動化されたアプローチです(以下の この 答え)。

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変数だけです。

3
onetrickpony

これが私がどのように問題を解決したかの要約です。オプションを更新するためのトリガーは、新しいオプション "version"が存在するかどうかを確認することです。そして今から、必要ならばバージョン比較をすることができます。

(自分の質問に答えるのが正しいのか、それとも質問を更新したほうがいいのかわからない…)

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);

    }
}
1
brasofilo