Я пытаюсь создать случайное автоматическое имя для загружаемых файлов в WordPress, и я сделал это, но не полностью. Посмотрите, пожалуйста, мой код.
Мне нужно проверить новые имена файлов на предмет дублирования, а затем вернуть имя файла или сгенерировать новое имя, в зависимости от проверки. Но я не знаю, как проверить имена файлов на дублирование. Вы можете мне с этим помочь?
function new_upload_filename($filename, $filename_raw) {
$info = pathinfo( $filename );
$type = $info['extension'];
if ( $type == 'jpg' || $type == 'jpeg' || $type == 'png' ) {
$prefix = 'img_';
} elseif ( $type == 'pdf' || $type == 'txt' || $type == 'docx' || $type == 'doc' || $type == 'xlsx' || $type == 'xls' ) {
$prefix = 'doc_';
} elseif ( $type == 'mp4' || $type == 'avi' ) {
$prefix = 'mov_';
} elseif ( $type == 'gif' ) {
$prefix = 'gif_';
} else {
$prefix = 'file_';
}
while ( $duplicatecheck ) {
$ext = empty( $info['extension'] ) ? '' : '.' . $info['extension'];
$rand = rand(11111,9999);
$newname = $prefix . $rand . $ext;
$duplicatecheck = // duplicate name checker (true if dublicate or false if not)
return $newname;
}
add_filter('sanitize_file_name', 'new_upload_filename', 10, 2);
В Wordpress есть встроенная функция проверки, если имена дублируются, то дубликату присваивается суффикс -1 (++). Но я не знаю, как его использовать в своем чекере. https://developer.wordpress.org/reference/functions/wp_unique_filename/
Спасибо.
UPD:
Готовый.
do {
$ext = empty( $info['extension'] ) ? '' : '.' . $info['extension'];
$rand = rand(11111,9999);
$newname = $prefix . $rand . $ext;
$upload_dir = wp_get_upload_dir();
$namecheck = is_file( $upload_dir['path'] . DIRECTORY_SEPARATOR . $newname );
} while ( $namecheck );






Вам нужно будет проанализировать все ваши файлы, используя что-то вроде readdir(), или сохранить сгенерированные имена в базе данных в виде массива и пройти через это.
Почему бы просто не сгенерировать более линейное имя файла, используя что-то вроде текущей временной метки unix, чтобы снизить риск коллизий, пока они именуются?
$newname = $prefix . time() . $ext;
Или, если вы получаете несколько файлов в секунду, вы можете получить идентификационную информацию от пользователя:
$newname = $prefix . get_current_user_id() . time(). $ext;
Или, если вы пытаетесь немного запутать его, просто пропустите его через базовый хеш, например md5.
$hash = md5( get_current_user_id() . time() );
$newname = $prefix . $hash . $ext;
Используйте MD5-хэш Unix Date + filename + username + uniqid. Спросите is_file, существует ли файл. Если да, увеличьте хеш и проверьте снова.
В качестве альтернативы, если ваши файлы каким-то образом ссылаются в базе данных, вы можете использовать database_id в качестве имени файла.