この内容は古いバージョンです。最新バージョンを表示するには、戻るボタンを押してください。
バージョン:6
ページ更新者:atom
更新日時:2026-06-11 07:10:02

タイトル: コメントに絵文字を入力可能にする方法
SEOタイトル: WordPress コメント絵文字対応 (utf8mb4) 完全ガイド

この記事の要点
  • WordPress のコメントで絵文字が「??」になるのは DB の文字セットが utf8 (3 バイト) のため
  • 絵文字 (U+1F600 等) は 4 バイト UTF-8 → MySQL の utf8mb4 でないと格納不可
  • 対処: ① wp-config.phpDB_CHARSET = 'utf8mb4' → ② DB と全テーブルを utf8mb4 へ変換
  • InnoDB は ROW_FORMAT=DYNAMIC + innodb_large_prefix 推奨(古い MySQL 5.6 で必要)
  • 「Disable Emojis」プラグインは絵文字を消すのではなく 絵文字用 JS/CSS の自動読込を止めるもので別物

なぜ絵文字が「??」になるのか

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');

対処手順 (全体像)

  1. DB バックアップ (mysqldump)
  2. wp-config.phpDB_CHARSETutf8mb4
  3. DB と全テーブル・全カラムを utf8mb4 に変換
  4. 動作確認 (絵文字を含むコメント投稿)

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」プラグインで同等効果。

コメントフォーム側の確認

コメント投稿フォームの <textarea> は通常 type 指定不要ですが、ページ全体のメタが charset=utf-8 になっているか念のため確認:

<head>
  <meta charset="utf-8">
  ...
</head>

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-replaceinformation_schema で対象を再洗い出し → 個別 ALTER TABLE。

Q: 既存のコメントの「??」は復元できる?
A: 不可。元の絵文字情報は破棄されています。変換後の新規投稿から保存可能になります。