Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
Ваша статья из разряда вредных советов и является довольно костыльным решением. Вы решаете одну проблему создавая другую. Если вы не php программист и не знаете как лучше решить вопрос без последствий — то лучше всего будет обратится к тем, кто знает.
Microtime — это не ГСПЧ.
CRC32 — это не хеш, а код проверки целостности.
название файла = его хэш + правильное расширение, в папке — две/три буквы этого хэша
вставить в случайных местах
/**
* Plugin Name: %Имя_Вашего_Великолепного_Плагина%
*/
patch. Не вижу трудностей.Ничего, потому что написал плагин и в любой точке мира, даже без интернета сплю спокойно.
В сухом остатке имеем костыльное решение (правка движка), которое порождает неудобства (необходимость повторения операции после каждого обновления движка), которые в свою очередь решаются еще одним костылём (diff файл, который не имеет никаких гарантий, что правила прописанные в нём сработают, так как исходный файл может быть изменен в процессе обновления).
patch можно обернуть в bash скрипт, который проверит --dry-run проходит ли он, и если все в порядке — удаляет .orig файл и применяет diff. В противном случае сообщает пользователю что что-то поменялось внутри файла.functions.php, это тоже не конец света, а всего лишь новое имя файла в команде, скопировать и вставить. Далее как написано выше — если пользователь обернул patch, то его скрипт сообщит то, что он в него заложил. Иначе первый «сухой» прогон выдаст ошибку.Ваше решение требует наличие некоторого количества умений, больше доступа и больше телодвижений
/**
* Plugin Name: %Имя_Вашего_Великолепного_Плагина%
*/
add_action('add_attachment', function ($attachmentId) {
$attachment = get_post($attachmentId);
$path = get_attached_file($attachmentId);
// в $path у Вас полный путь к файлу, а в $attachment - объект WP_Post вашего аттачмента
// ... здесь Ваша логика для того, чтоб переименовать файл.
});
$uploads = wp_upload_dir();
wp_update_post(array(
'ID' => $attachment->ID,
'guid' => trailingslashit($uploads['url']) . basename($path_to_renamed_file)
))
<?php
/**
* Plugin Name: Rename Attachments
*/
/**
* Class RenameAttachments
* @package RenameAttachments
*/
class RenameAttachments
{
/**
* Hooks the "add_attachment" action.
*/
public static function register()
{
add_action('add_attachment', array(__CLASS__, 'rename'));
add_filter(
'filter_attachment_filename',
array(__CLASS__, 'filterAttachmentFileName')
);
}
/**
* Filters attachment file name.
* @param string $file Attachment file name.
* @returns string
*/
public static function filterAttachmentFileName($file)
{
return crc32(md5(mt_rand() . microtime()) . sanitize_file_name($file)) . '_' . sanitize_file_name($file);
}
/**
* Renames the attachment.
* @param int $attachmentId Attachment ID.
*/
public static function rename($attachmentId)
{
if (!$path = get_attached_file($attachmentId)) {
return;
}
$trash = array();
$uploads = wp_upload_dir();
$original = basename($path);
$filtered = apply_filters(
'filter_attachment_filename',
$original
);
$images = glob(dirname($path) . '/' . pathinfo($original, PATHINFO_FILENAME) . '*');
if ($images === false || (is_array($images) && count($images) === 0)) {
return;
}
foreach ($images as $image) {
$name = str_replace($original, $filtered, $image);
if (copy($image, $name)) {
$trash[] = $image;
}
}
$path = dirname($path) . '/' . $filtered;
$attachedFile = str_replace($uploads['basedir'] . '/', '', $path);
if (update_post_meta($attachmentId, '_wp_attached_file', $attachedFile) === true) {
foreach ($trash as $file) {
@unlink($file);
}
}
}
}
RenameAttachments::register();
$bs_extid=strpos(strrev(sanitize_file_name($filename)),".");
if($bs_extid){
$bs_extid=strlen(sanitize_file_name($filename))-1-$bs_extid;
$filename = substr(sanitize_file_name($filename),0,$bs_extid)."_".crc32(md5(microtime()).sanitize_file_name($filename))."_".substr(sanitize_file_name($filename),$bs_extid);
} else {
$filename = sanitize_file_name($filename)."_".crc32(md5(microtime()).sanitize_file_name($filename)).sanitize_file_name($filename)),0,16);
}
Зачем городить такой огород?$filename = sanitize_file_name($filename);
$filename = pathinfo($filename, PATHINFO_FILENAME) . '_' . mt_rand() . (pathinfo($filename, PATHINFO_EXTENSION) ? '.' . pathinfo($filename, PATHINFO_EXTENSION) : '');
mtrand использовать и текстовую строку. Которую знает только владелец. "blablabla" была упомянута в статье как пример. В таком случае даже зная время создания файла и имя файла не получить следующего файла, так как неизвестна строка, участвующая в генерации.for file in *; do cp $file ${file}_`identify -format '%[EXIF:DateTimeOriginal]' $file|sed 's/[ :]//g'`.jpg ;done
Мусор в именах файлов или прячем наших лебедей (wordpress)