Изменение имени файла вложения
Есть ли функция, которая позволяет изменить имя файла вложения, основываясь на ID вложения, которое у меня есть?
Спасибо! Деннис

Это позволит вам переименовать вложение сразу после его загрузки:
add_action('add_attachment', 'rename_attachment');
function rename_attachment($post_ID){
$file = get_attached_file($post_ID);
$path = pathinfo($file);
//dirname = Путь к файлу
//basename = ИмяФайла.Расширение
//extension = Расширение
//filename = Имя файла
$newfilename = "НОВОЕ ИМЯ ФАЙЛА ЗДЕСЬ";
$newfile = $path['dirname']."/".$newfilename.".".$path['extension'];
rename($file, $newfile);
update_attached_file( $post_ID, $newfile );
}

хм, я получаю эту ошибку rename(): http wrapper не поддерживает переименование

Думаю, для ясности лучше назвать $post_ID как $attach_ID или что-то подобное, потому что это может быть перепутано с ID родительской записи, тогда как подразумевается ID вложения. Хороший ответ :)

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

Применение
Функция работает для:
- Добавления файлов
- Обновления файлов (да, включая уже существующие)
- Множественных файлов
Ограничения
Функция прерывает выполнение для автоматических сохранений, выполняемых WordPress автоматически, или если целевые типы файлов или MIME-типы не соответствуют заданным.Дополнительные возможности
Вы можете задать имя файла, типы файлов и MIME-типы, которые хотите изменить внутри функции перед циклом foreach
. Файлу присваивается ID записи, а затем ID вложения, что позволяет безопасно загружать и изменять несколько файлов одновременно. Это также обеспечивает сортировку файлов сначала по ID записи, затем по ID вложения.
function wpse30313_update_attachment_names($post_ID)
{
// Прерываем, если WordPress выполняет автосохранение
if ( defined('DOING_AUTOSAVE') && DOING_AUTOSAVE )
return;
# >>>> НАСТРОЙКИ
// Новое имя файла:
$new_file_name = "___";
// Лучше использовать название записи вместо произвольного заголовка:
# $post_data = get_post( $post_ID );
# $new_file_name = $post_data->post_name;
// Типы файлов для изменения:
$allowed_types = array(
'image'
);
// MIME-типы для изменения:
$allowed_ext = array(
'jpg'
,'jpeg'
,'gif'
,'png'
);
# <<<< НАСТРОЙКИ
// Добавляем ID записи для предотвращения конфликтов
$new_file_name = "{$new_file_name}-{$post_ID}";
// Получаем все вложенные файлы
$attachments = get_children( array(
'post_type' => 'attachment'
,'post_parent' => $post_ID
) );
// Массовое обновление имен вложенных файлов
foreach ( $attachments as $att )
{
$att_ID = $att->ID;
// Добавляем ID вложения (предотвращение конфликтов)
// Также позволяет сортировать файлы по ID записи и вложения
$new_name = "{$new_file_name}-{$att_ID}";
$mime_type = explode( "/", get_post_mime_type( $att->ID ) );
$file_type = $mime_type[0];
$mime_type = $mime_type[1];
// Пропускаем нежелательные типы файлов
if ( ! in_array( $file_type, $allowed_types ) )
continue;
// Пропускаем нежелательные MIME-типы
if ( ! in_array( $mime_type, $allowed_ext ) )
continue;
// Получаем текущую информацию о файле
$file_path = get_attached_file( $att->ID );
$path = pathinfo( $file_path );
$dir = trailingslashit( $path['dirname'] );
$ext = $path['extension'];
// Формируем итоговое имя
$final = "{$dir}{$new_name}.{$ext}";
// Пропускаем, если путь уже был изменен при загрузке
// Без этого функция не будет работать со старыми файлами
if ( $file_path == $final )
continue;
// Обновляем мета-информацию вложения для файла
rename( $file_path, $final );
update_attached_file( $att_ID, $final );
}
return;
}
add_action( 'add_attachment', 'wpse30313_update_attachment_names' );
add_action( 'edit_attachment', 'wpse30313_update_attachment_names' );
Функцию следует добавить в файл functions.php или (лучше) в виде отдельного небольшого плагина. Просто добавьте комментарий плагина в начало, загрузите в папку плагинов и активируйте.

Я бы использовал функцию PHP rename
и путь к файлу, полученный через get_attached_file
.
function rename_file( $post_id, $newname ) {
$file = get_attached_file( $post_id );
rename($file,dirname($file).$newname)
}
ВАЖНО: этот код не тестировался, и вам следует соблюдать крайнюю осторожность при работе с файлами. Возможно, потребуется внести изменения для корректной работы, но это может быть хорошей отправной точкой. Надеюсь, это поможет.
Дайте знать, если это сработает, и я изменю код на рабочий вариант.

add_action('add_attachment', 'rename');
function rename($post_ID){
$post = get_post($post_ID);
$file = get_attached_file($post_ID);
$path = pathinfo($file);
$newfilename = "mynewfilename";
$newfile = $path['dirname']."/".$newfilename.".".$path['extension'];
rename($file, $newfile);
update_attached_file( $post_ID, $newfile );
}
Ссылки http://codex.wordpress.org/Function_Reference/update_attached_file http://wordpress.org/tags/add_attachment
