Limiter le nombre de widgets inactifs

10

J'essaie de limiter le nombre de widgets de la barre latérale "wp_inactive_widgets" à 10 maximum, car la page d'administration des widgets est incroyablement lente:

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

Cela fonctionne apparemment, mais le problème est que les options d'instance de widget restent dans la base de données, que l'instance de widget existe ou non dans une barre latérale ...

Quelqu'un connaît-il également un moyen de supprimer les options de widget?

J'ai trouvé une solution:

Modifier: dans certaines situations, il semble que les widgets des autres barres latérales soient également supprimés, mais je ne suis pas sûr de ce qui le cause ...

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;
    
posée onetrickpony 24.07.2011 - 13:31

1 réponse

3

Testé sous 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);
}

Le code ci-dessus limite la barre latérale inactive aux 10 derniers widgets et uniquement à la barre latérale inactive. Il supprime également les options des widgets supprimés.

    
réponse donnée Tom J Nowell 26.10.2011 - 12:15

Lire d'autres questions sur les étiquettes