Begrenzen Sie die Anzahl inaktiver Widgets

10

Ich versuche, die Anzahl der Widgets in der Seitenleiste "wp_inactive_widgets" auf maximal 10 zu beschränken, da die Widgets-Administrationsseite unglaublich langsam ist:

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;
}

Dies funktioniert anscheinend, aber das Problem ist, dass die Widget-Instanzoptionen weiterhin in der Datenbank verbleiben, unabhängig davon, ob die Widget-Instanz in einer Seitenleiste vorhanden ist oder nicht ...

Kennt jemand eine Möglichkeit, auch die Widget-Optionen zu entfernen?


Ich habe eine Lösung gefunden:

Bearbeiten: In bestimmten Situationen scheinen Widgets auch aus anderen Seitenleisten entfernt zu werden. Ich bin mir nicht sicher, was dies verursacht.

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;
Onetrickpony
quelle
1
Könnten Sie dies als A schreiben und es bitte als akzeptiert markieren? Vielen Dank!
Kaiser
Nein, weil ich herausgefunden habe, dass es nicht richtig funktioniert. Es scheint Einstellungen aus anderen Seitenleisten zu entfernen
onetrickpony
Dann sollten Sie das "Ich habe eine Lösung gefunden" aus dem Q entfernen. Hm?
Kaiser
1
Aktualisiert F. Ich werde es noch einmal versuchen, wenn ich Zeit habe
onetrickpony
Haben Sie versucht, es in eine if ( is_admin() && /* page does here */ )Erklärung zu packen ? Ich denke, der Punkt ist, dass Sie diese Widgets bei jeder Anfrage überall global entfernen. Ok: Bearbeiten. Nach einigem Nachdenken könnte Ihr Problem darin bestehen, dass Sie verwenden, auf update_optiondie global zugegriffen werden kann (Sie kennen die genauen Interna für Widgets nicht). Möglicherweise können Sie eine benutzerdefinierte Option für eingeschränkte Widgets aktualisieren und den Bereich für inaktive Widgets mit Ihrer benutzerdefinierten Option "füttern", um Interferenzen zu umgehen.
Kaiser

Antworten:

3

Getestet unter 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);
}

Der obige Code beschränkt die inaktive Seitenleiste auf die letzten 10 Widgets und nur auf die inaktive Seitenleiste. Außerdem werden die Optionen für die gelöschten Widgets entfernt.

Tom J Nowell
quelle