Creare tabelle CUSTOM con i plugin di WordPress

← ritorno a WordPress

Estratto da: https://www.html.it/pag/55313/plugin-e-gestione-del-database-di-wordpress/

Quando creare tabelle custom

Immaginiamo di dover implementare da zero un semplice social network in WordPress in cui sono presenti dei gruppi creati dagli utenti. Per il profilo esteso degli utenti possiamo usare la funzionalità built-in di WordPress dei metadati utente, ma per quanto riguarda i gruppi dobbiamo necessariamente creare delle tabelle custom. Perché?

Perché non c'è corrispondenza nel database di WordPress con il concetto di "gruppo": WordPress aggrega post e tassonomie, ma esistono solo due tabelle per gli utenti, una per il profilo base e l'autenticazione e l'altra per i metadati. Quindi le tabelle custom andrebbero create solo se la struttura del database non prevede nulla di simile a quello che vogliamo implementare.

Creare tabelle custom

La documentazione ufficiale di WordPress sulla creazione di tabelle con i plugin raccomanda di:

  • Scrivere una funzione che crea la tabella.
  • Assicurarsi che la funzione venga invocata quando il plugin viene attivato.
  • Creare una funzione di upgrade nel caso il plugin venga aggiornato.

La prima cosa da fare è usare un nome di tabella che abbia lo stesso prefisso scelto per le tabelle del database:

global $my_db_version;
$my_db_version = '1.0';
function my_plugin_install() {
    global $wpdb;
    global $my_db_version;
    $table_name = $wpdb->prefix . 'groups';
    // continua
}

Quindi dobbiamo creare la tabella con il numero di versione per l'aggiornamento:

$charset_collate = $wpdb->get_charset_collate();
 // continua
$sql = "CREATE TABLE $table_name (
        id mediumint(9) NOT NULL AUTO_INCREMENT,
        created datetime DEFAULT '0000-00-00 00:00:00' NOT NULL,
        name tinytext NOT NULL,
        creator int(11) NOT NULL,
        members text DEFAULT '' NOT NULL,
        UNIQUE KEY id (id)
    ) $charset_collate;";
require_once( ABSPATH . 'wp-admin/includes/upgrade.php' );
dbDelta( $sql );
add_option( 'my_db_version', $my_db_version );

Quindi dobbiamo registrare la nostra funzione:

register_activation_hook( __FILE__, 'my_plugin_install' );

Per l'aggiornamento dobbiamo eseguire un check sulla versione modificando la funzione come segue:

$installed_ver = get_option( "my_db_version" );
if ( $installed_ver != $my_db_version ) {
	$table_name = $wpdb->prefix . 'groups';
	$sql = "CREATE TABLE $table_name (
		id mediumint(9) NOT NULL AUTO_INCREMENT,
		created datetime DEFAULT '0000-00-00 00:00:00' NOT NULL,
		name tinytext NOT NULL,
		creator int(11) NOT NULL,
		members text DEFAULT '' NOT NULL,
		UNIQUE KEY id (id)
	) $charset_collate;";
	require_once( ABSPATH . 'wp-admin/includes/upgrade.php' );
	dbDelta( $sql );
	update_option( "my_db_version", $my_db_version );
}

Lo step finale è registrare il nostro check:

function my_plugin_update_db_check() {
    global $my_db_version;
    if ( get_site_option( 'my_db_version' ) != $my_db_version ) {
        my_plugin_install();
    }
}
add_action( 'plugins_loaded', 'my_plugin_update_db_check' );

Operazioni sulle tabelle

Prima ancora di pensare di operare sulle tabelle, dobbiamo tenere presente che ogni tipo di input passato dall'esterno ad una nostra query è potenzialmente pericoloso. La prima funzionalità da imparare in assoluto è quindi $wpdb::prepare(). Come suggerisce il suo nome, questo metodo esegue il filtraggio dei parametri:

$evil = trim( $_POST['input'] );
if( !empty( $evil ) ) {
    $wpdb->query( $wpdb->prepare( "INSERT INTO $wpdb->table ( input ) VALUES ( %s )", $evil ) );
}

WordPress dispone di diversi metodi per operare sulle tabelle. Ad esempio per ottenere un set di risultati possiamo utilizzare il metodo $wpdb::get_results():

$groups = $wpdb->get_results( "SELECT * FROM groups" );
foreach( $groups as $group ) {
    // Ogni riga è un oggetto
    echo $group->name;
}

Per ottenere un unico valore possiamo invece utilizzare $wpdb::get_var():

$groups_count = $wpdb->get_var( "SELECT COUNT(*) FROM groups" );
echo $groups_count; // "10"