動作確認バージョン
WordPress 4.9.9
WordPress 5.0.3
ググってもできなかったケース
この手の問題はやはりどこでも発生するようで、
ググればいろいろ情報出てくるんだけど、
その通りやってもうまくいかない。
function custom_mime_types( $mimes ) {
$mimes['css'] = 'text/css';
return $mimes;
}
add_filter( 'upload_mimes', 'custom_mime_types' );
こういうやつ。
調べてみると、WordPressで取り扱う MIME の情報には、
もとからちゃんと text/css が入ってるようなので、
そもそもこれやらんでもアップできてしかるべきじゃね?という状況だった。
落とし穴は MIME にあった
いったいどこでエラー吐いてるんだ、と思って
wp-includes の中まで順番に追いかけていくと、
ようやく問題の条件分岐を発見し、
そこで使われてる変数の状態をdumpして愕然。
css 上げてるのに MIME が text/plain になってやがる
WordPress管理画面のメディアのアップロードの処理としては、
wp-admin/admin-ajax.php から始まり、
最終的に wp-includes/functions.php の wp_check_filetype_and_ext() 内で
「期待される MIME とアップされた MIME が違うっぽい」と判断され、
セキュリティ的にアップさせられないよ! というエラーを吐いていた。
動いたパターン
そんなわけで、「拡張子が css だけど MIME は text/plain やで」と
明示的に教えてやることで無事にアップロードできるようになった。
function custom_mime_types( $mimes ) {
$mimes['css'] = 'text/plain';
return $mimes;
}
add_filter( 'upload_mimes', 'custom_mime_types' );
これで解決。
今回ハマったのは、css という ASCII なデータゆえ、なのかな・・。
POST時の MIME が期待の通りに送られてないっぽい感じはあるけど、
それがフォーム側の問題なのか、ブラウザの挙動なのか、Webサーバの設定なのか、
ちょっと追いかけきれてないけど、まぁ解決したのでよしとする。