WordPressで本番環境からエクスポートしたXMLファイルがFatal Errorを吐いていて、その原因がAll in One SEOとPHP8系によるものではないか?という体験と検証の報告です。
現状未解決ですが、おま環かもしれないし、その内修正されるかもしれません。検索してもヒットしないので困っている人がいないのかもしれませんが、取り急ぎ。
※WordPress 6.9の既知のバグとして認知され、6.9.1以降のアップデートが提供されるのを待っています。
Error on Export Tool _ WordPress.org
WordPress 6.9.1 のリリースが準備されています。内容としてはバグ修正のみのメンテナンスリリースとのことです。
— オレイン(Koji Kuno) (@Olein_jp) January 22, 2026
リリース予定日は 2026年2月3日 となっているので、日本時間だと翌日になるかと思います。リリースされたらアップデートしていきましょう!
詳しい記事はこちら↓
▼実施期間
2025年1月19日~20日
▼環境
- WordPress v6.9
- PHP v8.3.21
- MySQL v5.7
- All in One SEO v4.9.3
- WordPressインポーター v0.9.5
ことの発端(XMLファイルのFatal Error)
ブロックレイアウト対応のテーマのテストをするために、Docker Desktopを導入して、本番環境からエクスポート/インポートすれば終わる話でした。
しかし、エクスポートしたXMLでは記事は一つもインポートできませんでした。
この原因をGeminiに訊いたところ、「XMLファイルの最後が</rss>で終了しているかどうか」を確認することに。
実際にXMLファイルの中身を見ると、ファイルの途中でFatal Errorが発生し、最後はエラーの発生を知らせるHTMLコードが挿入されていました。(Fig1)

Geminiには、このエラーを回避するために別のプラグインでエクスポートとインポートを行うように提案されたが、これはこれで面倒くさすぎた上に完了できなかったので放棄した(後述)。
PHP8系でFatal Errorが起こる原因
このエラーを調べたところ、PHP8系では型指定が厳格になったという情報が出てきた。
同じ空欄でも「空文字(文字列型)」と「Null」を区別しており、その結果「文字列型でなければならない処理でNullが渡されている」のでFatal Errorとなったようだ。
<b>Fatal error</b>: Uncaught TypeError: wp_is_valid_utf8(): Argument #1 ($bytes) must be of type string, null given
なぜエクスポート時にFatal Errorが起こったのか
このFatal Errorが起こる直前の内容に注目すると、All in One SEOのプラグインが提供するメタデータのフィールド(?)に該当する。
記事の編集画面で、画面下の方に「投稿のタイトル」や「メタディスクリプション」を記述する項目があり、おそらくココ。
投稿のタイトル(ページのタイトル)は_aioseo_title、メタディスクリプションは_aioseo_descriptionという項目にデータが保存されていると推測できる。
(すぐ近くに_aioseopという似ている項目があるが、これは3.xの旧版のものらしい。)
しかし、この項目は空っぽには見えない。
スマートタグを用いてWordPressの設定情報から参照しており、内容の変更起きてもそれをキャッチする仕組みになっている。
実際に文字数はカウントされ、プレビューにも反映されているのに、なぜNull(文字列型ですらない)になっているのだろうか?(Fig2)

正常にXMLファイルをエクスポートできるか検証
ひとまずできそうなこととして、スマートタグではなく直にページのタイトルを入力する。
これでエクスポートする記事を一つに絞ったところ、またFatal Error。
ただし、「投稿のタイトル」の保存先(_aioseo_title)は正常に処理できていて、次のメタディスクリプションの行でFatal Errorが発生した。(Fig3)
つまり、「スマートタグを利用しなければFatal Errorを回避できる」ことがわかった。

そして、次のメタディスクリプションの項目で発生したFatal Errorについて。
投稿のタイトルについては、このブログを開始した当初からAll in One SEOのスマートタグを使ってきた。
メタディスクリプションはテーマで表示するつくりにしなかったので、検索エンジンで利用される程度の用途しかなないと軽視していた。
そのため抜粋(≠要約)を考えるの面倒だったので、だいたい「空欄もしくは全文」が格納されている。
ページのタイトルを空欄にするわけにはいかなかったので、メタディスクリプションの項目はスマートタグではなく空欄(スペースすら入力しない)でFatal Errorが発生するかどうかを検証した。
結果、文字入力がゼロでもFatal Errorを回避することができ、これだけでXMLファイルは</rss>で締めくくられ、正常にエクスポートすることができた。
もしかしたら、All in One SEOが提供するスマートタグとパイプ記号以外に何か入力してあればFatal Errorを回避するかもしれない(未検証)。
まとめ
これらの結果から、このトラブルの原因は「PHP8系での仕様変更によって『文字列型でなければならない処理』に、All in One SEOが追加したデータベースの値(Null)が渡されたから」だと推測した。
これまで頻繁にエクスポートしてきたわけではないからそれぞれのPHPのバージョンでの挙動はわからないが、PHP8系での仕様変更の情報から、All in One SEO側の問題ではなさそう。
今は本番環境からのエクスポートを必要としているのだが、”これまでの記事のすべてのタイトルと抜粋を置き換える(しかも静的に変更)”は、手間に対してメリットが上回らない。
なので、現状は修正を待っている。
番外:他のプラグインでエクスポートとインポート
これらの検証をする前に、Geminiはプラグインを使用してエクスポートとインポートをする方法を教えてくれた。
All in One SEOが持つメタキーを発見できたのはこのエクスポートを担うプラグインのおかげ。
XMLではなくCSV形式でエクスポートを行う。
しかし、インポートはなかなか手間で、画像をメディアライブラリに登録する作業は面倒くさすぎて投げるくらい失敗続きだった。
インポートプラグインでは、「データベースのどのメタキーが、投稿のどの部分に該当するか」を一つずつ紐づける必要があった。
これが結構面倒で、タイトルや本文、メタディスクリプション、カテゴリやタグの紐づけの他に、本番環境からダウンロードした画像のファイルパスを置き換えたりする必要があった。
さらに、このインポートで”メディアライブラリには画像が登録されていないのにアイキャッチ以外の画像が添付済みになっていた”り、メディアライブラリに登録するためのプラグインなのにそれができないとか、Geminiの回答では解決することができなかった。
AIの回答を完璧だとは思ってはいないが、あまりに進展がなかったのでこの不具合報告を書いている。
標準のエクスポート機能が早く直ってほしい。