Permite încărcarea fișierelor CSV
Încerc să permit încărcarea fișierelor CSV într-o pagină de meniu din dashboard astfel...
<form method="post" enctype="multipart/form-data">
<input type="file" name="csv_file" id="csv_file" multiple="false" accept=".csv" />
<input type="submit" value="Încarcă" />
</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',
),
) );
Când încarc un fișier CSV în formular, primesc următoarea eroare...
Ne pare rău, acest tip de fișier nu este permis din motive de securitate.
Poate cineva să identifice ce fac greșit? Am presupus că am permis tipul MIME pentru CSV în codul de mai sus.
Există un bug în WordPress 4.7-4.7.3 legat de validarea tipurilor MIME, așa că codul furnizat de Dave Romsey nu va funcționa.
Există un plugin în repository care ocolesc verificările MIME, dar dezactivează aceste verificări pentru toți utilizatorii și toate extensiile. Cred că o soluție mai bună ar fi să adăugăm o nouă capabilitate pentru administratori care să le permită să încarce fișiere cu extensia .csv.
//* Înregistrează hook-uri pentru activare și dezactivare
register_activation_hook( __FILE__ , 'wpse_258192_activation' );
register_deactivation_hook( __FILE__ , 'wpse_258192_deactivation' );
//* Adaugă capabilitatea upload_csv rolului de administrator
function wpse_258192_activation() {
$admin = get_role( 'administrator' );
$admin->add_cap( 'upload_csv' );
}
//* Elimină capabilitatea upload_csv din rolul de administrator
function wpse_258192_deactivation() {
$admin = get_role( 'administrator' );
$admin->remove_cap( 'upload_csv' );
}
//* Adaugă filtru pentru verificarea tipului de fișier și extensiei
add_filter( 'wp_check_filetype_and_ext', 'wpse_258192_check_filetype_and_ext', 10, 4 );
//* Dacă utilizatorul curent are dreptul upload_csv și extensia fișierului este csv, suprascrie argumentele - edit - "$pathinfo" schimbat în "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;
}

Dacă dorești o soluție temporară rapidă și ușoară, poți permite încărcări nefiltrate în fișierul tău wp-config.php.
define('ALLOW_UNFILTERED_UPLOADS', true);
Această linie de cod probabil nu ar trebui să rămână în config.php, dar dacă vrei să faci ceva precum un import de produse WooCommerce prin CSV doar o singură dată, poate fi o soluție ușoară.

În mod implicit, WordPress blochează încărcarea fișierelor .csv
. Filtru mime_types
vă va permite să adăugați fișiere .csv
sau orice alt tip de fișier pentru încărcare:
add_filter( 'mime_types', 'wpse_mime_types' );
function wpse_mime_types( $existing_mimes ) {
// Adaugă csv la lista de tipuri mime permise
$existing_mimes['csv'] = 'text/csv';
return $existing_mimes;
}

Deci, având în vedere acest lucru, pentru ce este folosită suprascrierea mime a media_handle_upload?

De fapt, array-ul $mimes
din array-ul $overrides
are același scop până la urmă. Așadar, problema ar putea proveni din bug-ul menționat de Nathan Johnson în răspunsul său. (Aveam activat un cod în mediul meu de testare care suprascria verificarea mime din cauza bug-ului, lucru pe care l-am uitat :)
