Limitez 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 ...

Est-ce que quelqu'un connaît également un moyen de supprimer les options du widget?


J'ai trouvé une solution:

Edit: dans certaines situations, il semble également supprimer les widgets des autres barres latérales, je ne sais pas ce qui cause cela ...

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
la source
1
Pourriez-vous écrire ceci comme un A et le marquer comme accepté s'il vous plaît? Merci!
kaiser
Non, car j'ai découvert que cela ne fonctionnait pas correctement. Il semble supprimer les paramètres des autres barres latérales
onetrickpony
Ensuite, vous devez supprimer le "J'ai trouvé une solution" du Q. Hm?
kaiser
1
Mise à jour Q. Je vais essayer à nouveau quand j'aurai le temps
onetrickpony
Avez-vous essayé de l'envelopper dans une if ( is_admin() && /* page does here */ )déclaration? Je suppose que le fait est que vous supprimez globalement ces widgets à chaque demande partout. Ok: éditez. Après y avoir réfléchi, votre problème pourrait être que vous utilisez update_optionce qui est accessible globalement (je ne connais pas les internes exacts pour les widgets). Vous pouvez peut-être mettre à jour une option de widgets limitée personnalisée et "alimenter" la zone des widgets inactifs avec votre option personnalisée pour contourner les interférences.
kaiser

Réponses:

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 qui ont été supprimés.

Tom J Nowell
la source