Come inserire correttamente i dati in una tabella personalizzata tramite plugin
Ho un plugin che legge i dati da un file caricato ed esegue query sul database di WordPress. Questi inserimenti vengono effettuati in una tabella creata dal mio plugin, quindi non sono del tipo post.
Ecco come l'ho fatto funzionare:
$connection = mysqli_connect($db_host, $db_user, $db_pass, $db_name);
mysqli_query($connection, $query);
Il problema è che devo dichiarare queste variabili ($db_host, $db_user, $db_pass, $db_name) all'interno del codice sorgente del plugin.
Esiste un modo per inserire i dati nelle mie tabelle personalizzate utilizzando l'API di WordPress? Oppure c'è un modo per estrarre queste variabili da un file esterno che posso ignorare in una configurazione di controllo versione?
Non è una buona pratica cercare di connettersi al database con i propri metodi quando WordPress lo fa già inizialmente per te.
Il problema è che devo dichiarare queste variabili ($db_host, $db_user, $db_pass, $db_name) all'interno del codice sorgente del plugin.
Tutte queste proprietà sono già definite nel file wp-config.php
, situato nella directory root.
Se vuoi ottenere queste costanti, puoi includere il file e chiamare le costanti direttamente, oppure usare REGEX (meglio usare REGEX, perché potrebbero esserci altri callback che richiedono il caricamento di WordPress)
// caricamento del file di configurazione per ottenere le costanti DB_*
$dirname = dirname(__FILE__);
$root = false !== mb_strpos( $dirname, 'wp-content' ) ? mb_substr( $dirname, 0, mb_strpos( $dirname, 'wp-content' ) ) : $dirname;
// se $root non è corretto, fornisci un percorso statico, ad es. $root = '/percorso/alla/directory/root'
// assumendo che le costanti siano pronte (WordPress è configurato), recuperiamole.
require_once( $root . "wp-config.php" );
echo var_dump(
'Nome DB', DB_NAME,
'Utente DB', DB_USER,
'Password DB', DB_PASSWORD,
'Host DB', DB_HOST
);
Ecco una soluzione migliore:
Carica WordPress
require( '/wp-blog-header.php' );
Assicurati di fornire il percorso corretto a questo file!
Per verificare se hai caricato WordPress con successo, stampa qualcosa:
add_action("wp", function() {
echo sprintf( "Sì! Sto funzionando con WordPress v. %s!\n", get_bloginfo("version") );
exit("Termino l'esecuzione\n");
});
Ora utilizza l'API del database di WordPress
Per inserire dati, puoi usare wpdb::insert
. Ecco la sintassi:
$wpdb->insert( $table, $data, $format );
e un esempio di utilizzo:
$wpdb->insert(
'messages',
array(
'PM_ID' => (int) $pm_id,
'sender' => $current_user->ID,
'recipient' => (int) $recipient,
'message' => "Ciao!\n",
'date' => time()
)
);
$record_id = $wpdb->insert_id;
Nell'esempio, l'array nel secondo parametro di $wpdb->insert
contiene gli indici come nomi delle colonne e i valori da inserire per queste colonne in un record indipendente. Puoi ottenere l'ID di questo record con $wpdb->insert_id
, che restituisce l'ID dell'ultimo record inserito nella tabella.
Spero che questo ti aiuti, almeno per evitare SQL injection usando $wpdb::insert
o prepared statements invece di query dirette.

Perché non studiare come funziona $wpdb. Visita https://codex.wordpress.org/Class_Reference/wpdb
Ecco un esempio di come inserire dati nel database utilizzando $wpdb
<?php
global $wpdb;
$wpdb->insert(
'nome_tabella_qui',
array(
'colonna1' => 'valore1',
'colonna2' => 123
),
array(
'%s',
'%d'
)
);
?>
Visita https://codex.wordpress.org/Creating_Tables_with_Plugins per maggiori informazioni.

<?php
// Accede all'oggetto globale WordPress Database
global $wpdb;
// Nome della tabella del database
$table = "test_table";
// Array associativo con i dati da inserire
$store_arr["name"] = "test"; // Nome da inserire
$store_arr["email"] = "test@gmail.com"; // Email da inserire
// Esegue l'inserimento dei dati nella tabella
$wpdb->insert($table, $store_arr);
?>
