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

11

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

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

FLX
источник

Ответы:

22

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

add_action('add_attachment', 'rename_attachment');
function rename_attachment($post_ID){

    $file = get_attached_file($post_ID);
    $path = pathinfo($file);
        //dirname   = File Path
        //basename  = Filename.Extension
        //extension = Extension
        //filename  = Filename

    $newfilename = "NEW FILE NAME HERE";
    $newfile = $path['dirname']."/".$newfilename.".".$path['extension'];

    rename($file, $newfile);    
    update_attached_file( $post_ID, $newfile );

}
Ijaas
источник
1
очень точно объяснил :)
Booota
хм, я получаю это переименование ():
Оболочка
Здесь есть опечатка. Функция должна быть вызвана rename_attachment.
Avishai
Я думаю, для ясности лучше, если вы называете $ post_ID как $ attach_ID или что-то подобное, потому что это может быть перепутано с идентификатором родительского поста, в то время как он должен быть идентификатором вложения. Хороший ответ :)
Армандо
Обратите внимание, что это не меняет guid вложения, поэтому код, использующий guid для получения источника изображения, например, не будет работать. Хотя, вообще говоря, вы не должны изменять guid поста, в этой ситуации может быть целесообразно также обновить guid.
Армандо
4

Сценарии использования

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

  • Добавление файлов
  • Обновление файлов (да, также для файлов, которые уже присутствуют)
  • Несколько файлов

Случаи без использования

Прерывает автоматическое сохранение заданий, выполняемых WordPress автоматически или если целевые типы файлов или типы MIME не встречаются.

Плюсы

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

function wpse30313_update_attachment_names($post_ID)
{
    // Abort if WP does an autosave 
    if ( defined('DOING_AUTOSAVE') && DOING_AUTOSAVE ) 
        return;

    # >>>> SET
        // New file name:
        $new_file_name = "___";

        // Best would be to take the post name as file name instead of a custom title:
        # $post_data = get_post( $post_ID );
        # $new_file_name = $post_data->post_name;

        // The file types we want be changed:
        $allowed_types = array(
            'image'
        );

        // The mime types we want to be changed:
        $allowed_ext = array(
             'jpg'
            ,'jpeg'
            ,'gif'
            ,'png'
        );
    # <<<< SET

    // Appended by post ID for collision safety
    $new_file_name = "{$new_file_name}-{$post_ID}";

    // get all attached files
    $attachments = get_children( array( 
         'post_type'    => 'attachment'
        ,'post_parent'  => $post_ID
    ) );

    // Bulk updating attached file names
    foreach ( $attachments as $att )
    {
        $att_ID     = $att->ID;
        // Append attachment ID (collision safety)
        // Also allows sorting files by post & then attchment 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];

        // Skip file types we don't want to change
        if ( ! in_array( $file_type, $allowed_types ) )
            continue;
        // Skip mime types we don't want to change
        if ( ! in_array( $mime_type, $allowed_ext ) )
            continue;

        // Get current file info
        $file_path = get_attached_file( $att->ID );
        $path   = pathinfo( $file_path );
        $dir    = trailingslashit( $path['dirname'] );
        $ext    = $path['extension'];

        // Build final name
        $final  = "{$dir}{$new_name}.{$ext}";

        // Skip if the path was already changed on upload
        // If we don't set this, the function wouldn't work for older files
        if ( $file_path == $final )
            continue;

        // Update attachment-post meta info for file
        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 или (лучше) в виде отдельного небольшого плагина. Просто добавьте комментарий к плагину сверху, загрузите его в папку плагинов и активируйте.

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

Я бы использовал PHP renameи путь к файлу, заданному get_attached_file.

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

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

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

Наойз Голден
источник
1
Это нарушает ссылку WordPress на файл, так как WordPress не поймет, что произошло переименование.
Анника Бэкстрем