Zmień nazwę pliku załącznika


11

Czy jest funkcja, która pozwala mi zmienić nazwę pliku załącznika na podstawie posiadanego ID załącznika?

Dzięki! Dennis

Odpowiedzi:


22

Umożliwi to zmianę nazwy załącznika natychmiast po przesłaniu:

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
bardzo dokładnie wyjaśnione :)
booota,

Uhm, dostaję tę zmianę nazwy (): opakowanie HTTP nie obsługuje zmiany nazwy
Bakaburg

Tutaj jest literówka. Funkcja powinna zostać wywołana rename_attachment.
Avishai

Myślę, że dla jasności lepiej jest podać nazwę $ post_ID jako $ attach_ID lub coś podobnego, ponieważ można ją pomylić z nadrzędnym identyfikatorem postu, podczas gdy ma to być identyfikator załącznika. Dobra odpowiedź :)
Armando

Zauważ, że to nie zmienia guid załącznika, więc kod polegający na guid, na przykład na uzyskanie źródła obrazu, nie będzie działał. Chociaż ogólnie rzecz biorąc, nie powinieneś zmieniać post-guid, w tej sytuacji rozsądnie byłoby również zaktualizować guid.
Armando

4

Przypadków użycia

Funkcja działa dla

  • Dodawanie plików
  • Aktualizowanie plików (tak, również w przypadku plików, które są już obecne)
  • Wiele plików

Przypadki bezużyteczne

Przerywa zadania automatycznego zapisywania, wykonywane automatycznie przez wordpress lub jeśli docelowe typy plików lub typy MIME nie są spełnione.

Smakołyki

Możesz ustawić nazwę pliku, typy plików i typy MIME, które chcesz zmienić w funkcji przed foreachpętlą. Plik otrzymuje identyfikator posta, a następnie dołączany jest identyfikator załącznika, dzięki czemu można bezpiecznie przesyłać i zmieniać wiele plików jednocześnie. Dba to również o porządkowanie plików według (pierwszego) identyfikatora posta i (drugiego) identyfikatora załącznika.

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

Funkcja powinna zostać dodana do pliku functions.php lub (lepiej) jako osobna mała wtyczka. Po prostu dodaj komentarz wtyczki na górze, załaduj go do folderu wtyczek i aktywuj.


dziękuję za szczegółową odpowiedź, uruchomiłem kod i wydawało się, że został wykonany, ale nie jestem pewien, czy coś to zmieniło. Czy powinien zmienić post_name lub guid obiektu załącznika?
Robert Sinclair

3

Użyłbym PHP renamei ścieżki do pliku podanej przez get_attached_file.

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

UWAGA: nie zostało to przetestowane i należy zachować szczególną ostrożność podczas pracy z plikami. Prawdopodobnie wymaga zmiany, aby działało, ale może być dobrym punktem wyjścia. Mam nadzieję że to pomoże.

Daj mi znać, jeśli to pomoże, a ja zmienię kod na rzeczywisty działający kod.


1
To zrywa link WordPressa do pliku, ponieważ WordPress nie zrozumie, że nastąpiła zmiana nazwy.
Annika Backstrom

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.