Limitare il numero di widget inattivi


10

Sto cercando di limitare il numero di widget dalla barra laterale "wp_inactive_widgets" a un massimo di 10, perché la pagina di amministrazione dei widget è incredibilmente 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;
}

Funziona apparentemente, ma il problema è che le opzioni dell'istanza del widget rimangono ancora nel database, indipendentemente dal fatto che l'istanza del widget esista o meno all'interno di una barra laterale ...

Qualcuno conosce un modo per rimuovere anche le opzioni del widget?


Ho scoperto una soluzione:

Modifica: in alcune situazioni sembra rimuovere anche i widget da altre barre laterali, non sono sicuro di cosa stia causando ...

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;

1
Potresti scrivere questo come A e contrassegnarlo come accettato per favore? Grazie!
— Kaiser,

No perché ho scoperto che non funziona correttamente. Sembra rimuovere le impostazioni da altre barre laterali
— onetrickpony,

Quindi dovresti rimuovere "Ho trovato una soluzione" da Q. Hm?
— Kaiser

1
Aggiornato Q. Proverò di nuovo quando avrò il tempo
— onetrickpony,

Hai provato a racchiuderlo in una if ( is_admin() && /* page does here */ )dichiarazione? Immagino che il punto sia che stai rimuovendo globalmente quei widget su ogni richiesta ovunque. Ok: Modifica. Dopo averci pensato, il tuo problema potrebbe essere l'uso update_optionche è accessibile a livello globale (non conosci gli interni esatti per i widget). Forse potresti aggiornare un'opzione personalizzata di widget limitati e "alimentare" l'area dei widget inattivi con l'opzione personalizzata per aggirare le interferenze.
— Kaiser

Risposte:


3

Testato sotto 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);
}

Il codice sopra limita la barra laterale inattiva agli ultimi 10 widget e solo la barra laterale inattiva. Rimuove anche le opzioni per i widget che sono stati eliminati.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.