Permettere il caricamento di immagini WebP?
Ho provato entrambi questi metodi, ma continuo a ricevere il messaggio di errore: "Spiacente, questo tipo di file non è permesso per motivi di sicurezza."
// aggiungi supporto per i tipi mime webp
function webp_upload_mimes( $existing_mimes ) {
// aggiungi webp alla lista dei tipi mime
$existing_mimes['webp'] = 'image/webp';
// restituisci l'array alla funzione con il nostro tipo mime aggiunto
return $existing_mimes;
}
add_filter( 'mime_types', 'webp_upload_mimes' );
function my_custom_upload_mimes($mimes = array()) {
// aggiungi webp alla lista dei tipi mime
$existing_mimes['webp'] = 'image/webp';
return $mimes;
}
add_action('upload_mimes', 'my_custom_upload_mimes');
Qualche idea?

È necessario utilizzare il filtro wp_check_filetype_and_ext
per impostare il tipo mime e l'estensione per i file webp, oltre a utilizzare il filtro upload_mimes
per aggiungere il tipo mime alla lista dei mime caricabili.
/**
* Imposta l'estensione e il tipo mime per i file .webp.
*
* @param array $wp_check_filetype_and_ext Array di dati del file contenente le chiavi 'ext', 'type' e
* 'proper_filename'.
* @param string $file Percorso completo del file.
* @param string $filename Nome del file (può differire da $file perché
* $file potrebbe essere in una cartella tmp).
* @param array $mimes Chiave è l'estensione del file con valore come tipo mime.
*/
add_filter( 'wp_check_filetype_and_ext', 'wpse_file_and_ext_webp', 10, 4 );
function wpse_file_and_ext_webp( $types, $file, $filename, $mimes ) {
if ( false !== strpos( $filename, '.webp' ) ) {
$types['ext'] = 'webp';
$types['type'] = 'image/webp';
}
return $types;
}
/**
* Aggiunge il tipo file webp ai mime consentiti
*
* @see https://codex.wordpress.org/Plugin_API/Filter_Reference/upload_mimes
*
* @param array $mimes Tipi mime con chiave come regex dell'estensione del file corrispondente
* a quei tipi. 'swf' e 'exe' rimossi dalla lista completa. 'htm|html' anche
* rimosso in base alle capacità dell'utente.
*
* @return array
*/
add_filter( 'upload_mimes', 'wpse_mime_types_webp' );
function wpse_mime_types_webp( $mimes ) {
$mimes['webp'] = 'image/webp';
return $mimes;
}
Ho testato questo codice su WP v5.0.1 e sono riuscito a caricare file webp dopo averlo aggiunto.

Davvero strano. La funzione upload_mimes che avevo già stava funzionando bene, e poi un giorno, senza un motivo apparente, ha smesso di funzionare. Ho scoperto questo, ho aggiunto il tuo codice (nel mio caso era .svg
il problema), e voilà - perfetto! Comunque, grazie per questo.

Purtroppo non funziona per me. Continuo a ricevere "Questa immagine non può essere elaborata dal server web. Convertila in JPEG o PNG prima di caricarla." Uso WP 5.8.

@WilliamBeaumont Penso che il problema che hai menzionato sia diverso da quello dell'OP. Questo commento (e la discussione) potrebbe aiutare a risolvere l'errore che hai notato: https://wordpress.org/support/topic/wordpress-5-8-still-rejects-webp-images/#post-14733877

A volte i caricamenti sono limitati dal tuo hosting. Prova a definire la costante ALLOW_UNFILTERED_UPLOADS
che consente il caricamento per ogni tipo di file:
define( 'ALLOW_UNFILTERED_UPLOADS', true );
Usa questo nel tuo file wp-config.php
per un momento, a scopo di test. Poi ricarica il tuo file, e se ancora non funziona, è probabile che l'hosting abbia bloccato quel tipo di file dal caricamento. Assicurati di rimuovere la costante il prima possibile, quando hai finito di provare.
Inoltre, puoi usare la funzione get_allowed_mime_types()
per verificare i mime type consentiti per il caricamento.

Sono riuscito a farlo funzionare creando il seguente plugin. (Basta aggiungere questo codice a un nuovo file nella directory /wp-content/plugins/
per creare il plugin. Assicurati di attivare il plugin dopo averlo creato.)
<?php
/**
* Plugin Name: WPSE Consenti Upload Webp
*/
function webp_file_and_ext( $mime, $file, $filename, $mimes ) {
$wp_filetype = wp_check_filetype( $filename, $mimes );
if ( in_array( $wp_filetype['ext'], [ 'webp' ] ) ) {
$mime['ext'] = true;
$mime['type'] = true;
}
return $mime;
}
add_filter( 'wp_check_filetype_and_ext', 'webp_file_and_ext', 10, 4 );
function add_webp_mime_type( $mimes ) {
$mimes['webp'] = 'image/webp';
return $mimes;
}
add_filter( 'upload_mimes', 'add_webp_mime_type' );

Ho creato un esempio di come potrebbe essere implementato in una classe:
<?php
class Example {
public array $mime_types = [
'woff' => 'font/woff|application/font-woff|application/x-font-woff|application/x-woff|application/octet-stream',
'woff2' => 'font/woff2|application/font-woff2|application/x-font-woff2|application/x-woff2|application/octet-stream',
'ttf' => 'font/ttf|application/font-ttf|application/x-font-ttf|application/x-ttf|application/octet-stream',
'otf' => 'font/otf|application/font-otf|application/x-font-otf|application/x-otf|application/octet-stream',
'eot' => 'application/vnd.ms-fontobject'
];
private function __construct() {
/** altre tue azioni + filtri */
add_filter( 'upload_mimes', [ $this, 'custom_upload_mimes' ] );
add_filter( 'wp_check_filetype_and_ext', [ $this, 'file_and_ext_webp' ], 10, 4 );
}
/**
* @param $existing_mimes array
*
* @return array
*/
function custom_upload_mimes( $existing_mimes = [] ): array {
foreach ( $this->mime_types as $ext => $value ) {
$existing_mimes[ $ext ] = $value;
}
return $existing_mimes;
}
/**
* Imposta l'estensione e il tipo mime per i file predefiniti.
*
* @return mixed
*/
function file_and_ext_webp( $types, $file, $filename, $mimes ) {
foreach ( $this->mime_types as $ext => $value ) {
if ( false !== strpos( $filename, ".$ext" ) ) {
$types['ext'] = $ext;
$types['type'] = $value;
}
}
return $types;
}
}
https://gist.github.com/frizzant/7ad08ad6bfc0dbac08dabeed73e2d964
