Ek dosya adını değiştirme


11

Sahip olduğum Ek Kimliğine göre bir ekin dosya adını değiştirmeme izin veren bir işlev var mı?

Teşekkürler! Dennis

Yanıtlar:


22

Bu, bir eki yüklenir yüklenmez yeniden adlandırmanıza olanak tanır:

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
çok kesin açıkladı :)
booota

uhm, bu rename (): http sarmalayıcı yeniden adlandırmayı desteklemiyor
Bakaburg

Burada bir yazım hatası var. İşlev çağrılmalıdır rename_attachment.
Avishai

Ben netlik için $ post_ID $ attach_ID veya benzer bir şey olarak adlandırırsanız daha iyi olduğunu düşünüyorum, çünkü bu ek posta kimliği olması gerekiyordu, üst posta kimliği ile karıştırılabilir. İyi anwser :)
Armando

Bunun ek kılavuzunu değiştirmediğini, bu nedenle resim kaynağını almak için kılavuza dayanan kodun çalışmadığını lütfen unutmayın. Genel olarak konuşursanız, bir gönderi kılavuzunu değiştirmemelisiniz, ancak bu durumda kılavuzu güncellemek akıllıca olabilir.
Armando

4

Kullanım Örnekleri

Fonksiyon şu şekilde çalışır:

  • Dosya ekleme
  • Dosyaları güncelleme (evet, zaten mevcut olan dosyalar için de)
  • Birden çok dosya

Kullanılmayan Vakalar

Wordpress tarafından otomatik olarak veya hedeflenen dosya türleri veya mime türleri karşılanmadığında gerçekleştirilen otomatik kaydetme işleri için durur.

şekerleme

Döngüden önce işlevin içinde değiştirmek istediğiniz dosya adını, dosya türlerini ve mime türlerini ayarlayabilirsiniz foreach. Dosya, posta kimliğini ve ardından ek kimliğini alır, böylece aynı anda birden fazla dosyayı güvenle yükleyebilir ve değiştirebilirsiniz. Bu aynı zamanda dosyaları (ilk) posta kimliğine ve (ikinci) ek kimliğine göre sıralamayı önemser.

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

İşlev, function.php dosyanıza veya (daha iyi) ayrı bir küçük eklenti olarak eklenmelidir. Üstte bir eklenti yorumu ekleyin, eklentiler klasörüne yükleyin ve etkinleştirin.


ayrıntılı cevap için teşekkür ederim, ben kodu koştu ve yürütmek gibiydi, ama bir şey değişti emin değilim. Ek nesnesinin posta_adı veya kılavuzunu değiştirmeli mi?
Robert Sinclair

3

Ben PHP'nin renameve tarafından verilen dosyanın yolunu kullanırdım get_attached_file.

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

Bunun test edilmediğini ve dosyalarla çalışırken çok dikkatli olmanız gerektiğini unutmayın. Muhtemelen çalışması için değişmesi gerekiyor, ancak iyi bir başlangıç ​​noktası olabilir. Bu yardımcı olur umarım.

Bana yardımcı olup olmadığını bildirin ve kodu gerçek çalışma koduna değiştireceğim.


1
Bu, WordPress'in dosya bağlantısını keser, çünkü WordPress bir yeniden adlandırma olduğunu anlamaz.
Annika Backstrom

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.