Ändern Sie den Dateinamen des Anhangs


11

Gibt es eine Funktion, mit der ich den Dateinamen eines Anhangs basierend auf meiner Anhang-ID ändern kann?

Vielen Dank! Dennis

Antworten:


21

Auf diese Weise können Sie einen Anhang umbenennen, sobald er hochgeladen wurde:

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
sehr genau erklärt :)
Booota

Ähm, ich bekomme diese Umbenennung (): http Wrapper unterstützt keine Umbenennung
Bakaburg

Hier gibt es einen Tippfehler. Die Funktion sollte aufgerufen werden rename_attachment.
Avishai

Ich denke aus Gründen der Klarheit ist es besser, wenn Sie $ post_ID als $ attach_ID oder ähnliches bezeichnen, da dies mit der übergeordneten Post-ID verwechselt werden kann, während es die Anhang-ID sein soll. Gute Antwort :)
Armando

Bitte beachten Sie, dass dies die Anhangsrichtlinie nicht ändert, sodass der Code, der sich auf die Richtlinie stützt, um beispielsweise die Bildquelle abzurufen, nicht funktioniert. Obwohl Sie im Allgemeinen eine Post-Guid nicht ändern sollten, kann es in dieser Situation ratsam sein, die Guid ebenfalls zu aktualisieren.
Armando

4

Anwendungsfälle

Die Funktion funktioniert für

  • Dateien hinzufügen
  • Aktualisieren von Dateien (ja, auch für bereits vorhandene Dateien)
  • Mehrere Dateien

Fälle ohne Verwendung

Es wird für automatisch gespeicherte Jobs abgebrochen, die von WordPress automatisch ausgeführt werden oder wenn die gewünschten Dateitypen oder MIME-Typen nicht erfüllt werden.

Goodies

Sie können den Dateinamen, die Dateitypen und die MIME-Typen festlegen, die Sie innerhalb der Funktion vor der foreachSchleife ändern möchten . Die Datei erhält die Post-ID und anschließend die angehängte Anhang-ID, sodass Sie mehrere Dateien gleichzeitig sicher hochladen und ändern können. Hierbei geht es auch darum, die Dateien nach (erster) Post-ID und (zweiter) Anhang-ID zu ordnen.

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

Die Funktion sollte zu Ihrer Datei functions.php oder (besser) als separates kleines Plugin hinzugefügt werden. Fügen Sie einfach oben einen Plugin-Kommentar hinzu, laden Sie ihn in den Plugin-Ordner hoch und aktivieren Sie ihn.


Vielen Dank für die ausführliche Antwort. Ich habe den Code ausgeführt und er schien ausgeführt zu werden, aber ich bin mir nicht sicher, ob er etwas geändert hat. Sollte es den Postnamen oder die Guid des Anhangsobjekts ändern?
Robert Sinclair

3

Ich würde PHPs renameund den Pfad zu der Datei von verwenden get_attached_file.

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

HINWEIS: Dies wurde nicht getestet und Sie sollten beim Arbeiten mit Dateien äußerst vorsichtig sein. Es muss wahrscheinlich geändert werden, damit es funktioniert, kann aber ein guter Ausgangspunkt sein. Hoffe das hilft.

Lassen Sie mich wissen, ob es hilft, und ich werde den Code in den tatsächlichen Arbeitscode ändern.


1
Dies unterbricht den Link von WordPress zur Datei, da WordPress nicht versteht, dass eine Umbenennung stattgefunden hat.
Annika Backstrom

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.