Próbowałem przeprowadzić pewne badania na ten temat, ale nie znalazłem jeszcze niczego solidnego. Mam wtyczkę, nad którą pracuję i między ostatnią wersją a nową wersją wprowadziliśmy kilka aktualizacji widżetu, które zmieniają niektóre nazwy ustawień (na backendie) i mam problem z utworzeniem procedury aktualizacji, aby to zrobić.
To, co do tej pory zrobiłem, co wydaje się (głównie) działać, to:
$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 );
}
W większości moich testów działa to dobrze, ale problem polega na tym, że stary widget nie wyświetla już swoich danych wyjściowych. Wyświetlony zostanie tylko tytuł widżetu. Mogę to naprawić, przechodząc i zapisując każdy indywidualny widżet, a następnie będzie działał dobrze, ale nie chcę, aby moi użytkownicy to robili.
Myślałem, że coś takiego może działać:
$settings = $widgets->get_settings();
foreach( $settings as $s ) {
$s['setting1'] = $s['oldsetting1'];
$s['setting2'] = $s['oldsetting2'];
$widgets->save_settings( $s );
}
Wygląda jednak na to, że save_settings()
połączenie musi być nieprawidłowe, ponieważ powoduje to całkowite usunięcie widżetu.
Mam problem ze znalezieniem jakiegokolwiek standardu dla czegoś takiego i chciałbym po prostu usłyszeć wszelkie przemyślenia, pomysły lub linki, które mogą być potrzebne do zrobienia czegoś takiego.
Z góry dziękuję za wszelką pomoc.
EDYTOWAĆ:
W rzeczywistości nie jest to pytanie o śledzenie kluczy licencyjnych lub aktualizację wtyczek, które nie są hostowane w repozytorium WP. Chodzi o to, aby zaktualizować ustawienia między 2 wersjami wtyczki podczas aktualizacji użytkownika.
Przykład:
wersja 1.0.0 ma pole ustawień name
W wersji 1.1.0 zdecydowaliśmy, że potrzebujemy zarówno imienia, jak i nazwiska, dlatego zmieniamy stare ustawienie na, first_name
a następnie dodajemy nowe last_name
.
Przeniesienie tych opcji, jeśli zostały zapisane jako meta post dla niestandardowego typu postu, nie stanowi problemu:
$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' );
Więc ta część jest łatwa. Problem z tym, co wydaje mi się niełatwe, to robienie tego samego, ale dla ustawień WIDGET.
Mamy nadzieję, że rozwiąże to wszelkie nieporozumienia i pomoże w łatwiejszym udzieleniu odpowiedzi.
EDYCJA 2:
Wynik echo '<pre>' . print_r( $widget, true ) . '</pre>';
z pierwszego fragmentu kodu powyżej:
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
)
źródło
Odpowiedzi:
Zrobiłem szybki test po prostu zmieniając opcję i wydaje się, że działa.
To co zrobiłem to:
Zmieniono funkcję rejestrującą widget,
'widgets_init'
aby wywołać funkcję aktualizującą opcje widgetu:Napisałem prostą klasę, aby zaktualizować opcje widżetu:
Zedytowałem klasę widżetu, aby zapisać opcję
"is_{$widget_name}_updated"
wewnątrzupdate()
metody, w ten sposób klasa aktualizacji nigdy nie będzie wywoływana dla nowych użytkowników, którzy nigdy nie zainstalowali starego widżetuOdwiedziłem moją witrynę, a widżety zapisane przy starych opcjach są wyświetlane bez problemu przy użyciu nowych opcji. (Oczywiście „nazwisko” jest zawsze puste).
Dobrym pomysłem może być zastąpienie
"is_{$widget_name}_updated"
opcji opcją przechowującą aktualną wersję widżetu, w ten sposób przyda się ona następnym razem, gdy będziesz potrzebować aktualizacji.źródło
update_option
poprawnego? Zastanawiam się teraz, czy haczyk może mieć znaczenie? Zaczepiam to doinit
haka. Czy istnieje ogromna różnica, dodając jąwidgets_init
zamiast tego do haka? Byłem całkiem pewien, że strzelają w tym samym czasie. Dzięki za pomoc.foreach
jest nieprawidłowy.Aby ważyć pod innym kątem - zamiast automatycznie aktualizować wszystkie ustawienia podczas aktualizacji wtyczki, po prostu sprawdź „stare” ustawienie i mapuj na „nowe” ustawienia w locie:
źródło
Z góry mojej głowy każde wystąpienie widżetu otrzymuje jakiś unikalny identyfikator. Chcę powiedzieć, że staje się prefiksem do kluczy widgetu.
Pamiętam, że jakiś czas temu wtrąciłem się, ale nie pamiętam, jakie były dokładne, przepraszam.
źródło