Angehängte Bilder aus Taxonomie und Datum komprimieren

Lesezeit: 5 Minuten

Ich arbeite an einem Skript, das es einem Client ermöglicht, alle Bilder herunterzuladen, die an Posts innerhalb einer bestimmten benutzerdefinierten Taxonomie angehängt sind und an einem bestimmten Datum veröffentlicht wurden.

Ich habe die neue Admin-Seite erstellt, die eine enthält formkönnen sie die Taxonomie und das Datum auswählen und dann das Formular absenden.

Das Formular sendet dann an ein Skript, das versucht, alle zu erhalten url‘s für eine bestimmte Bildgröße (1920px). Bisher lasse ich eine Schleife laufen, um die Beiträge zu erhalten, dann a db rufen Sie an, um die Anhänge mit Übereinstimmung zu erhalten ID‘s.

Aber ich stecke ein wenig fest, wie ich die bekommen soll url‘s dieser Bilder in einem Array, sodass sie vom Benutzer gezippt und heruntergeladen werden können.

Hier ist der Code für das Skript bisher:

(create_zip Funktion von: http://davidwalsh.name/create-zip-php)

/* creates a compressed zip file */
function create_zip($files = array(),$destination = '',$overwrite = false) {

    //if the zip file already exists and overwrite is false, return false
    if(file_exists($destination) && !$overwrite) { return false; }
    //vars
    $valid_files = array();
    //if files were passed in...
    if(is_array($files)) {
        //cycle through each file
        foreach($files as $file) {
            //make sure the file exists
            if(file_exists($file)) {
                $valid_files[] = $file;
            }
        }
    }

    //if we have good files...
    if(count($valid_files)) {
        //create the archive
        $zip = new ZipArchive();
        if($zip->open($destination,$overwrite ? ZIPARCHIVE::OVERWRITE : ZIPARCHIVE::CREATE) !== true) {
            return false;
        }
        //add the files
        foreach($valid_files as $file) {
            $zip->addFile($file,$file);
        }
        //debug
        //echo 'The zip archive contains ',$zip->numFiles,' files with a status of ',$zip->status;

        //close the zip -- done!
        $zip->close();

        //check to make sure the file exists
        return file_exists($destination);

    } else {

        return false;
    }

}

?>

(Code um die Bilder zu bekommen)

<?php

    // get things from the form
    $club = $_POST['club'];
    $day = $_POST['day'];
    $month = $_POST['month'];
    $year = $_POST['year']; 


    // run the loop 
    $loop = new WP_Query( array( 
        'post_type' => 'sell_media_item',
        'collection' => $club,
        'include_children' => false,
        'year' => $year,
        'monthnum' => $month,
        'day' => $day,
        'fields' => 'ids',
    ) );

    if ( $post_ids = $loop->get_posts() ) {

        $post_ids = implode( ',', $post_ids );
        $atts_ids = $wpdb->get_col( "SELECT ID FROM $wpdb->posts WHERE post_parent IN($post_ids) AND post_type="attachment"" );   

        $images->query( array(
            'post_mime_type' =>'image',
            'post_status' => 'published',
            'post_type' => 'attachment',
            'post__in' => $atts_ids,
        ));

    }


    //////////////////////////////////////////////
    // something here to get the image url's?
    /////////////////////////////////////////////


    // prep the files to zip
    $files_to_zip = array(
        'src/to/files.jpg'
    );

    // zip 'em!
    $result = create_zip($files_to_zip,'vip-download.zip');


?>

Irgendwelche Ideen, wie ich dann die URL zu der spezifischen Miniaturbildgröße von 1920px in das Zip-Datei-Array bekomme?

  • Schau mal hier: stackoverflow.com/questions/9906403/… Das könnte helfen. Wenn die Größe des Bildes ein weiteres Problem darstellt, können Sie entweder Tags für die verschiedenen Größen verwenden, Dateinamenkonventionen verwenden oder gdlib/imagick zum Abrufen der Bildgröße verwenden.

    – Sven Schneider

    2. September 2013 um 9:19 Uhr

  • Danke, werde das prüfen. Ich dachte nur, ich könnte vielleicht eine machen $wpdb rufen Sie an, um die Bilder aus der Datenbank selbst zu erhalten, da ich jeden Anhang anhand der Post-ID finden kann. Aber wenn ich mir diesen Thread ansehe, muss ich den tatsächlichen Pfad zur Datei und nicht den Link erhalten. Ist dies bei Shared Hosting möglich?

    – Lukas

    3. September 2013 um 10:24 Uhr


  • Ja. Sie haben immer einen vollständigen Pfad. Ob das “virtuell” ist oder nicht spielt keine Rolle.

    – Sven Schneider

    3. September 2013 um 13:11 Uhr

  • @lucas572 Hallo, bitte überprüfe meine Antwort und lass mich wissen, ob es funktioniert;) Ich habe Informationen zur Bildgröße hinzugefügt.

    – Gemeinschaft

    7. September 2013 um 10:14 Uhr

