【wpメモ】500 Internal Server Errorが出現した

ご存知のように、現在のCLASSICUSのWebサイトはWordPressで作られおり、ショッピングカート機能はwelcartという、標準機能は無料のWordPress用EC(eコマースの略らしい)プラグインを使用しています。

WordPressというのは非常に簡単かつ強力なCMS(Contents Management Systemつまりコンテンツ管理システム。次々と現れる略称の数々、まったくついていけません)で、無数にあるテーマやプラグインなどを選んでいくだけで相当に完成度の高いWebページ(昔はHP、つまりホームページと言ったものですが)を作ることができます。html手打ちをしてWebをコツコツと作っていた世代から見ると隔世の感があります。

さてこのWordPress、テーマやらプラグインを選び、ちょっとしたデザインや遊びをCSS(カスケード・スタイル・シート、要はhtmlの装飾要素のようなものです)をいじくり回して満足しているうちは良いのですが、本格的に動作の原理(つまりは表示する内容やら順番やら)を変更しようとすると、いささか厄介な事になります。

詳しくは他所へ譲るとして、WordPressはPHPという言語で書かれており、このPHPをカスタマイズすることによって、Web上で可能なことはほとんど何でも実現できてしまう、ある意味禁断の果実といえます。

CLASSICUSのWebページも、特にwelcartを独自の仕様で表示させたかったためもあってPHPをカスタマイズしているのですが(ただし、このPHPカスタマイズも、最近のWordPressは子テーマをカスタマイズすることによって、テーマの基幹部分を壊したり、更新によってカスタマイズが消去されるというようなことが防止されるようになっています)、このPHPカスタマイズによってエラーが出てしまうことが少なからずあります。

最も多いエラーは単純な文法エラーです。括弧が対になっていなかったり、関数の綴り間違いなど、ごく簡単かつ見落としがちなこのようなエラーによって、いきなりWebページが表示されなくなってしまうため、初めて出くわした時には慌てふためいてしまいます。また、エラーの種類は千差万別ですから、気がつくときにはすぐに気がつくのですが、単純であればあるほど見つからなかったりするものです。

さて、ようやく本題です。 商品の並べ替え方法を見直そうと、久々にPHPをカスタマイズ(ややこしく表現すれば、function.phpの並べ替えフックの変更)したのですが、WordPressのエディターで更新したところ、突如として真っ白な画面に「500 Internal Server Error」と表示されてしまったのです。

こうなってしまうと、WordPress自体が動作を止めてしまうため、FTPからファイルをアップロードして復旧を行うより他なくなってしまいます。ところが、FTPで変更した部分を元に戻してもWordPressは動作せず、いささか慌ててしまいました。

ひとしきり検索をして色々な事例を眺め、思案したところで、手始めにfunction.phpを消去してみますと、何事もなかったように復旧してしまいました(function.phpは親テーマにもあるため、子テーマのものが消えても大きな問題とはなりません)。次に、カスタマイズした部分をコメントアウト(/* */ で囲い言語と見なされないコメントとすること)したfunction.phpをアップロードすると、これもまたごく普通に動作します。

これで、エラーはカスタマイズした中にあることが分かりました。しかし、何度見直し、似たような部分と比較しても、エラーらしきものは見つけられず、コメントアウトを外した途端に「Error 500」となってしまいます。

あちらを消しこちらを直し何度試してみても「Error 500」から逃れることが出来ず諦めかけたところで突如閃き、テキストエディターにペーストしたfunction.phpに半角文字検索をかけてみたところ、半角スペースであるはずの部分に謎の空白が挟まっていることが判明しました(キャプチャ写真参照)。そこで、その謎の空白を正しい半角スペースへ変更したものをFTPでアップロードしたところ、あっけなく動作してしまいました。

この謎スペースの文字コードは「00A0」で、これは「ノーブレークスペース」というものらしく、手打ちhtml世代は良くお世話になった「 」と同じもののようです。アルファベットや括弧などの半角と全角の間違いはチェックしていたのですが、まさかスペース部分にこのような罠が潜んでいようとは思いもよりませんでした。一体このようなものがいつどこで混入したのか、謎は残ったままですが。

レアケースとは思いますが、構文上問題が無いのにPHPの動作がおかしい場合にはスペースや改行などに怪しい文字コードが潜んでいないかチェックしてみても良いかもしれません。