Modificarea bazei de date in WordPress se realizeaza prin intermediul clasei ‘wpdb’. Aceasta clasa este utilizata pentru a putea interactiona cu tabelele din baza de date pe care site-ul o foloseste, utilizand obiectul global $wpdb. Prin intermediul acestuia putem avea acces total la baza de date WordPress.
Cu alte cuvinte clasa wpdb poate comunica cu orice tabel existent in baza de date atribuita site-ului. Initializarea obiectului global $wpdb se realizeaza prin intermediul fisierului ‘db.php’ din folderul ‘wp-content’.
Atunci cand utilizam operatii de adaugare, stergere sau de editare a continutului din baza de date WordPress, va trebui sa ne folosim pentru securitatea site-ului cat mai mult de functia prepare(). Prin intermediul acestei functii putem preveni atacurile prin care se doreste injectarea unor coduri nedorite sql.
Ce functii utilizeaza $wpdb?
query() – executa o interogare SQL
//sintaxa:
$wpdb->query( "SELECT * FROM nume_tabel" );
prepare() – pregateste o interogare SQL prevenind injectarea de cod nesigur
//sintaxa:
$wpdb->query( $wpdb->prepare( "SELECT * FROM nume_tabel" ));
get_var() – preia valoarea unei singure variabile din baza de date
//sintaxa:
$wpdb->get_var( "SELECT nume_coloana FROM nume_tabel WHERE ID = 1" );
get_row() – prea sub forma unui array() valorile unui rand dintr-un tabel
//sintaxa:
$wpdb->get_row( "SELECT * FROM nume_tabel WHERE ID = 1" );
get_col() – preia sub forma unui array() valorile din coloana unui tabel
//sintaxa:
$wpdb->get_col( "SELECT nume_coloana FROM nume_tabel" );
get_results() – preia valorile dintr-un tabel sub forma unui array() asociativ
//sintaxa:
$wpdb->get_results( "SELECT * FROM nume_tabel" );
insert() – insereaza valori pe un rand al unui tabel
//sintaxa:
$wpdb->insert( 'nume_tabel', array( 'nume_coloana' => 'valoare', 'nume_coloana' => 'valoare'), array( '%s', '%s') );
update() – modifica date existente intr-un tabel
//sintaxa:
$wpdb->update( 'nume_tabel', array( 'nume_coloana' => 'valoare'), array( 'ID' => 'valoare' ), array( '%s' ) );
delete() – sterge randuri din baza de date
//sintaxa:
$wpdb->delete( nume_tabel, array('id'=>valoare));
show_errors() si print_errors()
//sintaxa:
$wpdb->show_errors();
$wpdb->print_error();
Exemplificarea utilizarii obiectului global $wpdb prin intermediul unui plugin custom
Daca cunoasteti limbajul MySql atunci cu siguranta veti fi familiarizati cu utilizarea acestei clase si va trebui sa va obisnuiti doar cu anumite functii implicite platformei WordPress.
In acest tutorial va vom arata cum poate fi utilizat obiectul global $wpdb. In continuare vom crea un plugin prin intermediul caruia utilizatorii se vor putea inscrie la un concurs. Deasemenea, noi, ca administratori vom seta ca toate datele persoanelor care se inscriu la concurs sa fie afisate intr-o pagina noua, creata in panoul WordPress.
Vom structura tutorialul in cativa pasii simpli:
1.Crearea fisierelor
Pentru inceput ne vom Loga la panoul cpanel urmand calea ‘public_html/wp-content/plugins’ si vom crea un folder care sa contina noul modul. In acest tutorial vom numi folderul ‘test_DB’. In foderul creat vom adauga doua fisiere: index.php si style.css.
Pentru a face WordPres-ul sa citeasca fisierul index.php ca si plugin va trebui inainte de toate sa ii adaugam acestuia un antet. Daca doriti sa aflati mai multe despre antetul paginii unui modul, puteți citi acest articol.
<?php
// Plugin Name: Formular Concurs
// Plugin URI: https://websitestools.ro
// Description: This is my first plugin, enjoy it!
// Author: Talmatchi Marius
// Version: 0.1
// Author URI: https://websitestools.ro
Dupa ce am adaugat acest antet vom putea vedea noul modul in pagina ‘plugins’ a panoului, astfel:

