web-dev-qa-db-ja.com

拡張子に複数のファイルMIMEタイプを割り当てるには?

追加のファイルタイプを割り当てることができるので、WPではそれらをアップロードすることができます。

add_filter('mime_types', 'my_mimes');
function my_mimes($all)
{
    $all['Zip'] = 'application/Zip';
    return $all;
}

しかし、私は質問を持っています:1つの拡張子に複数のファイルタイプを割り当てる方法?例えば、Zip拡張子 - いくつかのZipファイルはapplication/Zip mimeを持ちますが、他のものはapplication/x-Zipを持ちます(7Zipから来るように)。

それでは、どうやって両方のMIMEをZip拡張子に割り当てることができるでしょうか。

4
T.Todua

WP 5.0.1以降のファイルタイプとファイル拡張子が一致する必要があるため、より厳密なMIMEタイプのチェックに注意してください。例えば参照。この最近の 質問vttファイルタイプについて。

特定のファイル拡張子の二次MIMEタイプ

これは与えられたファイル拡張子のために二次MIMEタイプをサポートする方法の提案です。例として.vttを取りましょう。コアは、そのファイル拡張子のMIMEタイプをtext/vttと想定していますが、finfo_file()の実際のMIMEタイプはtext/plainになることもあります。 finfo_file()はやや バギー のようです。次のようにして、2次MIMEタイプとしてサポートを追加できます。

/**
 * Support for 'text/plain' as the secondary mime type of .vtt files,
 * in addition to the default 'text/vtt' support.
 */
add_filter( 'wp_check_filetype_and_ext', 'wpse323750_secondary_mime', 99, 4 );    

function wpse323750_secondary_mime( $check, $file, $filename, $mimes ) {
    if ( empty( $check['ext'] ) && empty( $check['type'] ) ) {
        // Adjust to your needs!
        $secondary_mime = [ 'vtt' => 'text/plain' ];

        // Run another check, but only for our secondary mime and not on core mime types.
        remove_filter( 'wp_check_filetype_and_ext', 'wpse323750_secondary_mime', 99, 4 );
        $check = wp_check_filetype_and_ext( $file, $filename, $secondary_mime );
        add_filter( 'wp_check_filetype_and_ext', 'wpse323750_secondary_mime', 99, 4 );
    }
    return $check;
}

ここでは、チェックが失敗したかどうかを確認するためにwp_check_filetype_and_extフィルタを使用します。その場合は、wp_check_filetype_and_ext()を再度実行しますが、現在はセカンダリMIMEタイプでのみ実行し、その間は無限ループを回避するためにフィルターコールバックを無効にします。

特定のファイル拡張子に対する複数のMIMEタイプ

.vttファイルに対して2つ以上のMIMEタイプをサポートする必要がある場合、上記のスニペットを以下のように拡張することができます。

/**
 * Demo: Support for 'text/foo' and 'text/bar' mime types of .vtt files,
 * in addition to the default 'text/vtt' support.
 */
add_filter( 'wp_check_filetype_and_ext', 'wpse323750_multi_mimes', 99, 4 );

function wpse323750_multi_mimes( $check, $file, $filename, $mimes ) {
    if ( empty( $check['ext'] ) && empty( $check['type'] ) ) {
        // Adjust to your needs!
        $multi_mimes = [ [ 'vtt' => 'text/foo' ], [ 'vtt' => 'text/bar' ] ];

        // Run new checks for our custom mime types and not on core mime types.
        foreach( $multi_mimes as $mime ) {
            remove_filter( 'wp_check_filetype_and_ext', 'wpse323750_multi_mimes', 99, 4 );
            $check = wp_check_filetype_and_ext( $file, $filename, $mime );
            add_filter( 'wp_check_filetype_and_ext', 'wpse323750_multi_mimes', 99, 4 );
            if ( ! empty( $check['ext'] ) ||  ! empty( $check['type'] ) ) {
                return $check;
            }
        }
    }
    return $check;
}

私はあなたがそれをさらにテストしてあなたのニーズに合わせて調整できることを願っています。

4
birgire

バージールの答えが少し改善されました。 svgに複数のMIMEタイプを追加する必要がありましたが、svgはデフォルトで禁止されているため、upload_mimesに動的フィルターを追加する必要がありました。

class Multiple_Mimes {

    public static function init() {
        add_filter( 'wp_check_filetype_and_ext', [self::class, 'add_multiple_mime_types'], 99, 3 );
    }


    public static function add_multiple_mime_types( $check, $file, $filename ) {
        if ( empty( $check['ext'] ) && empty( $check['type'] ) ) {
            foreach ( self::get_allowed_mime_types() as $mime ) {
                remove_filter( 'wp_check_filetype_and_ext', [ self::class, 'add_multiple_mime_types' ], 99 );
                $mime_filter = function($mimes) use ($mime) {
                    return array_merge($mimes, $mime);
                };

                add_filter('upload_mimes', $mime_filter, 99);
                $check = wp_check_filetype_and_ext( $file, $filename, $mime );
                remove_filter('upload_mimes', $mime_filter, 99);
                add_filter( 'wp_check_filetype_and_ext', [ self::class, 'add_multiple_mime_types' ], 99, 3 );
                if ( ! empty( $check['ext'] ) || ! empty( $check['type'] ) ) {
                    return $check;
                }
            }
        }

        return $check;
    }


    public static function get_allowed_mime_types(){
        return [
            [ 'svg' => 'image/svg' ],
            [ 'svg' => 'image/svg+xml' ],
        ];
    }

}
0