Benennen Sie Dateien beim Hochladen mithilfe von Variablen um

7

Ich möchte Dateien während des Uploads umbenennen und ihre Namen auf den Post-Slug setzen, an den die Dateien angehängt werden, sowie einige zufällige Zeichen (ein einfacher inkrementeller Zähler reicht völlig aus), um die Dateinamen zu unterscheiden.

Mit anderen Worten, wenn ich Bilder zu dem Beitrag hochlade / anhänge, dessen Seiten-Slug "Test-Page-Slug" ist, möchte ich, dass die Bilder im laufenden Betrieb umbenannt werden in test-page-slug-[C].[extension]:

  • test-page-slug-1.jpg
  • test-page-slug-2.jpg
  • usw., es spielt keine Rolle, wie die ursprünglichen Dateinamen lauteten.

Es gibt dieses Plugin, Custom Upload Dir :

Mit diesem Plugin können Sie Pfade aus zusätzlichen Variablen wie Post-Titel, ID, Kategorie, Post-Autor, Post-Datum und vielem mehr erstellen.

Wie kann ich das Gleiche mit Dateinamen tun?

Pereyra
quelle
Wo füge ich dieses Skript in meine WordPress-Installation ein? Soll ich es zu einem Plugin machen oder füge ich es einer Funktionsdatei hinzu? Ich möchte automatisch arbeiten oder wissen, wie ich es aktivieren kann, damit es den ganzen Zauber der automatischen Änderung des Namens für mich bewirkt. Vielen Dank!

Antworten:

9

Sie sollten sich an den Filter wp_handle_upload_prefilter anschließen (zu dem ich keine Dokumentation finden kann, der aber ziemlich einfach zu sein scheint). Ich habe das vor Ort ausprobiert und es scheint für mich zu funktionieren:

function wpsx_5505_modify_uploaded_file_names($arr) {

    // Get the parent post ID, if there is one
    if( isset($_REQUEST['post_id']) ) {
        $post_id = $_REQUEST['post_id'];
    } else {
        $post_id = false;
    }

    // Only do this if we got the post ID--otherwise they're probably in
    //  the media section rather than uploading an image from a post.
    if($post_id && is_numeric($post_id)) {

        // Get the post slug
        $post_obj = get_post($post_id); 
        $post_slug = $post_obj->post_name;

        // If we found a slug
        if($post_slug) {

            $random_number = rand(10000,99999);
            $arr['name'] = $post_slug . '-' . $random_number . '.jpg';

        }

    }

    return $arr;

}
add_filter('wp_handle_upload_prefilter', 'wpsx_5505_modify_uploaded_file_names', 1, 1);

In meinen Tests scheint es, dass Posts nur dann einen Slug haben, wenn Sie hübsche Permalinks aktiviert haben. Daher habe ich vor dem Umbenennen der Datei eine Überprüfung hinzugefügt, um sicherzustellen, dass ein Slug vorhanden ist. Sie sollten auch den Dateityp überprüfen, was ich hier nicht getan habe - ich habe nur angenommen, dass es sich um ein JPG handelt.

BEARBEITEN

Wie im Kommentar angefordert, ändert diese zusätzliche Funktion einige der Metaattribute für das hochgeladene Bild. Es scheint jedoch nicht möglich zu sein, den ALT-Text festzulegen, und aus irgendeinem Grund wird der Wert, den Sie als "Beschriftung" festgelegt haben, tatsächlich als Beschreibung zugewiesen. Du musst damit Affen sein. Ich habe diesen Filter in der Funktion wp_read_image_metadata () gefunden, die sich in wp-admin / includes / image.php befindet. Darauf stützen sich die Funktionen zum Hochladen von Medien und wp_generate_attachment_metadata, um Metadaten aus dem Bild abzurufen. Sie können dort einen Blick darauf werfen, wenn Sie weitere Einblicke wünschen.

function wpsx_5505_modify_uploaded_file_meta($meta, $file, $sourceImageType) {

    // Get the parent post ID, if there is one
    if( isset($_REQUEST['post_id']) ) {
        $post_id = $_REQUEST['post_id'];
    } else {
        $post_id = false;
    }

    // Only do this if we got the post ID--otherwise they're probably in
    //  the media section rather than uploading an image from a post.
    if($post_id && is_numeric($post_id)) {

        // Get the post title
        $post_title = get_the_title($post_id);

        // If we found a title
        if($post_title) {

            $meta['title'] = $post_title;
            $meta['caption'] = $post_title;

        }

    }

    return $meta;

}
add_filter('wp_read_image_metadata', 'wpsx_5505_modify_uploaded_file_meta', 1, 3);

Bearbeitet am 04.04.2012, um die Post-ID aus dem REQUEST-Objekt zu ziehen, anstatt GET und POST nacheinander zu überprüfen. Basierend auf Vorschlägen in den Kommentaren.

MathSmath
quelle
MathSmath, ich kann nicht glauben, dass das total funktioniert, vielen Dank! Denken Sie, wir könnten es ein wenig weiter ausbauen und den hochgeladenen Bildern Titel und Alt (beide gleich) zuweisen, basierend auf dem Namen des Beitrags, an den wir sie anhängen? :) Das wäre einfach perfekt. Vielen Dank für Ihre Hilfe!
Pereyra
@ Pereyra Ich bin froh, dass es funktioniert hat! Ich habe meine Antwort aktualisiert, um eine weitere Funktion zum Ändern einiger Bild-Metadaten aufzunehmen. Ich konnte es nicht dazu bringen, den Alternativtext festzulegen, aber es setzt den Bildtitel auf den Post-Titel.
MathSmath
@pereyra Bitte setzen Sie ein Häkchen neben die Antwort, damit die Leute wissen, dass sie gelöst ist. Gib mir fünf!
MathSmath
Das funktioniert, danke! Tatsächlich habe ich festgestellt, dass WP, solange das Titelfeld ausgefüllt ist, für Alt und Titel denselben Wert verwendet, es sei denn, dem Alt-Feld wird ein anderer Wert zugewiesen, also nur $ meta ['title'] = $ post_title; ist perfekt für meine Bedürfnisse. Nochmals vielen Dank für Ihre Hilfe.
Pereyra
1
Wie erhöhen Sie diese anstelle einer Zufallszahl?