Molte volte si presenta la necessità di dover modificare una parte del codice HTML di un sito Wordpress. Le strategie per farlo sono molte, a partire dalla modifica diretta dei file di template, passando per la creazione di child template basati sul template originale, e ancora hook su plugin già presenti per modificarne le funzionalità.

Tuttavia, tutte le opzioni sopra riportate sono scomode, controintuitive, ed esose in termini di tempo.

Consideriamo una modifica molto banale al codice HTML finale di un sito Wordpress, ovvero, la riscrittura di tutte le frasi "Read more" oppure "Error page". Questa necessità capita quasi sempre quando si installa un template da themeforest: il supporto alla traduzione è spesso incompleto o parziale, ed andare ad agire sui file di traduzione è noioso e fa perdere tempo.

Fortunatamente, esiste un metodo per "agguantare" il codice HTML del sito prima che venga mandato in output ai browser client, ricalcolarlo a proprio piacimento, e mandarlo in output modificato così come è stato da noi definito.

Tutto questo è fattibile con un semplicissimo plugin, che incollo qui sotto. Ovviamente, questa soluzione è "quick and dirty". Non è da considerarsi lo stato dell'arte per effettuare modifiche al behaviour del proprio template. E' da usare solo quando si ha fretta, o il template è davvero troppo complicato o vetusto da impedirne una rapida modifica.

<?php
/*
Plugin Name: Final Output Buffer
Plugin URI: https://www.mauriziofonte.it/
Description: Il plugin definitivo per la modifica dell'output HTML di Wordpress.
Version: 1.0
Author: Maurizio Fonte
Author URI: https://www.mauriziofonte.it/
License: Questo plugin è concesso con licenza GPL
*/

function wp_mf_is_login_page ( ) {
    return in_array ( $GLOBALS['pagenow'], array('wp-login.php', 'wp-register.php' ) );
}

function wp_mf_finaloutputbuffer ( $buffer ) {
	
	if ( is_admin() || wp_mf_is_login_page () ) return $buffer;
	
	// correzione di tutti i testi "Read More"
	$buffer = str_ireplace ( 'read more', 'Continua a leggere...', $buffer );
	
	// correzione di tutti i testi "Related posts"
	$buffer = str_ireplace ( 'related posts', 'Articoli correlati', $buffer );
	
	// correzione di tutti i testi "goto homepage"
	$buffer = str_ireplace ( 'goto homepage', 'Ritorna alla Home', $buffer );
	
	// correzione di tutti i testi "error 404"
	$buffer = str_ireplace ( 'error 404', 'Errore 404', $buffer );
	
	return $buffer;
}

function wp_mf_finaloutputbuffer_buffer_start() { 
	if ( ! is_admin() && ! wp_mf_is_login_page () ) ob_start ( "wp_mf_finaloutputbuffer" ); 
}

function wp_mf_finaloutputbuffer_buffer_end() { 
	if ( ! is_admin() && ! wp_mf_is_login_page () ) {
		$html = ob_get_clean ();
		echo $html;
	}
}

add_action ( 'after_setup_theme', 'wp_mf_finaloutputbuffer_buffer_start' );
add_action ( 'shutdown', 'wp_mf_finaloutputbuffer_buffer_end' );

Questo codice va inserito all'interno di un file PHP che chiamerete "final-output-buffer.php", ed inserito dentro una cartella, chiamata anch'essa "final-output-buffer", creata all'interno della cartella "wp-content/plugins" della vostra installazione di Wordpress.

Questo plugin funziona nel seguente modo:

  1. Aggiunge un hook dopo il caricamento del template, wp_mf_finaloutputbuffer_buffer_start
  2. Aggiunge un hook su completamento di tutte le azioni di Wordpress, wp_mf_finaloutputbuffer_buffer_end
  3. Istanzia l'output buffer di PHP dichiarando come callback la funzione wp_mf_finaloutputbuffer

Quindi, il flow di esecuzione è il seguente:

  1. Wordpress fa il setup dei plugin e dei template
  2. A completamento della 1), triggera l'esecuzione di wp_mf_finaloutputbuffer_buffer_start, che controlla che la pagina attualmente "in lavorazione" NON sia una pagina di amministrazione o la pagina di login: nel qual caso, procede come se questo plugin non esistesse, altrimenti, istanzia l'output buffer con callback su wp_mf_finaloutputbuffer
  3. Il sito costruisce il "proprio" HTML ignaro di quello che farà wp_mf_finaloutputbuffer
  4. Il codice HTML "originale" viene agganciato da wp_mf_finaloutputbuffer, che lo ricalcola sulla base del codice PHP di replace che è stato inserito dallo sviluppatore
  5. Viene richiamata la funzione wp_mf_finaloutputbuffer_buffer_end, che manda in output il codice HTML sulla base del ricalcolo della 4)

Per modificare il plugin secondo le proprie necessità, è sufficiente andare a modificare la funzione wp_mf_finaloutputbuffer, andando ad effettuare preg_match, str_replace, o qualsiasi tipo di funzione di manipolazione di stringhe su $buffer, che contiene tutto il codice HTML.

Se nella vostra installazione dovessero già essere presenti dei plugin che sfruttano questa tecnica, è molto probabile che avrete dei problemi di content encoding, o che il sito mostrerà pagina bianca. Se dovesse succedere, è sufficiente rinominare temporaneamente la cartella "final-output-buffer", in modo che Wordpress disattivi il plugin, e andare ad analizzare la situazione successivamente.