ZIP up alle Bilder in einer und bieten als Download-Link

Ich möchte meinen Besuchern die Möglichkeit bieten, die gesamte Fotogalerie (angezeigt auf dedizierten [Galerie] Seiten) als ZIP-Datei herunterzuladen, die unten auf jeder Galerieseite angezeigt wird. – Das Bild in voller Größe muss eingefügt werden.

David Walsh hat in seinem Post hier einen Code gegeben, um Dateien zu komprimieren, aber ich habe Probleme, diese mit WordPress-functionen zu integrieren.

Ich bin mir bewusst, dass es ein NextGEN Gallery Download Plugin gibt, aber ich bin nicht in der Lage das zu verwenden, da ich die nativen WordPress Galerie functionen nutze.

Eine ähnliche Frage mit einer Alternative (manuelle Methode) zum Ausfüllen des oben genannten finden Sie hier: Plugin zum Herunterladen angehängter Mediendateien?

Jede Hilfe würde sehr geschätzt werden. Vielen Dank.

Solutions Collecting From Web of "ZIP up alle Bilder in einer und bieten als Download-Link"

Zuerst musst du die Bilder holen. Wie man alle Bilder einer Galerie bekommt, wird hier beschrieben.

WordPress verwendet zwei classn zum Entpacken von Dateien. Das PHP-Bilt in ZipArchive() (Verwendung siehe David Walsh). Und PclZip , können Sie diese class in wp-admin/includes/class-pclzip.php . Wenn Sie Probleme mit ZipArchive() versuchen Sie die PclZip-class.

Jetzt musst du beide zusammenkleben. Vielleicht kann ich später etwas Beispielcode posten, momentan bin ich nicht an meinem Schreibtisch.

Aktualisieren

Ihre Frage kann in zwei Teile aufgeteilt werden. Die erste ist, alle Bilder aus einer Galerie zu bekommen. Der zweite ist das Zippen der Bilder und das Senden der Zip-Datei.
Ich werde nur den ersten Teil erklären, der alle Bilder einer Galerie enthält, denn das Zippen der Dateien ist etwas offtopic.

Vielleicht gibt es andere Lösungen, aber in diesem Beispiel ersetze ich den ursprünglichen Galerie-Shortcode durch einen benutzerdefinierten, um die Bilder zu erhalten. Der Grund ist, dass WordPress die Galerien in v3.5 ein wenig verändert hat.
Vor Version 3.5 sind die Bilder für eine Galerie Anhänge des Posts. Nach 3.5 werden die Bilder als Attribut an den Shortcode übergeben. Seit WP3.5 können wir die angehängten Bilder eines Posts nicht mehr bekommen, wir müssen die Liste aus den Shortcode-Attributen holen. Meine Strategie besteht darin, den ursprünglichen Shortcode durch einen benutzerdefinierten Shortcode zu ersetzen, die Attribute zu übernehmen und den ursprünglichen Shortcode aufzurufen, um die Galerieausgabe zu erhalten.

Alle galeriebezogenen Dinge gehören zu einer class. Um eine Zip-Datei zu erstellen, können wir eine andere class verwenden, die die Ausgabe der Galerieklasse als Eingabe verwendet. Beginnen wir mit einer class und einem einfachen Konstruktor.

 class GalleryZip { private static $instance = null; public static $images = array(); public static function get_instance() { if ( ! session_id() ) session_start(); if ( null === self::$instance ) self::$instance = new self(); return self::$instance; } private final function __construct() { remove_shortcode( 'gallery' ); add_shortcode( 'gallery', array( __CLASS__, 'gallery_zip_shortcode' ) ); } } 

Wir werden die Methode get_instance() später im Plugin mit dem hook plugins_loaded . Im Konstruktor entfernen wir den ursprünglichen Shortcode und ersetzen ihn durch unseren benutzerdefinierten gallery_zip_shortcode() . Jetzt brauchen wir den Shortcode Callback

 public static function gallery_zip_shortcode( $atts ) { $post = get_post(); if ( ! function_exists( 'gallery_shortcode' ) ) require_once ABSPATH . 'wp-includes/media.php'; self::get_gallery_images_from_shortcode( $post->ID, $atts ); $output = gallery_shortcode( $atts ); $gallery_id = count( self::$images[$post->ID] ) - 1; $link = sprintf( '', $gallery_id, $post->ID, __( 'Get as Zip' ) ); $output .= $link; return $output; } 

Das erste Ding in dieser Methode ist, den Pfosten zu erhalten, weil wir die Pfosten Identifikation benötigen. wp-includes/media.php wir wp-includes/media.php , enthält diese Datei die Callback-function für den ursprünglichen Galerie-Shortcode. Jetzt rufen wir eine Methode auf, um ein Array mit allen Bildern zu erhalten, erstellen die Galerie-Ausgabe, indem wir den ursprünglichen Gallerie-Callback aufrufen, einen Link erstellen und den Link an die Galerie-Ausgabe anhängen. Die Bilder selbst bzw. die Pfade zu den Bildern werden in der classnvariablen $images gespeichert, wir brauchen dieses Array später.
Die classnvariable $image enthält einen Eintrag für jeden Post mit einer Galerie, sodass wir die function entweder auf der Startseite oder in der Einzelansicht verwenden können. Jeder Eintrag enthält ein Array für jede Galerie, da es in jedem Beitrag mehr als eine Galerie geben kann.

