Saya sudah mencoba melakukan penelitian tentang ini tetapi belum menemukan sesuatu yang solid. Saya memiliki plugin yang sedang saya kerjakan dan antara versi terakhir dan versi baru kami membuat beberapa pembaruan pada widget yang mengubah beberapa nama pengaturan (di backend) dan saya mengalami masalah dalam membuat rutin upgrade untuk melakukan ini.
Apa yang telah saya lakukan sejauh ini yang tampaknya (sebagian besar) berhasil adalah ini:
$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 );
}
Dalam sebagian besar pengujian saya ini berhasil, tetapi masalahnya adalah bahwa widget lama tidak lagi menampilkan outputnya. Hanya judul widget yang akan ditampilkan. Saya dapat memperbaikinya dengan membuka dan menyimpan masing-masing widget dan kemudian itu akan berfungsi dengan baik, tetapi saya tidak ingin membuat pengguna saya melakukan itu.
Saya pikir sesuatu seperti ini mungkin berhasil:
$settings = $widgets->get_settings();
foreach( $settings as $s ) {
$s['setting1'] = $s['oldsetting1'];
$s['setting2'] = $s['oldsetting2'];
$widgets->save_settings( $s );
}
Tapi sepertinya save_settings()
panggilan itu pasti salah karena ini menghapus widget sepenuhnya.
Saya mengalami kesulitan menemukan standar apa pun untuk sesuatu seperti ini dan hanya ingin mendengar pemikiran, gagasan, atau tautan apa pun yang mungkin harus Anda lakukan seperti ini.
Terima kasih sebelumnya atas bantuannya.
EDIT:
Ini sebenarnya bukan pertanyaan tentang melacak kunci lisensi atau meningkatkan plugin yang tidak di-host di WP repo. Tentang ini adalah memperbarui pengaturan antara 2 versi plugin ketika pengguna melakukan upgrade.
Contoh:
versi 1.0.0 memiliki bidang pengaturan name
Nah di versi 1.1.0 kami memutuskan kami membutuhkan nama depan dan belakang sehingga kami mengubah pengaturan lama menjadi first_name
dan kemudian menambahkan pengaturan baru last_name
.
Mentransfer opsi-opsi ini jika disimpan sebagai meta pos untuk jenis pos khusus tidak ada masalah:
$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' );
Sehingga bagian itu mudah. Apa yang saya mengalami masalah dengan yang tampaknya tidak mudah adalah melakukan hal yang sama tetapi untuk pengaturan WIDGET.
Semoga ini akan menjernihkan kebingungan dan membantu membuat ini menjadi lebih mudah untuk dijawab.
EDIT 2:
Hasil dari echo '<pre>' . print_r( $widget, true ) . '</pre>';
potongan kode pertama di atas:
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
)
sumber
Jawaban:
Saya telah melakukan tes cepat pada hanya mengubah opsi dan sepertinya berhasil.
Apa yang saya lakukan adalah:
Mengedit fungsi yang mendaftarkan widget
'widgets_init'
untuk memanggil fungsi yang memperbarui opsi widget:Menulis kelas sederhana untuk memperbarui opsi widget:
Saya mengedit kelas widget untuk menyimpan opsi
"is_{$widget_name}_updated"
di dalamupdate()
metode, dengan cara ini kelas pembaru tidak akan pernah dipanggil untuk pengguna baru yang tidak pernah menginstal widget lamaSaya mengunjungi situs saya dan widget yang disimpan dengan opsi lama ditampilkan tanpa masalah menggunakan opsi baru. (Tentu saja "nama belakang" selalu kosong).
Ide yang bagus mungkin menggantikan
"is_{$widget_name}_updated"
opsi, dengan opsi yang menyimpan versi widget yang sebenarnya, dengan cara ini akan berguna saat Anda membutuhkan pembaruan.sumber
update_option
benar? Saya bertanya-tanya sekarang apakah kaitannya mungkin? Saya mengaitkannya keinit
kait. Apakah ada perbedaan besar dengan menambahkannya kewidgets_init
hook? Saya cukup yakin mereka menembak pada saat yang sama. Terima kasih atas bantuan Anda.foreach
salah.Hanya untuk mempertimbangkan dari sudut yang berbeda - alih-alih memperbarui otomatis semua pengaturan pada pembaruan plugin, cukup periksa pengaturan "lama" & petakan ke pengaturan "baru" secara langsung:
sumber
Di atas kepala saya, setiap instance widget diberikan semacam ID unik. Saya ingin mengatakan itu menjadi prexfix untuk tombol untuk widget.
Saya ingat mengetuk ini beberapa waktu lalu tetapi tidak ingat persis apa tepatnya, maaf.
sumber