Я пытаюсь ограничить количество виджетов с боковой панели "wp_inactive_widgets" максимум 10, потому что страница администрирования виджетов невероятно медленная:
add_filter('pre_update_option_sidebars_widgets', 'cleanup_inactive_widgets', 10, 2);
function cleanup_inactive_widgets($new, $old){
if(!empty($new['wp_inactive_widgets']) && count($new['wp_inactive_widgets']) > 10)
$new['wp_inactive_widgets'] = array_slice($new['wp_inactive_widgets'], -10, 10);
return $new;
}
Очевидно, это работает, но проблема в том, что параметры экземпляра виджета все еще остаются в базе данных, независимо от того, существует ли экземпляр виджета внутри боковой панели ...
Кто-нибудь знает способ удалить опции виджета тоже?
Я нашел решение:
Редактировать: в определенных ситуациях кажется, что виджеты также удаляются с других боковых панелей, я не уверен, что это вызывает ...
if(!empty($new['wp_inactive_widgets']) && count($new['wp_inactive_widgets']) > 10){
// find out which widget instances to remove
$removed_widgets = array_slice($new['wp_inactive_widgets'], 0, -10);
// remove instance options
foreach($removed_widgets as $widget_id)
if(isset($GLOBALS['wp_registered_widgets'][$widget_id])){
$instance = $GLOBALS['wp_registered_widgets'][$widget_id]['callback'][0]->number;
$option_name = $GLOBALS['wp_registered_widgets'][$widget_id]['callback'][0]->option_name;
$options = get_option($option_name); // get options of all instances
unset($options[$instance]); // remove this instance's options
update_option($option_name, $options);
}
// keep only the last 10 records from the inactive widgets area
$new['wp_inactive_widgets'] = array_slice($new['wp_inactive_widgets'], -10, 10);
}
return $new;
if ( is_admin() && /* page does here */ )
заявлении? Я предполагаю, что дело в том, что вы повсеместно удаляете эти виджеты при каждом запросе. ОК: Редактировать. Подумав об этом, ваша проблема может заключаться в том, что вы используетеupdate_option
глобальный доступ (не знаю точных внутренних элементов для виджетов). Возможно, вы могли бы обновить настраиваемую опцию ограниченных виджетов и «скормить» область неактивных виджетов своей опцией, чтобы избежать помех.Ответы:
Протестировано под v3.2.1:
Приведенный выше код ограничивает неактивную боковую панель последними 10 виджетами и только неактивной боковой панелью. Он также удаляет параметры для виджетов, которые были удалены.
источник