
La classe wpdb
Durante la realizzazione di questo sito, non volendo riscrivere molte delle pagine che avevo sul sito precedente, ho pensato di costruire delle tabelle personalizzate all’interno del database di WordPress ed utilizzare la classe wpdb per accedere ai suoi dati.
La classe wpdb contiene un insieme di funzioni che possono essere utilizzate per interagire con il database WordPress e, volendo, anche con altri database.
Riferimento: CODEX wordpress.org
Considerazioni
- Non sarà di certo la soluzione ottimale (non mi sono ancora completamente addentrato nei meandri di WorPress), ma comunque funziona. In futuro, magari, nascerà qualcosa di più elegante.
- La funzione standard di WordPress per effettuare ricerche non contemplerà i dati all’interno di tale tabella. Può darsi che esista un modo per farglielo capire, ma per adesso desisto.
- L’inserimento degli elementi all’interno della tabella dovrà essere effettuato con PhpMyAdmin o con un tool equivalente. Io, da un po’ di tempo, utilizzo adminer-4.7.7-mysql. Molto snello: provare per credere. Ho letto delle guide che permettono di realizzare strumenti di aggiornamento di tabelle direttamente dal pannello di controllo, ma anche qui ho desistito.
Importazione/costruzione della tabella
La tabella che è stata importata, rinominata my_arduino, (volendo se ne può costruire una ex novo) presenta i seguenti campi:

