En la entrada del pasado 30 de mayo hice alguna esquiva referencia a mi implicación en un proyecto de plataforma de blogs basada en WordPress MU. Sin prisas, pero sin pausas (hemos tomado buena nota de las observaciones de Luis Barriocanal, a quien deseo expresar mi reconocimiento por sus consejos y por su Planeta Educativo, víctima de prácticas nada edificantes) la aventura sigue adelante, sorteando numerosos escollos y atascos. De unos y otros vamos saliendo gracias a una mezcla de técnicas y habilidades en la que intervienen, en proporciones nada fáciles de precisar, la experiencia con WordPress, las habilidades informáticas y, por supuesto, la cabezonería.

En la citada entrada señalaba los quebraderos de cabeza que nos dio el editor visual de WordPress MU, basado en TinyMCE, cuyo módulo de corrección ortográfica en castellano no conseguimos que funcionara satisfactoriamente. Pues bien, me alegra poder decir que esos problemas se han visto superados gracias al talento de Miguel Ríos Martín, mi jefe en la Sección de Nuevas Tecnologías del Departamento de Educación del Gobierno de Navarra.


Miguel, que es un programador avezado, con amplia experiencia en PHP, AJAX y Java, identificó enseguida la causa del trastorno: cuando el corrector halla una palabra mal escrita, solicita la lista de alternativas. Si éstas no contienen tildes o eñes, todo va bien; en cambio, si en la lista se encuentran dichos caracteres, el corrector se atasca.

Hasta aquí, el planteamiento del caso. Cedo la palabra a Miguel para que enuncie la solución:

Para arreglar el problema del diccionario hay que realizar un par de modificaciones en el fichero wp-includes/js/tinymce/plugins/spellchecker/classes/TinyPspell.class.php.

El problema surge cuando el array de palabras sugeridas contiene caracteres con acento o eñes y es debido a que AJAX (JavaScript) trabaja con UTF-8 y no con ISO-8859-1. La función PHP que genera las sugerencias sobre una determinada palabra es [php light=”true”]pspell_suggest(diccionario, palabra)[/php] y devuelve un array codificado en ISO-8859-1 (supongo que porque el servidor utiliza esa codificación, o al menos el PHP la detecta). Usando la función PHP [php light=”true”]utf8_encode(cadena)[/php] podemos convertirla antes de que JavaScript la reciba. Es decir, la línea ~57:

[php light=”true”]return pspell_suggest($this->;plink, $word);[/php]

la cambiamos por:

[php light=”true”]return array_map("utf8_encode", pspell_suggest($this->;plink, $word));[/php]

La función PHP [php light=”true”]array_map(función, unarray)[/php] aplica la función a cada elemento del array unarray. Con esto la cadena de sugerencias se recibe correctamente.

Pero la cosa no queda ahí, porque resulta que cuando se pide chequear la ortografía siempre selecciona las palabras con acentos o eñes. La razón es que JavaScript manda al servidor esas palabra y como llegan codificadas con UTF-8 para ser chequeadas y resulta que PHP usa ISO-8859-1, las considera erróneas, aunque estén bien escritas. Por ello las sigue marcando como para revisar. ¿Cómo se arregla? Pues haciendo el proceso inverso. En la línea 44 aparece, en la función [php light=”true”]checkWords[/php]

[php light=”true”]if(!pspell_check($this->;plink, trim($word)))[/php]

que cambiamos por:

[php light=”true”]if(!pspell_check($this->;plink, trim(utf8_decode($word)))[/php]

De este modo decodificamos la palabra antes de dársela al PHP, que chequea de forma que la revisión sale perfecta si la palabra estaba bien escrita.

Con el permiso del jefe, publico en La Bitácora del Tigre este truco, que probablemente venga bien a más de un esforzado practicante de esa hidra de mil cabezas que es WPMU.

Addenda del 9 de agosto de 2007

Después de actualizar nuestro WordPress MU a la versión 1.2.3, hemos constatado que el módulo spellchecker no funciona, ni siquiera después de aplicar este truco. La solución, al menos por el momento, ha sido la que se propone en una de las entradas de los foros de WPMU: cambiar el nombre del módulo spellchecker, subir el antiguo módulo (para esto sirven las copias de seguridad), y listo.