Neue Plugin-Version freigeben, alte Optionsschlüssel umbenennen?

Ich habe alles bereit für die Veröffentlichung einer neuen Version meines Plugins, aber eine letzte Ausgabe steht …

Die alte Version hatte keine Namenskonvention für ihre Schlüsseloptionsnamen.

Die Optionen wuchsen und ich benannte sie alle um, wobei ich Präfixe verwendete, um eine gute Programmierpraxis und meine eigene geistige Gesundheit zu erreichen.

Ich dachte daran, eine Warnung in die Beschreibung und das Changelog zu schreiben, aber ich denke, es wäre sanfter, wenn ich eine interne Importmethode machen könnte.

Also, das ist die Frage:

  • Wie starte ich eine function beim Plugin-Update?
  • und wie überprüft man, ob $ myOptions [‘old_key’] existiert, übergebe es an $ myOptions [‘new_key’] und lösche schließlich den alten_key

Vielen Dank,

Solutions Collecting From Web of "Neue Plugin-Version freigeben, alte Optionsschlüssel umbenennen?"

Sie sollten eine Versionsnummer für Ihr Plugin in der database speichern (wenn Sie dies noch nicht tun, fügen Sie dieses pronto hinzu), mit dem Sie dies tun können (beachten Sie, dass dies Pseudocode ist):

 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 } 

Wenn Sie dann Ihr nächstes Update veröffentlichen, ändern Sie $current_version in die Version, in der die Änderung aufgetreten ist. Der Grund hinter der Verwendung dieser Methode ist, dass, wenn Ihre Updates jemals incrimental sind (das heißt, Sie können nicht von 1.1 zu 1.9 gehen, müssen Sie 1.3 und 1.5 dazwischen oder etwas Ähnliches erreichen), Sie werden eine Struktur haben an Stelle, um das zu verwalten. Wenn es komplex wird, halte ich den Code oft sauber und wpse49717_plugin_release_150() die if statement etwas wie wpse49717_plugin_release_150() ausführen und verwalte die Updates und so weiter.

Ich möchte nur erwähnen (gut, wirklich, wiederholen), dass Sie nur diese Struktur für Ihre inkrimalen Updates verwenden sollten. Sie sollten erwarten, dass dieser Code nur einmal ausgeführt wird. Stellen Sie daher sicher, dass Sie Ihre databaseversionen aktualisieren.

Hier ist ein schöner, automatisierter Ansatz (im Anschluss an diese Antwort):

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

Der erste Aufruf von $this->getOptions() führt alle notwendigen Aktualisierungen Ihrer Optionen durch. Die einzigen Dinge, die Sie anpassen müssen, sind die Konstanten / $ defaults-Variable.

Hier ist die Zusammenfassung, wie ich das Problem getriggers habe. Der Auslöser für das Aktualisieren der Optionen besteht darin, zu prüfen, ob die neue Option “Version” vorhanden ist oder nicht. Und von nun an kann ich bei Bedarf einen Versionsvergleich durchführen.

(Ich bin mir nicht sicher, ob das Beantworten meiner eigenen Frage das Richtige ist oder ob es besser wäre, die Frage zu aktualisieren ….)

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