Contiene, sostanzialmente, una serie di esercizi su Arduino, dove i campi rappresentano:
- id_esercizio: identificativo
- t_esercizio: titolo dell’esercizio
- t_autore: autore
- t_content: contenuto preformattato (indicazioni)
- t_codice: contenuto preformattato (codice)
- d_data: data di inserimento (inutilizzata)
- b_visibile: campo booleano: 1 se da visuallizzare 0 altrimenti
Realizzazione
Per realizzare quello che mi serve ho costruito due pagine:
- Arduino – Esercizi: visualizza l’elenco degli esercizi (solo il titolo)
- Arduino – Esercizio: visualizza un singolo elemento della tabella
N.B. Il codice per la costruzione delle due pagine è relativo ad una prima stesura; in futuro potrebbe subire delle variazioni.
Arduino – Esercizi
La pagina per visualizzare la lista completa degli esercizi si avvale di uno shortcode realizzato grazie al plugin Insert PHP Code Snippet (XYZ PHP Code)
Il richiamo alla pagina dell’esercizio viene effettuato, non inviando l’ID dell’esercizio, ma il numero dell’elemento (la lista degli esercizi è numerata da 1 a $numero_di_record); questo per facilitare la scrittura del menu di navigazione tra gli esercizi.
Il codice richiamato dallo shortcode è il seguente:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
<?php /* ---------------------------------------------------- assegnazione valori per le variabili ----------------------------------------------------- */ $elementi_per_pagina = 10; $numero_pagina = isset( $_GET['_P_np'] ) ? abs( (int) $_GET['_P_np'] ) : 1; $offset_pagina = ( $numero_pagina * $elementi_per_pagina ) - $elementi_per_pagina; /* ---------------------------------------------------- query principale, query conteggio record e assegnazione variabili ----------------------------------------------------- */ $query = "SELECT id_esercizio, t_esercizio, b_visibile FROM my_arduino " ."WHERE b_visibile=1 " ."ORDER BY id_esercizio LIMIT " .$offset_pagina.', '. $elementi_per_pagina; $elementi_dataset = $wpdb->get_results( $query); // Il numero dei record restituiti viene impostato in $wpdb->num_rows, // ma visto che si lavora con offset ne verranno restituiti comunque un // numero pari a $elementi_per_pagina, URGE una query di conteggio record. $numero_di_record = $wpdb->get_var( "SELECT COUNT(*) FROM my_arduino WHERE b_visibile=1"); $numero_di_pagine=ceil($numero_di_record / $elementi_per_pagina); // ----------------------- PAGINAZIONE - Prima visualizzazione my_get_paginazione("https://vitocafazzo.it/site_Wp/arduino-esercizi", $numero_di_record, $numero_di_pagine, $numero_pagina); /* ---------------------------------------------------- visualizzazione elenco ----------------------------------------------------- */ echo "</br></br>"; $n=$offset_pagina; foreach ($elementi_dataset as $risultato) { $n++; $paginaTarget= "https://vitocafazzo.it/site_Wp/arduino-esercizio/"; $id= $risultato->id_esercizio; $titolo= $risultato->t_esercizio; echo '<h2 class="section-title"><a href='.$paginaTarget.'?_P_ele='.$n.'>'.$n.') '.$titolo.'</a></h2>'; } echo "</br></br>"; // ----------------------- PAGINAZIONE - Seconda visualizzazione my_get_paginazione("https://vitocafazzo.it/site_Wp/arduino-esercizi", $numero_di_record, $numero_di_pagine, $numero_pagina); ?> |
Per la paginazione ho costruito la funzione my_get_paginazione (più generale possibile, in modo da poterla utilizzare in altre situazioni; spero di non doverci più mettere mano) inserita all’interno del file functions.php del tema child.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 |
<?php /********************************************************************/ function my_get_paginazione($pageURL, $maxREC, $maxPAG, $_P_np){ /* Il parametro "numero di pagina" sulla barra dell'indirizzo deve essere _P_np In questa funzione viene memorizzato in $_P_np Viene utilizzata la classe my_paginazione definita nel CSS */ $primAtt="https://vitocafazzo.it/site_Wp/wp-content/uploads/2020/11/pag_Prim_Att.png"; $primDis="https://vitocafazzo.it/site_Wp/wp-content/uploads/2020/11/pag_Prim_Dis.png"; $precAtt="https://vitocafazzo.it/site_Wp/wp-content/uploads/2020/11/pag_Prec_Att.png"; $precDis="https://vitocafazzo.it/site_Wp/wp-content/uploads/2020/11/pag_Prec_Dis.png"; $succAtt="https://vitocafazzo.it/site_Wp/wp-content/uploads/2020/11/pag_Succ_Att.png"; $succDis="https://vitocafazzo.it/site_Wp/wp-content/uploads/2020/11/pag_Succ_Dis.png"; $ultiAtt="https://vitocafazzo.it/site_Wp/wp-content/uploads/2020/11/pag_Ulti_Att.png"; $ultiDis="https://vitocafazzo.it/site_Wp/wp-content/uploads/2020/11/pag_Ulti_Dis.png"; echo '<div class="my_paginazione">'; if ($maxREC!=0) { echo 'Pagine [ '; // ------------------------------------------------------ PRIMA if ($_P_np==1) { echo '<img border="0" src="'.$primDis.'" />'; } else { echo '<a class="imgNoBgColor" href="'.$pageURL .'?_P_np=1">' .'<img border="0" src="'.$primAtt.'"' .'alt="Prima" title="Prima" /></a>'; } // ------------------------------------------------------ PRECEDENTE if ($_P_np==1) { echo '<img border="0" src="'.$precDis.'" />'; } else { echo '<a class="imgNoBgColor" href="'.$pageURL .'?_P_np='.($_P_np-1).'">' .'<img border="0" src="'.$precAtt.'"' .'alt="Precedente" title="Precedente" /></a>'; } // ------------------------------------------------------ SINGOLE PAGINE for ($i=1;$i <= $maxPAG;$i++){ if ($i!=$_P_np){ echo '<a href="'.$pageURL .'?_P_np='.$i .'"><strong>'.$i.' </strong></a>'; } else echo $i.' '; } // ------------------------------------------------------ SUCCESSIVA if ($_P_np==$maxPAG) { echo '<img border="0" src="'.$succDis.'" />'; } else { echo '<a class="imgNoBgColor" href='.$pageURL .'?_P_np='.($_P_np+1).'">' .'<img border="0" src="'.$succAtt.'"' .'alt="Successiva" title="Successiva" /></a>'; } // ------------------------------------------------------ ULTIMA if ($_P_np==$maxPAG) { echo '<img border="0" src="'.$ultiDis.'" />'; } else { echo '<a class="imgNoBgColor" href='.$pageURL .'?_P_np='.$maxPAG.'">' .'<img border="0" src="'.$ultiAtt.'"' .'alt="Ultima" title="Ultima" /></a>'; } //------------------------------------------ echo '] - Elementi: <strong>'.$maxREC.'</strong>'; } else echo 'Nessun elemento inserito'; echo'</div>'; } //funzione ?> |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
div.my_paginazione{ font-family: Arial, Helvetica, sans-serif; background-color: #D7D9FF; color: #191970; font-size: 14px; padding: 2px; margin-right: 5px; margin-left: 5px; text-align: center; border: 3px solid; border-color: #BDC1FF; overflow: hidden; } |
Arduino-Esercizio
Anche per questa pagina ho realizzato uno shortcode grazie al plugin Insert PHP Code Snippet (XYZ PHP Code). Il codice richiamato è il seguente:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
<?php /* ---------------------------------------------------- Controllo parametro: numero sequenziale dell'esercizio in _P_ele ----------------------------------------------------- */ $num_ele = isset( $_GET['_P_ele'] ) ? abs( (int) $_GET['_P_ele'] ) : 1; /* ---------------------------------------------------- query conteggio record ----------------------------------------------------- */ $numero_di_record = $wpdb->get_var( "SELECT COUNT(*) FROM my_arduino WHERE b_visibile=1" ); /* ---------------------------------------------------- query principale ----------------------------------------------------- */ $num_ese_query=$num_ele-1; $query = "SELECT * FROM my_arduino " ."WHERE b_visibile=1 " ."ORDER BY id_esercizio " ."LIMIT 1 OFFSET ".$num_ese_query; $elementi_dataset = $wpdb->get_results($query); if ($wpdb->num_rows==0) { echo '<div class="my_paginazione"> Esercizio inesistente </div>'; } else { $titolo=$elementi_dataset[0]->t_esercizio; $autore=$elementi_dataset[0]->t_autore; $indicazioni=$elementi_dataset[0]->t_content; $codice= $elementi_dataset[0]->t_codice; /* ---------------------------------------------------- visualizzazione ----------------------------------------------------- */ echo '<h3>'.$titolo.'</h3>'; echo '<h6 class="my_intestazione_info"><b>Autore: </b>'.$autore.'</h6>'; // navigator my_get_navigator("https://vitocafazzo.it/site_Wp/arduino-esercizio", "https://vitocafazzo.it/site_Wp/arduino-esercizi" , $num_ele, $numero_di_record); echo '</br></br><h5 style="text-align:center"> Indicazioni </h4>'; echo '<blockquote class="wp-block-quote"><pre>'.$indicazioni.'</pre></blockquote>'; echo '</br><h5 style="text-align:center"> Codice </h4>'; echo '<blockquote class="wp-block-quote"><pre>'.$codice.'</pre></blockquote>'; } ?> |
La navigazione tra gli esercizi avviene grazie alla funzione my_get_navigator definita in functions.php del tema child.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 |
<?php /********************************************************************/ function my_get_navigator($pageURL, $pagePARENT, $num_ele, $max_ele){ /* Il parametro "numero dell'elemento" sulla barra dell'indirizzo deve essere _P_ele In questa funzione viene memorizzato in $num_ele Viene utilizzata la classe my_paginazione definita nel CSS */ $precAtt="https://vitocafazzo.it/site_Wp/wp-content/uploads/2020/11/ele_SX_Att.png"; $precDis="https://vitocafazzo.it/site_Wp/wp-content/uploads/2020/11/ele_SX_Dis.png"; $pagePar="https://vitocafazzo.it/site_Wp/wp-content/uploads/2020/11/ele_LISTA.png"; $succAtt="https://vitocafazzo.it/site_Wp/wp-content/uploads/2020/11/ele_DX_Att.png"; $succDis="https://vitocafazzo.it/site_Wp/wp-content/uploads/2020/11/ele_DX_Dis.png"; echo '<div class="my_paginazione">'; if ($max_ele!=0) { // ------------------------------------------------------ PRECEDENTE if ($num_ele==1) { echo '<img border="0" src="'.$precDis.'" />'; } else { echo '<a class="imgNoBgColor" href="'.$pageURL .'?_P_ele='.($num_ele-1).' ">' .'<img border="0" src="'.$precAtt.'"' .'alt="Precedente" title="Precedente" /></a>'; } // ------------------------------------------------------ PARENT echo '<a class="imgNoBgColor" href="'.$pagePARENT.'">' .'<img border="0" src="'.$pagePar.'"' .'alt="Lista" title="Lista" /></a>'; // ------------------------------------------------------ SUCCESSIVA if ($num_ele==$max_ele) { echo '<img border="0" src="'.$succDis.'" />'; } else { echo '<a class="imgNoBgColor" href='.$pageURL .'?_P_ele='.($num_ele+1).' ">' .'<img border="0" src="'.$succAtt.'"' .'alt="Successivo" title="Successivo" /></a>'; } } else echo 'Nessun elemento inserito'; echo "</br>"; echo '<span class="my_intestazione_info"> Elemento '.$num_ele.' di '.$max_ele." </span>" ; echo'</div>'; } //funzione ?> |
Problemi
Nella realizzazione di questa pagina ho avuto un po’ di problemi per visualizzazione il codice con un highlight. Agganciare, in qualche modo, il plugin usato (Urvanov Syntax Highlighter) non è stato possibile. Ho tentato di utilizzare altri evidenziatori di codice, tipo highlight.js, provando ad inserire javascript nella pagina in diversi modi, ma non ha dato risultati (In tutti i test effettuati fuori da WordPress funziona). Per adesso mi sono arreso e ho presentato il codice a video come normale testo preformattato.
