Come inserire correttamente i dati in una tabella personalizzata tramite plugin

14 lug 2016, 19:47:32
Visualizzazioni: 41.2K
Voti: 6

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?

2
Commenti

hai provato a utilizzare un custom post type invece di fare query SQL dirette https://codex.wordpress.org/Function_Reference/register_post_type ?

mmm mmm
14 lug 2016 19:50:55

Ciao @mmm, purtroppo un custom post type non funzionerà per quello che mi serve.

Breno Breno
14 lug 2016 20:13:25
Tutte le risposte alla domanda 3
1
10

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.

15 lug 2016 00:04:58
Commenti

Sto facendo qualcosa di simile creando route/endpoint nella WP Rest API e leggendo/scrivendo sul database utilizzando i metodi collegati alle route.

b_dubb b_dubb
19 mar 2024 16:23:05
0

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.

14 lug 2016 21:06:17
1
-1
<?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);
?>
19 lug 2016 08:01:38
Commenti

Per favore, spiega cosa fa questo codice e perché risponde alla domanda. Le risposte con solo codice sono sconsigliate.

Tim Malone Tim Malone
19 lug 2016 08:19:54