WordPress Gutenberg でエラー「更新に失敗しました」が出る問題の解決方法

WordPress Gutenberg always_populate_raw_post_data エラー

問題

WordPress の管理画面で、 Gutenberg エディタ(ブロックエディタ)を使ってポストを更新しようとすると「更新に失敗しました」というメッセージが出ます。 しかし実際には投稿は適切に更新されていて、エラーメッセージが間違って表示される状態です。

対象バージョン

問題が発生した PHP と WordPress のバージョンは次のとおりです。

  • PHP 5.6.x
  • WordPress 5.0.3

原因

Gutenberg エディタ(ブロックエディタ)がうまく動かない問題の原因はたくさんあるようですが、今回私が経験した問題の場合は PHP の設定 always_populate_raw_post_data が原因でした。

PHP のエラーログには次のようなメッセージが出ていました( xxx は行数)。

PHP Warning:  Cannot modify header information - headers already sent in /path/to/wordpress/wp-includes/rest-api.php on line xxx
PHP Warning:  Cannot modify header information - headers already sent in /path/to/wordpress/wp-includes/rest-api/class-wp-rest-server.php on line xxx
PHP Deprecated:  Automatically populating $HTTP_RAW_POST_DATA is deprecated and will be removed in a future version. To avoid this warning set 'always_populate_raw_post_data' to '-1' in php.ini and use the php://input stream instead. in Unknown on line 0

解決方法

エラーメッセージの指示どおりに PHP の設定値 always_populate_raw_post_data-1 にセットすると解決しました。

php.ini が使える場合は次のとおりにします。

always_populate_raw_post_data = -1

Apache が mod_php5.c モジュールを使っている場合は .htaccess を使ってセットすることもできます。

<IfModule mod_php5.c>
  php_value always_populate_raw_post_data -1
</IfModule>

always_populate_raw_post_data は PHP 5.6.0 で deprecated となり、 PHP 7.0.0 で削除されたので PHP 7 を使っている場合はこの問題は起こらないようです。

This feature was DEPRECATED in PHP 5.6.0, and REMOVED as of PHP 7.0.0.