问题描述
我试图将”wp_inactive_widgets” 侧边栏的小工具数限制为最大 10,因为小工具管理页面非常慢:
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;
}
这显然是有效的,但问题是 widget 实例选项仍然保留在数据库中,无论窗口小工具实例是否存在于侧边栏中…
有没有人知道一个方法来删除小工具选项吗?
我找到了一个解决方案:
编辑:在某些情况下,它似乎从其他侧边栏删除小工具,我不知道是什么导致这个…
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;
最佳解决方案
根据 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);
}
上述代码将非活动边栏限制为最后 10 个小工具,而仅限于非活动边栏。它还会删除已删除的窗口小工具的选项。
参考文献
注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。