「x文字分の予期しない出力が生成されました」エラーへの対応方法【WordPress】

この記事は最終更新から4年以上が経過しています。情報が古くなっている可能性があります。

こんにちは、しばです。
最近気分転換にWordPressのプラグイン作りにチャレンジしていたんですが、「x(数字)文字分の予期しない出力が生成されました」というメッセージに遭遇しました。

PHPもWordPressカスタマイズも初心者の域を脱しない程度の知識なので、原因はまだよくわかっていません(-ω-;)
エラー解消はできたので、今後見直す時用に備忘録を残したいと思います。

エラーの詳細

まずはエラーメッセージの全文がこちら。

2397文字分の予期しない出力が生成されました。もし “headers already sent” エラーメッセージ、配信フィードの問題などが発生する場合は、プラグインを停止または削除してください。

これが、プラグインを有効化した後プラグイン管理画面の上部に表示されました。

とりあえずググって見ると、一般的に以下が原因で表示されるメッセージなようです。

  1. UTF-8(BOMあり)で、BOMコードがあることが原因
  2.  <?php の前に空白などがあることが原因
  3.  ?> より後ろに空白などがあることが原因
  4. 「プラグイン有効化(register_activation_hook())」のタイミングで「echo」している

引用元)【WordPress】「プラグインを有効化する際に、xxx文字分の予期しない出力が生成されました」の解決方法

既成プラグインでこのエラーが起こる例は少なく、だいたい自作している時に起きることが多いようですね。

今回の原因

私の場合、「プラグイン有効化(register_activation_hook())」のタイミングではあるものの、その処理の中でecho等アウトプットするものは行なっていませんでした。

疑問に思いながらregister_activation_hook()につけてたprivateを、

private function plug_activate() {
    //プラグイン有効時の処理
}

とりあえずpublicにしてみたところ、

public function plug_activate() {
    //プラグイン有効時の処理
}

エラー解消…!

「カプセル化はprivateを使う」「privateメソッドはクラス内ならアクセス可能」だと(安易に)思っていたので、ここがひっかかったことにびっくり。

実際にprivateだったせいでアクセスできずエラーが起きたことが原因だったのか。「ヘッダー変更関数前に何かが送信された」というエラーメッセージとprivateメソッドとの関係があるのか。なども分かっていません。。

もうちょっとカプセル化について勉強しようと思います(´・ω・`)

まとめ

ということで、今の所分かったことをまとめると、

  • register_activation_hook()をprivateで用意していたことが(恐らく)原因
  • これまでの例に漏れず自作プラグインでコードミスで起きたエラー(環境のバージョンだったり何かとの干渉だったりではない)

でした。
なにも分かっていない。
とりあえず、このエラーメッセージの場合はだいたい自分のコードに問題があると考えてよさそうですね。

以上、こんなエラーメッセージが出てこれで治った(?)よーという備忘録でした。


余談ですが、まずは行動!と、こんな感じで作ったプラグインを公式に申請してみました。
たくさんの指摘と共に戻ってきたので、審査チームにあまり迷惑かけないよう、修正&勉強していこうと思います(ノ∀`)