Ich habe versucht, diesbezüglich Nachforschungen anzustellen, aber noch nichts Festes gefunden. Ich habe ein Plugin, an dem ich arbeite, und zwischen der letzten Version und der neuen Version haben wir einige Aktualisierungen am Widget vorgenommen, die einige der Einstellungsnamen (im Backend) ändern, und ich habe Probleme, eine Upgrade-Routine zu erstellen, um dies zu tun.
Was ich bisher getan habe, was (meistens) zu funktionieren scheint, ist Folgendes:
$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 );
}
In den meisten meiner Tests funktioniert dies in Ordnung, aber das Problem besteht darin, dass das alte Widget seine Ausgabe nicht mehr anzeigt. Es wird nur der Titel des Widgets angezeigt. Ich kann dies beheben, indem ich jedes einzelne Widget speichere. Dann funktioniert es einwandfrei, aber ich möchte meine Benutzer nicht dazu bringen, dies zu tun.
Ich dachte, so etwas könnte funktionieren:
$settings = $widgets->get_settings();
foreach( $settings as $s ) {
$s['setting1'] = $s['oldsetting1'];
$s['setting2'] = $s['oldsetting2'];
$widgets->save_settings( $s );
}
Es scheint jedoch, dass der save_settings()
Aufruf falsch sein muss, da dadurch das Widget vollständig entfernt wird.
Ich habe Probleme, einen Standard für so etwas zu finden, und möchte nur Gedanken, Ideen oder Links hören, die Sie möglicherweise benötigen, um so etwas zu tun.
Vielen Dank im Voraus für jede Hilfe.
BEARBEITEN:
Dies ist eigentlich keine Frage zum Verfolgen von Lizenzschlüsseln oder zum Aktualisieren von Plugins, die nicht auf dem WP-Repo gehostet werden. Hier geht es mehr darum, die Einstellungen zwischen zwei Versionen eines Plugins zu aktualisieren, wenn ein Benutzer ein Upgrade durchführt.
Beispiel:
Version 1.0.0 hat ein Einstellungsfeld name
Nun, in Version 1.1.0 entscheiden wir, dass wir sowohl Vor- als auch Nachnamen benötigen, also ändern wir die alte Einstellung first_name
und fügen dann eine neue Einstellung hinzu last_name
.
Das Übertragen dieser Optionen, wenn sie als Post-Meta für einen benutzerdefinierten Post-Typ gespeichert sind, ist kein Problem:
$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' );
Dieser Teil ist also einfach. Was ich damit zu tun habe, scheint nicht einfach zu sein, dasselbe zu tun, aber für WIDGET-Einstellungen.
Hoffentlich wird dies Verwirrung beseitigen und dazu beitragen, dass dies leichter zu beantworten ist.
EDIT 2:
Ergebnis des echo '<pre>' . print_r( $widget, true ) . '</pre>';
ersten Codeblocks oben:
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
)
quelle
Antworten:
Ich habe einen kurzen Test durchgeführt, um nur die Option zu ändern, und es scheint zu funktionieren.
Was ich getan habe ist:
Die Funktion, mit der das Widget registriert wird, wurde bearbeitet
'widgets_init'
, um eine Funktion aufzurufen, mit der die Widget-Optionen aktualisiert werden:Schrieb eine einfache Klasse, um Widget-Optionen zu aktualisieren:
Ich habe die Widget-Klasse bearbeitet, um die Option
"is_{$widget_name}_updated"
in derupdate()
Methode zu speichern. Auf diese Weise wird die Updater-Klasse niemals für neue Benutzer aufgerufen, die niemals ein altes Widget installiert habenIch habe meine Website besucht und die mit alten Optionen gespeicherten Widgets werden ohne Probleme mit neuen Optionen angezeigt. (Natürlich ist "Nachname" immer leer).
Eine gute Idee ist es, die
"is_{$widget_name}_updated"
Option durch eine Option zu ersetzen, in der die aktuelle Version des Widgets gespeichert wird. Auf diese Weise ist es praktisch, wenn Sie das nächste Mal ein Update benötigen.quelle
update_option
richtigen Verwendung gemacht habe ? Ich frage mich jetzt, ob der Haken vielleicht wichtig ist? Ich hänge es an deninit
Haken. Gibt es einen großen Unterschied, wenn Sie eswidgets_init
stattdessen zum Haken hinzufügen ? Ich war mir ziemlich sicher, dass sie gleichzeitig abfeuern. Danke für Ihre Hilfe.foreach
falsch.Nur um aus einem anderen Blickwinkel abzuwägen - anstatt alle Einstellungen beim Plugin-Update automatisch zu aktualisieren, suchen Sie einfach im laufenden Betrieb nach einer "alten" Einstellung und ordnen Sie sie "neuen" Einstellungen zu:
quelle
Jede Instanz eines Widgets erhält eine eindeutige ID. Ich möchte sagen, dass dies ein Präfix für die Schlüssel für das Widget wird.
Ich erinnere mich, dass ich vor einiger Zeit darüber gestochert habe, kann mich aber nicht erinnern, was genau das war, sorry.
quelle