Limite la cantidad de widgets inactivos

10

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;
Pony de un solo truco
fuente
1
¿Podría escribir esto como una A y marcarlo como aceptado, por favor? ¡Gracias!
Kaiser
No porque descubrí que no funciona correctamente. Parece que se está eliminando la configuración de otras barras laterales
onetrickpony
Entonces deberías eliminar el "Encontré una solución" de la Q. Hm?
kaiser
1
Q actualizado. Voy a intentarlo de nuevo cuando tenga tiempo
onetrickpony
¿Has intentado envolverlo en una 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 un update_optionacceso 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.
Kaiser

Respuestas:

3

Probado bajo 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);
}

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.

Tom J Nowell
fuente