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;
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, aufupdate_option
die 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.Antworten:
Getestet unter v3.2.1:
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.
quelle