Come implementare l'aggiornamento del plugin WordPress che modifica il database?


10

Sviluppo un plugin per WordPress, che ha diverse tabelle di database proprie. Il plug-in crea queste tabelle quando viene attivato e le rimuove quando vengono eliminate / disinstallate.

Devo implementare un processo di aggiornamento del plugin che aggiorna il codice del plugin e la struttura delle tabelle. Il caso più semplice sarebbe quello di aggiungere una nuova colonna a una delle tabelle. Il caso più complesso sarebbe quello di creare una nuova struttura di tabelle e aggiornare il contenuto di conseguenza.

Come consiglieresti di risolvere questo problema? Esistono funzioni integrate di WordPress che possono essere utili?

Risposte:


4

Il modo corretto per farlo in questi giorni è includere il tuo schema come file nella fonte del plugin e usare la funzione WordPress integrata dbDelta () per aggiornare il database secondo necessità usando quello schema. Il codice effettivo richiesto è molto semplice:

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

Ciò creerà e aggiornerà il database per te come richiesto. L'ultima volta che ho verificato non ha eliminato le vecchie colonne non utilizzate, quindi è necessario codificarlo tramite un controllo della versione. Questa è una bellissima funzionalità di WordPress e un enorme risparmio di tempo. Fai attenzione quando crei il file schema.sql che copi la spaziatura in un'esportazione di uno schema mysql esattamente come si ritiene che il codice dbDelta () sia molto esigente riguardo alla spaziatura. Dovresti anche testare la versione del database e, se non è la più recente, chiama quanto sopra per aggiornare il database. Potrebbe anche essere necessario eseguire aggiornamenti specifici per coprire le modifiche che dbDelta () non riesce (ad es. Eliminando una colonna). È facile scrivere un semplice logico if test per vedere se la versione è stata aggiornata ed eseguire questi aggiornamenti manuali tramite $ wpdb. Ad esempio, potresti eliminare una colonna che ora non è utilizzata.

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

Questo è semplificato dall'esecuzione del codice, mi scuso se l'ho rotto nel processo di semplificazione per la pubblicazione.

Ricorda inoltre che a partire da WordPress 3.9.2, WordPress non esegue sempre il gancio di attivazione durante l'aggiornamento del plug-in (in particolare, se un aggiornamento di massa viene eseguito dalla pagina Aggiornamenti del dashboard).


In questi giorni ho iniziato a prendere la versione del DB dal momento della modifica del file schema.sql. Ciò significa che basta aggiornare il file schema.sql per causare un aggiornamento del database; non è necessario ricordare di modificare la versione del database. Qualcosa come: $ db_version = filemtime (“schema.sql”);
Brian C,

1
Quindi, se l'ora del file cambia da qualcosa di esterno come lo spostamento dei server, cambiano la versione mtime e la versione db?
Walf,

Il tempo dei file è sempre in GMT, e i server raramente differiscono di qualche secondo, quindi è quasi impossibile che venga attivato due volte da quello. Tuttavia, anche se viene nuovamente attivato, non viene fatto alcun danno mentre viene eseguito una volta e fa un confronto con il DB live, ovviamente senza cambiare nulla. Questa è la cosa bella di dbDelta (): può funzionare più volte senza problemi. Bella domanda, grazie.
Brian C,

3

In breve, sì, la $wpdbclasse. Vedi Codice per maggiori informazioni.

Ogni volta che interagisci con una tabella personalizzata (o qualsiasi tabella, in realtà) dovresti passare $wpdb, in particolare assicurati di avere familiarità con il preparemetodo che può aiutare a sfuggire alle query e prevenire iniezioni.

Dovresti già avere familiarità con, come dovresti usarlo per creare la tabella. Sul gancio di installazione dovresti avere qualcosa del tipo:

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

Questo codice viene effettivamente eseguito ogni volta che viene attivato il plug-in (ovvero non solo installato). Quindi sarà eseguito quando qualcuno aggiorna il plug-in automatico . Nota: se si aggiornano sostituendo manualmente il plug-in, quindi non lo farà, quindi sarà necessario attivare il codice sopra admin_initquando il plug-in viene aggiornato (memorizzare il numero di versione nella tabella delle opzioni, verificare con la versione corrente) .

Ora normalmente non si vorrebbe che il CREATE TABLEcomando SQL fosse in esecuzione ogni volta che si aggiorna il plug-in: qui è dove dBDelta()entra in gioco.

Prima di eseguire il comando precedente, controlla se esiste la tabella. Inoltre, controlla i tipi di colonna. Quindi, se la tabella non esiste, la crea, in caso affermativo, ma alcuni tipi di colonna sono stati modificati, li aggiorna e se una colonna non esiste, la aggiunge.

Sfortunatamente, se rimuovi una colonna da quanto sopra, non rimuoverà automaticamente la colonna. Per rimuovere colonne / tabelle è necessario specificarle DROP(verificandone l'esistenza prima di farlo).

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.