Creare Tabelle con i Plugin

Per poter funzionare correttamente, alcuni plugin hanno bisogno di una propria tabella all'interno del Database di WordPress. Questo spesso richiede uno script di installazione, o peggio, di intervenire direttamente sul database tramite strumenti come PhpMyAdmin. Invece tramite lo stesso Plugin è possibile creare senza problemi e automaticamente una tabella all'interno del database.

Per fare questo bisogna essere efficienti. L'ultima cosa che vogliamo è che il plugin crei la stessa tabella ogni volta che viene caricata una pagina di WordPress. Questo articolo spiega come si può creare una tabella tramite plugin in maniera semplice ed efficace.

1.  Scrivere una funzione di Installazione

La prima cosa da fare è scrivere una funzione che installi direttamente le tabelle necessarie, con le relative opzioni, nel database di WordPress. Tale funzione deve:

  1. Creare una nuova tabella
  2. Aggiornare eventuali versioni precedenti della stessa tabella
  3. Installare le opzioni predefinite
  4. Assicurarsi che sono l'amministratore possa usare tale funzione

1.1  Per iniziare

Invochiamo tre variabili globali: $table_prefix, $wpdb, e $user_level. $table_prefix è il prefisso che l'utente definisce nel suo file wp-config.php. Il prefisso standard è wp_, ma non è corretto assumere che sia sempre lo stesso per tutti i blog. $wpdb è l'oggetto che permette la connessione al database. Infine, $user_level serve ad ottenere il livello utente di chi accede alla pagina. Aggiungiamo quindi le tre variabili al plugin:

 function jal_install () {
    global $table_prefix, $wpdb, $user_level;
    $table_name = $table_prefix . "liveshoutbox";

La variabile $table_name verrà usata in seguito, quando servirà la connessione al database. Se il prefisso è wp_, la variabile $table_name avrà valore wp_liveshoutbox.

1.2  Controllare il Livello Utente

Ora controlliamo che l'utente sia correttamente loggato nel sistema e abbia un livello utente 8 o superiore, che gli permetta di gestire i plugin. Se l'utente non ha un livello adeguato, la funzione non viene eseguita, ma la pagina continua il suo caricamento.

 function jal_install () {
    global $table_prefix, $wpdb, $user_level;
    $table_name = $table_prefix . "liveshoutbox";

    get_currentuserinfo();
    if ($user_level < 8) { return; }

1.3  La Tabella è già installata?

Ora controlliamo se il plugin è stato già installato. Il codice seguente ci segnala se la tabella è presente o meno nel database.

     if($wpdb->get_var("show tables like '$table_name'") != $table_name)

1.4  Creare e Aggiornare la Tabella

Al momento non abbiamo ancora installato nulla. Invece di usare una normale query per creare la tabella, possiamo usare una funzione speciale di WordPress che ci permette di creare una tabella, oppure di cambiarne la struttura nel caso questa sia differente da quella della tabella che ci serve. Tale funzione si chiama dbDelta(), e normalmente non è disponibile in WordPress, così dobbiamo includere il file in cui essa viene definita: /wp-admin/upgrade-functions.php. Questa funzione richiede una rigida struttura MySQL. Per ulteriori usi di dbDelta(), si veda /wp-admin/upgrade-schema.php che contiene diversi esempi di utilizzo.

 $sql = "CREATE TABLE ".$table_name." (
 	  id mediumint(9) NOT NULL AUTO_INCREMENT,
 	  time bigint(11) DEFAULT '0' NOT NULL,
 	  name tinytext NOT NULL,
 	  text text NOT NULL,
 	  url VARCHAR(55) NOT NULL,
 	  UNIQUE KEY id (id)
);";

 require_once(ABSPATH . 'wp-admin/upgrade-functions.php');
 dbDelta($sql);

1.5  Solo Prima Installazione

Ogni volta che viene usata questa funzione, viene eseguito il codice sopraindicato. Ma potrebbero esserci delle cose che non vogliamo installare ogni volta che viene eseguita la funzione. Perciò abbiamo aggiunto all'inizio il controllo della variabile

 if($wpdb->get_var("show tables like '$table_name'") != $table_name)

quindi:

 if($wpdb->get_var("show tables like '$table_name'") != $table_name) {
   $welcome_name = "Mr. WordPress";
   $welcome_text = "Congratulazioni, hai appena completato l'installazione!";

   $insert = "INSERT INTO ".$table_name.
             " (time,name,text) ".
             "VALUES ('".time()."','".$welcome_name."','".$welcome_text."')";

   $results = $wpdb->query( $insert );

   update_option('shoutbox_fade_from', "666666");
   update_option('shoutbox_fade_to', "FFFFFF");
   update_option('shoutbox_update_seconds', 4000);
 }

1.6  L'intera Funzione

La funzione è finita. Guardiamola per intero:

 function jal_install () {
    global $table_prefix, $wpdb, $user_level;

    $table_name = $table_prefix . "liveshoutbox";

    get_currentuserinfo();
    if ($user_level < 8) { return; }

    $sql = "CREATE TABLE ".$table_name." (
 	     id mediumint(9) NOT NULL AUTO_INCREMENT,
 	     time bigint(11) DEFAULT '0' NOT NULL,
              name tinytext NOT NULL,
              text text NOT NULL,
 	     url VARCHAR(55) NOT NULL,
 	     UNIQUE KEY id (id)
 	   );";

     require_once(ABSPATH . 'wp-admin/upgrade-functions.php');
     dbDelta($sql);

     if($wpdb->get_var("show tables like '$table_name'") != $table_name) {

       $welcome_name = "Mr. WordPress";
       $welcome_text = "Congratulations, you just completed the installation!";

       $insert = "INSERT INTO ".$table_name.
                 " (time,name,text) ".
                 "VALUES ('".time()."','".$welcome_name."','".$welcome_text."')";

       $results = $wpdb->query( $insert );

       update_option('shoutbox_fade_from', "666666");
       update_option('shoutbox_fade_to', "FFFFFF");
       update_option('shoutbox_update_seconds', 4000);
 }

 }

2.  Richiamare la funzione

Quando un utente attiva il plugin, attiva l'azione activate_urlDelPlugin. Al posto di urlDelPlugin va inserito il percorso del plugin partendo dalla cartella plugins, quindi mioplugin.php, se si trova nella cartella principale, o dir/mioplugin.php se si trova in una sotto cartella.

Possiamo quindi lanciare una funzione per l'installazione di un plugin in questo modo:

 add_action('activate_urlDelPlugin', 'jal_install')

3.  Risorse

Ultima modifica il 11/10/2006 ore 01:45