Saya mencoba membatasi jumlah widget dari bilah samping "wp_inactive_widgets" menjadi maksimum 10, karena halaman admin widget sangat lambat:
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;
}
Ini tampaknya berhasil, tetapi masalahnya adalah bahwa opsi instance widget masih tetap ada dalam database, terlepas dari apakah instance widget itu ada atau tidak di dalam bilah sisi ...
Apakah ada yang tahu cara untuk menghapus opsi widget juga?
Saya menemukan solusinya:
Sunting: dalam situasi tertentu sepertinya menghapus widget dari sidebar lain juga, saya tidak yakin apa yang menyebabkan ini ...
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
Bisakah Anda menulis ini sebagai A dan menandainya sebagai diterima? Terima kasih!
—
kaiser
Tidak karena saya tahu itu tidak berfungsi dengan benar. Tampaknya akan menghapus pengaturan dari sidebar lain
—
onetrickpony
Maka Anda harus menghapus "Saya menemukan solusi" dari Q. Hm?
—
kaiser
Diperbarui P. Saya akan mencoba lagi ketika saya punya waktu
—
onetrickpony
Sudahkah Anda mencoba membungkusnya dalam sebuah
—
kaiser
if ( is_admin() && /* page does here */ )
pernyataan? Saya kira intinya adalah bahwa Anda menghapus widget secara global pada setiap permintaan di mana-mana. Oke: Edit. Setelah beberapa memikirkannya, masalah Anda mungkin adalah Anda menggunakan update_option
yang dapat diakses secara global (tidak tahu internal yang tepat untuk widget). Mungkin Anda dapat memperbarui opsi widget terbatas khusus dan "mengumpankan" area widget tidak aktif dengan opsi kustom Anda untuk menghindari gangguan.