Stavo aggiornando un vecchio articolo pubblicato qualche mese fa quando, al momento del salvataggio del post, mi si presenta una schermata con questo messaggio di errore:
Warning: require_once(Text/Diff/Renderer.php) [function.require-once]: failed to open stream: No such file or directory in /home/public_html/wp-includes/Text/Diff/Renderer/inline.php on line 17
Fatal error: require_once() [function.require]: Failed opening required ‘Text/Diff/Renderer.php’ (include_path=’.:/usr/lib/php:/usr/local/lib/php’) in /home/public_html/wp-includes/Text/Diff/Renderer/inline.php on line 17
Descrizione del problema
Come già scritto in precedenza, con il rilascio della release 2.6 di WordPress, è stata introdotta la gestione delle revisioni dei post (Post Revisions Tracking) per tenere traccia delle modifiche di ogni articolo e pagina (mostrando le differenze in maniera visuale), con la possibilità di ripristinare la versione precedentemente salvata. Ovviamente, essendo il mio sito un blog esclusivamente monoautore, questa funzionalità è stata subito disattivata, risparmiando, così, spazio sul database e risorse per gestirla.
Da quando, però, ieri ho installato l’ultima release stabile 2.6.5, mi si è presentato un problema che non mi era mai accaduto, ma che, leggendo su internet, era presente sin dal primo rilascio della 2.6: il famoso Fatal error in Text/Diff.php, un fastidioso “bug” che impediva la modifica degli articoli pubblicati. Infatti, cercando di editare un articolo pubblicato si incappava in un messaggio di errore relativo alla directory Text contenuta in /wp_includes (che gestisce la funzione di revisione dei post), tanto da rendere impossibile qualsiasi modifica all’articolo a meno che non si provvedeva alla cancellazione e riscrittura dell’articolo stesso.
Il motivo che genera questo misterioso errore è, però, da ricercarsi nel fatto che molti server provider non permettono l’uso della funzione ini_set(). Probabilmente, quindi, la causa del presentarsi improvviso di questo errore sulle revisioni (nonostante siano state disattivate da tempo), non dovrebbe imputarsi alla release WordPress 2.6.5, bensì, forse, solo ad un cambio di policy del mio server provider (devo comunque ancora chiedere delucidazione a blooweb).
La soluzione del problema
Per risolvere questo problema, senza dover ricorrere alle modifiche manuali sui file php di WordPress (come suggerito qui, anche se l’autore sembra prevedere solo delle modifiche a due soli file, mentre in realtà dovrebbero essere fatte a 4 file: pluggable.php, wp-diff.php, Diff.php, inline.php), potete scaricare questo pacchetto zip che contiene direttamente i 4 files patchati: wp-includes-WP-2.6.0.zip
Il problema, però, è che questo pacchetto è stato realizzato il 23 Luglio 2008, quando ancora vi era la release 2.6, mentre da Luglio a Novembre 2008 sono intercorse 3 minor release (4 con la 2.6.1) che hanno interessato le modifiche ai seguenti file:
[source language=”:php”]
[https://codex.wordpress.org/Version_2.6.5]
wp-admin/users.php
wp-content/plugins/akismet/akismet.php
wp-includes/feed.php
wp-includes/post.php
wp-includes/version.php
xmlrpc.php
[https://codex.wordpress.org/Version_2.6.3]
wp-admin/includes/media.php
wp-content/plugins/akismet/akismet.php
wp-includes/class-snoopy.php
wp-includes/version.php
[https://codex.wordpress.org/Version_2.6.2]
wp-admin/includes/template.php
wp-admin/includes/image.php
wp-admin/import/textpattern.php
wp-admin/css/press-this-ie.css
wp-includes/post.php
wp-includes/version.php
wp-includes/query.php
wp-includes/formatting.php
wp-includes/pluggable.php
wp-includes/widgets.php
wp-login.php
wp-settings.php
[/source]
Siccome i file modificati dal pacchetto sono:
[source language=”:php”]
wp-includes/wp-diff.php
wp-includes/pluggable.php
wp-includes/Text/Diff/Diff.php
wp-includes/Text/Diff/Renderer/inline.php
[/source]
abbiamo che nel pacchetto di patch, il file wp-includes/pluggable.php non risulta aggiornato (perché modificato con la release 2.6.2).
A questo punto non resta che realizzare un nuovo pacchetto di file patchati comprensivo del nuovo wp-includes/pluggable.php aggiornato alla release 2.6.5 (che comunque risulta invariato dalla release 2.6.2) per non portarci dietro i vecchi bug risolti da mesi. Fortunatamente, l’autore del BUGFIX ha commentato tutte le righe con la seguente frase:
[source language=”:php”]
//BUGFIX: changed for systems doesn’t support ini changes (www.code-styling.de)
[/source]
Per cui è stato facile individuare tutte le modifiche apportate ai file. In particolare, non ha fatto altro che, almeno per questo file, commentare una riga di codice nel seguente modo:
[source language=”:php”]
//BUGFIX: changed for systems doesn’t support ini changes (www.code-styling.de)
// ini_set(‘include_path’, ‘.’ . PATH_SEPARATOR . ABSPATH . WPINC );
[/source]
In realtà, ho poi scoperto che, questa riga, nelle ultime release, è stata eliminata; in questo modo, nel pacchetto finale, compatibile con WordPress 2.6.5, basterà eliminare il file wp-includes/pluggable.php visto che con la release 2.6.2 l’ini_set è stato eliminato.
Ecco quindi, in definitiva, il nuovo pacchetto zip aggiornato alla release 2.6.5 contenente i 3 file php patchati: wp-includes-WP-2.6.5.zip
Il mistero delle revisioni che non si disattivano completamente
Dopo aver copiato i nuovi file nelle specifiche cartelle di WordPress, se andrete ad editare un post già pubblicato, non avrete più quel messaggio di errore, bensì, almeno inizialmente, come è accaduto a me, un semplice avviso bordato di rosso che dice:
Vi è un salvataggio automatico per questo articolo che è più recente della versione sottostante. Visualizza il salvataggio automatico.
Confrontando l’ultima revisione ho scoperto che, fortunatamente, conteneva le modifiche (salvate con il Salvataggio Automatico) che avevo fatto all’articolo prima che mi desse il messaggio di Fatal error in Text/Diff.php.
Il fatto strano, però, è che in teoria la funzione di revisione doveva essere stata completamente disattivata sul mio blog, perché nel file wp-config.php ho inserito la seguente riga:
[source language=”:php”]
define(‘WP_POST_REVISIONS’, false); //Disabilita la revisione dei POST
[/source]
Invece, lanciando la seguente query SQL da PhpMyAdmin:
[source language=”:sql”]
SELECT * FROM wp_posts WHERE post_type = ‘revision’
[/source]
scopro che ho ben 19 revisioni che risalgono addirittura dal 28 Luglio 2008, esattamente 7 giorni dopo aver disabilitato le revisioni su WordPress. Non capisco come possano essere state create le revisioni di alcuni articoli, mentre su tutti gli altri scritti in questo intervallo di tempo no. Presumo che, forse, siano state create solo le revisioni degli articoli pubblicati, e, in seguito, modificati, ma non è ho comunque la certezza. Mi riservo in futuro di effettuare ulteriori analisi, con la speranza che la patch inserita possa aver risolto il problema.
In definitiva, però, è evidente che risulta un funzionamento anomalo delle revisioni di WordPress che non verrebbero mai definitivamente disattivate. Qualcuno di voi può verificare o ha già riscontrato un simile comportamento?
Ritornando alla mia situazione, una volta constatata la presenza delle revisioni, ho deciso che, per avere un DB pulito, di rimuoverle tutte con il seguente comando MYSQL:
[source language=”:sql”]
DELETE FROM wp_posts WHERE post_type = ‘revision’;
[/source]
Download Patch Fatal error in Text/Diff.php aggiornato a WordPress 2.6.5
Scarica wp-includes-WP-2.6.5.zip | |
Dimensione: 13.5 KB |
Ecco finalmente il mio secondo plugin per WordPress: Filter Badwords Comment.
Nato soprattutto per l’esigenza di censurare alcune parole offensive presenti nei commenti su questo sito (specie nella calda sezione Xbox 360 vs PlayStation 3) ho deciso di renderlo pubblico per dare ad altri webmaster e blogger la possibilità di proteggere i propri lettori dalla lettura di parole che potrebbero offendere la sensibilità personale.
Caratteristiche del plugin
Filter Badwords Comment, è stato strutturato in modo da essere altamente personalizzabile anche dal Pannello di Amministrazione di WordPress. Infatti presenta, sotto il menu Impostazioni, una sezione “Filter Badwords Comment” in cui, è presente una textarea con elencate tutte le parole da filtrare. Inizialmente questa area è nascosta, per evitare di offendere la sensibilità delle persone.
Solo dopo aver visualizzato sul tasto Show (Visualizza nel caso abbiate la versione di WordPress localizzata in italiano) verrà visualizzata una area di modifica del dizionario delle parole, una per riga, da censurare.
Qui sono presenti sia singole parole (per quanto possibile nella loro versione al plurale e al singolare e in quelle artefatte) e sia da parole composte (le classiche frasi fatte offensive).
Per il plugin ho realizzato 2 vocabolari: badwords_IT.txt e badwords_EN.txt. Entrambi contengono parole offensive nelle rispettive lingue ITALIANO e INGLESE. A seconda di quale database di base scegliete dovete rinominarlo nell’unico file che il plugin legge: badwords.txt (che di default ho comunque incluso e contiene solo le parole italiane). Ovviamente nulla esclude che potete creare un vostro nuovo file con le parole da censurare: quello che ho fatto io è solamente di fornirvi tutti gli strumenti in modo da avere una base di partenza su cui far funzionare il plugin per wordpress.
Per i blog multilingua, potete benissimo realizzare un file unico che racchiuda entrambe le lingue anche se lo sconsiglio perché le parole inglesi potrebbero essere facilmente trovate in parte di quelle italiane (un esempio è: “mettere in ballo” in cui la parola “ball” verrebbe censurata).
Anche nel caso di parole italiane vi potrebbero essere problemi di censure parziali delle parole perché, magari, in mezzo è stata trovata una parola da censurare (è il caso, per esempio, di grafica“).
Per come ho sviluppato il plugin, che usa la funzione php di str_replace() su tutto il testo del commento e non tiene in considerazioni le sentence, il problema non è facilmente risolvibile. Per cui ho risolto eliminando quelle parole da censurare che potrebbero essere facilmente confondibili con altre di uso comune.
Se avete qualche suggerimento per migliorare questo plugin siete sempre i benvenuti!
Come funziona
Il plugin Filter Badwords Comment non fa altro che, ogni volta che WordPress deve visualizzare un commento, interrogare un file di testo e ricercare le relative corrispondenze. Una volta trovate le parole da censurare, queste vengono nascoste dietro degli asterischi solo in visualizzazione (le parole rimangono comunque inalterate nel database). So che la soluzione del file di testo non è la soluzione più veloce di interrogazione di un elenco di dati, ma sicuramente era quella più veloce e funzionale, perché, a differenza di un array interno al plugin o di un campo in una tabella mysql, è facilmente modificabile ed esportabile in quanto è un semplice file di testo in ASCII. Per semplificare la modifica online del parole da censurare ho, comunque, previsto la possibilità di poter modificare il file dal Pannello di Amministrazione di WordPress.
Da qui, inoltre, è possibile anche scegliere se censurare l’intera parola da fltrare con tutta una serie di asterischi pari al numero di lettere di cui è composta, oppure, per lasciare intendere il senso della frase, di lasciare visibile solo la prima e l’ultima lettera.
Compatibilità
Il plugin Filter Badwords Comment è stato testato sul mio blog per diversi giorni ed è compatibile con tutte le versioni di WordPress, quindi anche con la release 2.5.1. In ogni caso, il plugin agisce solo nell’area commenti e non fa altro che lavorare sulla sola visualizzazione senza alterare alcun dato. Il plugin è stato rilasciato esclusivamente in lingua inglese ma presumo che le sue funzionalità e caratteristiche siano abbastanza chiare.
Possibili evoluzioni
Una possibile evoluzione del plugin potrebbe essere quello di non permettere l’inserimento dei commenti se sono presenti parole da censurare. In questo modo si risolverebbe il problema a monte e si educherebbero i commentatori a non scrivere parole offensive! Il problema è che questo non può essere l’unica soluzione ma solo una caratteristica in più, da abbinare alla censura in visualizzazione delle parole, poiché, specie nei siti attivi da più anni e con diversi migliaia di commenti, bisogna comunque filtrare le parole offensive.
L’origine della badlist
Ci tengo a precisare che la lista italiana delle parole da censurare è stata tratta quasi integralmente, ad eccetto di alcune aggiunte da me, dal sito di Clarence che riportava una gaffe notata su un CD di Infinito che aveva lasciato visibile un file badlist.txt con tutte le parole da censurare durante la registrazione, compresi alcuni nomi di partiti italiani.
Supporto
Il plugin può essere testato nella sezione dei commenti di questa pagina. Se avete suggerimenti, domande o segnalazioni di anomalie, potete commentare qui sotto, oppure, contattarmi direttamente per mail dalla sezione Contattami.
Download
[ITALIANO]
Nome Plugin: Filter Badwords Comment
Autore: Antonio Troise
Descrizione: Questo plugin permette di censurare dai commenti le parole che risultano essere offensive prelevandole da un database italiano o inglese. Il plugin agisce solo sulla visualizzazione dei commenti dove è possibile nasconderle completamente dietro una serie di asterischi pari al numero di lettere di cui sono composte, oppure, per lasciare intendere il senso della frase, è possibile lasciare visibile solo la prima e l’ultima lettera.
Versione: 1.0.2
Installazione:
[ENGLISH]
Plugin Name: Filter Badwords Comment
Author: Antonio Troise
Description: This plugin allows to filter the bad words present in the comments with asterisk from italian/english dictionary. When the comments get displayed, WordPress gives the comment content to the comment filter plugin and returns the modified content that replace the bad word with asterisk.
Release: 1.0.2
Usage: