Bagaimana cara mengimplementasikan pembaruan plugin WordPress yang memodifikasi database?

10

Saya mengembangkan plugin WordPress, yang memiliki beberapa tabel database sendiri. Plugin membuat tabel ini ketika diaktifkan, dan menghapusnya saat dihapus / dihapus.

Saya harus menerapkan proses pembaruan plugin yang memperbarui kode plugin serta struktur tabel. Kasus paling sederhana adalah menambahkan kolom baru ke salah satu tabel. Kasus yang lebih kompleks adalah membuat struktur tabel baru dan memperbarui konten yang sesuai.

Bagaimana Anda merekomendasikan untuk mengatasi masalah ini? Apakah ada fungsi WordPress bawaan yang dapat membantu?

Misha Moroshko
sumber

Jawaban:

4

Cara yang benar untuk melakukan ini hari ini adalah dengan memasukkan skema Anda sebagai file dalam sumber plugin dan menggunakan fungsi WordPress inbuilt dbDelta () untuk memperbarui database yang diperlukan menggunakan skema itu. Kode aktual yang diperlukan sangat sederhana:

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

Ini akan membuat dan memperbarui database untuk Anda sesuai kebutuhan. Ketika saya terakhir memeriksa itu tidak menghapus kolom lama yang tidak terpakai, jadi Anda perlu kode untuk itu melalui pemeriksaan versi. Ini adalah fitur WordPress yang indah dan penghemat waktu yang sangat besar. Hati-hati saat membuat file schema.sql yang Anda salin spasi di ekspor skema mysql persis seperti kode dbDelta () yang terkenal sangat cerewet tentang spasi. Anda juga harus menguji versi database, dan jika itu bukan yang terbaru, panggil yang di atas untuk memperbarui database. Anda juga mungkin perlu melakukan pembaruan spesifik untuk menutupi perubahan yang dbDelta () tidak beres (mis. Menghapus kolom). Sangat mudah untuk menulis logis jika tes sederhana untuk melihat apakah versi telah diperbarui dan melakukan pembaruan manual ini melalui $ wpdb. Misalnya, Anda mungkin menjatuhkan kolom yang sekarang tidak digunakan.

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

Ini disederhanakan dari menjalankan kode, permintaan maaf jika saya telah merusaknya dalam proses menyederhanakannya untuk publikasi.

Juga ingat bahwa pada WordPress 3.9.2, WordPress tidak selalu menjalankan kait aktivasi saat memperbarui plugin (khususnya, jika pembaruan massal dilakukan dari halaman Pembaruan Dashboard).

Brian C
sumber
Hari ini saya sudah mulai mengambil versi DB dari waktu mod file schema.sql. Ini berarti bahwa hanya memperbarui file skema.sql sudah cukup untuk menyebabkan peningkatan basis data; tidak perlu ingat untuk mengedit versi database. Sesuatu seperti: $ db_version = filemtime (“schema.sql”);
Brian C
1
Jadi, jika waktu file berubah dari sesuatu yang eksternal seperti memindahkan server, versi mtime dan db berubah?
Walf
Waktu file selalu dalam GMT, dan server jarang berbeda beberapa detik, jadi hampir tidak mungkin dipicu dua kali oleh itu. Namun, bahkan jika dipicu lagi, tidak ada salahnya dilakukan karena berjalan sekali dan melakukan perbandingan terhadap DB hidup, jelas tanpa mengubah apa pun. Ini adalah hal yang indah tentang dbDelta () - ia dapat berjalan beberapa kali tanpa masalah. Pertanyaan bagus, terima kasih.
Brian C
3

Singkatnya, ya - $wpdbkelas. Lihat Codex untuk informasi lebih lanjut.

Setiap kali Anda berinteraksi dengan tabel khusus (atau tabel apa saja, sebenarnya) Anda harus melaluinya $wpdb- khususnya pastikan Anda terbiasa dengan preparemetode yang dapat membantu lolos dari kueri dan mencegah injeksi.

Anda harus sudah terbiasa, karena Anda harus menggunakannya untuk membuat tabel. Pada kait instal Anda, Anda harus memiliki sesuatu seperti:

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

Kode ini sebenarnya dijalankan setiap kali plug-in diaktifkan (tidak hanya diinstal). Jadi itu akan berjalan ketika seseorang memperbarui plug-in secara otomatis . Catatan: Jika mereka meningkatkan dengan mengganti plug-in secara manual - maka itu tidak akan - jadi Anda harus memicu kode di atas admin_initketika plug-in Anda ditingkatkan (nomor versi toko dalam tabel opsi, periksa versi saat ini) .

Sekarang Anda biasanya tidak ingin CREATE TABLEperintah SQL dijalankan setiap kali Anda memperbarui plug-in - ini adalah tempatnya dBDelta().

Sebelum menjalankan perintah di atas - memeriksa apakah tabel ada. Terlebih lagi, ini memeriksa jenis kolom. Jadi jika tabel tidak ada, itu akan membuatnya, jika itu ada, tetapi beberapa jenis kolom telah mengubahnya memperbaruinya, dan jika sebuah kolom tidak ada - ia menambahkannya.

Sayangnya - jika Anda menghapus kolom dari yang di atas, itu tidak secara otomatis menghapus kolom. Untuk menghapus kolom / tabel Anda perlu secara khusus DROP(memeriksa mereka ada sebelum Anda melakukannya).

Stephen Harris
sumber