Изменение имени файла вложения

5 окт. 2011 г., 11:50:51
Просмотры: 15.9K
Голосов: 12

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

Спасибо! Деннис

0
Все ответы на вопрос 4
6
25

Это позволит вам переименовать вложение сразу после его загрузки:

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 );

}
11 окт. 2011 г. 07:35:38
Комментарии

очень точно объяснено :)

Assad Nazar Assad Nazar
11 окт. 2011 г. 08:01:40

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

Bakaburg Bakaburg
6 сент. 2013 г. 00:51:38

Здесь опечатка. Функция должна называться rename_attachment.

Avishai Avishai
18 дек. 2016 г. 00:41:39

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

Way Too Simple Way Too Simple
17 мая 2019 г. 17:50:26

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

Way Too Simple Way Too Simple
17 мая 2019 г. 22:10:14

Также убедитесь, что после этого выполняется wp_generate_attachment_metadata(), чтобы все миниатюры были правильно перегенерированы.

KittMedia KittMedia
13 апр. 2022 г. 16:09:20
Показать остальные 1 комментариев
1

Применение

Функция работает для:

  • Добавления файлов
  • Обновления файлов (да, включая уже существующие)
  • Множественных файлов

Ограничения

Функция прерывает выполнение для автоматических сохранений, выполняемых 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 или (лучше) в виде отдельного небольшого плагина. Просто добавьте комментарий плагина в начало, загрузите в папку плагинов и активируйте.

17 окт. 2011 г. 15:16:37
Комментарии

спасибо за подробный ответ, я запустил код, и кажется, он выполнился, но не уверен, что что-то изменилось. Должен ли он изменять post_name или guid объекта вложения?

Robert Sinclair Robert Sinclair
1 февр. 2017 г. 06:54:57
1

Я бы использовал функцию PHP rename и путь к файлу, полученный через get_attached_file.

function rename_file( $post_id, $newname ) {
    $file = get_attached_file( $post_id );
    rename($file,dirname($file).$newname)
}

ВАЖНО: этот код не тестировался, и вам следует соблюдать крайнюю осторожность при работе с файлами. Возможно, потребуется внести изменения для корректной работы, но это может быть хорошей отправной точкой. Надеюсь, это поможет.

Дайте знать, если это сработает, и я изменю код на рабочий вариант.

10 окт. 2011 г. 18:12:52
Комментарии

Это нарушает связь WordPress с файлом, поскольку WordPress не поймет, что произошло переименование.

User User
17 окт. 2011 г. 16:04:06
1
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

15 окт. 2011 г. 12:14:25
Комментарии

Это нарушает работу превью миниатюр в панели управления WordPress.

Drew Baker Drew Baker
23 нояб. 2020 г. 18:22:04