我试图将“ 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;
}
这显然是可行的,但问题是小部件实例选项仍保留在数据库中,无论小部件实例是否存在于边栏中。
有谁知道一种删除小部件选项的方法吗?
我找到了解决方案:
编辑:在某些情况下,它似乎也从其他侧边栏中删除了小部件,我不确定是什么原因导致的...
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;
1
您能将其写为A并标记为接受吗?谢谢!
—
凯撒
否,因为我发现它无法正常工作。它似乎正在从其他侧边
—
栏中
然后,您应该从“问题”中删除“我找到了解决方案”。
—
kaiser
问:我有空的时候再试试看
—
onetrickpony
您是否尝试将其包装成
—
kaiser
if ( is_admin() && /* page does here */ )
语句?我想说的是,您正在全球各地删除每个请求上的那些小部件。确定:编辑。经过一番思考,您的问题可能是您使用了update_option
可全局访问的(不知道小部件的确切内部结构)。也许您可以更新自定义的受限窗口小部件选项,并使用您的自定义选项“馈送”非活动窗口小部件区域,以避开干扰。