Переименование файлов во время загрузки в бэкэнде Wordpress

Есть ли способ переименовать файлы во время выполнения загрузки в бэкэнде Wordpress 3.0? Я хотел бы иметь последовательное именование файлов, особенно для изображений.

Я думаю, что хэш-значение 12 (+ -) цифр исходного имени файла или что-то подобное было бы удивительным. Любые предложения?

Привет

Ответы

Ответ 1

Но было бы проще сделать это перед загрузкой файлов.

Не совсем уверен в этом - это кажется довольно простым;

/**
 * @link http://stackoverflow.com/a/3261107/247223
 */
function so_3261107_hash_filename( $filename ) {
    $info = pathinfo( $filename );
    $ext  = empty( $info['extension'] ) ? '' : '.' . $info['extension'];
    $name = basename( $filename, $ext );

    return md5( $name ) . $ext;
}

add_filter( 'sanitize_file_name', 'so_3261107_hash_filename', 10 );

Этот фильтр создает 32-символьный хэш исходного имени файла, сохраняя расширение файла. Вы можете немного сократить его, используя substr(), если хотите.

Этот фильтр запускается после того, как файл был загружен во временную папку на вашем сервере, но до того, как он будет изменен (если применимо) и сохранен в вашей папке uploads.

Обратите внимание, что нет риска перезаписать файл - в случае, если новый хэшированный файл совпадает с тем, который уже существует, WordPress попытается добавить добавочную цифру к имени файла, пока не будет больше конфликта.

Плагин WordPress

<?php

/**
 * Plugin Name: Hash Upload Filename
 * Plugin URI:  http://stackoverflow.com/questions/3259696
 * Description: Rename uploaded files as the hash of their original.
 * Version:     0.1
 */

/**
 * Filter {@see sanitize_file_name()} and return an MD5 hash.
 *
 * @param  string $filename
 * @return string
 */
function so_3261107_hash_filename( $filename ) {
    $info = pathinfo( $filename );
    $ext  = empty( $info['extension'] ) ? '' : '.' . $info['extension'];
    $name = basename( $filename, $ext );

    return md5( $name ) . $ext;
}

add_filter( 'sanitize_file_name', 'so_3261107_hash_filename', 10 );

Ответ 2

Я сделал для него плагин. Я сделал это, потому что у меня были слишком большие проблемы с моими клиентами, которые пытались загрузить изображения со специальными символами.

http://wordpress.org/plugins/file-renaming-on-upload

Ответ 3

Я действительно искал плагин, который мог бы сделать это правильно, и, наконец, я сам это сделал. Это доступно в моем блоге: http://www.meow.fr/media-file-renamer! Если вы используете его, пожалуйста, дайте мне отзыв:) Я искренне надеюсь, что это поможет!

Ответ 4

Я реализовал то же самое, я хотел получить более случайное имя файла, чем оригинал, поскольку сайт, для которого я использую это, предназначен только для фото, и все файлы находятся в одном каталоге.

я сделал следующее

return md5($ip . uniqid(mt_rand(), true)) . $ext;

Ответ 5

http://wpapi.com/change-image-name-to-wordpress-post-slug-during-upload/

BTW:

Добавить фильтр в sanitize_file_name абсолютно неверен, поскольку функция sanitize_file_name() является вспомогательной функцией для форматирования строки, ее можно использовать в другом месте, например, плагины или темы.

function wp_modify_uploaded_file_names($file) {
    $info = pathinfo($file['name']);
    $ext  = empty($info['extension']) ? '' : '.' . $info['extension'];
    $name = basename($file['name'], $ext);

    $file['name'] = uniqid() . $ext; // uniqid method
    // $file['name'] = md5($name) . $ext; // md5 method
    // $file['name'] = base64_encode($name) . $ext; // base64 method

    return $file;
}

add_filter('wp_handle_upload_prefilter', 'wp_modify_uploaded_file_names', 1, 1);

Ответ 6

Вы не можете автозарегистрировать файл с помощью функции медиабиблиотеки. Я бы рекомендовал переименовать файлы перед их загрузкой. Даже после загрузки файла вы не можете переименовать его в WordPress, но только через FTP.

Единственный способ сделать это - это плагин, который подключается к процессу загрузки медиабиблиотеки. Но было бы проще сделать это перед загрузкой файлов.