2026年5月25日
2026年5月25日
WordPressで絵文字が消える・保存できない原因と直し方|utf8mb4への変換手順
WordPress で絵文字(😀 など)を使ったときに起きる問題の多くは、データベースのテーブルの文字セットが原因です。絵文字は UTF-8 で4バイトになる文字ですが、MySQL・MariaDB の古い文字セット utf8(正式名は utf8mb3)は3バイトまでの文字しか保存できません。4バイトの文字まで保存できる文字セットが utf8mb4 です。
WordPress は 4.2 以降、新しくインストールするとテーブルを utf8mb4 で作ります。それより前からあるサイトや、別のサーバーから移したサイトでは、テーブルが utf8mb3 のまま残っていることがあります。この記事では、症状の見分け方、文字セットの確認方法、utf8mb4 への変換手順を説明します。
症状から原因を見分ける
WordPress 7.1.4(2026年10月時点の最新版)と MariaDB 11 で、テーブルを utf8mb3 にして動きを確かめた結果です。
| 症状 | 原因と WordPress の動き |
|---|---|
本文やタイトルの絵文字が、データベースでは 😀 のような文字列になっている |
投稿テーブルが utf8mb3。WordPress が保存前に絵文字を HTML の文字参照に変換している(表示はされる) |
| コメントの絵文字だけが消える | コメントテーブルが utf8mb3。保存に失敗した後、WordPress が絵文字を取り除いて保存し直している |
| カスタムフィールド・プラグインの設定・タグ名などに絵文字を入れると保存されない | そのテーブルが utf8mb3。WordPress が保存を中止し、Processing the value for the following field failed というデータベースエラーを記録している |
絵文字が画像(img.emoji)に置き換わる |
WordPress の絵文字スクリプトの動き。エラーではない(後述) |
投稿の本文・タイトル・抜粋だけは、WordPress がテーブルの文字セットを確認して、utf8mb3 なら絵文字を文字参照に変換してから保存します。そのため、投稿では問題に気づきにくく、コメントや投稿メタで初めて気づくことがよくあります。
なお、「Fatal error: Allowed memory size of ... bytes exhausted」は PHP のメモリ不足のエラーで、絵文字が原因ではありません。メモリ不足の直し方は WordPressの「Allowed memory size exhausted」を直す方法|WP_MEMORY_LIMIT・WP_MAX_MEMORY_LIMIT・memory_limitの違い を参照してください。
テーブルの文字セットを確認する
WP-CLI が使える場合は、WordPress のディレクトリで次を実行します。utf8mb4 以外のテーブルだけが表示されます。
wp db query "SELECT TABLE_NAME, TABLE_COLLATION FROM information_schema.TABLES WHERE TABLE_SCHEMA = DATABASE() AND TABLE_COLLATION NOT LIKE 'utf8mb4%';"
phpMyAdmin を使う場合は、データベースを選び、「SQL」タブで DATABASE() を実際のデータベース名に置き換えて同じ SQL を実行します。
- 何も表示されない:すべてのテーブルが
utf8mb4です。絵文字の問題は別の原因(プラグインの処理など)を疑います utf8_...やutf8mb3_...のテーブルが表示される:次の手順でutf8mb4に変換しますlatin1_...など、UTF-8 以外のテーブルが表示される:この記事の手順では変換しないでください。中身が文字化けすることがあります(WordPressのデータベース文字化けを解決する方法)
WordPress がデータベースに接続するときの文字セットは、次のコマンドで確認できます。
wp eval 'global $wpdb; echo $wpdb->charset, " ", $wpdb->collate, PHP_EOL;'
utf8mb4 と表示されれば接続は問題ありません。wp-config.php の DB_CHARSET が 'utf8' になっていても、データベースが対応していれば WordPress が接続時に utf8mb4 に切り替えます。新しく書く場合は define( 'DB_CHARSET', 'utf8mb4' ); とし、DB_COLLATE は空('')のままにします。
テーブルをutf8mb4に変換する
テーブルの構造を変える作業なので、先にデータベースをバックアップします。テーブルが大きいと変換に時間がかかり、その間は書き込みが待たされるため、アクセスの少ない時間帯に行います。
# 1. バックアップ
wp db export before-utf8mb4.sql
# 2. WordPress の接頭辞(wp_ など)が付いたテーブルをすべて utf8mb4 に変換
for t in $(wp db tables --all-tables-with-prefix --format=csv | tr ',' ' '); do
wp db query "ALTER TABLE \`$t\` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_520_ci;"
done
# 3. 確認(何も表示されなければ完了)
wp db query "SELECT TABLE_NAME, TABLE_COLLATION FROM information_schema.TABLES WHERE TABLE_SCHEMA = DATABASE() AND TABLE_COLLATION NOT LIKE 'utf8mb4%';"
utf8mb4_unicode_520_ciは、WordPress が使える場合に選ぶ照合順序です。前の手順のwp evalで表示された照合順序に合わせてもかまいませんwp db tables --all-tables-with-prefixは、プラグインが作ったテーブルも含めて、接頭辞が一致するテーブルをすべて対象にします- MySQL 5.6 などの古いデータベースでは、プラグインのテーブルで「Specified key was too long」というエラーが出て変換できないことがあります。WordPress 本体のテーブルはこの制限に合わせて作られているので、エラーになったテーブルはプラグインの作者に確認します
変換後、コメントやカスタムフィールドに絵文字を入れて保存し、消えずに残ることを確認します。変換前に消えてしまったコメントの絵文字は、変換しても戻りません。
ほかのサーバーへ移す場合や、データベース全体の既定の文字セットを変える方法は MySQLのcharset・collationを変更する方法 を参照してください。
絵文字が画像に置き換わるのはエラーではない
WordPress は、閲覧しているブラウザが絵文字を表示できるかを確かめるスクリプトを、すべてのページの <head> に出力しています。ブラウザが表示できない絵文字があると、WordPress.org の配信サーバー(s.w.org)から絵文字の画像を読み込み、img.emoji に置き換えます。これは不具合ではなく、古いブラウザでも絵文字を表示するための仕組みです。
外部への通信を減らしたい、ページを軽くしたいといった理由でこの仕組みを止めるには、テーマの functions.php(子テーマ推奨)か独自のプラグインに次を書きます。WordPress 7.1 のフックで確認したコードです。
<?php
add_action( 'init', function () {
// 絵文字を判定するスクリプト(サイト・管理画面・埋め込み)
remove_action( 'wp_head', 'print_emoji_detection_script', 7 );
remove_action( 'admin_print_scripts', 'print_emoji_detection_script' );
remove_action( 'embed_head', 'print_emoji_detection_script' );
// 絵文字画像用のスタイル(WordPress 6.4 以降は wp_enqueue_emoji_styles がこの登録を確認する)
remove_action( 'wp_print_styles', 'print_emoji_styles' );
remove_action( 'admin_print_styles', 'print_emoji_styles' );
// フィード・メールで絵文字を画像に変える処理
remove_filter( 'the_content_feed', 'wp_staticize_emoji' );
remove_filter( 'comment_text_rss', 'wp_staticize_emoji' );
remove_filter( 'wp_mail', 'wp_staticize_emoji_for_email' );
} );
止めた後は、絵文字はブラウザや OS が持つフォントで表示されます。止めても、データベースへの保存(前の章の問題)には影響しません。詳しくは WordPressの絵文字スクリプトを無効化する方法 を参照してください。
まとめ
- 絵文字が消える・保存できない原因は、テーブルの文字セットが
utf8mb4でないこと。utf8(utf8mb3)は絵文字を保存できない - 投稿の本文は WordPress が文字参照に変換して保存するが、コメントは絵文字が取り除かれ、投稿メタや設定は保存が中止される
information_schema.TABLESで文字セットを確認し、バックアップを取ってからALTER TABLE ... CONVERT TO CHARACTER SET utf8mb4で変換する。latin1のテーブルはこの方法で変換しない- 絵文字が画像になるのは WordPress の絵文字スクリプトの動きで、不要なら
remove_actionで止められる
関連記事: