限制不活动的小部件的数量


10

我试图将“ 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

1
问:我有空的时候再试试看
onetrickpony

您是否尝试将其包装成if ( is_admin() && /* page does here */ )语句?我想说的是,您正在全球各地删除每个请求上的那些小部件。确定:编辑。经过一番思考,您的问题可能是您使用了update_option可全局访问的(不知道小部件的确切内部结构)。也许您可以更新自定义的受限窗口小部件选项,并使用您的自定义选项“馈送”非活动窗口小部件区域,以避开干扰。
kaiser

Answers:


3

在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个小部件,并且仅将非活动侧边栏限制为。它还会删除已删除的窗口小部件的选项。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.