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.