Limitar o número de widgets inativos

10

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;
onetrickpony
fonte
11
Você poderia escrever isso como um A e marcá-lo como aceito, por favor? Obrigado!
kaiser
Não, porque descobri que não está funcionando corretamente. Parece estar removendo as configurações de outras barras laterais
onetrickpony
Então você deve remover o "Encontrei uma solução" do Q. Hum?
Kaiser
11
Atualizado Q. Vou tentar outra vez quando tiver tempo
onetrickpony
Você já tentou envolvê-lo em uma 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 uso update_optionacessí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.
Kaiser

Respostas:

3

Testado na 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 aos últimos 10 widgets e apenas a barra lateral inativa. Ele também remove as opções para os widgets que foram excluídos.

Tom J Nowell
fonte