限制非活动微件的数量

时间:2011-07-24 作者:onetrickpony

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

1 个回复
最合适的回答,由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个小部件,并且仅限于非活动侧栏。它还删除了已删除的小部件的选项。

结束

相关推荐

如何使wp-signup.php成为一个1步流程

我正在为房地产经纪人开发一个多站点。Wp注册。php从我的主题中使用了错误的页面模板(主页而不是全宽页面模板),所以我从wp注册中获取了一些重要信息。php创建了一个页面模板。结果如下:[http://thewebrockstar.com/realestate/signup/][1]然而,现在第2步(在点击下一步之后)将从我的wp注册页面模板重定向到原来的wp注册页面。php。有什么解决办法吗?我在想注册wp是最容易的。php是一个一步流程(所有内容都在一个页面上),而不是:http://i.stack.