追加のファイルタイプを割り当てることができるので、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
拡張子に割り当てることができるでしょうか。
WP 5.0.1以降のファイルタイプとファイル拡張子が一致する必要があるため、より厳密なMIMEタイプのチェックに注意してください。例えば参照。この最近の 質問vtt
ファイルタイプについて。
これは与えられたファイル拡張子のために二次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タイプでのみ実行し、その間は無限ループを回避するためにフィルターコールバックを無効にします。
.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;
}
私はあなたがそれをさらにテストしてあなたのニーズに合わせて調整できることを願っています。
バージールの答えが少し改善されました。 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' ],
];
}
}