Permitir la carga de archivos CSV en WordPress
Estoy intentando permitir archivos CSV en una página del menú del dashboard de esta forma...
<form method="post" enctype="multipart/form-data">
<input type="file" name="csv_file" id="csv_file" multiple="false" accept=".csv" />
<input type="submit" value="Subir archivo" />
</form>
require_once( ABSPATH . 'wp-admin/includes/file.php' );
require_once( ABSPATH . 'wp-admin/includes/media.php' );
$attachment_id = media_handle_upload ( 'csv_file', 0, array(), array(
'test_form' => false,
'mimes' => array(
'csv' => 'text/csv',
),
) );
Cuando subo un archivo CSV al formulario obtengo el siguiente mensaje de error...
Lo sentimos, este tipo de archivo no está permitido por razones de seguridad.
¿Alguien puede ver qué estoy haciendo mal? Había asumido que había permitido el tipo mime CSV en el código anterior.
Existe un error en WordPress 4.7-4.7.3 relacionado con la validación de tipos MIME, por lo que el código proporcionado por Dave Romsey no funcionará.
Hay un plugin en el repositorio que evita las comprobaciones MIME, pero desactiva las verificaciones para todos los usuarios y todas las extensiones. Creo que una mejor solución sería agregar una nueva capacidad para los administradores que les permita subir archivos con extensión .csv.
//* Registrar hooks de activación y desactivación
register_activation_hook( __FILE__ , 'wpse_258192_activation' );
register_deactivation_hook( __FILE__ , 'wpse_258192_deactivation' );
//* Añadir capacidad upload_csv al rol de administrador
function wpse_258192_activation() {
$admin = get_role( 'administrator' );
$admin->add_cap( 'upload_csv' );
}
//* Eliminar capacidad upload_csv del rol de administrador
function wpse_258192_deactivation() {
$admin = get_role( 'administrator' );
$admin->remove_cap( 'upload_csv' );
}
//* Añadir filtro para verificar tipo de archivo y extensión
add_filter( 'wp_check_filetype_and_ext', 'wpse_258192_check_filetype_and_ext', 10, 4 );
//* Si el usuario actual puede upload_csv y la extensión del archivo es csv, sobrescribir argumentos - edición - "$pathinfo" cambiado a "pathinfo"
function wpse_258192_check_filetype_and_ext( $args, $file, $filename, $mimes ) {
if( current_user_can( 'upload_csv' ) && 'csv' === pathinfo( $filename )[ 'extension' ] ){
$args = array(
'ext' => 'csv',
'type' => 'text/csv',
'proper_filename' => $filename,
);
}
return $args;
}

Si deseas una solución temporal rápida y sencilla, puedes permitir subidas sin filtrar en tu archivo wp-config.php.
define('ALLOW_UNFILTERED_UPLOADS', true);
Esta línea probablemente no debería permanecer en tu config.php, pero si necesitas hacer algo como una importación única de productos de WooCommerce mediante CSV, puede ser una solución fácil.

Por defecto, WordPress bloquea la subida de archivos .csv
. El filtro mime_types
te permitirá añadir archivos .csv
o cualquier otro archivo para que puedan ser subidos:
add_filter( 'mime_types', 'wpse_mime_types' );
function wpse_mime_types( $existing_mimes ) {
// Añade csv a la lista de tipos mime permitidos
$existing_mimes['csv'] = 'text/csv';
return $existing_mimes;
}

Entonces, siendo ese el caso, ¿para qué se utiliza la anulación de mime de media_handle_upload?

En realidad, el array $mimes
dentro del array $overrides
sí cumple el mismo propósito después de todo. Así que el problema podría originarse del error señalado por Nathan Johnson en su respuesta. (Tenía habilitado algún código en mi entorno de pruebas que anulaba la verificación de mime debido al error, lo cual había olvidado :)
