Utilizo o ManageWP para facilitar o gerenciamento dos meus sites em WordPress e também para fazer backups recorrentes dos mesmos. Só que importo esses backups no LocalWP para rodar os sites no meu computador pessoal, todos os emojis são trocados por ????
. Já escrevi até um tutorial chamado “Problema com emojis sendo trocados por ? (interrogação) no WordPress” sobre este problema, mas a solução que encontrei não funcionou para este caso.
Para me certificar de que o problema não estava na exportação do banco de dados, abri o arquivo SQL em um editor (o VS Code é ótimo pois não costuma travar com arquivos grandes) e verifiquei que os emojis estavam lá. Então algo fazia a troca dos emojis para ????
na hora da importação. Depois de quebrar a cabeça por um tempo, descobri que no arquivo SQL haviam vários lugares onde o charset estava definido como utf8
em vez de utf8mb4
, mas em outros lugares estavam corretos. O exportador LocalWP deve ter ignorado as especificações do wp-config.php
do charset.
Trecho do arquivo wp-config.php
:
/** 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');
Code language: PHP (php)
Trecho da exportação do banco de dados com dois charsets (utf8
e utf8mb4
):
/*!40101 SET NAMES utf8 */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `wp_commentmeta` (
`meta_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`comment_id` bigint(20) unsigned NOT NULL DEFAULT 0,
`meta_key` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
`meta_value` longtext COLLATE utf8mb4_unicode_ci DEFAULT NULL,
PRIMARY KEY (`meta_id`),
KEY `comment_id` (`comment_id`),
KEY `meta_key` (`meta_key`(191))
) ENGINE=InnoDB AUTO_INCREMENT=7140 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
Code language: SQL (Structured Query Language) (sql)
Fiz um experimento alterando utf8
para utf8mb4
em todos os lugares que apareciam as linhas abaixo e após fazer a importação do banco de dados novamente, este problema foi resolvido!
/*!40101 SET NAMES utf8 */;
/*!40101 SET character_set_client = utf8 */;
Code language: SQL (Structured Query Language) (sql)
Para facilitar este processo, escrevi dois comandos com sed para fazer esta substituição, cuidando para que não sejam alterados nenhum conteúdo dentro de posts ou páginas que contenha a palavra uft8 e não é uma definição do banco de dados em si. Nos comandos abaixo estou considerando que o nome do banco de dados é db.sql
.
sed -i 's/SET character_set_client = utf8\b/SET character_set_client = utf8mb4/g' db.sql
sed -i 's/SET NAMES utf8\b/SET NAMES utf8mb4/g' db.sql
Code language: Bash (bash)
Queria escrever um script bash para facilitar esta troca, mas para seguir a filosofia do Texto Mínimo Viável vou parar este post por aqui.
Além de ensinar a solução, o objetivo deste post é também compartilhar um pouco o meu processo de resolução de problemas para ajudar outras pessoas a aprenderem como aprimorar seus próprios processos.
Deixe um comentário