Cum să inserezi corect date într-o tabelă personalizată prin intermediul unui plugin

14 iul. 2016, 19:47:32
Vizualizări: 41.2K
Voturi: 6

Am un plugin care citește date dintr-un fișier încărcat și execută interogări în baza de date WordPress. Aceste inserări sunt într-o tabelă creată de plugin-ul meu, deci nu sunt de tipul post.

Așa am reușit să îl fac să funcționeze:

$connection = mysqli_connect($db_host, $db_user, $db_pass, $db_name);
mysqli_query($connection, $query);

Problema cu această abordare este că trebuie să declar aceste variabile ($db_host, $db_user, $db_pass, $db_name) în codul sursă al plugin-ului.

Există vreo modalitate prin care pot insera date în tabelele mele personalizate folosind API-ul WordPress? Sau există vreo modalitate prin care pot prelua aceste variabile dintr-un fișier extern pe care să-l pot ignora într-o configurație de control al versiunilor?

2
Comentarii

ai încercat să folosești un tip de postare personalizat în loc să faci interogări SQL directe https://codex.wordpress.org/Function_Reference/register_post_type ?

mmm mmm
14 iul. 2016 19:50:55

Salut @mmm, din păcate un tip de postare personalizat nu va funcționa pentru ceea ce am nevoie.

Breno Breno
14 iul. 2016 20:13:25
Toate răspunsurile la întrebare 3
1
10

Aceasta nu este o practică bună să încerci să te conectezi la baza de date prin metode proprii în timp ce WordPress o face pentru tine inițial.


Problema cu această abordare este că trebuie să declar aceste variabile ($db_host, $db_user, $db_pass, $db_name) în codul sursă al plugin-ului.

Toate aceste proprietăți sunt definite în fișierul wp-config.php, situat în directorul rădăcină.

Dacă dorești să obții aceste constante, poți include fișierul și să apelezi constantele, sau să folosești REGEX (mai bine REGEX, deoarece pot exista alte callback-uri care necesită încărcarea WordPress)

// încărcare fișier config pentru a obține constantele DB_*
$dirname = dirname(__FILE__);
$root = false !== mb_strpos( $dirname, 'wp-content' ) ? mb_substr( $dirname, 0, mb_strpos( $dirname, 'wp-content' ) ) : $dirname;
// dacă $root nu este corect, furnizează o cale statică, $root = '/calea/catre/directorul/radacina'
// presupunând că constantele sunt gata (wp este configurat), să le obținem
require_once( $root . "wp-config.php" );
echo var_dump(
    'Nume DB', DB_NAME,
    'Utilizator DB', DB_USER,
    'Parolă DB', DB_PASSWORD,
    'Gazdă DB', DB_HOST
);

Iată o soluție mai bună:

Încarcă WordPress

require( '/wp-blog-header.php' ); Ar trebui să furnizezi o cale funcțională către acest fișier!

Pentru a testa dacă ai încărcat WordPress cu succes, afișează ceva:

add_action("wp", function() { 
    echo sprintf( "Da! Lucrez cu WordPress v. %s!\n", get_bloginfo("version") );
    exit("Am terminat\n");
});

Acum folosește WordPress DB API

Pentru a insera date, există wpdb::insert pe care ar trebui să-l folosești. Iată sintaxa:

$wpdb->insert( $table, $data, $format ); și un exemplu de utilizare:

$wpdb->insert( 
    'messages', 
    array( 
        'PM_ID'     => (int) $pm_id,
        'sender'    => $current_user->ID,
        'recipient' => (int) $recipient,
        'message'   => "Salut!\n",
        'date'      => time()
    )
);
$record_id = $wpdb->insert_id;

În exemplu, array-ul din al doilea parametru al $wpdb->insert este un array cu indexi ca nume de coloane, și valori care vor fi inserate pentru aceste coloane într-un înregistrare independentă al cărei ID îl poți obține cu $wpdb->insert_id, care returnează ultimul ID inserat în acea tabelă.

Sper că acest lucru te ajută, cel puțin să eviți SQL injection folosind $wpdb::insert sau declarații pregătite în loc de interogări directe.

15 iul. 2016 00:04:58
Comentarii

Fac ceva similar prin crearea de rute/endpoint-uri în WP Rest API și citesc/scriu în baza de date folosind metodele atașate rutelor.

b_dubb b_dubb
19 mar. 2024 16:23:05
0

De ce să nu studiezi cum funcționează $wpdb. Vizitează https://codex.wordpress.org/Class_Reference/wpdb

Iată un exemplu de cum să inserezi date în baza de date folosind $wpdb

<?php
  global $wpdb;

  $wpdb->insert( 
    'numele_tabelului_aici', 
    array( 
        'coloana1' => 'valoare1', 
        'coloana2' => 123 
    ), 
    array( 
        '%s', 
        '%d' 
    ) 
 );
?>

Vizitează https://codex.wordpress.org/Creating_Tables_with_Plugins pentru mai multe informații.

14 iul. 2016 21:06:17
1
-1
<?php 
global $wpdb;
 $table="test_table";
$store_arr["name"]="test";
$store_arr["email"]="test@gmail.com";

$wpdb->insert( $table, $store_arr);
 ?> 
19 iul. 2016 08:01:38
Comentarii

Te rog explică ce face acest cod și de ce răspunde la întrebare. Răspunsurile doar cu cod sunt descurajate.

Tim Malone Tim Malone
19 iul. 2016 08:19:54