Molti plugin di WordPress si appoggiano a tabelle personalizzate create nel database MySQL del sito. Creare tabelle è un requisito fondamentale di tutti quei plugin che hanno una struttura complessa. In questo articolo parleremo della creazione di queste tabelle personalizzate nel database.
Prefisso delle tabelle
Nel file wp-config.php
è possibile specificare un prefisso per le tabelle del database. Per impostazione predefinita il prefisso è wp_
, ma dovete sempre verificarne il valore in uso per creare le vostre tabelle.
Questo valore si trova nella variabile $wpdb->prefix
. Quindi se volete creare una tabella chiamata {prefisso}test
dovete scrivere:
function plugin_install () {
global $wpdb;
$table_name = $wpdb->prefix . "test";
// continua
}
Creare la tabella
Il passo successivo è creare la tabella. Si può usare la funzione dbDelta()
contenuta in wp-admin/includes/upgrade.php
, e per questo motivo dobbiamo includere questo file nel nostro script. Questa funzione esamina la struttura della tabella e fa un raffronto con la struttura voluta, oltre che modificare la tabella se necessario, e in questo senso si rivela molto utile per gli aggiornamenti.
Per funzionare, la funzione dbDelta()
vuole questi requisiti:
- Dovete inserire ogni campo su una nuova riga nella query SQL.
- Dovete usare due spazi tra le parole
PRIMARY KEY
e la definizione della vostra chiave primaria. - Dovete usare la parola chiave
KEY
invece cheINDEX
e ne dovete includere almeno una.
Nota
Ovviamente potete usare anche il metodo query()
dell'oggetto $wpdb
se non volete sottostare a queste limitazioni.
Esempio:
$sql = "CREATE TABLE " . $table_name . " (
id mediumint(9) NOT NULL AUTO_INCREMENT,
time datetime DEFAULT '0000-00-00 00:00:00' NOT NULL,
name tinytext NOT NULL,
text text NOT NULL,
url VARCHAR(55) DEFAULT '' NOT NULL,
UNIQUE KEY id (id)
);";
require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
dbDelta($sql);
Inserire i primi dati
Ecco come inserire i primi dati nella tabella appena creata:
$name = "Test";
$text = "Test";
$rows_affected = $wpdb->insert( $table_name, array( 'time' => current_time('mysql'), 'name' => $name, 'text' => $text ) );
Una cosa importante da ricordare è che dovreste sempre filtrare i dati in entrata nel database utilizzando i metodi $wpdb->escape()
e $wpdb->prepare
. Per ulteriori informazioni consultate la documentazione.
Aggiungere un numero di versione
Potete aggiungere un numero di versione alla vostra tabella che vi servirà per gli aggiornamenti:
add_option("plugin_db_version", "1.0");
Il codice completo
global $plugin_db_version;
$plugin_db_version = "1.0";
function plugin_install() {
global $wpdb;
global $plugin_db_version;
$table_name = $wpdb->prefix . "test";
$sql = "CREATE TABLE " . $table_name . " (
id mediumint(9) NOT NULL AUTO_INCREMENT,
time datetime DEFAULT '0000-00-00 00:00:00' NOT NULL,
name tinytext NOT NULL,
text text NOT NULL,
url VARCHAR(55) DEFAULT '' NOT NULL,
UNIQUE KEY id (id)
);";
require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
dbDelta($sql);
add_option("plugin_db_version", $plugin_db_version);
}
function plugin_install_data() {
global $wpdb;
$name = "Test";
$text = "Test";
$rows_affected = $wpdb->insert( $table_name, array( 'time' => current_time('mysql'), 'name' => $name, 'text' => $text ) );
}
Richiamare le funzioni
Infine, dobbiamo far eseguire le due funzioni definite in precedenza quando il plugin viene attivato nel backend di WordPress:
register_activation_hook(__FILE__,'plugin_install');
register_activation_hook(__FILE__,'plugin_install_data');
Aggiornamento del plugin
Quando è disponibile una nuova versione di un plugin, è necessario aggiornare anche la struttura delle tabelle. Potete aggiungere il seguente codice alla funzione plugin_install()
per verificare se la versione del plugin è l'ultima disponibile e eventualmente aggiornarne la tabella:
$installed_ver = get_option( "plugin_db_version" );
if( $installed_ver != $plugin_db_version ) {
$sql = "CREATE TABLE " . $table_name . " (
id mediumint(9) NOT NULL AUTO_INCREMENT,
time datetime DEFAULT '0000-00-00 00:00:00' NOT NULL,
name tinytext NOT NULL,
text text NOT NULL,
url VARCHAR(100) DEFAULT '' NOT NULL,
UNIQUE KEY id (id)
);";
require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
dbDelta($sql);
update_option( "plugin_db_version", $plugin_db_version );
}
Dalla versione 3.1 di WordPress l'hook di attivazione non viene invocato quando il plugin viene aggiornato, quindi dovete aggiungere la seguente routine di verifica:
function plugin_update_db_check() {
global $plugin_db_version;
if (get_site_option('plugin_db_version') != $plugin_db_version) {
plugin_install();
}
}
add_action('plugins_loaded', 'plugin_update_db_check');
In questo caso la action di verifica ha luogo quando il plugin è stato effettivamente caricato.