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 astucias 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 el problema con el corrector de WPMU ha podido ser solucionado 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. A continuación, y con el permiso de Miguel Ríos, publico en La Bitácora del Tigre su solución, que probablemente venga bien a más de un esforzado practicante de esa hidra de mil cabezas que es WPMU.
La solución al problema con el corrector de WPMU
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
pspell_suggest(diccionario, palabra)
y devuelve un array codificado en ISO-8859-1 (probablemente porque el servidor utiliza esa codificación, o al menos el PHP la detecta). Usando la función PHP
utf8_encode(cadena)
podemos convertirla antes de que JavaScript la reciba. Es decir, la línea 57:
return pspell_suggest($this->plink, $word);
la cambiamos por:
return array_map("utf8_encode", pspell_suggest($this->plink, $word));
La función PHP
array_map(función, unarray)
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 checkWords
if(!pspell_check($this->plink, trim($word)))
que cambiamos por:
if(!pspell_check($this->plink, trim(utf8_decode($word)))
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.
Adenda 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.
Antonio Omatos dice
Hola Eduardo.
Pregunto y sólo pregunto, por que no conozco muy bien lo que estáis haciendo: ¿ no sería más fácil que el servidor trabajara en utf8 que es el estándar?.
No sé de que servidor estás hablando pero si es un apache, me extraña que use por defecto iso-8859-1, lo lógico sería el utf8. En las versiones viejas de apache si que solía pasar pero a partir de la 2 no.
Como prueba cambia el .htaccess con lo siguiente:
AddDefaultCharset On
AddDefaultCharset utf8
Igual lo tenéis con iso-8859-1.
Bueno ya me contarás.
Saludos.
Eduardo Larequi dice
El lunes lo miro y te contesto con más detalle. Pero efectivamente es un Apache 2.
Eduardo Larequi dice
Acabamos de probar la solución que propones, Antonio. No funciona aunque el servidor esté configurado para usar por defecto UTF-8. En cambio, con los cambios de Miguel el corrector ortográfico funciona perfectamente.
Antonio Omatos dice
Eduardo php utilza por defecto iso-8859-1, lo puedes cambiar a utf8 en php.ini con la directiva:
default-charset utf8
Evidentemente esta solución sólo sirve si tu gestionas el servidor.
Saludos
Eduardo Larequi dice
También hemos probado esta posibilidad, siguiendo tus sugerencias, y el resultado negativo persiste. Sólo se resuelve volviendo a la configuración que ya teníamos establecida, y con el «parche» de Miguel.