Putem sa selecta optiunea activeaza, insa deocamdata aceasta nu va face nimic deoarece nu am spus in fisier nimic altceva, decat am creat antetul pentru ca acest fisier sa poata fi interpretat de WordPress ca si plugin. Bun, acum putem incepe sa adaugam functionalitati modulului.
2.Atribuirea fisierului CSS
Inainte de a incepe sa adaugam functionalitati pentru partea de Frontend sau pentru cea de Backend vom lega intai fisierul CSS de pagina principala a modulului, respectiv index.php utilizand urmatorul cod:
// ======================= inserare fisier css ======================
add_action('admin_print_styles','register_scripts2');
function register_scripts2 () {
wp_register_style( 'test_DB', plugins_url('style.css', __FILE__ . 'stye.css'),"","","all");
wp_enqueue_style ( 'test_DB' , plugins_url( 'style.css' , __FILE__ ) ) ;
// wp_enqueue_style('test_DB');
}
In codul de mai sus am utilizat un hook (“admin_print_styles”) prin prin care adaugam un fisier CSS (style.css) prin intermediul functiei create de noi (“register_scripts2”). In interiorul functiei respectiv am folosit doua alte functii implicite respectiv “wp_register_style” si “wp_enqueue_style”. Parametri acestor doua functii sunt urmatoarele:
- $parametru 1 = Numele foii de stil. Ar trebui să fie unic.
- $parametru 2 = Adresa URL completă a foii de stil.
- $parametru 3 = O matrice de foi de stil inregistrate se ocupa de aceasta foaie de stil de care depinde, noi am lasat spatiul liber.
- $parametru 4 = Sir care specifica numarul versiunii fisierului CSS, noi am lasat spatiu liber. Valoare implicita: false.
- $parametru 5 = Media pentru care a fost definita aceasta foaie de stil. Acceptă tipuri de media precum „all”, „print” si „screen”.
Vom testa acest cod in continuarea articolului, imediat dupa ce vom aduce continut fisierului index.php.
3.Crearea unor pagini ale plugin-ului in meniul panoului WordPress
Pentru a putea introduce date in baza de date vom folosi un formular prin care utilizatorii se pot inscrie la concurs. Insa, inainte de a introduce acest formular vom adauga cateva pagini precum si subpagini in panoul de control WordPress, de unde vom putea prelua informatii din baza de date.
In continuare vom folosi un alt hook intitulat ‘admin_meniu’ prin intermediul caruia vom crea pagini si subpagini in meniul panoului de control. Functia care va crea acestei pagini va fi intitulata my_menu_pages(), insa poate avea orice alt nume doriti.
//========================inserare date formular in pagina pluginului din panoul de control wordpress==========================
add_action('admin_menu', 'my_menu_pages');
function my_menu_pages(){
add_menu_page('concurs', 'Concurs', 'manage_options', 'concurs', 'pagina_principala_concurs' );
add_submenu_page('concurs', 'Concurenti inscrisi', 'Concurenti inscrisi', 'manage_options','concurs2', 'pagina_afisare_concurenti' );
add_submenu_page('concurs', 'Stergere concurenti', 'Stergere concurenti', 'manage_options', 'concurs3', 'pagina_stergere_concurenti' );
add_submenu_page('concurs', 'Alege castigator', 'Alege castigator', 'manage_options', 'concurs4', 'pagina_alegere_castigator' );
}
In codul aratat utilizam doua functii implicite respectiv add_menu_page() si add_submenu_page.
Prima functie va crea o pagina in meniul panoului, iar a doua o subpagina. In exemplul dat a fost creata o pagina parinte, cu 3 pagini copil:

In continuare vom explica parametri fiecarei functii:
a. add_menu_page()
- $page_title = Textul care urmeaza sa fie afisat in etichetele de titlu ale paginii cand este selectat meniul.
- $menu_title = Textul care trebuie utilizat pentru meniu.
- $capacitate = Capacitatea necesara pentru ca acest meniu sa fie afisat utilizatorului.
- $menu_slug = Numele slug-ului prin care se face referire la acest meniu. Ar trebui sa fie unic pentru aceasta pagina de meniu si sa includa numai caractere alfanumerice minuscule, liniute si caractere de subliniere pentru a fi compatibile cu sanitize_key() .
- $functie = Functia care trebuie apelata pentru a afisa continutul acestei pagini.
b. add_submenu_page()
- $parent_slug = Numele slug-ului pentru meniul parinte.
- $page_title = Textul care urmeaza sa fie afisat in etichetele de titlu ale paginii cand este selectat meniul.
- $menu_title = Textul care trebuie utilizat pentru meniu.
- $capacitate = Capacitatea necesara pentru ca acest meniu sa fie afisat utilizatorului.
- $menu_slug = Numele slug-ului prin care se face referire la acest meniu. Ar trebui sa fie unic pentru acest meniu si sa includa doar caractere alfanumerice minuscule, liniute si caractere de subliniere pentru a fi compatibile cu sanitize_key().
4. Testarea fisierului style.css
Pentru a testa daca fisierul style.css functioneaza bine si este incorporat in plugin-ul nostru vom crea in pagina principala (pagina parinte creata in panou) un subtitlu H4 carei ii vom atribui o clasa intitulata ‘titlul-pagina’.
//========setare pagina principala panou =================
function pagina_principala_concurs () {
echo "<h4 class='titlu-pagina'>Buna ziua, aceasta este prima pagina a modulului de inscriere concurenti</h4>";
}
In fisierul style.css vom incerca sa ii adaugam o culoare fontului, pentru a vedea daca aceasta functioneaza.
.titlu-pagina {
color: red;
}
Acum, pagina va arata asa:

