ZIPen Sie alle in einer [Galerie] angezeigten Bilder und bieten Sie sie als Download-Link an


13

Ich möchte meinen Besuchern die Möglichkeit bieten, die gesamte Fotogalerie (auf dedizierten [Galerie] -Seiten) als ZIP-Datei herunterzuladen, die am unteren Rand jeder Galerieseite angezeigt wird. - Das Bild in voller Größe muss enthalten sein.

David Walsh hat in seinem Beitrag hier einen Code angegeben , um Dateien zu komprimieren, aber ich habe Probleme, diesen Code in Wordpress-Funktionen zu integrieren.

Ich bin mir bewusst, dass es ein NextGEN-Galerie-Download-Plugin gibt, aber ich bin nicht in der Lage, dieses zu verwenden, da ich die nativen WordPress-Galerie-Funktionen verwende.

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

Jede Hilfe wäre sehr dankbar. Vielen Dank.


Was meinen Sie mit dedizierten Galerieseiten?
NoBugs

Standard-Posts, die NUR den Galerie-Shortcode [gallery columns = "4" link = "file"] und keinen anderen Inhalt auf der Seite anzeigen. Ich habe das in die Beschreibung aufgenommen, nur weil es Entwicklern geholfen hat.
Paul Thomson

Antworten:


13

Zuerst müssen Sie die Bilder bekommen. Wie Sie alle Bilder einer Galerie erhalten, wird hier beschrieben .

WordPress verwendet zwei Klassen zum Entpacken von Dateien. Das PHP ist eingebunden ZipArchive()(Verwendung siehe David Walsh). Und PclZip , Sie können diese Klasse in finden wp-admin/includes/class-pclzip.php. Wenn Sie Probleme mit ZipArchive()der PclZip-Klasse haben, versuchen Sie es.

Jetzt musst du nur noch beides zusammenkleben. Vielleicht kann ich später einen Beispielcode posten, zur Zeit bin ich nicht an meinem Schreibtisch.

Aktualisieren

Ihre Frage kann in zwei Teile geteilt werden. Die erste Methode ruft alle Bilder aus einer Galerie ab. Der zweite ist das Zippen der Bilder und das Senden der Zip-Datei.
Ich werde nur den ersten Teil erläutern, in dem alle Bilder einer Galerie angezeigt werden, da das Komprimieren der Dateien nicht immer aktuell ist.

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 3.5 sind die Bilder für eine Galerie Anhänge des Beitrags. Nach 3.5 werden die Bilder als Attribut an den Shortcode übergeben. Da wir in WP3.5 die angehängten Bilder eines Posts nicht mehr erhalten können, müssen wir die Liste aus den Shortcode-Attributen abrufen. Meine Strategie besteht darin, den ursprünglichen Shortcode durch einen benutzerdefinierten Shortcode zu ersetzen, die Attribute zu erfassen und den ursprünglichen Shortcode aufzurufen, um die Galerieausgabe zu erhalten.

Alle galeriebezogenen Dinge gehören zu einer Klasse. Um eine zip-Datei zu erstellen, können wir eine andere Klasse verwenden, die die Ausgabe der Galerieklasse als Eingabe verwendet. Beginnen wir mit einer Klasse 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 aufrufen plugins_loaded. Im Konstruktor entfernen wir den ursprünglichen Shortcode und ersetzen ihn durch unseren benutzerdefinierten Shortcode gallery_zip_shortcode(). Jetzt brauchen wir den Shortcode-Rückruf

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( '<div><a href="#" gallery-id="%d" post-id="%d" class="gallery-zip">%s</a></div>', $gallery_id, $post->ID, __( 'Get as Zip' ) );
    $output .= $link;

    return $output;

}

