サーバーを引越ししたりすると、古い設定などが影響したエラーがよくでます。
そういうのはちょっと特殊だったりするので検索をかけてもなかなか同じ問題にあたった人が少なかったりして解決が難しかったりするのですが、WordPressであれば素がPHPなので自分で解決することができます。
でも苦労してソースを追いかけて、わりと簡単な原因だったよ、とほほ、ということが私の場合多いのですが、今回もそういうケースです。
WordPressで画像をアップロードできない
WordPressの入ったサーバーを専用サーバーからVPSサーバーに変えました。
コンテンツをコピーして運用を始めたのですがWordPressのメディアアップロードでエラーが。
「ディレクトリ uploads/2013/05 を作成できませんでした。この親ディレクトリのアクセス権はサーバーによる書き込みを許可していますか ?」
当然、ディレクトリのパーミッションをまず疑いますわな。案の定、その他に書き込み権限がなかったので権限を付与。
1 |
$ chmod -R a+w wp-content/wordpress/wp-content/uploads/ |
それでもエラー変わらず。
検索かけると、セーフモードが原因というのもけっこうでてきます。
セーフモードはPHP5.4から削除された機能で、なんだかよく分からないのですが削除されたんだからいらない機能なんでしょう。
php.iniをみるとOffになってるので今回は関係ないみたいです。
さあvar_dumpしてみようか
検索かけても解決方法が分からないので、デバッグ開始します。
とりあえずブラウザアップローダの方が分かりやすそうだったのでwp-admin/media-new.phpから。
1 2 3 4 5 6 7 8 9 10 11 12 |
if ( $_POST ) { $location = 'upload.php'; if ( isset($_POST['html-upload']) && !empty($_FILES) ) { check_admin_referer('media-form'); // Upload File button was clicked $id = media_handle_upload( 'async-upload', $post_id ); if ( is_wp_error( $id ) ) $location .= '?message=3'; } wp_redirect( admin_url( $location ) ); exit; } |
この中で$_FILESを表示させてみると、この段階でエラーになってました。
自分の作った.htaccessには
1 2 3 4 |
php_value memory_limit 34M php_value post_max_size 33M php_value upload_max_filesize 32M php_value max_execution_time 600 |
とアップロードする画像の容量を増やしてるのですが、これが何か悪さしてる?といったん消してみると成功、でも何が悪いのか分からず戻してやるとあらら、成功。$_FILESがエラーになってたのは何かの気の迷いに違いない、ここはOK、とデバッグの続きを。
media_handle_uploadの先をみます。こういうとき、PHPStormはCtrl+クリックで関数にジャンプするので便利です。wp_handle_uploadの中の
1 2 3 |
// A writable uploads dir will pass this test. Again, there's no point overriding this one. if ( ! ( ( $uploads = wp_upload_dir($time) ) && false === $uploads['error'] ) ) return call_user_func($upload_error_handler, $file, $uploads['error'] ); |
でひっかかっていました。wp_upload_dirにとびます。
この関数の最初のほうで$upload_pathを
1 |
$upload_path = trim( get_option( 'upload_path' ) ); |
と取得しています。
どうやらここが目指すアップロード先ディレクトリの格納場所のようです。$upload_pathは古いサーバーのパスをとっていました。
get_optionをのぞいてみると・・・あれれ、SQLを発行してDBから取得している!?あ、そうか、管理画面で設定している値なんだな!と気づいて管理画面。
犯人はダッシュボードの設定、盲点!
「設定>メディア」の中に、アップロードする画像の格納場所として、古いサーバーのディレクトリを絶対パスで設定してました。デフォルトはwp-content/uploadsと書いてあるのでそれに変えて画像をアップロードできるようになりました。
それからブログを書くために前の状態に戻そうと設定画面を確認したらアップロードする画像の格納場所を設定する箇所が消えていました。
特定のバージョンのWordPressだけで設定できた値なのかもしれませんね。