Dupa cum se vede acesta merge perfect.
5.Crearea unui formular care sa introduca date in baza de date
Primul lucru pe care trebuie să îl facem este sa cream un formular de înregistrare pentru utilizatori precum si un tabel în baza de date prin intermediul functiei formular_frontend (). In aceasta functie vom introduce urmatorul cod:
//======================== formular frond-end ==========================
function formular_frontend () {
//========================creare tabel in DB==========================
global $wpdb;
$tabel_concurenti = $wpdb->prefix. "concurenti";
$check_table_query = "SHOW TABLES LIKE '" . $tabel_concurenti . "'";
$tabel = $wpdb->query($check_table_query);
if (!$tabel) {
//creare tabel in baza de date
$charset_collate = $wpdb->get_charset_collate();
$creare_tabel = "CREATE TABLE $tabel_concurenti (
id mediumint(9) NOT NULL AUTO_INCREMENT,
nume varchar(255) DEFAULT '' NOT NULL,
email varchar(255) DEFAULT '' NOT NULL,
telefon varchar(255) DEFAULT '' NOT NULL,
PRIMARY KEY (id)
) $charset_collate;";
$wpdb->query($creare_tabel);
}
Explicarea codului.
- In functie formular formular_frontend() am apelat obiectul global $wpdb.
- Am creat o variabila $tabel_concurenti caruia i-am setat ca valoare denumirea tabelului pe care vrem sa il cream
- Am solicitat sa fie verificat inainte daca exista un tabel cu astfel de nume prin intermediul variabilei $check_table_query utilizad functia query()
- Am solicitat in cazul in care tabelul nu exista, sa fie creat automat cu urmatoarele coloane:
1.id
2.nume
3.email
4.telefon
Este foarte important sa setam “PRIMARY KEY” la coloana “ID”. Astfel, acesta va fi unic pentru fiecare rand din tabel.
Sintaxa de baza de pe care o folosim in acest exemplu este reprezentat de functia insert() prin intermediul caruia introducem date noi in tabelul specificat. Pentru siguranta datelor ne folosim de functia implicita prepare() cu ajutorul caruia ne protejam de codurile introduse in baza de date cu intentia de injectare a altor coduri decat cele obisnuite, precum “string”, “number” sau “date”. Pentru a verifica daca codul scris este corect, am introdus o functie conditionala if() prin intermediul caruia vom apela o alerta JavaScript care sa ne anunte daca formularul functioneaza sau nu.
Daca ne uitam in sectiunea phpmyadmin din Cpanel, vom putea vedea tabelul creat.

6.Crearea unui formular pentru partea de Frontend
In continuare, vom crea si formularul de contact:
// ========= inceputul formularului ==============================
echo '<h2>Formular de inscriere in concurs</h2>';
echo '<form id="regForm" action="'. esc_url( $_SERVER['REQUEST_URI'] ).'" method="POST">';
echo 'Introdu numele tau <br/>';
echo '<input type="text" name="nume"><br/>';
echo 'Introdu adresa ta de email <br/>';
echo '<input type="text" name="email"><br/>';
echo 'Introdu nr. tau de telefon <br/><br/>';
echo '<input type="text" name="telefon"><br/><br/>';
echo '<input type="submit" name="trimite" value="Trimite">';
echo '</form>';
Ultimul lucru pe care il vom mai face in aceasta functie va fi sa setam ca datele introduse de utilizatori sa fie stocate in tabelul creat.
//============= salveaza datele in tabelul concurenti ===================
if(isset($_POST['trimite'])){
global $wpdb;
$tabel_concurenti2 = $wpdb->prefix. "concurenti";
$nume = $_POST['nume'];
$email = $_POST['email'];
$telefon = $_POST['telefon'];
$sql1 = $wpdb->insert($tabel_concurenti2, array("nume"=>$nume, "telefon"=>$telefon, "email"=>$email));
$wpdb->query($wpdb->prepare($sql1));
if ($sql1 == true) {
echo "<script> alert('Ati fost inscris in concurs!')</script>";
} else {
echo "<script> alert('Ceva nu a mers bine, mai incercati odata')</script>";
}
}
}
7.Crearea unui shortcode
Dupa ce am creat formularul, vom crea o pagina in care sa introducem codul. Vom adauga bineinteles functia add_shortcode() prin intermediul caruia vom putea afisa formularul in partea de forntend. Pentru a face acest lucru vom crea o pagina direct din meniul WordPress in care vom introduce codul. Acesta va arata asa:
//============Shortcode formular===============
add_shortcode('formular_inscriere_concurs', 'formular_frontend');
Cream o pagina noua pentru a il introduce:

