Batasi jumlah widget yang tidak aktif

10

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;
onetrickpony
sumber
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
1
Diperbarui P. Saya akan mencoba lagi ketika saya punya waktu
onetrickpony
Sudahkah Anda mencoba membungkusnya dalam sebuah 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_optionyang 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.
kaiser

Jawaban:

3

Diuji di bawah 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);
}

Kode di atas membatasi sidebar tidak aktif hingga 10 widget terakhir, dan hanya sidebar tidak aktif. Ini juga menghapus opsi untuk widget yang telah dihapus.

Tom J Nowell
sumber