Eklenti yükseltme: Widget ayarları


9

Bu konuda biraz araştırma yapmayı denedim ama henüz sağlam bir şey bulamadım. Üzerinde çalıştığım bir eklenti var ve son sürüm ile yeni sürüm arasında bazı ayar adlarını (arka uçta) değiştiren widget'a bazı güncellemeler yaptık ve bunu yapmak için bir yükseltme rutini oluşturmada sorun yaşıyorum.

Şimdiye kadar yaptığım (çoğunlukla) iş gibi görünüyor:

$widget = get_option( 'widget_name' );

if( is_array( $widget ) && ! empty( $widget ) ) {
    foreach( $widget as $a => $b ) {
        if( ! is_array( $b ) ) {
            continue;
        } 

        foreach( $b as $k => $v ) {
            $widget[$a]['setting1'] = $widget[$a]['oldsetting1'];
            $widget[$a]['setting2'] = $widget[$a]['oldsetting2'];
        }
    }

    update_option( 'widget_name', $widget );
}

Testlerimin çoğunda bu iyi çalışıyor, ancak sorun eski widget'ın artık çıktısını görüntülememesine neden oluyor. Yalnızca widget'ın başlığı gösterilir. Her bir widget'ı kaydedip kaydederek bunu düzeltebilirim ve sonra iyi çalışır, ancak kullanıcılarımın bunu yapmasını istemiyorum.

Böyle bir şeyin işe yarayabileceğini düşündüm:

$settings = $widgets->get_settings();

foreach( $settings as $s ) {

    $s['setting1'] = $s['oldsetting1'];
    $s['setting2'] = $s['oldsetting2'];

    $widgets->save_settings( $s );

}

Ancak, save_settings()aramanın yanlış olması gerektiği anlaşılıyor çünkü bu, widget'ı tamamen kaldırıyor.

Ben böyle bir şey için herhangi bir standart bulmakta sorun yaşıyorum ve sadece böyle bir şey yapmak zorunda kalabilirsiniz herhangi bir düşünce, fikir veya bağlantıları duymak istiyorum.

Herhangi bir yardım için şimdiden teşekkürler.

DÜZENLE:

Bu aslında lisans anahtarlarını izleme veya WP deposunda bulunmayan eklentileri yükseltme hakkında bir soru değildir. Bunun hakkında daha fazla bilgi, kullanıcı yükselttiğinde eklentinin 2 sürümü arasındaki ayarları güncellemektir.

Misal:

1.0.0 sürümünde ayar alanı var name

1.1.0 sürümünde hem adın hem de soyadın gerekli olduğuna karar veriyoruz, bu nedenle eski ayarı değiştirip first_nameyeni bir ayar ekliyoruz last_name.

Özel bir gönderi türü için gönderi meta olarak kaydedildiyse bu seçenekleri aktarmak sorun değildir:

$old_name = get_post_meta( $post->ID, 'name', true );
$first_name = update_post_meta ( $post->ID, 'first_name', true );
delete_post_meta( $post->ID, 'name' );

Yani bu kısım kolay. Bu kadar kolay görünmüyor gibi sorun yaşıyorum ne aynı şey ama WIDGET ayarları için yapıyor.

Umarım bu herhangi bir karışıklığı giderir ve bunun cevaplanmasını kolaylaştırır.

DÜZENLEME 2:

echo '<pre>' . print_r( $widget, true ) . '</pre>';Yukarıdaki ilk kod grubunun sonucu:

Array
(
[2] => Array
    (
        [title] => Class Schedule
        [id] => 23
        [display_type] => grid
        [order] => asc
        [display_title_text] => Events on
        [paging] => 1
        [list_max_num] => 7
        [list_max_length] => days
        [list_start_offset_num] => 0
        [list_start_offset_direction] => back
        [gce_per_page_num] => 7
        [gce_events_per_page] => days
    )

[3] => Array
    (
        [title] => Examples
        [id] => 24
        [display_type] => grid
        [order] => asc
        [display_title_text] => Events on
        [paging] => 1
        [list_max_num] => 7
        [list_max_length] => days
        [list_start_offset_num] => 0
        [list_start_offset_direction] => back
        [gce_per_page_num] => 7
        [gce_events_per_page] => days
    )

[_multiwidget] => 1
)

Bu makaleyi bugün Tutsplus'ta gördüm, hepsini bile okumadım, ama müttefikiniz gibi görünüyor. Lisans Kontrollü Tema ve Eklenti Güncelleme Sistemi
Oluşturun

@OnethingSimple Cevabınız için teşekkürler ama bu benim istediğim gibi görünmüyor. Soruyu daha açık hale getirmek için güncelleyeceğim.
Nick Young