Dupa ce salvam modificarile, rezultatul ar fi:

Dupa cum am spus inca de la inceputul tutorialului, inainte de a utilizat sau modifica baza de date va trebui sa invocam obiectul global $wpdb dupa care putem sa cream o variabila care sa aiba ca valoare numele tabelului pe care vrem sa lucram. Daca tabelul nu exista il vom putea crea imediat dupa ce am verificat existenta lui prin intermediul functiei get_charset_collate(). Mai departe implementam sintaxa sql prin intermediul variabilei $creare_tabel. Acest cod nu va face nimic pana in momentul in care nu vor fi solicitate date spre a fii introduse in tabel. Prin urmare, pentru ca acest tabel sa fie creat automat va trebui sa implementam mai intai un formular prin intermediul caruia sa introducem date noi in tabelul creat.
Acum putem testa formularul completandu-l pe acesta de cateva ori din partea de Frontend pentru a vedea daca in tabelul creat si insereaza sunt inserate datele respective.

8. Preluarea datelor din baza de date
Acum, dupa ce am creat un formular care sa stocheze date in tabel, putem incerca un cod care sa afiseze datele in paginile ‘child’ ale noului plugin.
Mai departe vom crea o noua functie intitulata pagina_afisare_concurenti() (cel de al 5-lea parametru al primei pagini copil create prin intermediul functiei implicite add_submenu_page(). La fel ca mai sus vom invoca inainte de toate obiectul global $wpdb si vom solicita afisarea unui tabel HTML prin intermediul caruia vom prelua date din baza de date, cu ajutorul functiei get_results().
//========== personalizare pagina care afiseaza cursantii ============
function pagina_afisare_concurenti () {
global $wpdb;
echo '<table border="1">';
echo '<tr>';
echo '<th>ID</th>';
echo '<th>NUME</th>';
echo '<th>TELEFON</th>';
echo '<th>EMAIL</th>';
echo '</tr>';
$tabel = $wpdb->prefix. "concurenti";
$selectie_date_concurenti = $wpdb->get_results("SELECT * FROM $tabel order by id desc");
foreach ($selectie_date_concurenti as $concurenti) {
$id = $concurenti-> id;
$nm = $concurenti->nume;
$em = $concurenti->email;
$tel = $concurenti->telefon;
echo '<tr>';
echo '<td>'.$id.'</td>';
echo '<td>'.$nm.'</td>';
echo '<td>'.$em.'</td>';
echo '<td>'.$tel.'</td>';
echo '</tr>';
}
echo '</table>';
}
Rezultatul codului va fi afisat in pagina ‘Concurenti inscrisi’:

9. Cum se sterg date din baza de date
In continuare vom exemplifica prin intermediul unui formular cum pot fi sterse date din baza de date utilizand functia delete().
//=============stergere randuri in DB=============
function pagina_stergere_concurenti() {
global $wpdb;
$tabel = $wpdb->prefix. "concurenti";
echo '<br/>';
echo '<form action="'. esc_url( $_SERVER['REQUEST_URI'] ).'" method="POST" class="sterge-date">';
echo '<input type="text" name="alegeid">';
echo '<input type="submit" name="buton_stergere" value="sterge">';
echo '</form>';
if(isset($_POST['buton_stergere'])){
$alegeid = ($_POST['alegeid']);
$wpdb->delete($tabel, array('id'=>$alegeid));
}
}
Rezultatul va fi afisat in pagina ‘Stergere concurenti’:

10. Selectare castigator
Ne vom folosi de pagina creata cu numele ‘Alege castigator’ pentru a mai exemplifica cum puteti solicita un rand din tabelul creat in baza de date, ales la intamplare de functia PHP rand().
function pagina_alegere_castigator () {
global $wpdb;
$tabel = $wpdb->prefix. "concurenti";
$sql3 = $wpdb->get_results( "SELECT * FROM ".$tabel. " ORDER BY RAND() LIMIT 1" );
print_r ($sql3);
}
Rezultatul acestui cod va fi afisat prin intermediul functiei print_r() care va returna un array() asociativ cu numele coloanelor si valorile existente din randul ales.

Sper ca va placut acest tutorial, si va invit sa va abonati pentru a fi la curent cu urmatoarele articole aparute.