Etkin olmayan widget'ların sayısını sınırlama


10

Widget yönetici sayfası inanılmaz derecede yavaş, çünkü "wp_inactive_widgets" kenar çubuğundan maksimum 10 widget sayısını sınırlamak çalışıyorum:

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;
}

Bu görünüşte çalışıyor, ancak sorun, widget örneği bir kenar çubuğunun içinde olup olmadığına bakılmaksızın, widget örneği seçeneklerinin hala veritabanında kalmasıdır ...

Widget seçeneklerini de kaldırmanın bir yolunu bilen var mı?


Bir çözüm buldum:

Düzenleme: bazı durumlarda widget'ları diğer kenar çubuklarından da kaldırıyor gibi görünüyor, buna ne neden olduğundan emin değilim ...

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
Bunu A olarak yazabilir ve kabul edildi olarak işaretleyebilir misiniz? Teşekkürler!
kaiser

Hayır, çünkü düzgün çalışmadığını öğrendim. Diğer kenar çubuklarından ayarları kaldırıyor gibi görünüyor
onetrickpony

O zaman Q. Hm? "Bir çözüm buldum?"
kaiser

1
Güncellenmiş S.
Zamanım

Bir if ( is_admin() && /* page does here */ )ifadeye sarmaya çalıştınız mı ? Sanırım asıl nokta, her bir istekte bu widget'ları global olarak kaldırmanızdır. Tamam: Düzenle. Bunu düşündükten sonra, sorununuz update_optionküresel olarak erişilebilir olan (widget'lar için kesin iç kısımları bilmediğiniz) olabilir. Özel bir sınırlı pencere öğesi seçeneğini güncelleyebilir ve paraziti önlemek için etkin olmayan pencere öğesi alanını özel seçeneğinizle "besleyebilirsiniz".
kaiser

Yanıtlar:


3

V3.2.1 altında test edilmiştir:

$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);
}

Yukarıdaki kod, etkin olmayan kenar çubuğunu son 10 pencere öğesiyle ve yalnızca etkin olmayan kenar çubuğuyla sınırlar. Ayrıca, silinen widget'ların seçeneklerini de kaldırır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.