WordPress 「更新に失敗しました。 返答が正しい JSON レスポンスではありません。」の対応方法

「更新に失敗しました。 返答が正しい JSON レスポンスではありません。」というエラーが発生するようになってしまったので、原因と解決方法について。

環境

Xserver
WordPress 5.8.1 使用エディタ(Gutenberg).

発生する状況

  • 投稿ページの下書き中に自動保存などが走った際に発生する。
  • 下書き保存した際に発生する。

原因箇所の特定

使用しているショートコードの中に引数で配列を渡せるようになっているものがあり、その関数の中で echo による文字出力、または一旦PHPブロックを抜けての文字出力(①と②)をするようになっていると発生するようだった。

function sample_funk($atts)
{
	extract(shortcode_atts(array(
		'ids' => array(), // 配列
	), $atts));

	...

	echo "<p>文字列</p>"; // ① echo による文字出力

	?>
	<p>文字列</p>	<!-- ② 一旦PHPブロックを抜けての文字出力 -->
	<?php
}
add_shortcode('sample_funk', 'sample_funk');

軽く調べてみたが、どういう仕組みでそうなっているかまでは現状分からない。

解決方法(暫定)

とりあえず出力関連に問題がありそうと当たりをつけて色々試してみたところ、下記のように、ob_start()、ob_get_contents()、ob_get_clean() を使用して関数内の処理全体をサンドイッチしてあげると発生しなくなった。

function sample_funk($atts)
{
	extract(shortcode_atts(array(
		'ids' => array(), // 配列
	), $atts));

	ob_start(); // 出力バッファリングを有効化する

	...

	echo "<p>文字列</p>"; // ① echo による文字出力

	?>
	<p>文字列</p>	<!-- ② 一旦PHPブロックを抜けての文字出力 -->
	<?php

	ob_get_contents();	// 出力バッファに溜まった分を出力
	return ob_get_clean(); // 出力バッファを削除する
}
add_shortcode('sample_funk', 'sample_funk');

最後に

発生個所までは特定でき暫定的な対策もできたが、真相についてはよくわからない部分がありモヤモヤした感じ。
時間ができたらもう少し深くしらべてみようとは思う。