Bei dieser Methode müssen Sie zuerst den Beitrag abrufen, da wir die Beitrags-ID benötigen. Als wir enthalten wp-includes/media.php, enthält diese Datei die Rückruffunktion für den ursprünglichen Galerie-Shortcode. Nun rufen wir eine Methode auf, um ein Array mit allen Bildern zu erhalten, erstellen die Galerie-Ausgabe durch Aufrufen des ursprünglichen Galerie-Rückrufs, erstellen einen Link und hängen den Link an die Galerie-Ausgabe an. Die Bilder selbst bzw. die Pfade zu den Bildern werden in der Klassenvariablen gespeichert $images, wir brauchen dieses Array später.
Die Klassenvariable $imageenthält einen Eintrag für jeden Beitrag mit einer Galerie, sodass wir die Funktion entweder auf der Startseite oder in der Einzelansicht verwenden können. Jeder Eintrag enthält ein Array für jede Galerie, da jeder Beitrag mehrere Galerien enthalten kann.

Der Kern des Plugins ist die Methode, um die Bilder aus dem Shortcode zu erhalten.

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 Beitrag oder eine Liste von Beitrags-IDs handelt. Wenn es sich um eine Liste mit Beitrags-IDs handelt, wird eine Galerie ab WP3.5 + verarbeitet. Danach müssen wir das excludeAttribut behandeln. Nachdem wir alle Variablen eingerichtet haben, können wir endlich die Bilder aus der Galerie bekommen. Die abgerufenen Bilder werden $imageszur späteren Verwendung in die Klasse var 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;
}

Das ist das Gold des Plugins. Richten Sie einfach ein Array mit Abfrageargumenten ein, rufen Sie die Anhänge mit ab get_posts()und gehen Sie über die abgerufenen Anhänge. Um mit unterschiedlichen Größen umgehen zu können, erhalten wir das angehängte Bild und den URL-Streifen. Aus der angehängten Datei nehmen wir den Pfad und fügen ihn mit dem Dateinamen zusammen. Im Array $imagesbefinden sich nun alle Bilder und deren Pfade aus der Galerie.

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

Wie können wir es besser machen? Erinnerst du dich, dass ich alle Bilder in die Klassenvariable gestellt habe $images? Wir können diese Klassenvariable für eine Ajax-Anfrage verwenden. Eine Ajax-Anfrage ist jedoch nur ein weiterer Seitenaufruf, und wir können nur dann auf die Bilder zugreifen, wenn die Ausgabe der Galerie erstellt wird. Wir müssen unsere Bilder an einem Ort speichern, auf den wir auch nach einer erneuten Seitenanforderung zugreifen können.
In diesem Beispiel verwende ich eine Sitzungsvariable, um das Array mit Bildern zu speichern. Auf eine Sitzungsvariable kann auch nach einem erneuten Laden der Seite zugegriffen werden. Um die Bilder zu speichern, registriere ich eine Methode mit dem shutdownHaken. Nachdem WordPress das Rendern der Seite beendet hat, wird der shutdownHook aufgerufen. Zu diesem Zeitpunkt sollten wir alle Bilder aus allen angezeigten Galerien gesammelt haben. Wir speichern einfach die Bilder und können auf sie in einer Ajax-Anfrage zugreifen.

Wenn die Ajax-Anforderung ausgelöst wird, rufen wir die Sitzungsvariable auf und erstellen aus den Daten eine ZIP-Datei. Aber das ist ein bisschen unangebrachtes Thema für diese Frage.

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


Beachten Sie, dass diese Methode zum Abrufen von Bildern aus einer Galerie möglicherweise nicht für Sie geeignet ist, wenn Sie mit neuen Galerien im 3.5-Stil arbeiten.
Milo

Zur Verdeutlichung verwende ich die neueste Version von Wordpress 3.5.1. Johannes, ich wäre dir sehr dankbar, wenn du ein Beispielcode liefern könntest, wenn du das nächste Mal auf deinem Desktop bist. Vielen Dank, Paul
Paul Thomson

