Veritabanını değiştiren WordPress eklenti güncellemesi nasıl uygulanır?


10

Kendi birkaç veritabanı tablosu olan bir WordPress eklentisi geliştiriyorum. Eklenti, etkinleştirildiğinde bu tabloları oluşturur ve silindiğinde / kaldırıldığında bunları kaldırır.

Tablo yapısının yanı sıra eklentinin kodunu güncelleyen eklentinin bir güncelleme işlemini uygulamak zorundayım. En basit durum tablolardan birine yeni bir sütun eklemek olacaktır. Daha karmaşık olan durum, yeni bir tablo yapısı oluşturmak ve içeriği buna göre güncellemek olacaktır.

Bu sorunu çözmeyi nasıl önerirsiniz? Yardımcı olabilecek herhangi bir yerleşik WordPress işlevi var mı?

Yanıtlar:


4

Bu günlerde bunu yapmanın doğru yolu, şemanızı eklenti kaynağına bir dosya olarak dahil etmek ve bu şemayı kullanarak veritabanını gerektiği gibi güncellemek için dahili WordPress işlevini dbDelta () kullanmaktır. Gerekli gerçek kod çok basit:

$sql = file_get_contents( plugin_dir_path(__FILE__) . "/schema.sql" );
dbDelta( $sql );

Bu, sizin için veritabanını gerektiği gibi oluşturur ve günceller. En son kontrol ettiğimde, kullanılmayan eski sütunları silmediğinden, bunu bir sürüm kontrolü yoluyla kodlamanız gerekir. Bu, WordPress'in güzel bir özelliği ve devasa bir zaman kazandırıcıdır. DbDelta () kodu boşluk hakkında çok telaşlı olduğu söylenir gibi bir mysql şema dışa aktarma aralığını kopyalamak schema.sql dosyasını oluştururken dikkat edin. Ayrıca veritabanının sürümünü sınamanız gerekir ve en son sürüm değilse, veritabanını güncelleştirmek için yukarıdakini arayın. Ayrıca, dbDelta () yönteminin doğru şekilde yapmadığı değişiklikleri (örneğin bir sütunu silme) kapsayacak şekilde özel güncellemeler yapmanız gerekebilir. Testin sürümün güncellenip güncellenmediğini görmek için basit bir mantık yazmak kolaydır ve bu manuel güncellemeleri $ wpdb ile yapın. Örneğin, şimdi kullanılmayan bir sütunu bırakabilirsiniz.

$installed_ver = get_option(MY_DB_VERSION);
$wpp = $wpdb->prefix . "mypluginname";
if ($installed_ver < 102)
        $wpdb->query("ALTER TABLE ${wpp}_movies DROP nft_date");
if ($installed_ver < 107)
        $wpdb->query("ALTER TABLE ${wpp}_movies CHANGE lastupdated "
        . "lastupdated TIMESTAMP on update CURRENT_TIMESTAMP "
        . "NOT NULL DEFAULT CURRENT_TIMESTAMP");

update_option(MY_DB_VERSION, $db_version);

Bu yayın için basitleştirmek sürecinde kırmış olsaydım özür dilerim çalışan kod, basitleştirilmiştir.

Ayrıca, WordPress 3.9.2'den itibaren, WordPress'in eklentiyi güncelleme konusunda her zaman aktivasyon kancasını çalıştırmadığını unutmayın (özellikle, Pano Güncelleştirmeleri sayfasından toplu güncelleme yapılırsa).


Bu günlerde schema.sql dosyasının mod zamanından DB sürümünü almaya başladım. Bu, yalnızca scheme.sql dosyasını güncellemenin veritabanı yükseltmesine neden olması için yeterli olduğu anlamına gelir; veritabanı sürümünü düzenlemeyi hatırlamaya gerek yok. Şuna benzer: $ db_version = filemtime (“schema.sql”);
Brian C

1
Peki, dosya süresi hareketli sunucular gibi harici bir şeyden değişirse, mtime ve db sürümü değişir mi?
Walf

Dosya süresi her zaman GMT'dir ve sunucular nadiren birkaç saniye farklıdır, bu nedenle iki kez tetiklenmesi neredeyse imkansızdır. Bununla birlikte, tekrar tetiklense bile, bir kez çalıştığı ve canlı DB ile hiçbir şey değiştirmeden açık bir şekilde karşılaştırıldığı için hiçbir zarar verilmez. Bu dbDelta () ile ilgili güzel bir şeydir - sorunsuz bir şekilde birden çok kez çalışabilir. Güzel soru, teşekkürler.
Brian C

3

Kısacası, evet - $wpdbsınıf. Daha fazla bilgi için Kodeks'e bakın .

Özel bir tabloyla (veya gerçekten herhangi bir tabloyla) etkileşime girdiğinizde $wpdb, özellikle de preparesorgulardan kaçmaya ve enjeksiyonları önlemeye yardımcı olabilecek yöntemi bildiğinizden emin olun .

Tabloyu oluşturmak için kullanmanız gerektiği için zaten aşina olmalısınız. Kurulum kancanızda şöyle bir şey olmalıdır:

$charset_collate = '';
if ( ! empty($wpdb->charset) )
    $charset_collate = "DEFAULT CHARACTER SET $wpdb->charset";
if ( ! empty($wpdb->collate) )
    $charset_collate .= " COLLATE $wpdb->collate";

//Create custom table
$sql_custom_table ="CREATE TABLE {$wpdb->prefix}my_table (
    id bigint(20) unsigned NOT NULL auto_increment,
    column_a varchar(255) default NULL,
    column_b varchar(255) default NULL,
    PRIMARY KEY  (id)
    ) $charset_collate; ";

require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
dbDelta($sql_custom_table);

Bu kod aslında eklenti her etkinleştirildiğinde çalıştırılır (yani sadece kurulu değil). Böylece, birisi eklentiyi otomatik olarak güncellediğinde çalışır . Not: Eklentiyi manuel olarak değiştirerek yükseltirlerse - o zaman olmaz - bu nedenle admin_initeklentiniz yükseltildiğinde yukarıdaki kodu tetiklemeniz gerekir (seçenekler tablosunda sürüm numarasını saklayın, mevcut sürüme karşı kontrol edin) .

Artık CREATE TABLEeklentiyi her güncellediğinizde normalde SQL komutunun çalışmasını istemezsiniz - işte bu noktada dBDelta()devreye girer.

Yukarıdaki komutu çalıştırmadan önce - tablonun mevcut olup olmadığını kontrol eder. Dahası, sütun türlerini kontrol eder. Bu nedenle, tablo yoksa, oluşturur, eğer yaparsa, ancak bazı sütun türleri değiştiğinde tablolar güncellenir ve bir sütun yoksa - ekler.

Ne yazık ki - yukarıdan bir sütunu kaldırırsanız, sütun otomatik olarak kaldırılmaz. Sütunları / tabloları kaldırmak için özel olarak DROPbunlara ihtiyacınız vardır (sizden önce var olduklarını kontrol edin).

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.