web-dev-qa-db-ja.com

SVGファイルが最新の時点以降アップロードされない WP 更新

私はSVGファイルをアップロードすることを可能にする私の機能PHPファイルに抜粋を持っています。今日の最新バージョンのWPにアップグレードしてから、svgsをアップロードできなくなりました。私はまた、CSSトリックのWebサイトからの2番目のコードスニペットを試してみましたが、どちらもうまくいきません。

誰かが知っていますか?.

これが私が通常使うコードです:

function svg_mime_types( $mimes ) {
   mimes['svg'] = 'image/svg+xml';
   return $mimes;}
add_filter( 'upload_mimes', 'svg_mime_types' );  

どうもありがとう

ポール.

16
Paul12_

WordPress 4.7.1では 変更が導入されました アップロードされたファイルの本当のMIMEタイプをチェックします。これはSVGやDOCXのようなファイルタイプのアップロードを中断します。 WordPress Coreにはすでにこの問題のチケットが存在しています。こちらで詳細を読むことができます。

一時的な および推奨される回避策(この問題が解決するまでの間)は次のプラグインです。
実際のMIMEチェックを無効にする

そのプラグインを使用したくない場合は、これと同じ機能があります。

add_filter( 'wp_check_filetype_and_ext', function($data, $file, $filename, $mimes) {
    global $wp_version;

    if ( '4.7.2' !== $wp_version ) {
       return $data;
    }

    $filetype = wp_check_filetype( $filename, $mimes );

    return [
        'ext'             => $filetype['ext'],
        'type'            => $filetype['type'],
        'proper_filename' => $data['proper_filename']
    ];

}, 10, 4 );

この断片にはWordPressが更新されるとすぐに修正を無効にするバージョンチェックが含まれていることに注意してください。

編集

この問題は4.7.2で修正されるように当初設定されていました。しかし、 4.7.2は緊急のセキュリティリリースだった ので、修正してもそのバージョンにはなりませんでした。これは4.7.3で修正される予定です。

16
Gchtr

これはこのチケットに関連している可能性があるようです https://core.trac.wordpress.org/ticket/39552 、4.7.1で壊れたもののように見えます

4
Mark Kaplun

誰もが今あるものにうまくいっただけではないようです。

歴史/背景

私は2015年にCSS-Tricksの記事に基づいてSVGアップローダを作成しました。私はまたグリッドを画像プレビューのために動かしてもらって、そして他のいくつかの修正を使いました。単純なプラグイン(IMOファイルタイプのプラグインは単純なはずです)

溶液

4.7ではいくつか変更がありました。本当のPITAは、image/ mime types WPが画像にGdを使っていることです。これを回避するために、Gdがファイルをめちゃくちゃにしないようにsvg拡張子をapplication/svg+xmlを使用するように設定しました。

更新: 4.7.2の時点でいくつかの明るい火花がそれを破った

それから後でフック経由でそれをimage/svg+xmlに戻します。それは他の答えで使われているのと同じですが、私たちはまず効果を排除するために私たちの特定のケースにそれを固定します(それはSVGファイルです)。私たちは$data['ext']を読むことに頼ることができます(ただ一つの比較と一つの配列/ハッシュアクセスとしてファイル情報を得るための関数より安いはずです)。

更新: 4.7.2以降では$data['ext']は常に設定されるわけではないので、strtolower(end(explode('.', $filename)))を使用してファイル名から拡張子を1未満(潜在的に安全でない)に拡張します。私がFileInfoを使って本当に戦っているのは、本質的にPHP拡張子に頼るのは不透明過ぎて誰にとってもうまくいくとは限らないからです。 )拡張機能の代わりに機能するものが欲しいのですが。 FileInfoの出力を信頼している拡張機能(5.6以降ではこれがデフォルトだと思います)を持っている人たちにとって正しい情報を持っていることはもはや問題ではありません。また、これはプラグインなので、コアを変更しているのではなく、このコードを無効にしたりフックを登録解除したりすることはできません。

https://github.com/Lewiscowles1986/WordPressSVGPlugin

見る

その他の回避策

フィルタリングされていないアップロードを許可することは恐ろしい解決策です。他の人がこのスレッドにリンクしているとメディアアップローダを介してphpファイルをアップロードすることができるからです(それは悪いので、やめて考えてください)。

チェックせずにすべてのファイルにすべてのファイルを強制します(皮肉なことに、MIMEタイプにimage/がある場合、単純なextチェックはできません)。これは、比較的ニッチな問題を解決するためのはるかに広範囲の効果を生み出す可能性を秘めており、全体的により多くの作業を導入します(管理者ユーザーが管理メディアUIを機能させるためのより多くの作業も導入します)。

Mimeをapplication/svg + xmlのままにして、単にアップロードするMIMEタイプをフィルタリングしたとしても、おすすめの画像として使用するには修正が必要になるでしょう。慎重に戦いを選ぶ。

お役に立てれば。

2
MrMesees