Estoy tratando de restringir el número de widgets de la barra lateral "wp_inactive_widgets" a un máximo de 10, porque la página de administración de widgets es increíblemente 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;
}
Aparentemente, esto funciona, pero el problema es que las opciones de instancia del widget aún permanecen en la base de datos, independientemente de si la instancia del widget existe o no dentro de una barra lateral ...
¿Alguien sabe una forma de eliminar las opciones del widget también?
Encontré una solución:
Editar: en ciertas situaciones también parece eliminar widgets de otras barras laterales, no estoy seguro de qué está causando esto ...
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 */ )
declaración? Supongo que el punto es que está eliminando globalmente esos widgets en cada solicitud en todas partes. Ok: editar. Después de pensarlo un poco, su problema puede ser que utilice unupdate_option
acceso global (no conozca las partes internas exactas de los widgets). Tal vez podría actualizar una opción de widgets limitados personalizados y "alimentar" el área de widgets inactivos con su opción personalizada para evitar interferencias.Respuestas:
Probado bajo v3.2.1:
El código anterior limita la barra lateral inactiva a los últimos 10 widgets, y solo la barra lateral inactiva. También elimina las opciones para los widgets que se han eliminado.
fuente