Widget ayarları yapısının okuduğunuz haliyle bir dökümü elde etme şansımız olabilir (bazı değerleri değiştirmeniz gerekse bile). Bu, neyin yanlış gittiğine dair bir fikir vermenize yardımcı olabilir. örneğin echo "<pre>". print_r ($ widget'ı, doğru). "</ pre>";
Özel

@Gizlier Şimdi OP'nin altına eklendi.
Nick Young

Yanıtlar:


3

Sadece seçeneği değiştirme konusunda hızlı bir test yaptım ve işe yarıyor gibi görünüyor.

Yaptığım şey:

  1. Sadece 2 alanı olan bir widget yazdı: "Başlık" ve "Ad". Kenar çubuğuma bu widget'ın birkaç örneğini ekle. Ön uçta doğru gösterildiklerinden emin olun.
  2. Sınıfı 3 alan kullanacak şekilde düzenledi: "Başlık" ve "Ad" ("Ad" yerine) ve "Soyadı" ekledi.
  3. Pencere 'widgets_init'öğesi seçeneklerini güncelleyen bir işlevi çağırmak için pencere öğesini kaydeden işlevi düzenledi :

    add_action( 'widgets_init', 'my_example_widget_register' );
    
    function my_example_widget_register() {
    
      $widget_name = 'my_example_widget';  // <-- You will probably replace this
    
      $options = get_option("widget_{$widget_name}");
    
      // if the widget is not updated, run a function that updates it
      if ($options && ! get_option("is_{$widget_name}_updated")) {
          // use class below to update options
          $updater = new MyExampleWidgetUpdater($widget_name, $options);
          $updater->update();
      }
    
      register_widget('My_Example_Widget'); // <-- You will probably replace this
    }
  4. Widget seçeneklerini güncellemek için basit bir sınıf yazdı:

    class MyExampleWidgetUpdater
    {
    
      private $name;
      private $options;
    
      public function __construct($name, $options) {
         $this->name = $name;
         $this->options = $options;
      }
    
      public function update() {
        // loop all the options
        array_walk($this->options, function(&$option, $key) {
            if (is_array($option) && is_numeric($key)) {
              $option = $this->getOption($option);
            }
        });
        // update all options in DB
        update_option("widget_{$this->name}", $this->options);
        // set the widget as updated
        update_option("is_{$this->name}_updated", 1);
      }
    
      private function getOption($options) {
        if (!isset($options['name'])) {
           return $options;
        }
        $options['first_name'] = $options['name'];
        $options['last_name'] = '';
        unset($options['name']);
        return $options;
      }
    }
  5. Yöntemin "is_{$widget_name}_updated"içindeki seçeneği kaydetmek için widget sınıfını düzenledim, update()bu şekilde güncelleyici sınıfı asla eski widget'ı yüklemeyen yeni kullanıcılar için çağrılmaz

    class My_Example_Widget {
    
        ...
    
        public function update($new_instance, $old_instance) {
            ...
    
            $widget_name = 'my_example_widget';
            update_option("is_{$widget_name}_updated", 1);
        }
    }
  6. Sitemi ziyaret ettim ve eski seçeneklerle kaydedilen widget'lar yeni seçenekler kullanılarak sorunsuz bir şekilde görüntüleniyor. (Tabii ki "soyadı" her zaman boştur).

"is_{$widget_name}_updated"Seçeneğin yerine, widget'ın gerçek sürümünü saklayan bir seçenekle iyi bir fikir olabilir , böylece bir dahaki güncellemeye ihtiyacınız olduğunda kullanışlı olacaktır.


Bu yüzden henüz cevap vermeden cevabınıza bakın. Sadece update_optiondoğru kullanarak yaptığımla benzer mi? Şimdi kanca belki önemli olup olmadığını merak ediyorum? Kancaya inittakıyorum. widgets_initBunun yerine kancaya ekleyerek büyük bir fark var mı ? Aynı zamanda ateş ettiklerinden emindim. Yardımın için teşekkürler.
Nick Young

@NickYoung Kancada hiçbir fark yok. Ama ilk kod snippet'inizde (bu benimkine benzeyen) ikinci (iç) foreachyanlış.
gmazzap

Yazdığınız kodu uygulama şansım oldu. Harika çalışıyor, ama yine de daha önce aldığım sorunu yaşıyorum. Seçenekleri başarılı bir şekilde aktarır, ancak eklenti için yükseltme rutinini çalıştırdıktan sonra widget ana HTML çıktısını durdurur ve yalnızca widget'ın başlığını gösterir. Widget ayarlarına gidip kaydet düğmesine tıklarsam tekrar açılır. Düşüncesi olan var mı?
Nick Young

Son yorumuma eklemek için. Bu seçenekler doğru güncelleniyor gibi ama gerçek örnek değil. Bu bir olasılık mı?
Nick Young

Hayır, tüm önbelleği devre dışı bıraktı. Aynı problemle 2 farklı ana bilgisayarda da test edildi.
Nick Young

1

Sadece farklı bir açıdan tartmak - eklenti güncellemesindeki tüm ayarları otomatik olarak yükseltmek yerine, "eski" bir ayar olup olmadığını kontrol edin ve anında "yeni" ayarlara eşleyin:

function widget( $args, $instance ) {
    if ( isset( $instance['old_setting'] ) )
         $instance = self::_version_compat( $instance );
}

static function _version_compat( $instance ) {
    $instance['new_setting'] = $instance['old_setting'];
    // etc.

    return $instance;
}

0

Başımın en üstünde, bir widget'ın her örneğine bir tür benzersiz kimlik verilir. Bu widget için bir prexfix olur demek istiyorum.

Bunu bir süre önce alay ettiğimi hatırlıyorum ama tam olarak ne olduğunu hatırlayamıyorum, üzgünüm.

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.