Accedere ad un dB esterno da un sito WordPress

WordPress si appoggia ad un database MySQL per gestire i contenuti caricati sul proprio sito, ma come si può procedere nel caso si voglia visualizzare nelle pagine (o negli articoli) di un sito WordPress una tabella con dati recuperati da un database esterno? Ho cercato vari plugin che potessero implementare questa funzionalità, ma alla fine non ho trovato niente che si adattasse alle mie esigenze; perciò, dopo una lunga serie di insuccessi, ho dovuto ricorrere ad una soluzione un po’ articolata, ma che funziona decisamente bene.

Quello che illustro di seguito è ciò che ho fatto per rendere visibile il mio dB MySQL con le serie Anime dall’interno del mio sito WordPress; gli elementi necessari sono:

  • un sito WordPress già attivo e funzionante;
  • il plugin Insert PHP Code Snippet (gratuito);
  • il plugin WP Data Access (gratuito);
  • tanta pazienza!

Visto che far accedere WordPress ad un database esterno risulta praticamente impossibile senza modificare sostanzialmente il codice di WP stesso, la soluzione più semplice è creare le tabelle con i dati che ci interessano nello stesso dB che utilizza WP e sfruttare WP Data Access per recuperare le informazioni da queste tabelle. Il plugin, infatti, è in grado di accedere a tutte le tabelle presenti nel dB su cui è appoggiato il sito WP, quindi tutta la parte di gestione della connessione al dB è già codificata nel loop di WP.

Dal momento che voglio effettuare delle query sul dB passando i parametri direttamente nell’URL della pagina, è necessario abilitare la funzione che interpreta e restituisce gli argomenti passati tramite link; dal pannello di controllo di WordPress, andare nella sezione Aspetto / Editor del tema e modificare il file functions.php aggiungendo il seguente codice PHP:

function pn_custom_query_vars_filter($vars) {
  $vars[] = 'idSerie';
  $vars[] = 'idStagione';
  return $vars;
}
add_filter( 'query_vars', 'pn_custom_query_vars_filter' );

Ovviamente andranno indicati tutti i nomi delle variabili che vogliamo utilizzare nelle query.

Se vogliamo rappresentare i dati in forma tabellare, ora è possibile preparare tutte le tabelle tramite la sezione Data Publisher del plugin WP Data Access: l’utilizzo è estremamente intuitivo e non credo sia necessario aggiungere altro. Per ogni tabella creata avremo il relativo shortcode che potremo utilizzare nella pagina che conterrà i risultati delle query.

Ora arriva la parte di implementazione delle query SQL: utilizzando il plugin Insert PHP Code Snippet possiamo disegnare la nostra pagina che conterrà la tabella con i dati filtrati e inserire poi lo shortcode di questo snippet in una pagina (o un articolo) di WP; qui sotto, ad esempio, il codice che prepara la pagina con il dettaglio di una serie la cui chiave è stata passata nell’URL della pagina stessa:

<?php
$idserie = sanitize_text_field( get_query_var( 'idSerie' ) );

$detserie = $wpdb->get_row( "SELECT * FROM as_serie WHERE se_idserie = '" . $idserie . "'" );

echo <<<PPP
<!-- wp:heading {"level":3} -->
<h3>{$detserie->se_titolo}</h3>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>Titolo Originale: <strong><em>{$detserie->se_titolo_originale}</em></strong></p>
<!-- /wp:paragraph -->

<!-- wp:spacer {"height":32} -->
<div style="height:32px" aria-hidden="true" class="wp-block-spacer"></div>
<!-- /wp:spacer -->
PPP;

echo do_shortcode('[wpdataaccess pub_id="2" filter_field_name="st_idserie" filter_field_value="' . $idserie . '"]');

echo <<<NNN
<!-- wp:spacer {"height":64} -->
<div style="height:64px" aria-hidden="true" class="wp-block-spacer"></div>
<!-- /wp:spacer -->
NNN;

In realtà il codice non si limita a richiamare la tabella con lo shortcode di WP Data Access, ma visualizza anche altri campi recuperati dalla query e applica le formattazioni al testo.

A questo punto, basta creare una pagina che contiene solo il riferimento allo snippet:

<!-- wp:shortcode -->
[xyz-ips snippet="filtro-idserie"]
<!-- /wp:shortcode -->

Aprendo il link di questa pagina da un browser, basterà aggiungere nell’URL il valore da ricercare per ottenere solamente i risultati desiderati.