Limite o número de widgets inativos

Estou tentando restringir o número de widgets da barra lateral “wp_inactive_widgets” para o máximo de 10, porque a página de administração de widgets é incrivelmente lenta:

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; } 

Isso funciona aparentemente, mas o problema é que as opções de instância do widget ainda permanecem no database, independentemente de a instância do widget existir ou não dentro de uma barra lateral …

Alguém conhece uma maneira de remover as opções do widget também?


Descobri uma solução:

Editar: em determinadas situações, parece remover widgets de outras barras laterais também, não tenho certeza do que está causando isso …

 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; 

Solutions Collecting From Web of "Limite o número de widgets inativos"

Testado em v3.2.1:

 $sidebars = wp_get_sidebars_widgets(); if(count($sidebars['wp_inactive_widgets']) > 10){ $new_inactive = array_slice($sidebars['wp_inactive_widgets'],-10,10); // remove the dead widget options $dead_inactive = array_slice($sidebars['wp_inactive_widgets'],0,count($sidebars['wp_inactive_widgets'])-10); foreach($dead_inactive as $dead){ $pos = strpos($dead,'-'); $widget_name = substr($dead,0,$pos); $widget_number = substr($dead,$pos+1); $option = get_option('widget_'.$widget_name); unset($option[$widget_number]); update_option('widget_'.$widget_name,$option); } // save our new widget setup $sidebars['wp_inactive_widgets'] = $new_inactive; wp_set_sidebars_widgets($sidebars); } 

O código acima limita a barra lateral inativa para os últimos 10 widgets e apenas a barra lateral inativa. Ele também remove as opções para os widgets que foram excluídos.