Я попытался провести какое-то исследование по этому вопросу, но пока не нашел ничего серьезного. У меня есть плагин, над которым я работаю, и между последней версией и новой версией мы сделали некоторые обновления в виджете, которые изменяют некоторые имена настроек (на серверной части), и у меня возникают проблемы при создании процедуры обновления для этого.
То, что я сделал до сих пор, кажется, (в основном) работает так:
$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 );
}
В большинстве моих тестов это работает нормально, но проблема заключается в том, что старый виджет больше не отображает вывод. Будет отображаться только заголовок виджета. Я могу это исправить, сохранив каждый отдельный виджет, и тогда он будет работать нормально, но я не хочу, чтобы мои пользователи делали это.
Я думал, что-то вроде этого может работать:
$settings = $widgets->get_settings();
foreach( $settings as $s ) {
$s['setting1'] = $s['oldsetting1'];
$s['setting2'] = $s['oldsetting2'];
$widgets->save_settings( $s );
}
Но кажется, что save_settings()
вызов должен быть неправильным, потому что это полностью удаляет виджет.
У меня возникают проблемы с поиском какого-либо стандарта для чего-то подобного, и я просто хотел бы услышать любые мысли, идеи или ссылки, которые вам могут понадобиться, чтобы сделать что-то подобное.
Заранее благодарю за любую помощь.
РЕДАКТИРОВАТЬ:
На самом деле это не вопрос отслеживания лицензионных ключей или обновления плагинов, которые не размещены в репозитории WP. Более того, это обновление настроек между двумя версиями плагина при обновлении пользователем.
Пример:
версия 1.0.0 имеет поле настроек name
Что ж, в версии 1.1.0 мы решили, что нам нужны и имя, и фамилия, поэтому мы изменили старую настройку на, first_name
а затем добавили новую last_name
.
Передача этих параметров, если они сохранены в качестве мета-записи для пользовательского типа записи, не представляет проблем:
$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' );
Так что это легко. То, что у меня есть проблемы с этим, кажется, нелегко делать то же самое, но для настроек WIDGET.
Надеюсь, это устранит любую путаницу и поможет облегчить ответ.
РЕДАКТИРОВАТЬ 2:
Результат echo '<pre>' . print_r( $widget, true ) . '</pre>';
из первого куска кода выше:
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
)
источник
Ответы:
Я сделал быструю проверку только на изменение опции, и это похоже на работу.
Что я сделал, это:
Отредактировал функцию, в которой зарегистрирован виджет,
'widgets_init'
для вызова функции, которая обновляет параметры виджета:Написал простой класс для обновления параметров виджета:
Я отредактировал класс виджета, чтобы сохранить параметр
"is_{$widget_name}_updated"
внутриupdate()
метода, таким образом, класс обновления никогда не будет вызываться для новых пользователей, которые никогда не устанавливали старый виджетЯ посетил свой сайт, и виджеты, сохраненные со старыми параметрами, отображаются без проблем с использованием новых параметров. (Конечно, «фамилия» всегда пуста).
Хорошей идеей может быть замена этой
"is_{$widget_name}_updated"
опции опцией, в которой хранится актуальная версия виджета, таким образом, это будет удобно в следующий раз, когда вам понадобится обновление.источник
update_option
правильного? Мне интересно, если крючок имеет значение, может быть? Я зацепил его заinit
крючок. Есть ли огромная разница, добавив егоwidgets_init
вместо этого на крючок? Я был почти уверен, что они стреляют одновременно. Спасибо за вашу помощь.foreach
неверен.Просто взвесить под другим углом - вместо того, чтобы автоматически обновлять все настройки при обновлении плагина, просто проверьте «старые» настройки и сопоставьте «новые» настройки на лету:
источник
Вдобавок ко всему, каждому экземпляру виджета присваивается какой-то уникальный идентификатор. Я хочу сказать, что становится префиксом для ключей для виджета.
Я помню, как ковырялся в этом некоторое время назад, но не могу вспомнить, каковы были точные значения, извините.
источник