「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と書いて、承認済みとしてマークしてください。ありがとう!
—
カイザー2011
いいえ、正しく機能していないことがわかりました。他のサイドバーから設定を削除しているようです
—
onetrickpony
次に、Q。Hmから「解決策を見つけました」を削除する必要がありますか?
—
カイザー2011
更新Q.私は、私は時間があるときそれを別の試みを与えるつもりだ
—
onetrickpony
あなたはそれを
—
カイザー、
if ( is_admin() && /* page does here */ )
声明で包み込もうとしましたか?ポイントは、各リクエストのすべての場所でこれらのウィジェットをグローバルに削除していることです。OK:編集。少し考えた後、あなたの問題は、update_option
グローバルにアクセスできるものを使用することかもしれません(ウィジェットの正確な内部がわからない)。たぶん、カスタムの制限付きウィジェットオプションを更新し、非アクティブなウィジェット領域をカスタムオプションで「フィード」して干渉を回避することができます。