เปลี่ยนชื่อไฟล์แนบ


11

มีฟังก์ชั่นที่อนุญาตให้ฉันเปลี่ยนชื่อไฟล์ของสิ่งที่แนบมาตามรหัสสิ่งที่แนบมาที่ฉันมีหรือไม่

ขอบคุณ! เดนนิส

คำตอบ:


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

}

1
อธิบายได้อย่างแม่นยำมาก :)
booota

อืมฉันได้รับการเปลี่ยนชื่อนี้ (): http wrapper ไม่รองรับการเปลี่ยนชื่อ
Bakaburg

มีการพิมพ์ผิดที่นี่ rename_attachmentฟังก์ชั่นควรจะเรียกว่า
Avishai

ฉันคิดว่าความชัดเจนจะดีกว่าถ้าคุณตั้งชื่อ $ post_ID เป็น $ attach_ID หรือสิ่งที่คล้ายกันเพราะอาจสับสนกับรหัสโพสต์ของผู้ปกครองในขณะที่มันหมายถึงรหัสสิ่งที่แนบมา Good anwser :)
Armando

โปรดสังเกตว่าสิ่งนี้จะไม่เปลี่ยน guid สิ่งที่แนบมาดังนั้นโค้ดที่ใช้ guid เพื่อให้ได้แหล่งที่มาของรูปภาพเช่นจะไม่ทำงาน แม้ว่าโดยทั่วไปแล้วคุณไม่ควรเปลี่ยน guid ของการโพสต์ แต่ในสถานการณ์นี้คุณควรที่จะปรับปรุง guid ด้วยเช่นกัน
อาร์มันโด

4

ใช้เคส

ฟังก์ชั่นใช้งานได้สำหรับ

  • กำลังเพิ่มไฟล์
  • การอัพเดตไฟล์ (ใช่รวมถึงไฟล์ที่มีอยู่แล้ว)
  • หลายไฟล์

กรณีไม่ใช้

มันยกเลิกงานบันทึกอัตโนมัติดำเนินการโดย wordpress โดยอัตโนมัติหรือหากประเภทไฟล์เป้าหมายหรือประเภท mime ไม่ตรง

สารพัด

คุณสามารถตั้งชื่อไฟล์ประเภทไฟล์ & ประเภท mime ที่คุณต้องการเปลี่ยนภายในฟังก์ชั่นก่อนที่จะforeachวนรอบ ไฟล์จะได้รับรหัสประจำตัวจากนั้นจึงเพิ่มรหัสสิ่งที่แนบมาดังนั้นคุณจึงสามารถอัปโหลดและเปลี่ยนไฟล์ได้หลายไฟล์พร้อมกัน นอกจากนี้ยังให้ความสำคัญกับการสั่งซื้อไฟล์ตาม (ID แรก) โพสต์ ID และ (ไฟล์ที่สอง) ไฟล์แนบ

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 ของวัตถุที่แนบมาหรือไม่
Robert Sinclair

3

ฉันต้องการใช้ของ PHP และเส้นทางไปยังแฟ้มที่กำหนดโดยrenameget_attached_file

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

โปรดทราบว่าสิ่งนี้ยังไม่ได้ทดสอบและคุณควรระมัดระวังอย่างมากเมื่อทำงานกับไฟล์ อาจต้องเปลี่ยนเพื่อให้ทำงานได้ แต่อาจเป็นจุดเริ่มต้นที่ดี หวังว่านี่จะช่วยได้

แจ้งให้เราทราบหากช่วยได้และฉันจะเปลี่ยนรหัสเป็นรหัสการทำงานจริง


1
สิ่งนี้จะทำลายลิงก์ของ WordPress ไปยังไฟล์เนื่องจาก WordPress ไม่เข้าใจว่ามีการเปลี่ยนชื่อเกิดขึ้น
Annika Backstrom

3
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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.