WordPressで、記事を保存する際に「更新に失敗しました。データベース内の投稿を更新できませんでした。」というエラーメッセージが表示され、記事が保存できなくなってしまうことがあります。
保存できない原因は複数考えることができますが、多くは特殊な文字などが含まれている際に起こるため、このような特殊な文字が含まれていないかどうかをまずは確認してみてください。
メモ帳などのテキストエディタにテキストを一時退避しておき、段落ごとにコピー、貼り付けして「下書き保存」をしていくことで、該当する文字列がどこにあるのかを見つけ出すことができます。
エラーが起きる文字の例
これらのエラーが発生する文字の例を確認してみたところ、以下のようなものがありました。最近の話題だと鬼滅の刃の「竈門禰󠄀豆子」の中にエラーが起こる文字が含まれているので、鬼滅の刃ネタでブログを書いているときなどにこの症状に気づいた方もいらっしゃるかもしれません。
- 禰󠄀:竈門禰󠄀豆子(かまどねずこ)の「ね」の字。「禰」の異体字(禰豆子の場合はエラーなし)
- 辻󠄀:人名などに使われる異体字のしんにょうの点が1つの「つじ」の字(辻の場合はエラーなし)
- 𠮷:吉の上が「土」になっている「よし」の字
- 𠀋:「丈」の上に点がうたれた「じょう」の字
- 😀:絵文字など
上記の文字以外にもいわゆる異体字などの一部が含まれている場合に同じようなエラーが発生します。
これらの特殊な文字が原因でエラーが発生した場合、以下の方法で解決できるかもしれません。
特殊な文字が原因でエラーが発生した場合の対処方法
WordPressで「更新に失敗しました。データベース内の投稿を更新できませんでした。」エラーが発生し、その原因が投稿に特殊な文字が含まれていることであった場合、データベースの修正によって解決できる可能性があります。
また、この症状はWordPress4.2より古いバージョンなどからWordPressをアップデートし続けて使用している際に起こるようです。
WordPressが使用するデータベースの文字コード
2020年現在の最新バージョンのWordPressでは「utf8mb4」と呼ばれる文字コードでデータが保存されています。
これは、WordPress 4.2以降にアップデートされた絵文字などの最大4バイトで構成される補助文字をサポートした際に変更されたもので、それ以前の古いWordPressでは「utf8」と呼ばれる文字コードが使われていました。
本来、WordPress本体のアップデートの際、自動的にデータベーステーブルの文字コードが「utf8mb4」に変換されるはずなのですが、DBのバージョンが古い場合や導入しているプラグインやカスタマイズの影響などの原因により正しく変換されないまま本体のみがアップデートされてしまうことがあるようです。
他にも、ブログの引っ越しなどを行った場合も使用しているデータベースのバージョン(MySQL 5.0)などの違いによって設定と実際のテーブルの文字コードが変わってしまう例があるようです。
phpMyAdminから使用中のWordPressのテーブルを表示し、「wp_posts」などのテーブルの「照合順序」の項目が「utf8_general_ci」となっていたら文字コードは古い「utf8」のままなのでアップデートが必要な状態です。
エックスサーバーのWordPress簡単インストールで発生する?
(2021/1/20:追記)この症状ですが、どうやらエックスサーバーが提供するWordPressのセットアップ機能「WordPress簡単インストール」で設定したWordPress環境で起こってしまうことがあるようです。
再現条件など詳細は確認しきれていませんが、私の契約しているエックスサーバー環境でこの機能を使って新規インストールしたWordPressサイトで発生しました。データベースのバージョンなどの組み合わせによって起こっている可能性なども考えられそうなのですべてのユーザーで起こるものではないと思いますが、念のため「WordPress簡単インストール」を利用されている方は確認しておいたほうが良いかもしれません。。
utf8mb4にしないとデータの保存ができないのか
本来、データベーステーブルの文字コードがutf8のままであっても特殊な文字は実体参照と呼ばれるその文字を表す記号と数字の羅列に変換した状態で表記できます。
実体参照の例
- 辻󠄀 → 辻󠄀
- 禰󠄀 → 禰󠄀
- 𠮷 → 𠮷
- 𠀋 → 𠀋
- 😀 → 😀
このような形で文字を入力すれば、本来であれば文字コードにも影響なくデータベースへの保存ができるはずなのですが、WordPressエディタの自動変換機能によってこれが期待通りに動作しません。
これらはWordPressの「フィルタ」という機能が自動的に作用して起こるため、前述のエラーの対処方法として一部のサイトなどではこのフィルタ(wptexturize関数など)を無効化する処理をfunctions.phpなどに記載する方法が案内されていることがありますが、残念ながらその方法では今回の例は改善されません。
余談:異体字コードと組み合わせられた文字
上記の「辻󠄀」や「禰󠄀」の文字を実体参照の文字コードで見ると、2つのコードが組み合わされていることがわかります。(禰 + 󠄀など)
これは異体字セレクタと呼ばれるもので、上記の「辻󠄀」と「辻」のような異体字をベース文字と異体字セレクタの2種類のコードの組み合わせによって指定する形式です。このような異体字セレクタを使った文字は文字長が最大4バイトとなるため、従来のutf8テーブルでは使用できません。
対処方法:データベーステーブルの文字コードを変換する
今回のエラーに対処するにはデータベースの文字コードを変換する必要があります。
具体的な手順は以下となります。
手順1. wp-config.phpを変更する
まず、WordPressの設定内容を変更します。WordPressをインストールしたディレクトリにあるwp-config.phpの、「DB_CHARSET」の記載がある行を以下のように修正してください。
※すでにこの内容になっている場合があります。その場合は次の手順へ進んでください。
define( 'DB_CHARSET', 'utf8mb4' );
wp-config.phpはWordPressの管理画面からアクセスできない(はず)ので、FTPなどを使って作業を行う必要があります。
手順2-a. データベースを直接触れる方向け
ALTER TABLE `table` DEFAULT CHARACTER SET utf8mb4;
上記の1行がわかる方は同様の構文で直接phpMyAdminなどから定義を変更していただければ完了です。対象はWordPressの標準テーブルであるwp_commentmeta, wp_comments, wp_links, wp_options, wp_postmeta, wp_posts, wp_termmeta, wp_terms, wp_term_relationships, wp_term_taxonomy, wp_usermeta,wp_usersの12テーブルです。よくわからない場合はこの手順を読み飛ばして手順2-bを進めてください。
手順2-b. functions.phpに追記する
テーマに含まれているfunction.phpファイルに以下のコードを追記します。
function.phpはWordPressのテーマエディタなどからも編集可能ですが各自の環境に合わせて作業してください。基本的には最終行に貼り付ける形で問題ありません。
このコードはWordPressの関数を呼び出して強制的に標準のデータベーステーブルの文字コードをutf8mb4に変換する関数になっています。
if( isset($_GET["upgradeUtf8mb4"]) && $_GET["upgradeUtf8mb4"]==1) {
require_once ABSPATH."wp-admin/includes/upgrade.php";
if ( is_multisite() ) {
$tables = $wpdb->tables( 'blog' );
} else {
$tables = $wpdb->tables( 'all' );
if ( ! wp_should_upgrade_global_tables() ) {
$global_tables = $wpdb->tables( 'global' );
$tables = array_diff_assoc( $tables, $global_tables );
}
}
foreach ( $tables as $table ) {
maybe_convert_table_to_utf8mb4( $table );
}
echo "done.";
exit;
}
手順3. DB変換コードを動作させる
function.phpの変更が完了したら、ブラウザから以下のURLへアクセスします。
https://あなたのサイトのアドレス/?upgradeUtf8mb4=1
サイトのアドレスの最後に「?upgradeUtf8mb4=1」をつけてアクセスすることで先ほどのコードが動作し、変換が実行されます。
問題なく完了すると、空白のページに「done.」とだけ書かれたページが表示されます。
手順4. functions.phpに記述したコードを削除する
functions.phpのコードは一度動作させれば以降は必要ありません。
手順3が完了したら、再度functions.phpを開き、手順2-bで記述したコードを削除してください。
手順5. 動作確認
コードの削除が完了したら対処そのものは完了です。
サイトや管理画面の動作に問題がないことを確認し、その後問題が発生していた文字が正しく保存されるかどうか確認してください。
コメント
すごく助かりました!
ありがとうございます!!