Nessun risultato. Prova con un altro termine.
Guide
Notizie
Software
Tutorial

Plugin e gestione del database di WordPress

Le migliori procedure per ottimizzare l'interazione tra i plugin di WordPress e il database del CMS.
Le migliori procedure per ottimizzare l'interazione tra i plugin di WordPress e il database del CMS.
Link copiato negli appunti

Quando accedere al database

WordPress ci permette di accedere al database tramite la classe wpdb. Tuttavia questa classe viene già usata dalle funzioni di WordPress, quindi andrebbe impiegata soltanto se non è disponibile un altro modo di eseguire una determinata operazione.

Ad esempio, non è necessario accedere direttamente al database per creare un Loop di post con un determinato custom field, perché in questo caso possiamo usare la classe WP_Query. Viceversa, se dobbiamo interagire con una tabella custom creata da noi, dobbiamo per forza di cose usare la classe wpdb.

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"

La documentazione di WordPress offre ulteriori esempi in merito alle operazioni possibili utilizzando la classe wpdb.

Conclusioni

WordPress dispone di un set completo di strumenti che gli sviluppatori di plugin possono utilizzare, tuttavia questi vanno utilizzati seguendo sempre le pratiche migliori suggerite dalla documentazione di WordPress.

Ti consigliamo anche