Der core des Plugins ist die Methode, die Bilder aus dem Shortcode zu holen.

 protected static function get_gallery_images_from_shortcode( $id, $atts ) { // use the post ID if the attribute 'ids' is not set or empty $id = ( ! isset( $atts['ids'] ) || empty( $atts['ids'] ) ) ? (int) $id : $atts['ids']; $exclude = ( isset( $atts['exclude'] ) && ! empty( $atts['exclude'] ) ) ? $atts['exclude'] : ''; if ( ! isset( self::$images[$id] ) || ! is_array( self::$images[$id] ) ) self::$images[$id] = array(); $images = self::get_gallery_images( $id, $exclude ); array_push( self::$images[$id], $images ); return $images; } 

Zuerst entscheiden wir, ob es sich um einen einzelnen Post oder eine Liste von Post-IDs handelt. Wenn es sich um eine Liste von Post-IDs handelt, behandeln wir eine Galerie von WP3.5 +. Danach müssen wir das Attribut exclude . Nach dem Einrichten aller Variablen können wir endlich die Bilder aus der Galerie bekommen. Die abgerufenen Bilder werden zur späteren Verwendung in die class var $images verschoben.

 protected static function get_gallery_images( $id, $exclude ) { $images = array(); $query_args = array( 'post_status' => 'inherit', 'post_type' => 'attachment', 'post_mime_type' => 'image', ); // handle gallery WP3.5+ // if $id contains an comma, it is a list of post IDs if ( false !== strpos( $id, ',' ) ) { $query_args['include'] = $id; } elseif ( ! empty( $exclude ) ) { // handle excluding posts $query_args['post_parent'] = $id; $query_args['exclude'] = $exclude; } else { // handle gallery before WP3.5 $query_args['post_parent'] = $id; } $attachments = get_posts( $query_args ); $img_sizes = array_merge( array( 'full' ), get_intermediate_image_sizes() ); $img_size = ( in_array( self::IMAGE_SIZE, $img_sizes ) ) ? self::IMAGE_SIZE : 'full'; foreach ( $attachments as $key => $post ) { $img = wp_get_attachment_image_src( $post->ID, $img_size, false, false ); $images[] = sprintf( '%s/%s', dirname( get_attached_file( $post->ID ) ), basename( $img[0] ) ); } return $images; } 

Dies ist das Gold des Plugins. get_posts() einfach ein Array mit Abfrageargumenten ein, get_posts() Sie die Anhänge mit get_posts() und gehen Sie über die abgerufenen Anhänge. Um verschiedene Größen zu behandeln, erhalten wir das Anhangsbild und den Streifen der URL. Aus der angehängten Datei nehmen wir den Pfad und fügen ihn mit dem Dateinamen zusammen. Im Array $images befinden sich nun alle Bilder und deren Pfade aus der Galerie.

Grundsätzlich wird Ihre Frage an dieser Stelle beantwortet. Sie möchten aber auch eine Zip-Datei aus den Bildern erstellen. Sie könnten eine Zip-Datei aus dem Array $images in der letzten Methode erstellen. Diese Methode wird jedoch jedes Mal aufgerufen, wenn eine Galerie angezeigt wird, und das Erstellen einer Zip-Datei kann eine Weile dauern. Vielleicht würde niemand die ZIP-Datei anfordern, die Sie hier erstellt haben, das ist eine Verschwendung von Ressourcen.

Wie können wir es besser machen? Erinnerst du dich daran, dass ich alle Bilder in die classnvariable $images lege? Wir können diese class var für eine Ajax-Anfrage verwenden. Aber eine Ajax-Anfrage ist nur eine weitere Seitenladung und wir können nur auf die Bilder zugreifen, wenn die Ausgabe der Galerie erstellt wird. Wir müssen unsere Bilder an einem Ort speichern, an dem wir auch nach einer weiteren Seitenanfrage darauf zugreifen können.
In diesem Beispiel verwende ich eine Session-Variable, um das Array mit Bildern zu speichern. Auf eine Sitzungsvariable kann auch nach dem erneuten Laden einer Seite zugegriffen werden. Um die Bilder zu speichern, registriere ich eine Methode mit dem shutdown Haken. Nachdem WordPress die Seite gerendert hat, wird der shutdown Hook aufgerufen. An dieser Stelle sollten wir alle Bilder von allen angezeigten Galerien gesammelt haben. Wir speichern die Bilder einfach und können in einer Ajax-Anfrage darauf zugreifen.

Wenn die Ajax-Anforderung ausgetriggers wird, rufen wir die Sitzungsvariable ab und erstellen eine Zip-Datei aus den Daten. Aber das ist ein bisschen off topic für diese Frage.

Ich habe ein Repository auf GitHub mit dem kompletten Plugin-Code erstellt. Ich hoffe, es weist Sie in die richtige Richtung.

Ich mag die Idee von Ralfs Plugin, eine ganze Galerie auf einmal herunterladen zu können, aber ich konnte es nicht zur Arbeit bringen. Ich habe einen Workaround gefunden, der für unsere Zwecke geeignet ist. Die Methode besteht darin, die native WP-Galerie durch eine eigene zu ersetzen, die Sie am Ende der functions.php Datei Ihres Themes platzieren und die folgende Datei namens download.php in den aktiven Themenordner einfügen. In der benutzerdefinierten Galerie ruft ein Link unter der Datei die Datei download.php auf, die den Download Ihrer Datei automatisch auf die Festplatte zwingt. Ich habe dies auf den neuesten Chrome, Firefox und Safari-Versionen getestet und es funktioniert gut. Habe Twenty Twelve Theme verwendet, aber keinen Grund, warum es auch nicht bei anderen funktionieren sollte.

a) Fügen Sie am Ende von functions.php Folgendes hinzu: Dies ist einfach aus media.php übernommen

 remove_shortcode('gallery'); function gallery_with_download_links($attr) { $post = get_post(); static $instance = 0; $instance++; if ( ! empty( $attr['ids'] ) ) { // 'ids' is explicitly ordered, unless you specify otherwise. if ( empty( $attr['orderby'] ) ) $attr['orderby'] = 'post__in'; $attr['include'] = $attr['ids']; } // Allow plugins/themes to override the default gallery template. $output = apply_filters('post_gallery', '', $attr); if ( $output != '' ) return $output; // We're trusting author input, so let's at least make sure it looks like a valid orderby statement if ( isset( $attr['orderby'] ) ) { $attr['orderby'] = sanitize_sql_orderby( $attr['orderby'] ); if ( !$attr['orderby'] ) unset( $attr['orderby'] ); } extract(shortcode_atts(array( 'order' => 'ASC', 'orderby' => 'menu_order ID', 'id' => $post->ID, 'itemtag' => 'dl', 'icontag' => 'dt', 'captiontag' => 'dd', 'columns' => 3, 'size' => 'thumbnail', 'include' => '', 'exclude' => '' ), $attr)); $id = intval($id); if ( 'RAND' == $order ) $orderby = 'none'; if ( !empty($include) ) { $_attachments = get_posts( array('include' => $include, 'post_status' => 'inherit', 'post_type' => 'attachment', 'post_mime_type' => 'image', 'order' => $order, 'orderby' => $orderby) ); $attachments = array(); foreach ( $_attachments as $key => $val ) { $attachments[$val->ID] = $_attachments[$key]; } } elseif ( !empty($exclude) ) { $attachments = get_children( array('post_parent' => $id, 'exclude' => $exclude, 'post_status' => 'inherit', 'post_type' => 'attachment', 'post_mime_type' => 'image', 'order' => $order, 'orderby' => $orderby) ); } else { $attachments = get_children( array('post_parent' => $id, 'post_status' => 'inherit', 'post_type' => 'attachment', 'post_mime_type' => 'image', 'order' => $order, 'orderby' => $orderby) ); } if ( empty($attachments) ) return ''; if ( is_feed() ) { $output = "\n"; foreach ( $attachments as $att_id => $attachment ) $output .= wp_get_attachment_link($att_id, $size, true) . "\n"; return $output; } $itemtag = tag_escape($itemtag); $captiontag = tag_escape($captiontag); $icontag = tag_escape($icontag); $valid_tags = wp_kses_allowed_html( 'post' ); if ( ! isset( $valid_tags[ $itemtag ] ) ) $itemtag = 'dl'; if ( ! isset( $valid_tags[ $captiontag ] ) ) $captiontag = 'dd'; if ( ! isset( $valid_tags[ $icontag ] ) ) $icontag = 'dt'; $columns = intval($columns); $itemwidth = $columns > 0 ? floor(100/$columns) : 100; $float = is_rtl() ? 'right' : 'left'; $selector = "gallery-{$instance}"; $gallery_style = $gallery_div = ''; if ( apply_filters( 'use_default_gallery_style', true ) ) $gallery_style = "  "; $size_class = sanitize_html_class( $size ); $gallery_div = "\n"; return $output; } add_shortcode( 'gallery' , 'gallery_with_download_links' ); 

b) Kopiere und füge folgendes in eine Datei namens download.php im Basisverzeichnis des Themes ein.

 < ?php $file = $_GET['file']; if (file_exists($file)) { header('Content-Description: File Transfer'); header('Content-Type: application/octet-stream'); header('Content-Disposition: attachment; filename='.basename($file)); header('Content-Transfer-Encoding: binary'); header('Expires: 0'); header('Cache-Control: must-revalidate'); header('Pragma: public'); header('Content-Length: ' . filesize($file)); ob_clean(); flush(); readfile($file); exit; } ?> 

c). Vergiss nicht, auf die Datei in der Galerie zu verlinken !! Wichtig!