Es posible que en alguna ocasión, tratando de guardar una entrada nueva o actualizando una entrada, os hayáis encontrado con un error como el que os muestro arriba:
Ha fallado la actualización. No se ha podido insertar en la base de datos
Si os metéis en la pestaña de «Red» veréis que la petición que hace WordPress a la API para actualizar la entrada en base de datos devuelve un error 500. Os cuento el por qué aparece el error y cómo arreglar.
Causa del error: los emoticonos
Si habéis puesto emoticonos en vuestra entrada o página, a la hora de guardarlo en la base de dato MySQL o MariaDB devolverá un error porque el juego de caracteres que usas no permite emojis o emoticonos. Por lo general, se trata de UTF-8 en estos casos.
Soluciones hay varias, vamos a verlas. La más simples es quitar los emojis del contenido, pero claro, la idea es evitar hacerlo porque incluso llegan a aparecer en los SERP de Google y son un punto muy a favor para transmitir contenido.
Cambiar el juego de caracteres
Puedes cambiar de UTF-8 a UTF8MB64 y a priori, este nuevo juego de caracteres debería soportarlos. Sin embargo, sé de casos donde aún así sigue habiendo problemas con algunos emojis.
Filtrar el contenido justo antes de guardarlo
Dentro de WordPress hay una función que se llama wp_encode_emoji y que básicamente convierte cualquier emoji que aparece en el contenido en su equivalente HTML. Su equivalente HTML es un código que no tiene sentido para los humanos pero que para las máquinas representa los emojis y que al ser un código sencillo en plan ampersand, seguido de almohadilla y seguido por un entero de 6 cifras, terminando en punto y coma. Aquí lo veis más claro con un listado completo.
El filtro tiene esta forma y podéis ponerlo en vuestro plugin de funciones o en vuestro tema hijo:
add_filter( 'wp_insert_post_data', function( $data ) { if ( ! empty( $data['post_content'] ) ) { $data['post_content'] = wp_encode_emoji( $data['post_content'] ); } return $data; }, PHP_INT_MAX );
Qué básicamente dice:
- Cuando se va a hacer la inserción en la base de datos de un post
- Si el contenido no está vacío
- Convertir los emojis en su equivalente HTML
- Lo unimos como última acción con PHP_INT_MAX para que ejecute al final por si hay más códigos unidos a ese evento
Si tenéis dudas o problemas podéis dejarlo en comentarios.