WordPress: creare le tabelle dei plugin

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 che INDEX 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.

Torna su