Permettere il caricamento di file CSV
Sto cercando di permettere il caricamento di file CSV in una pagina del menu dashboard come questa...
<form method="post" enctype="multipart/form-data">
<input type="file" name="csv_file" id="csv_file" multiple="false" accept=".csv" />
<input type="submit" value="Carica" />
</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',
),
) );
Quando carico un file CSV nel form ottengo il seguente messaggio di errore...
Sorry, this file type is not permitted for security reasons.
Qualcuno riesce a vedere cosa sto sbagliando? Pensavo di aver già permesso il tipo MIME per i CSV nel codice sopra.

C'è un bug in WordPress 4.7-4.7.3 relativo alla validazione dei tipi MIME, quindi il codice fornito da Dave Romsey non funzionerà.
Esiste un plugin nel repository che bypassa i controlli MIME, ma disabilita i controlli per tutti gli utenti e tutte le estensioni. Penso che un modo migliore sarebbe aggiungere una nuova capability per gli amministratori che permetta loro di caricare file con estensione .csv.
//* Registra gli hook di attivazione e disattivazione
register_activation_hook( __FILE__ , 'wpse_258192_activation' );
register_deactivation_hook( __FILE__ , 'wpse_258192_deactivation' );
//* Aggiunge la capability upload_csv al ruolo amministratore
function wpse_258192_activation() {
$admin = get_role( 'administrator' );
$admin->add_cap( 'upload_csv' );
}
//* Rimuove la capability upload_csv dal ruolo amministratore
function wpse_258192_deactivation() {
$admin = get_role( 'administrator' );
$admin->remove_cap( 'upload_csv' );
}
//* Aggiunge il filtro per verificare tipo di file e estensione
add_filter( 'wp_check_filetype_and_ext', 'wpse_258192_check_filetype_and_ext', 10, 4 );
//* Se l'utente corrente può upload_csv e l'estensione del file è csv, sovrascrive gli argomenti - modifica - "$pathinfo" cambiato in "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;
}

Se desideri una soluzione temporanea rapida e semplice, puoi consentire upload non filtrati nel tuo file wp-config.php.
define('ALLOW_UNFILTERED_UPLOADS', true);
Questa riga probabilmente non dovrebbe rimanere nel tuo config.php, ma se vuoi fare qualcosa come un'importazione di prodotti WooCommerce via CSV una sola volta, può essere una soluzione semplice.

Di default, WordPress blocca il caricamento di file .csv
. Il filtro mime_types
ti permetterà di aggiungere i file .csv
o qualsiasi altro file da caricare:
add_filter( 'mime_types', 'wpse_mime_types' );
function wpse_mime_types( $existing_mimes ) {
// Aggiunge csv alla lista dei mime type consentiti
$existing_mimes['csv'] = 'text/csv';
return $existing_mimes;
}

Quindi, in questo caso, a cosa serve l'override del mime in media_handle_upload?

In realtà, l'array $mimes
all'interno dell'array $overrides
serve effettivamente allo stesso scopo. Quindi il problema potrebbe derivare dal bug segnalato da Nathan Johnson nella sua risposta. (Avevo del codice abilitato nel mio ambiente di test che bypassava il controllo del mime a causa del bug, cosa che avevo dimenticato :)
