タイトル: コメントに絵文字を入力可能にする方法
SEOタイトル: WordPress コメント絵文字対応 (utf8mb4) 完全ガイド
| この記事の要点 |
|
なぜ絵文字が「??」になるのか
WordPress のデフォルト MySQL 文字セットは古いインストールでは utf8 でした。MySQL の utf8 は最大 3 バイトまでしか格納できず、絵文字 (例: U+1F600) はUTF-8 で 4 バイト必要なため、保存時に「?」「??」に置換されてしまいます。
4 バイト文字を扱うには MySQL の utf8mb4 (mb4 = multi-byte 4 bytes) に変換する必要があります。WordPress 4.2 以降は新規インストール時に utf8mb4 が既定ですが、古い時期に作られたサイトは utf8 のまま残っているケースが多いです。
現状確認
-- DB の charset
SELECT default_character_set_name
FROM information_schema.SCHEMATA
WHERE schema_name = 'wordpress';
-- utf8mb4 / utf8 のいずれか
-- テーブル別
SELECT table_name, table_collation
FROM information_schema.TABLES
WHERE table_schema = 'wordpress';
-- カラム別
SELECT table_name, column_name, character_set_name, collation_name
FROM information_schema.COLUMNS
WHERE table_schema = 'wordpress'
AND data_type IN ('varchar','text','mediumtext','longtext');
対処手順 (全体像)
- DB バックアップ (mysqldump)
wp-config.phpのDB_CHARSETをutf8mb4に- DB と全テーブル・全カラムを utf8mb4 に変換
- 動作確認 (絵文字を含むコメント投稿)
STEP 1: バックアップ
# 必ず先にダンプ
mysqldump -u wpuser -p \
--default-character-set=utf8mb4 \
--single-transaction \
wordpress > wp-backup-$(date +%F).sql
STEP 2: wp-config.php の編集
// wp-config.php
define('DB_CHARSET', 'utf8mb4');
define('DB_COLLATE', ''); // 既定 (utf8mb4_unicode_ci) で OK
STEP 3: DB の変換
方法 A: SQL 直接
-- DB 全体
ALTER DATABASE wordpress
CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci;
-- 全テーブルとカラムを変換
ALTER TABLE wp_comments CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE wp_commentmeta CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE wp_posts CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE wp_postmeta CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE wp_users CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE wp_usermeta CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE wp_options CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE wp_terms CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE wp_term_taxonomy CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE wp_termmeta CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE wp_links CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
方法 B: WP-CLI (推奨)
# WP-CLI で一括 (テーブル列挙が不要)
wp db query "ALTER DATABASE \`$(wp config get DB_NAME)\` \
CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;"
# 全テーブル一括変換
for table in $(wp db tables --format=csv); do
wp db query "ALTER TABLE \`$table\` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;"
done
# 確認
wp db query "SHOW TABLE STATUS" | awk '{print $1, $15}'
方法 C: 一括変換スクリプト生成
-- ALTER TABLE 文を SQL で生成
SELECT CONCAT(
'ALTER TABLE `', table_schema, '`.`', table_name,
'` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;'
) AS stmt
FROM information_schema.tables
WHERE table_schema = 'wordpress'
AND table_type = 'BASE TABLE';
InnoDB 設定 (古い MySQL 5.6 のみ要対応)
MySQL 5.6 / MariaDB 10.0 系では utf8mb4 のインデックス (varchar(255)) で「Row size too large」エラーが起きやすく、以下の設定が必要でした:
# /etc/mysql/my.cnf
[mysqld]
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
innodb_file_per_table = ON
innodb_file_format = Barracuda
innodb_large_prefix = ON
innodb_default_row_format = DYNAMIC-- 既存テーブルを DYNAMIC へ
ALTER TABLE wp_posts ROW_FORMAT=DYNAMIC;
MySQL 5.7+ / 8.0 / MariaDB 10.2+ はこれらが既定なので、新しい環境では考慮不要です。
動作確認
# 投稿 → 絵文字付きコメントを投稿
# DB を直接見て 4 バイト文字が入っているか
mysql -e "SELECT comment_content FROM wp_comments ORDER BY comment_ID DESC LIMIT 1;" \
wordpress --default-character-set=utf8mb4
関連: 絵文字 JS の自動読込を止める
WordPress は古い (絵文字未対応の) ブラウザ用に wp-emoji-release.min.js を全ページ自動で読み込みます。これは絵文字の表示用であり、絵文字の保存可否とは別物です。ページ速度のために止めたいだけなら:
// functions.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('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');
});
あるいは「Disable Emojis」プラグインで同等効果。
コメントフォーム側の確認
コメント投稿フォームの は通常 type 指定不要ですが、ページ全体のメタが charset=utf-8 になっているか念のため確認:
...
FAQ
Q: 変換中に「Index column size too large」
A: MySQL 5.6 系。innodb_large_prefix=ON + innodb_file_format=Barracuda + ROW_FORMAT=DYNAMIC を設定。
Q: 一部テーブルだけ utf8 のまま
A: WP-CLI の wp db search-replace や information_schema で対象を再洗い出し → 個別 ALTER TABLE。
Q: 既存のコメントの「??」は復元できる?
A: 不可。元の絵文字情報は破棄されています。変換後の新規投稿から保存可能になります。