¿Cómo permitir subidas de imágenes WebP en WordPress? Solución al error de tipo de archivo
He probado ambos códigos, pero sigo recibiendo el mensaje de error: "Lo sentimos, este tipo de archivo no está permitido por razones de seguridad".
// agregar soporte para tipos mime webp
function webp_upload_mimes( $existing_mimes ) {
// agregar webp a la lista de tipos mime
$existing_mimes['webp'] = 'image/webp';
// devolver el array a la función con nuestro tipo mime agregado
return $existing_mimes;
}
add_filter( 'mime_types', 'webp_upload_mimes' );
function my_custom_upload_mimes($mimes = array()) {
// agregar webp a la lista de tipos mime
$existing_mimes['webp'] = 'image/webp';
return $mimes;
}
add_action('upload_mimes', 'my_custom_upload_mimes');
¿Alguna idea?

Es necesario usar el filtro wp_check_filetype_and_ext
para establecer el tipo mime y la extensión para archivos webp, además de usar el filtro upload_mimes
para agregar el tipo mime a la lista de tipos mime permitidos para subir.
/**
* Establece la extensión y tipo mime para archivos .webp.
*
* @param array $wp_check_filetype_and_ext Array de datos del archivo que contiene las claves 'ext', 'type', y
* 'proper_filename'.
* @param string $file Ruta completa al archivo.
* @param string $filename El nombre del archivo (puede diferir de $file debido a que
* $file está en un directorio temporal).
* @param array $mimes Clave es la extensión del archivo con el valor como el 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;
}
/**
* Agrega el tipo de archivo webp a los mimes permitidos
*
* @see https://codex.wordpress.org/Plugin_API/Filter_Reference/upload_mimes
*
* @param array $mimes Tipos mime indexados por la expresión regular de la extensión del archivo correspondiente a
* esos tipos. 'swf' y 'exe' eliminados de la lista completa. 'htm|html' también
* eliminados dependiendo de las capacidades del '$user'.
*
* @return array
*/
add_filter( 'upload_mimes', 'wpse_mime_types_webp' );
function wpse_mime_types_webp( $mimes ) {
$mimes['webp'] = 'image/webp';
return $mimes;
}
Probé esto en WordPress v5.0.1 y pude subir archivos webp después de agregar este código.

Qué extraño. Ya tenía la función upload_mimes y estaba funcionando bien, y luego un día, sin razón aparente, dejó de funcionar. Descubrí esto, agregué tu código (en mi caso era .svg
el problema), y ¡voilà - perfecto! De todos modos, gracias por esto.

No funciona para mí, desafortunadamente. Todavía me sale "Esta imagen no puede ser procesada por el servidor web. Conviértela a JPEG o PNG antes de subirla." Usando WP 5.8.

@WilliamBeaumont Creo que el problema que mencionas es diferente al del OP. Este comentario (y el hilo) podrían ayudar a resolver el error que has notado: https://wordpress.org/support/topic/wordpress-5-8-still-rejects-webp-images/#post-14733877

A veces las subidas están limitadas por tu proveedor de hosting. Intenta definir la constante ALLOW_UNFILTERED_UPLOADS
que permite la subida de cualquier tipo de archivo:
define( 'ALLOW_UNFILTERED_UPLOADS', true ); // Permite subidas sin filtrar
Usa esto en tu archivo wp-config.php
temporalmente, solo para pruebas. Luego vuelve a subir tu archivo, y si aún no funciona, es probable que el hosting haya bloqueado ese tipo de archivo. Asegúrate de eliminar la constante lo antes posible una vez que hayas terminado de probar.
Además, puedes usar la función get_allowed_mime_types()
para verificar los tipos MIME permitidos para subidas.

Logré que funcione creando el siguiente plugin. (Solo necesitas agregar este código a un nuevo archivo en el directorio /wp-content/plugins/
para crear el plugin. Asegúrate de activar el plugin después de crearlo).
<?php
/**
* Plugin Name: WPSE Permitir Subidas Webp
*/
function webp_archivo_y_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_archivo_y_ext', 10, 4 );
function agregar_tipo_mime_webp( $mimes ) {
$mimes['webp'] = 'image/webp';
return $mimes;
}
add_filter( 'upload_mimes', 'agregar_tipo_mime_webp' );

Hice un ejemplo de cómo podría verse esto en una clase:
<?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() {
/** tus otras acciones + filtros */
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;
}
/**
* Establece la extensión y tipo mime para archivos predefinidos.
*
* @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
