Tôi đã thử thực hiện một số nghiên cứu về điều này nhưng vẫn chưa tìm thấy gì vững chắc. Tôi có một plugin tôi đang làm việc và giữa phiên bản mới nhất và phiên bản mới, chúng tôi đã thực hiện một số cập nhật cho tiện ích thay đổi một số tên cài đặt (trên phụ trợ) và tôi gặp khó khăn khi tạo thói quen nâng cấp để thực hiện việc này.
Những gì tôi đã làm cho đến nay dường như (hầu hết) làm việc là thế này:
$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 );
}
Trong hầu hết các thử nghiệm của tôi, điều này hoạt động tốt, nhưng vấn đề là tiện ích cũ không còn hiển thị đầu ra nữa. Chỉ tiêu đề của widget sẽ hiển thị. Tôi có thể khắc phục điều này bằng cách đi và lưu từng tiện ích riêng lẻ và sau đó nó sẽ hoạt động tốt, nhưng tôi không muốn làm cho người dùng của mình làm điều đó.
Tôi nghĩ một cái gì đó như thế này có thể làm việc:
$settings = $widgets->get_settings();
foreach( $settings as $s ) {
$s['setting1'] = $s['oldsetting1'];
$s['setting2'] = $s['oldsetting2'];
$widgets->save_settings( $s );
}
Nhưng có vẻ như save_settings()
cuộc gọi phải sai vì điều này loại bỏ hoàn toàn widget.
Tôi gặp khó khăn khi tìm bất kỳ loại tiêu chuẩn nào cho một cái gì đó như thế này và chỉ muốn nghe bất kỳ ý tưởng, ý tưởng hoặc liên kết nào bạn có thể phải làm một cái gì đó như thế này.
Cảm ơn trước sự giúp đỡ nào.
BIÊN TẬP:
Đây thực sự không phải là một câu hỏi về việc theo dõi các khóa cấp phép hoặc nâng cấp các plugin không được lưu trữ trên repo WP. Điều này có nghĩa là cập nhật cài đặt giữa 2 phiên bản plugin khi người dùng nâng cấp.
Thí dụ:
phiên bản 1.0.0 có trường cài đặt name
Vâng, trong phiên bản 1.1.0, chúng tôi quyết định chúng tôi cần cả tên và họ để thay đổi cài đặt cũ thành first_name
và sau đó thêm cài đặt mới last_name
.
Việc chuyển các tùy chọn này nếu được lưu dưới dạng meta bài đăng cho loại bài đăng tùy chỉnh là không có vấn đề:
$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' );
Vì vậy, phần đó là dễ dàng. Điều tôi gặp khó khăn với điều đó dường như không dễ dàng là làm điều tương tự nhưng đối với các cài đặt WIDGET.
Hy vọng rằng điều này sẽ làm sáng tỏ bất kỳ sự nhầm lẫn và giúp làm cho điều này dễ trả lời hơn.
EDIT 2:
Kết quả echo '<pre>' . print_r( $widget, true ) . '</pre>';
từ đoạn mã đầu tiên ở trên:
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
)