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;
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_option
che è 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.