web-dev-qa-db-fra.com

Comment affecter plusieurs types de fichiers-mime à une extension?

nous pouvons assigner des types de fichiers supplémentaires, donc WP leur permet d'être chargés, comme:

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

Mais j’ai une question: comment affecter plusieurs types de fichiers à une extension? Par exemple, Zip extension - certains fichiers Zip ont application/Zip mime, alors que d'autres ont application/x-Zip (comme, venant de 7Zip).

Alors, comment pouvons-nous affecter les deux mimes à l'extension Zip?

4
T.Todua

Notez la vérification de type mime plus stricte depuis WP 5.0.1 où le contenu du fichier et son extension doivent correspondre. Voir par exemple this récent question sur le type de fichier vtt.

Type MIME secondaire pour une extension de fichier donnée

Voici une suggestion sur la façon de prendre en charge un type mime secondaire pour une extension de fichier donnée. Prenons .vtt à titre d'exemple. Le noyau suppose le type mime de text/vtt pour cette extension de fichier, mais le type mime réel de finfo_file() peut parfois être text/plain. La finfo_file() semble être un peu buggy . Nous pouvons lui ajouter un support en tant que type mime secondaire avec:

/**
 * 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;
}

Ici, nous utilisons le filtre wp_check_filetype_and_ext pour voir si la vérification a échoué. Dans ce cas, nous exécutons à nouveau wp_check_filetype_and_ext() mais maintenant uniquement sur notre type mime secondaire, en désactivant notre rappel de filtre entre-temps pour éviter une boucle infinie.

Plusieurs types de mime pour une extension de fichier donnée

Si nous devons prendre en charge plus de deux types MIME pour les fichiers .vtt, nous pouvons développer l’extrait de code ci-dessus avec:

/**
 * 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;
}

J'espère que vous pourrez le tester davantage et l'adapter à vos besoins.

4
birgire