Tabele suplimentare in baza de date WordPress

Daca lucrezi la un plugin pentru WordPress, e posibil sa stochezi informatie in baza de date. Uneori vrem mai mult decat vine din ‘fabrica’ asa ca avem multe optiuni la dispozitie:

  • Putem crea o pagina de setari folosind Settings API
  • Putem stoca informatia in tabela options folosind functiile set_option() si get_option()
  • Si a treia optiune, despre care discutam in acest articol, este sa cream o noua tabela si sa stocam datele acolo (beneficiul principal: putem stoca multa informatie si cum vrem)

In acest articol discutam despre stocarea intr-o tabela noua, cum o cream si cum ne asiguram ca ea exista inainte sa stocam date in ea.

Pentru ca WordPress vine cu tot felul de bunatati, vom folosi hooks la activarea si dezactivarea pluginului pentru a crea / sterge tabela suplimentara. [nu e obligatoriu, dar the ‘the right way‘]

Pentru a crea tabela noua la activarea pluginului, folosim urmatorul cod:


register_activation_hook( __FILE__, 'create_plugin_tables' );

function create_plugin_tables() {
 // cod pentru a crea tabelul ( sau tabele )
}

[ Nu uita ca acest cod se pune in pluginul pe care-l creezi ]

Cand cream o tabela noua, este important sa pastram consistenta la denumire si structura cu celalalte tabele din WordPress. Nu vrem sa arate tabela noastra ca nuca in perete. Asa ca vom folosi acelasi prefix din WordPress (pe care il putem gasi si /sau schimba in wp-config.php). Pentru a ne asigura ca folosim prefixul corect indiferent unde vom folosi pluginul, ne folosim de variabila din obiectul $wpdb. [exemplul urmator nu este cod folosibil ca atare, e doar un exemplu]


function create_plugin_tables(){ 
global $wpdb;
// prefixul curent
echo $wpdb->prefix . 'nume_tabela';
// in caz de o instalare multisite
echo $wpdb->base_prefix . 'nume_tabela';
}

Alegem intre proprietatile prefix si base_prefix atunci cand exista o instalare cu multisite activat. Daca folosim $wpdb->prefix, avem prefixul site-ului curent. Daca este o instalare multisite, blogul prezent poate returna  wp_2_. Folosind $wpdb->base_prefix vom primi prefixul definit in wp-config.php.

Deci: multisite -> base_prefix
Ne-multisite -> prefix.

In sfarsit, pentru a crea tabela noua, executam o interogare SQL si stocam prefixul intr-o variabila pentru functia dbDelta() .

function create_plugin_tables() {
global $wpdb;
$nume_tabela = $wpdb->prefix . 'nume_tabela;
$sql = "CREATE TABLE $nume_tabela (
id int(11) NOT NULL AUTO_INCREMENT,
name varchar(255) DEFAULT NULL,
UNIQUE KEY id (id)
);";

require_once( ABSPATH . 'wp-admin/includes/upgrade.php' );
 dbDelta( $sql );
 }

Functia dbDelta() analizeaza baza de date si o compara cu structura care va fi creata din SQL, ceea ce inseamna ca interogarea SQL este executata numai daca tabela nu exista deja. Functia dbDelta() nu este disponibila la momentul acesta in executia WordPress, asa ca trebuie sa includem fisierul /wp-admin/includes/upgrade.php inainte de a folosi functia respectiva.

Data viitoare cand activam pluginul, functia noastra se va executa si vom avea noua tabela creata.

Cum adaugam date in tabela noua

Ca sa adaugam informatie in tabela, ne folosim din nou de obiectul $wpdb, care are o metoda  numita insert(). Dupa cum este si numele, aceasta functie adauga date in BD (baza de date). Functia are 3 parametri: numele tabelei, un array care contine ce vrem sa adaugam si formatul parametrilor specificati.


function creeaza_tabela_noua()
{
global $wpdb;
$wpdb->insert(
'table',
array(
'id' => 1,
'name' => 'Ion'
),
array(
'%d',
'%s'
)
);
}

Cum citim informatii din tabela

Destul de simplu, din nou vom folosi  $wpdb. Sunt doua feluri in care putem citi informatii:

$wpdb->get_row() sau $wpdb->get_results().

Metoda get_row() ne returneaza doar un rand si o folosim mai ales atunci cand stim cheia primara (primary id) dupa care vom selecta, sau evident alte situatii in care un rand ne este suficient.

function get_one_row( $id ){
global $wpdb;
$nume_tabela = $wpdb->prefix . 'nume_tabela';
$row = $wpdb->get_row( $wpdb->prepare('SELECT * FROM '.$nume_tabela.' WHERE id = %d', $id) );
return $row;
}

Metoda get_results() ne va returna toate rezultatele interogarii. Exemplu:

function returneaza_toate_rezultatele( $nume ) { 
//sa zicem ca (,) cautam dupa nume, nu stim cate rezultate vom avea
 global $wpdb;
$nume_tabela = $wpdb->prefix . 'nume_tabela';
$results = $wpdb->get_results( $wpdb->prepare('SELECT * FROM '.$nume_tabela.' WHERE name = %s', $name) );

return $results;
 }

Pe scurt asa cream, introducem si citim date dintr-o tabela in WordPress.

Personal, aleg sa folosesc tabele custom doar daca options sau metadata nu imi sunt deajuns. Asta este in cazul in care am de stocat mai multe valori. Un exemplu concret din viata reala, sunt rezultatele unui quiz la care lucrez. Sunt multe valori, rezultate, procente, dati si ore, mult prea multe pentru a le stoca in meta.

Ati folosit meta sau preferati o tabela separata? Daca da sau nu, de ce?

Published by

Cristian Raț

Lucrez ca si dezvoltator aplicatii web de mai bine de 10 ani. Sunt Senior PHP developer la o companie din Londra. Anterior am lucrat in diverse agentii digitale din Londra sau Romania, unde am avut propria companie. In general folosesc WordPress la proiectele freelance sau Symfony framework la jobul de zi cu zi.

Leave a Reply

Your email address will not be published. Required fields are marked *