Разрешить загрузку CSV файлов
Я пытаюсь разрешить загрузку CSV файлов на странице админ-панели следующим образом...
<form method="post" enctype="multipart/form-data">
<input type="file" name="csv_file" id="csv_file" multiple="false" accept=".csv" />
<input type="submit" value="Загрузить" />
</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', // Указываем разрешенный MIME тип для CSV
),
) );
При попытке загрузить CSV файл через эту форму я получаю следующую ошибку...
Извините, этот тип файла не разрешен по соображениям безопасности.
Кто-нибудь может подсказать, что я делаю не так? Я предполагал, что разрешил MIME тип для CSV в приведенном выше коде.
В WordPress 4.7-4.7.3 существует баг, связанный с проверкой MIME-типов, поэтому код, предоставленный Dave Romsey, не будет работать.
Существует плагин в репозитории, который обходит проверку MIME-типов, но он отключает проверки для всех пользователей и всех расширений. Я считаю, что лучшим решением будет добавить новую возможность (capability) для администраторов, позволяющую им загружать файлы с расширением .csv.
//* Регистрация хуков активации и деактивации
register_activation_hook( __FILE__ , 'wpse_258192_activation' );
register_deactivation_hook( __FILE__ , 'wpse_258192_deactivation' );
//* Добавление возможности upload_csv для роли администратора
function wpse_258192_activation() {
$admin = get_role( 'administrator' );
$admin->add_cap( 'upload_csv' );
}
//* Удаление возможности upload_csv у роли администратора
function wpse_258192_deactivation() {
$admin = get_role( 'administrator' );
$admin->remove_cap( 'upload_csv' );
}
//* Добавление фильтра для проверки типа файла и расширения
add_filter( 'wp_check_filetype_and_ext', 'wpse_258192_check_filetype_and_ext', 10, 4 );
//* Если текущий пользователь имеет право upload_csv и расширение файла csv, переопределяем аргументы - примечание: "$pathinfo" изменено на "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;
}

Если вам нужно временное быстрое и простое решение, вы можете разрешить незащищенные загрузки в вашем файле wp-config.php.
define('ALLOW_UNFILTERED_UPLOADS', true);
Эту строку, вероятно, не стоит оставлять в вашем config.php на постоянной основе, но если вам нужно выполнить что-то вроде импорта товаров WooCommerce через CSV всего один раз, это может быть простым решением.

По умолчанию WordPress блокирует загрузку файлов с расширением .csv
. Фильтр mime_types
позволит вам разрешить загрузку .csv
файлов или любых других типов файлов:
add_filter( 'mime_types', 'wpse_mime_types' );
function wpse_mime_types( $existing_mimes ) {
// Добавляем csv в список разрешенных MIME-типов
$existing_mimes['csv'] = 'text/csv';
return $existing_mimes;
}

Итак, учитывая это, для чего предназначено переопределение mime в media_handle_upload?

На самом деле, массив $mimes
внутри массива $overrides
действительно служит той же цели. Так что проблема может быть связана с ошибкой, отмеченной Натаном Джонсоном в его ответе. (У меня в тестовой среде был включен код, который переопределял проверку mime из-за этой ошибки, о чем я забыл :)
