問題描述
我試圖將”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 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。