Estou tentando restringir o número de widgets da barra lateral "wp_inactive_widgets" para no máximo 10, porque a página de administração dos 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;
}
Aparentemente, isso funciona, mas o problema é que as opções da instância do widget ainda permanecem no banco de dados, independentemente de a instância do widget existir ou não dentro de uma barra lateral ...
Alguém sabe uma maneira de remover as opções de widget também?
Eu descobri uma solução:
Edit: em certas 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;
if ( is_admin() && /* page does here */ )
declaração? Eu acho que o ponto é que você está removendo globalmente esses widgets em cada solicitação em qualquer lugar. Ok: Editar. Depois de pensar um pouco, o seu problema pode ser o usoupdate_option
acessível globalmente (não sei o interior exato dos widgets). Talvez você possa atualizar uma opção de widgets limitados personalizados e "alimentar" a área de widgets inativos com sua opção personalizada para contornar interferências.Respostas:
Testado na v3.2.1:
O código acima limita a barra lateral inativa aos últimos 10 widgets e apenas a barra lateral inativa. Ele também remove as opções para os widgets que foram excluídos.
fonte