WordPress, MySQL y UTF-8 (balada triste de charset)

Hete aquí que luego de tropocientos (?) años, decidí actualizar el WordPress para que este sitio no se termine convirtiendo en un repositorio de malware ruso y/o chino.

El proceso de actualización per se fue bastante relajado, si hay algo que han mejorado los muchachos de WordPress es el update autmático del core, los plugins y los temas.  Además, quién escribe había seguido las “mejores prácticas” y el tema sencillito de este site es un child theme, con lo cual no se rompió nada al actualizar.

#MeCagoEnElCharset

#MeCagoEnElCharset

Pero (siempre hay un pero), una vez que finalizó la actualización, los acentos y demás caracteres especiales pasaron a ser un mágico � (como el del Super Mario, pero rombito).  Puta digo.  Habré hecho alguna cagada  con el charset en una de las 500 migraciones y upgrades que sufrió este pobre site.

Cambio la codificación en el navegador a iso-8859-1 (aka Latin1) y se ve joya todo lo que viene de la DB, pero lo que está en archivos PHP no.  Listo, soy un boludo, hice cagada con la base de datos en algún momento.

Y… no. La base de datos está en perfecto UTF-8, la collation de las tablas está tal cual lo tengo en el wp-config.php.  El phpmyadmin me muestra los acentos sin problema, casi escucho como se me caga de risa por la espalda el MySQL (?). Empiezo a levantar temperatura como un esquimal en Aruba.

Bueno, digo.  No hay nada que no se pueda resolver con una búsqueda en Google.  Me rendí después de leer 2 páginas de resultados, probando sin efecto alguno lo siguiente:

wp-config.php

wp-config.php

  • Comentar las líneas de CHARSET y COLLATION en el wp-config.php.
  • Cambiar el CHARSET a Latin1 en wp-config.php. .
  • Agregar en el header.php del tema de WordPress meta tags con UTF-8 e idioma es-AR.
  • Exportar la tabla de post, pasarla por el Notepad++ a UTF-8, plancharla en la DB y volverla a importar.
  • Modificar las directivas de charset en el .htaccess.

ZERO. ZIP. ZILCH. NADA.

Pasaron un par de días y me senté de vuelta, porque lo que no tengo de inteligente, me sobra de cabeza dura (?) .

Revisé los headers, y efectivamente están en UTF-8.  La DB está en UTF-8. WordPress está en UTF-8.  Entonces, encontré una puntita en un bug viejo de MySQL, donde ALGUNOS caracteres internacionales no andaban bien con conexiones UTF-8… la solución era pasarle en el connection string el charset y la collation, porque si no el motor de base de datos re-convertía lo que ya estaba en UTF-8 (?!).

wp-db.php

wp-db.php

Me puse a revisar el wp-db.php, que es el archivo con el cual WordPress hace la conexión a la base, y me encontré con una sorpresa.  En la función set_charset tanto $charset como $collation están por defecto en NULL.  Cuestión de forzarle utf8 + utf8_unicode_ci y DALE QUE SO VO’ (?).

Escribo estas líneas para los pobres incautos que se puedan llegar a dar la cabeza con este oscurísimo inconveniente.  Ahora si, el blog vuelve a su letargo habitual.

BESIS 😘