Captura de tela de um post do WordPress com os emojis trocados por ????

Problema com emojis sendo trocados por ? (interrogação) no WordPress3 min leitura

Veja como resolvi o problema dos emojis (como 😄 e 🧙‍♂️) sendo trocados por ? (interrogação) dentro do conteúdo dos posts e páginas do WordPress.

Depois de fazer a migração de um site WordPress para uma nova hospedagem, percebi que todos os emojis (como 😄 e 🧙‍♂️) dentro do conteúdo dos posts e páginas foram trocados por ? (interrogação). Este tipo de problema normalmente é causado por codificação incorreta, então comecei o processo de identificação da origem deste erro.

O primeiro passo foi descobrir se o problema ocorreu ao fazer a exportação ou a importação do banco de dados. No meu caso, eu havia feito a exportação com o WP-CLI, utilizando o comando padrão: wp db export, e ao abrir o SQL em um editor de código (VSCode) verifiquei que os emojis já estavam trocados por ?. Pesquisando um pouco descobri que o WP-CLI exportou por padrão com a codificação utf8 e o meu banco estava utilizando utf8mb4.

Para resolver este problema precisei exportar o banco de dados novamente, mas agora passando a codificação específica como parâmetro: wp db export –default-character-set=utf8mb4 banco.sql. Depois verifiquei o arquivo da exportação no editor e o problema havia sido solucionado.

Se o problema tivesse acontecido na importação do banco de dados, era só adicionar o --default-character-set=CHARSET no comando de importação, trocando o CHARSET pela codificação do banco de destino.

Se você quiser saber mais informações sobre o assunto, recomendo a página da documentação oficial sobre os argumentos globais de banco de dados.

Caso 2: Site no ar (ou em produção)

Neste caso você só descobriu o problema quando o site já havia sido migrado e não é mais possível fazer uma nova importação e exportação do banco de dados original. No meu caso os emojis apareciam corretamente no editor, mas na visualização eles eram trocados por ????.

Como primeiro passo da investigação fui verificar as informações do banco de dados. Para fazer isso, acessei no painel do WordPress o menu Ferramentas > Diagnóstico > Informação > Banco de dados e descobri que os itens Charset do banco de dados e Agrupamento do banco de dados (collation) estavam vazios! Abrindo o wp-config.php descobri que não havia um alinha para configurar o DB_CHARSET e o valor do DB_COLLATE estava vazio.

Para fazer a configuração correta, abri o gerenciador do banco de dados e descobri que as tabelas do WordPress (como a wp_posts) estava com a colação utf8mb4_unicode_ci. Com isso eu tinha todas as informações que precisava e fiz a seguinte configuração no wp-config.php:

%MINIFYHTMLd38adaa7b4ae18eaca5963f7e824d5c846%
/** Database Charset to use in creating database tables. */ define( 'DB_CHARSET', 'utf8mb4' ); /** The Database Collate type. Don't change this if in doubt. */ define('DB_COLLATE', 'utf8mb4_unicode_ci');

Pronto, os emojis voltara a funcionar corretamente! 🎉

Outros casos

Se o seu caso não se enquadrou em um dos dois listados acima, durante a minha pesquisa encontrei os seguintes links que podem ajudar:

  1. Convertendo o charsets de banco de dados (em inglês);
  2. Convertendo o WordPress de utf8 para utf8mb4 (em inglês).

Atenção: Antes de fazer qualquer alteração no banco de dados recomendo que você faça o backup completo do site.

Imagem padrão
Daniel Kossmann
Daniel Kossmann é graduado em Magia Ciência da Computação pela UFPR e (in)formado em jornalismo cultural, desenho e tradução pela Universidade Kósmica, tendo obtido com louvor o título de Kosmonauta. Nas horas vagas, gosta de viajar para universos paralelos. Se você gostou dos meus textos, me ajude a escrever mais.

Você tem algo construtivo sobre este texto para dizer? Então comente abaixo

Faça parte do Kosmos!

Se inscreva na minha newsletter intergalática e receba conteúdo exclusivo!