Benutzer-Avatar
Gemeinschaft

WordPress gibt die vollständige URL zu jedem Bild zurück, daher müssen Sie diese URLs in interne PATHS konvertieren, um sie Ihrer ZIP-Datei hinzuzufügen.

So konvertieren Sie WordPress-URLs in interne Serverpfade:

function convert_upload_url_to_path($url) {

    $path = $url;

    $upload_dir_infos = wp_upload_dir();
    $upload_url = $upload_dir_infos['baseurl']; // http://example.com/wp-content/uploads 
    $upload_path = $upload_dir_infos['basedir']; // C:\path\to\wordpress\wp-content\uploads 

    // Step 1: remove $upload_url
    $path = str_replace($upload_url, '', $path);

    // Step 2: prepend $upload_path
    $path = $upload_path.$path;

    return $path;
}

Um nun die tatsächliche URL von jedem Anhangsbild zu erhalten, verwenden Sie die wp_get_attachment_image_src($attachment_id, $size); Funktion.

Der erste Parameter ist die Anhangs-ID und der zweite (optional) die gewünschte Bildgröße. Es gibt die URL zum Bild zurück.

Hier ist ein Beispiel mit Ihrer $atts_ids Variable:

$files_to_zip = array();
foreach ($atts_ids as $attachement_id) {

    $image_info = wp_get_attachment_image_src($attachement_id, 'full');
    $image_url = $image_info[0];
    $image_path = convert_upload_url_to_path($image_url);

    $files_to_zip[] = $image_path;
}

// zip 'em!
$result = create_zip($files_to_zip,'vip-download.zip');

Beachten Sie, dass die Angabe der $size -Parameter ändert die Bildgröße nicht für Sie. Stattdessen wird die nächste bereits verfügbare Größe zurückgegeben. Wenn Sie das hochgeladene Originalbild in seiner größten Größe abrufen möchten, geben Sie es einfach an 'full'. Sie können WordPress so einstellen, dass hochgeladene Bilder in der Größe geändert werden (wird ausgeführt, wenn der Upload abgeschlossen ist), indem Sie Ihre gewünschte benutzerdefinierte Größe in einstellen WordPress Dashboard > Einstellungen > Medien.

  • Ich würde die Verwendung in Betracht ziehen wp_upload_dir(). Da /wp-content/ nicht immer wahr sein wird: WP_CONTENT_DIR und WP_CONTENT_URL kann sein auf ein anderes Verzeichnis/eine andere URL setzen.

    – Brasilo

    6. September 2013 um 18:55 Uhr

  • @brasofilo danke, du hast Recht! Ich habe meine Antwort aktualisiert 😉

    – Gemeinschaft

    7. September 2013 um 10:03 Uhr

1345300cookie-checkAngehängte Bilder aus Taxonomie und Datum komprimieren

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy