我试图将“wp\\u inactive\\u widgets”侧栏中的widgets数量限制为最多10个,因为widgets admin页面速度非常慢:
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;
}
这显然是可行的,但问题是小部件实例选项仍然保留在数据库中,无论小部件实例是否存在于侧边栏中。。。
有没有人知道删除小部件选项的方法?
我找到了一个解决方案
编辑:在某些情况下,它似乎也会从其他侧边栏中删除小部件,我不确定是什么导致了这种情况。。。
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;
最合适的回答,由SO网友:Tom J Nowell 整理而成
在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个小部件,并且仅限于非活动侧栏。它还删除了已删除的小部件的选项。