Hey Ralf, das ist eine fantastische Arbeit! Danke für das Teilen. Damit meine Galeriebilder richtig angezeigt werden, muss ich link = "file" in den Shortcode einfügen, dh [gallery link = "file"], da der Shortcode durch Ihren Code neu geschrieben wird Ergebnis Meine Galerien werden nicht korrekt angezeigt. Gibt es eine Möglichkeit, dieses Argument in Ihrem Code zu korrigieren?
Paul Thomson

Normalerweise werden die Attribute einfach an den ursprünglichen Shortcode weitergeleitet und nicht geändert. Die Galerien werden wie gewohnt angezeigt, jedoch mit angefügtem HTML. In meinen Tests (mit 20 Standardthemen) werden die Galerien korrekt angezeigt.
Ralf912

@PaulThomson Ich habe einige Probleme im Github-Repository behoben. Der Code war nicht sauber.
Ralf912

0

Ich mag die Idee von Ralfs Plugin, eine ganze Galerie auf einmal herunterladen zu können, aber ich habe es nicht geschafft, sie zum Laufen zu bringen. Ich habe eine Problemumgehung gefunden, die für unsere Zwecke funktioniert. Die Methode besteht darin, die native WP-Galerie durch Ihre eigene zu ersetzen, die Sie am Ende der functions.phpDatei Ihres Themas platzieren, UND die folgende Datei hinzuzufügen, die download.phpim aktiven Themenordner benannt ist. In der benutzerdefinierten Galerie ruft ein Link unter der Datei die Datei download.php auf, die automatisch den Download Ihrer Datei auf die Festplatte erzwingt. Ich habe dies auf den neuesten Chrome-, Firefox- und Safari-Versionen getestet und es funktioniert einwandfrei. Habe Twenty Twelve Theme benutzt, aber keinen Grund warum es nicht auch bei anderen funktionieren sollte.

a) Fügen Sie am Ende von Folgendes hinzu functions.php. Dies wird einfach aus media.php entnommen

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 = "
        <style type='text/css'>
            #{$selector} {
                margin: auto;
            }
            #{$selector} .gallery-item {
                float: {$float};
                margin-top: 10px;
                text-align: center;
                width: {$itemwidth}%;
            }
            #{$selector} img {
                border: 2px solid #cfcfcf;
            }
            #{$selector} .gallery-caption {
                margin-left: 0;
            }
        </style>
        <!-- see gallery_shortcode() in wp-includes/media.php -->";
    $size_class = sanitize_html_class( $size );
    $gallery_div = "<div id='$selector' class='gallery galleryid-{$id} gallery-columns-{$columns} gallery-size-{$size_class}'>";
    $output = apply_filters( 'gallery_style', $gallery_style . "\n\t\t" . $gallery_div );

    $i = 0;
    foreach ( $attachments as $id => $attachment ) {
        $link = isset($attr['link']) && 'file' == $attr['link'] ? wp_get_attachment_link($id, $size, false, false) : wp_get_attachment_link($id, $size, true, false);

        $output .= "<{$itemtag} class='gallery-item'>";
        $output .= "
            <{$icontag} class='gallery-icon'>
                $link
            </{$icontag}>";
        if ( $captiontag && trim($attachment->post_excerpt) ) {
            $output .= "
                <{$captiontag} class='wp-caption-text gallery-caption'>
                " . wptexturize($attachment->post_excerpt) . "
                </{$captiontag}>";
        }
// This is my addon which outputs a link to download the file through download.php . NB your file uri will be public! 
        $output .= '<br/ ><a href="'.get_template_directory_uri().'/download.php?file='.get_attached_file( $id ).'">Download image</a>';
        $output .= "</{$itemtag}>";
        if ( $columns > 0 && ++$i % $columns == 0 )
            $output .= '<br style="clear: both" />';
    }

    $output .= "
            <br style='clear: both;' />
        </div>\n";

    return $output;
}
add_shortcode( 'gallery' , 'gallery_with_download_links' );

b) Kopieren Sie das Folgende und fügen Sie es in eine Datei ein, download.phpdie im Basisverzeichnis des Themas aufgerufen wird .

<?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!

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.