inserire codice php nei widget in WordPress 8.1 (codice aggiornato!)

pallina gialla nella neve che sorride, per mostrare un widget di wordpress modificato in php felice

I widget di WordPress, così come sono, non consentono di utilizzare codice php, neppure nel contenitore più generico che ci sia, quello che si chiama “testo” che permette di inserire testo (sic!) e html generico.

Eppure sarebbe tanto comodo che si potesse inserire anche codice php, per poter avere immediatamente nella nostra barra laterale qualcosa di dinamico, che si modifichi al variare del post visualizzato… tanto per fare il primo esempio che mi viene in mente.

Fino alla versione WordPress 7 era necessario fare una piccola aggiunta a functions.php, ma con l’aggiornamento WordPress 8 questo metodo non funziona più: i nuovi widget in effetti facilitano la visualizzazione e la modifica di testo a chi non conosce html, ma sono un incubo per chi vuole effettuare modifiche in html e mantenerle (passando fra la visualizzazione testuale e la visualizzazione “codice” molte modifiche vengono riformulate in automatico e perdute).
Per fortuna in WordPress 8.1 questo problema è stato risolto AGGIUNGENDO ai widget testuali i widget html, in modo tale da poter scegliere quale tipologia di widget inserire a priori. E questo facilita enormemente le cose anche per poter inserire php (tenendo presente che gli unici widget con cui aggiungeremo codice php sono quelli html).

Quindi, più o meno come si faceva con WordPress 7, basta aggiungere al nostro file functions.php (meglio se quello del tema child, come sempre ricordo), una nuova funzione. (Non so se vi ho già raccontato che per aggiungere nuove funzioni al file functions, io mi trovo benissimo con un piccolo plugin che si chiama code snippets)

Bene, quindi dicevamo: nel file functions.php aggiungo:


function phpInWidget($text) {
if (strpos($text, '<' . '?') !== false) { ob_start(); eval('?' . '>' . $text);
$text = ob_get_contents();
ob_end_clean();
}
return $text;
}
add_filter('widget_custom_html_content', 'phpInWidget', 99);

ed il gioco è fatto!

Per i più frettolosi abbiamo già finito, ma proviamo a spiegare meglio quanto abbiamo scritto: abbiamo definito  una nuova funzione, che si chiama phpInWidget. Questa funzione ha un argomento: $text.

Piccolo inciso: ogni porzione di codice php che si rispetti ha, all’inizio, la dicitura <?php …. e in chiusura ?>. Quindi la nostra nuova funzione va a cercare proprio quello:  dapprima si chiede SE (if) nel nostro $text esiste il segno <?.

Se esiste (o meglio, se la posizione numerica occupata dai segni <? è diversa da FALSE), allora attiva il buffering (ovvero dice qualcosa del tipo’ aspetta un attimo prima di produrre output e metti tutto in memoria’).

EVAL è il cuore della nostra funzione: serve per memorizzare il codice nel database ed eseguirlo come php nella fase di output.

A questo punto recuperiamo il contenuto del buffer (ob_get_contents()) nella nostra variabile text e cancelliamo quello che non ci serve più. Nella nostra variabile $text ora c’è tutto quello che serve per eseguire il codice php che è racchiuso all’interno.

L’ultima riga semplicemente è quella che posiziona la nostra funzione nel widget_custom_html_content, in modo tale da poterla sempre utilizzare per ogni widget custom html (per chi come me aveva già incorporato la funzione nelle versioni precedenti di WordPress, in effetti l’unica cosa da cambiare è la posizione in cui aggiungo il filtro, non più widget_text ma widget_custom_html_content)

 

Ciao! Questo è il posto giusto per opinioni, domande, chiacchiere in libertà...