Thay đổi tên tệp đính kèm


11

Có chức năng nào cho phép tôi thay đổi tên tệp của tệp đính kèm, dựa trên ID tệp đính kèm mà tôi có không?

Cảm ơn! Dennis

Câu trả lời:


21

Điều này sẽ cho phép bạn đổi tên tệp đính kèm ngay khi được tải lên:

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

}

1
giải thích rất chính xác :)
booota

uhm, tôi nhận được tên đổi tên này (): trình bao bọc http không hỗ trợ đổi tên
Bakaburg

Có một lỗi đánh máy ở đây. Hàm nên được gọi rename_attachment.
Avishai

Tôi nghĩ rõ ràng sẽ tốt hơn nếu bạn đặt tên $ post_ID là $ Attach_ID hoặc một cái gì đó tương tự, bởi vì nó có thể bị nhầm lẫn với ID bài đăng gốc, trong khi đó có nghĩa là ID đính kèm. Anwser tốt :)
Armando

Xin lưu ý rằng điều này không thay đổi hướng dẫn đính kèm, vì vậy, mã dựa trên hướng dẫn để lấy nguồn hình ảnh chẳng hạn sẽ không hoạt động. Mặc dù nói chung, bạn không nên thay đổi hướng dẫn bài viết, trong tình huống này có thể là khôn ngoan để cập nhật hướng dẫn.
Armando

4

Trường hợp sử dụng

Hàm làm việc cho

  • Thêm tệp
  • Cập nhật tệp (có, cũng cho các tệp đã có)
  • Nhiều tập tin

Các trường hợp không sử dụng

Nó hủy bỏ các công việc tự động lưu, được thực hiện bởi wordpress tự động hoặc nếu các loại tệp mục tiêu hoặc loại mime không được đáp ứng.

Đồ tốt

Bạn có thể đặt tên tệp, loại tệp & loại mime mà bạn muốn thay đổi bên trong hàm trước foreachvòng lặp. Tệp nhận được ID bài đăng và sau đó ID đính kèm được thêm vào, do đó bạn có thể tải lên và thay đổi nhiều tệp một cách an toàn cùng một lúc. Điều này cũng quan tâm đến việc sắp xếp các tập tin bằng (đầu tiên) ID bài đăng và (tập tin đính kèm) thứ hai.

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

Hàm nên được thêm vào tệp tin.php của bạn hoặc (tốt hơn) dưới dạng một plugin nhỏ riêng biệt. Chỉ cần thêm một nhận xét plugin trên đầu trang, tải nó lên thư mục plugin và kích hoạt.


cảm ơn bạn đã trả lời chi tiết, tôi đã chạy mã và nó dường như thực thi, nhưng tôi không chắc liệu nó có thay đổi gì không. Nó nên thay đổi post_name hoặc hướng dẫn của đối tượng đính kèm?
Robert Sinclair

3

Tôi sẽ sử dụng PHP renamevà đường dẫn đến tệp được cung cấp bởi get_attached_file.

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

LƯU Ý rằng điều này đã không được kiểm tra và bạn nên hết sức thận trọng khi làm việc với các tập tin. Nó có thể cần thay đổi để nó hoạt động nhưng có thể là một điểm khởi đầu tốt. Hi vọng điêu nay co ich.

Hãy cho tôi biết nếu nó giúp và tôi sẽ thay đổi mã thành mã làm việc thực tế.


1
Điều này phá vỡ liên kết của WordPress đến tệp, vì WordPress sẽ không hiểu rằng việc đổi tên đã xảy ra.
Annika Backstrom

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.