WordPress を使っていると、画像のアップロード時に「HTTP エラー」が出ることがあります。ネットで検索すると、ファイルの権限に問題があるという説や、テーマに数行のコードを追加すれば直るという説など、さまざまな情報が見つかります。どれも「可能性はある」のですが、最も確実なのは、サーバーの Error Log を確認してエラーの原因を特定することです。ちょうど私も今日この問題に遭遇したので、私の解決方法と、そのほかに考えられる原因をまとめておきます!
ネット上にはすでに多くの解決法があるので、ここでは操作手順には触れず、その背後にある原因を簡単に説明します。解決法を見てすぐに試すのではなく、「何が起きているのか」を考えられるようになってほしいと思います。何が起きているのか分からないまま解決法を試すと、かえって問題を増やしてしまうことがあります。これは初心者によくあるパターンです。問題が起きるたびに Google で答えを探してそのまま真似をし、背後で何が起きているのかを理解しないと、貴重な学びの機会を逃してしまいます。
この問題で最も多い原因は、wp-content/uplaods のパーミッションが不足していることです。その結果、WordPress がファイルをアップロードしたり、フォルダーを作成したりできなくなります。手っ取り早い解決法は、パーミッションを 777 に設定することです。777 では、誰でも読み取り・書き込み・実行ができてしまいます。サーバーを自分だけで使っていて、セキュリティをあまり気にしないのであれば、それでもまあ何とかなります。ただ、より良い方法は、正しいファイルの所有者とグループを指定し、775 などの適切なパーミッションを設定することです。
ファイルサイズが大きすぎることも、アップロードできない原因になる場合があります。理論上は、この場合には「HTTP エラー」ではなく専用のエラーメッセージが表示されるはずです。ただ、この可能性に言及している人が多かったので、ここで取り上げておきます。この問題が起きたときは、Web サーバーの「ファイルアップロードの上限」を調整するだけでは解決しないことがあります。メモリの上限や POST Data Size も関係している場合があるのです。WordPress のファイルアップロードは HTTP POST で処理されます。そのため、たとえば POST で送れるデータが 10MB までに設定されていれば、ファイルアップロードの上限を 50MB にしても意味がありません。メモリの上限も同じ考え方です。
また、PHP はアップロード時にファイルをいったん /tmp ディレクトリに一時保存します。このディレクトリが存在しない場合や、PHP に書き込むための十分な権限がない場合も、アップロードエラーの原因になることがあります。
ほかにも、ファイル名に特殊文字が含まれている、サーバーのメモリが不足している、WordPress のバグがある、といった裏付けのない推測もあります。これらは、いくつかの方法を組み合わせて原因を切り分けることができます。たとえば、ファイル名を 001.jpg のようにシンプルにして、アップロードできるか試してみたり、Google で過去 1 週間にアップロードエラーの報告がないかを調べて、最新版の WordPress のバグの可能性を探ったりできます。
今回の件は少し不思議でした。一昨日は記事を書いているときに、問題なく画像をアップロードできていたのです。その後の数日間は何も操作していないので、アップロードできなくなる理由がありません。今は 1 月ですし、数日前も 1 月でした。画像は同じフォルダーにアップロードしているので、フォルダーを作成する権限の問題でもありません。確認したところ、権限の問題ではないことも確かめられました。さらに困ったことに、Apache Error Log を見てもひとことも手がかりがありませんでした……。そこで思い返すと、この数日の唯一の変化は、WordPress が自動アップデートされたことでした。また、「HTTP エラー」は PHP Image Library がサポートされていないことが原因だ、と書いている記事も多く見かけました。WordPress は標準でサムネイルの作成に ImageMagick を使うため、サーバーに ImageMagick がインストールされていないか、バージョンが古すぎると、画像のアップロードに失敗します。案の定、ImageMagick をアップグレードしたところ、無事にアップロードできるようになりました。推測ですが、前のバージョンの WordPress にセキュリティ関連の更新があり、古い ImageMagick では動かなくなったのではないかと思います。
ネットでは、functions.php を修正してコードを追加する方法もよく紹介されています。これは通常、上で触れた ImageMagick の問題を回避するためのものです。たとえば下のコードは、WordPress の標準の画像処理モジュールを ImageMagick ではなく GD に切り替えるものです。ただ、私はこれは根本的な解決ではなく、その場しのぎの方法だと考えています。より良い解決法は、サーバーに ImageMagick をインストール(またはアップデート)することです。共有ホスティングなどで自分でインストール内容を決められない場合を除き、画像処理モジュールを GD に変えるのではなく、ImageMagick をインストールすることをおすすめします。
add_filter( 'wp_image_editors', 'change_graphic_lib' );
function change_graphic_lib($array) {
return array( 'WP_Image_Editor_GD', 'WP_Image_Editor_Imagick' );
}