Problemas entre Planet y WordPress

Desde hace bastante tiempo tengo problemas con mi blog WordPress y el PlanetPlanet, este último no era capaz de entender mi feed para agregar mis posts. Por lo poco que investigué averigué que se trataba del caracter & que no lo interpretaba bien el planet, la única solución que encontré era crear un feed nuevo donde no estuviesen todo el cuerpo de mis posts, sólo un pequeño resúmen y de esta forma en la mayoría de los casos evitaba llegar a cualquier &.

El error concreto que daba el planet:

INFO:root:Updating feed <http ://www.marblestation.com/blog/wp-rss2.php>
DEBUG:root:Encoding: ISO-8859-1
DEBUG:root:E-Tag: "bc75f597ef208a8deaed7f6001f05cd8"
DEBUG:root:URI: <http ://www.marblestation.com/blog/wp-rss2.php>
ERROR:root:Update from <http ://www.marblestation.com/blog/wp-rss2.php> failed
Traceback (most recent call last):
  File "planet.py", line 130, in ?
    channel.update()
  File "/opt/planet-devel/planetlib.py", line 169, in update
    self._update(baseuri, data)
  File "/opt/planet-devel/planetlib.py", line 273, in _update
    feed.feed(data)
  File "/usr/lib/python2.3/sgmllib.py", line 95, in feed
    self.goahead(0)
  File "/usr/lib/python2.3/sgmllib.py", line 134, in goahead
    k = self.parse_endtag(i)
  File "/usr/lib/python2.3/sgmllib.py", line 293, in parse_endtag
    self.finish_endtag(tag)
  File "/usr/lib/python2.3/sgmllib.py", line 333, in finish_endtag
    self.unknown_endtag(tag)
  File "/opt/planet-devel/feedparser.py", line 358, in unknown_endtag
    method()
  File "/opt/planet-devel/feedparser.py", line 778, in _end_content
    value = self.pop('content')
  File "/opt/planet-devel/feedparser.py", line 480, in pop
    output = resolveRelativeURIs(output, self.baseuri)
  File "/opt/planet-devel/feedparser.py", line 897, in resolveRelativeURIs
    data = p.output()
  File "/opt/planet-devel/feedparser.py", line 853, in output
    return "".join(self.pieces)
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 3: ordinal not in range(128)

Más tarde, Tomàs empezó a utilizar también WordPress y acabó con los mismos problemas que yo con el planet 🙁 Però el si que empezó a investigar más profundamente cual era el problema y en uno de sus últimos posts encontró una solución.

Comenta que WordPress traduce el símbolo & como “& #038;” y es correcto si estamos tratando texto en formato ISO-8859-15, pero en el caso de UTF-8 el símbolo & debería ser expresado como “& #x0026;”. Así que la solución que encontró era cambiar el símbolo & (por lo visto solo los que se encuentran entre comillas, los demás no es necesario) por “& #x0026;”.

Hoy por fin me he decidido a aplicar la solución de Tomàs y me he leido con detenimiento su post, entonces me he dado cuenta que el tiene su blog completamente en UTF-8 y por tanto es lógico que la traducción del & que hace WordPress (según el parrafo anterior) sea incorrecta ya que mezcla ISO-8859-15 con UTF-8. Per en mi caso, lo tengo todo como ISO-8859-15 y por tanto la traducción que hace WordPress es correcta!! Utilizo ISO-8859-15 y WordPress traduce el símbolo & con el formato ISO-8859-15!! Por tanto, creo que aqui se han juntado 2 bugs:

  1. WordPress, a pesar de estar configurado con formato UTF-8, reemplaza los símbolos & por “& #038;” que corresponden al formato ISO-8859-15
  2. El Planet cuando obtiene notícias de un feed que esta en ISO-8859-15 falla al interpretar “& #038;” a pesar de que es correcto.

Por suerte he encontrado la solución muy rápidamente, he modificado el código fuente de WordPress para que traduzca los & en “& amp” en lugar de “& #038;”. De esta forma no falla cuando tienes la web en ISO-8859-15, no lo he probado con UTF-8… quizás lo pruebe Tomàs si se anima 😉

La modificación consiste en cambiar la linea 107 del fichero “wp-include/functions-formatting.php”:

--- functions-formatting.php    2004-08-08 13:27:59.000000000 +0200
+++ functions-formatting.php.new        2004-08-08 13:27:49.000000000 +0200
@@ -104,7 +104,7 @@
        $content = preg_replace('/<category>(.+?)</category>/','',$content);


        // Converts lone & characters into & (a.k.a. &)
-       $content = preg_replace('/&([^#])(?![a-z]{1,8};)/i', '&$1', $content);
+       $content = preg_replace('/&([^#])(?![a-z]{1,8};)/i', '&$1', $content);

        // Fix Word pasting
        $content = strtr($content, $wp_htmltranswinuni);

Leave a Reply

Your email address will not be published. Required fields are marked *