今回のエラーメッセージ
Fatal error: Unknown: Cannot use output buffering in output buffering display handlers in Unknown on line 0
今回はwordpressのコメント管理のページで久々のエラーが出たお話です。
ページ真っ白状態で難儀しました。
スパムコメントを削除しようとした
wordpressのコメント機能を生かしていると、世界中からうざいスパムコメントがわんさと集まってくる。
このサイトも未処理のスパムコメントが溜まってきてしまって、5,000件以上になってしまった。
(スパムコメント対策をしてないからでしょ!)
なのでゴミ箱へ移動しようと思う。
コメント管理ページにてチェックを入れて「ゴミ箱に移動」してから削除するという手順。
「作成者」のところにチェックを入れると他も一気にチェックが入る。
「表示オプション」で20件表示になっているので、このままでは20件づつしか「ゴミ箱に移動」が出来ない。
「表示オプション」から表示件数を変更する。
999件まで設定出来るようになっている。
999件に設定して「適用」ボタンを押す。
「ホワイトアウト」
お〜!
久々の「ホワイトアウト」
真っ白で何にも表示されない状態になった。
たまにテーマファイルをいじった時に1箇所書き忘れ、または余計な事を書き込んでしまったときにはこれになる。
しかし今回はファイルはいじっていない。
「表示オプション」から表示件数を変更しただけだ。
まいったな〜。
しばらくプログラムファイルを見ていないから時間がかかりそうだ。
デバッグをオンにする
何が起きてるのか知るためにデバッグ機能をオンにしなくてはいけない。
wordpressのルートディレクトリにwp-config.phpがあるのでFTPソフトでダウンロードしてくる。
そのファイル内で↓これを探す。
define(‘WP_DEBUG’,false );
なにか足してなければ84行あたりにある。
このfalseをtrueに変更する。
define(‘WP_DEBUG’,true );
これにブラウザにエラーが表示される。
たくさんエラー(軽微なものも含めて)が出てるとエラー表示だらけになる。
稼動中のサイトではエラーが表示されてはまずいので、そういうときは、次の2行も足してやる。
define(‘WP_DEBUG_DISPLAY’, false);//ディスプレイにはエラーメッセージを表示させない
define(‘WP_DEBUG_LOG’, true);//ログファイルを出力させる http://……./wp-content/debug.log」でアクセス
ログファイルを出力させてブラウザで見るというやり方。
/wp-content/debug.log でアクセス出来る。
(そのままでは誰でも見られる状態なのでアクセス出来ないような対策は必要ですよ)
「Fatal error」これは困った
さてエラーメッセージを見て見ると、
お〜、なんてこったい。
Fatal error: Unknown: Cannot use output buffering in output buffering display handlers in Unknown on line 0
まあ、真っ白になるんだから「Fatal error」はそうだろうなと思っていたが、
問題は「Unknown on line 0」
何が問題かはわかるよね。
普通は
/root/wp/wp-includes/functions.php on line 3853
のようにエラー個所が「3853行だよ」って教えてくれるんだけど、
「Unknown on line 0」
では場所がわからないじゃないの。
まあ、しょうがないから、いつもの手、
Fatal error: Unknown: Cannot use output buffering in output buffering display handlers
これをそのまま検索窓に打ち込み検索。
あんまりヒットしないなぁ。
日本語サイトは少ないなぁ。
いい解決策は出てこない。
昔ながらの方法、ファイルのブロックごとにテスト
しょうがない。
昔ながらの方法、ファイルのブロックごとにテストするか〜。
該当ファイルedit-comments.phpを上からブロックごとにテストする。
edit-comments.phpを「1ブロック」取ってきてtest.phpを作ってそこにコピーする。
これを「1ブロック」足すごとにFTPでアップする。
echo “test OK”; みたいのを入れておいて、表示されればそこまではエラーなし。
時間がかかるけど、これしかないので粛々とやる。
最後の方になって(やっぱり最後の方かい!手間かけやがって)エラー個所が分かった。
$wp_list_table->display();
これをコメントアウトするとちゃんと表示される。
もちろんこの関数が受け持っている部分は表示されないのだが。
コメント管理ページ復活
元のedit-comments.phpの
$wp_list_table->display();
部分をコメントアウトして、コメント管理ページ復活が概ね復活。
結構時間かかったな〜、今日はついてないな〜。
解決は表示件数の数
ようやく一番の原因らしきもの「表示件数」をいじれるようになった。
999件になっているのを20件にしてみた。
その状態で
edit-comments.phpの
$wp_list_table->display();
これのコメントアウトした部分を元に戻す。
完全復活〜!。
なんなんだろう。
表示件数は200件では大丈夫だった。
何件でエラーになるかはめんどいのでやらなかった。
ちなみに300件ではこんなサーバーエラーが出た。
サーバーエラー
Request-URI Too Long( URL長すぎでっせ!)
The requested URL’s length exceeds the capacity limit for this server.
使っているサーバーはロリポップだがこのサーバーエラーとも関係あるのか?
要するにちゃんとした原因はわからない。
display()っていう関数に関係しているのはわかるけど・・・・
わかる方、いらっしゃいましたら教えてください〜!。