PHP 8.3にバージョンアップしたところ、WordPressのコンテンツデータのエクスポートがエラーになった。
エラー内容
エクスポートを実行すると以下のようなFatal errorが発生する。
PHP Fatal error: Uncaught TypeError: wp_is_valid_utf8(): Argument #1 ($bytes) must be of type string, null given called in wp-admin/includes/export.php on line 246
原因
PHP 8.3で型チェックが厳格化されたため、wxr_cdata()関数にNULLが渡された場合にFatal errorとなる。PHP 8.2まではwarningで済んでいたが、8.3で致命的エラーになった。
対処方法
wp-admin/includes/export.phpのwxr_cdata()関数を修正し、NULLが渡された場合に空文字列として扱うようにする。
245行目付近のwxr_cdata()関数の先頭に以下のチェックを追加する。
function wxr_cdata( $str ) {
if ( $str === null ) {
$str = '';
}
Docker ComposeでWordpressを利用している場合
Docker Composeで運用している場合は、以下のコマンドで対象のコンテナ(ここではwordpressというコンテナ名)に対して修正を適用できる。
docker compose exec wordpress sh -c '
sed -i "
/function wxr_cdata( \$str ) {/a\\
\\
// PHP 8.3 compatibility fix\\
if ( ! is_string( \$str ) ) {\\
\$str = \"\";\\
}\\
" /var/www/html/wp-admin/includes/export.php
'
注意点
WordPressのアップデート時にこの修正は上書きされるため、アップデート後に再発するようであれば、再度適用が必要になる。WordPress本体で修正されるまでの暫定対応として利用する。