Bir [galeri] 'de görüntülenen tüm görüntüleri ZIP düzenleyin ve indirme bağlantısı olarak sunun


13

Ziyaretçilerime tüm fotoğraf galerisini (özel [galeri] sayfalarında görüntülenen) her galeri sayfasının altında görüntülenen bir ZIP dosyası olarak indirme seçeneği sunmak istiyorum. - Tam boyutlu görüntünün eklenmesi gerekir.

David Walsh, yazılarını sıkıştırmak için burada bazı kodlar verdi, ancak Wordpress işlevleriyle entegre etmede sorunlar yaşıyorum.

Bir NextGEN galeri indirme eklentisi olduğunu biliyorum ama yerel wordpress galeri işlevlerini kullandığım için bunu kullanacak bir konumda değilim.

Yukarıdakileri tamamlamak için alternatif (manuel yöntem) ile benzer bir soru burada bulunabilir: Ekli medya dosyalarını indirmek için eklenti?

Herhangi bir yardım büyük mutluluk duyacağız. Teşekkürler.


Özel galeri sayfalarıyla ne demek istiyorsun?
NoBugs

SADECE galeri kısa kodunu [gallery column = "4" link = "file"] görüntüleyen ve sayfada başka içerik bulunmayan standart yayınlar. Açıklamaya sadece geliştiricilere yardımcı olması durumunda dahil ettim.
Paul Thomson

Yanıtlar:


14

Önce görüntüleri almalısınız. Bir galerinin tüm görüntülerinin nasıl alınacağı burada açıklanmaktadır .

WordPress, dosyaları açmak için iki sınıf kullanır. PHP bilt ZipArchive()(kullanım bkz. David Walsh). Ve PclZip , bu sınıfı içinde bulabilirsiniz wp-admin/includes/class-pclzip.php. Eğer sorun ZipArchive()yaşarsanız PclZip sınıfını deneyin.

Şimdi ikisini de yapıştırmanız gerekiyor. Belki daha sonra bazı örnek kod gönderebilirim, şu anda masamda değilim.

Güncelleme

Sorunuz iki kısma ayrılabilir. Birincisi bir galeriden tüm görüntüleri almak. İkincisi görüntüleri sıkıştırıyor ve zip dosyasını gönderiyor.
Sadece ilk bölümü açıklayacağım, bir galerinin tüm görüntülerini alacağım, çünkü dosyaları sıkıştırmak biraz oftopik.

Belki başka çözümler var, ancak bu örnekte görüntüleri almak için orijinal galeri kısa kodunu özel bir kodla değiştiriyorum. Nedeni, WordPress'in v3.5'teki galerileri biraz değiştirdi.
3.5'ten önce, bir galeri için görüntüler gönderinin ekleridir. 3.5'ten sonra görüntüler öznitelik olarak kısa koda iletilir. WP3.5'ten beri artık bir gönderinin ekli görüntülerini alamıyoruz, listeyi kısa kod özelliklerinden almamız gerekiyor. Stratejim, orijinal kısa kodu özel bir kısa kodla değiştirmek, nitelikleri almak ve galeri çıktısını almak için orijinal kısa kodu çağırmaktır.

Galeri ile ilgili tüm şeyler bir sınıf içinde. Bir zip dosyası oluşturmak için, galeri sınıfının çıktısını girdi olarak alan başka bir sınıf kullanabiliriz. Bir sınıf ve basit bir kurucu ile başlayalım.

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

Yöntemi get_instance()daha sonra eklentide kanca ile çağıracağız plugins_loaded. Yapıcıda, orijinal kısa kodu kaldırırız ve özel kısa kodumuzla değiştiririz gallery_zip_shortcode(). Şimdi kısa kod geri aramasına ihtiyacımız var

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;

}

Bu yöntemdeki ilk şey gönderiyi almaktır çünkü gönderi kimliğine ihtiyacımız var. Dahil ettiğimizden wp-includes/media.php, bu dosya orijinal galeri kısa kodu için geri arama işlevini içeriyor. Şimdi, tüm görüntülerle bir dizi elde etmek, orijinal galeri geri aramasını arayarak galeri çıktısını oluşturmak, bir bağlantı oluşturmak ve galeri çıktısına bağlantı eklemek için bir yöntem çağırıyoruz. Görüntülerin kendisi, sırasıyla görüntülerin yolları, sınıf değişkeninde saklanır, $imagesdaha sonra bu diziye ihtiyacımız var.
Sınıf değişkeni $image, galeriye sahip her yazı için bir giriş tutar, böylece işlevi ön sayfada veya tek görünümde kullanabiliriz. Her yazı, her yazı için bir dizi içerir, çünkü her yazıda birden fazla galeri olabilir.

Eklentinin çekirdeği, görüntüleri kısa koddan alma yöntemidir.

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;

}

İlk önce tek bir gönderi mi yoksa posta kimlikleri listesi mi olduğuna karar veririz. Posta kimlikleri listesi ise, WP3.5 + 'dan bir galeriyi ele alıyoruz. Bundan sonra, excludeniteliği ele almalıyız. Tüm değişkenleri kurduktan sonra, görüntüleri galeriden alabiliriz. Geri alınan görüntüler $imagesdaha sonra kullanılmak üzere sınıf var'a aktarılacaktır .

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;
}

Bu eklentinin altını. Sorgu bağımsız değişkenleri içeren bir dizi kurmanız, ekleri almanız get_posts()ve geri alınan eklerin üzerinden geçmeniz yeterlidir . Farklı boyutları işlemek için, URL'nin ek görüntüsünü ve şeridini alırız. Ekli dosyadan yolu alıp dosya adıyla bir araya getiriyoruz. Dizide $imagesartık galeriden tüm görüntüler ve yolları var.

Temel olarak sorunuz bu noktada cevaplanmaktadır. Ama aynı zamanda görüntülerden zip dosyası kreatea istiyorum. $imagesSon yöntemde diziden bir zip dosyası oluşturabilirsiniz . Ancak bu yöntem her galeri görüntülendiğinde çağrılır ve bir zip dosyası oluşturmak biraz zaman alabilir. Belki hiç kimse burada oluşturduğunuz zip dosyasını istemez, bu bir kaynak israfıdır.

Nasıl daha iyi yapabiliriz? Tüm resimleri sınıf değişkenine koyduğumu hatırlıyor musunuz $images? Bu sınıf var ajax isteği için kullanabilirsiniz. Ancak ajax isteği yalnızca başka bir sayfa yüküdür ve görüntülere yalnızca galerinin çıktısı oluşturulduğunda erişebiliriz. Görüntülerimizi başka bir sayfa isteğinden sonra bile erişebileceğimiz bir yere kaydetmemiz gerekiyor.
Bu örnekte diziyi görüntülerle birlikte saklamak için bir oturum değişkeni kullanıyorum. Bir oturum değişkenine başka bir sayfa yeniden yüklendikten sonra bile erişilebilir. Görüntüleri saklamak için shutdownkancaya bir yöntem kaydediyorum. WordPress sayfayı oluşturmayı bitirdikten sonra shutdownkanca çağrılır. Bu noktada, görüntülenen tüm galerilerden tüm görüntüleri toplamalıydık. Sadece görüntüleri saklıyoruz ve bir ajax isteğinde bunlara erişebiliyoruz.

Ajax isteği tetiklendiğinde, session var'ı hatırlar ve verilerden bir zip dosyası oluştururuz. Ancak bu, bu soru için biraz konu dışı.

GitHub'da tam eklenti kodunu içeren bir depo oluşturdum . Umarım sizi doğru yöne yönlendirir.


yeni 3.5 stil galerileriyle uğraşıyorsanız, galeriden resim alma yönteminin sizin için uygun olmayabileceğini unutmayın.
Milo

Açıklığa kavuşturmak için Wordpress 3.5.1'in en son sürümünü kullanıyorum. Johannes, masaüstünüzde bir sonraki işinizde örnek kod verebilseydiniz çok minnettar olurum. Teşekkürler, Paul
Paul Thomson

Hey Ralf, bu harika bir iş! Paylaşım için teşekkürler. Galeri resimlerimin düzgün görüntülenmesi için kısa kodda link = "file" eklemeliyim yani: [gallery link = "file"] kısa kod kodunuzla yeniden yazıldığından, dışarıda bırakıldığını ve sonuç galerilerimin doğru gösterilmemesi. Bu argümanı kodunuza düzeltmenin bir yolu var mı?
Paul Thomson

Normalde öznitelikler basitçe orijinal kısa koda iletilir ve değiştirilmez. Galeriler normal olarak görüntülenir, ancak HTML eklenir. Testlerimde (twentytwelve standrad temasıyla) galeriler doğru bir şekilde görüntülenir.
Ralf912

@PaulThomson Github deposundaki bazı sorunları düzelttim. Kod temiz değildi.
Ralf912

0

Ralf'in eklentisinin bir seferde tüm galeriyi indirebilmesi fikrini seviyorum, ancak işe yarayamadım. Bizim amaçlarımız için çalışan bir geçici çözüm buldum. Yöntem, yerel WP galerisini kendi temanızın sonuna yerleştirdiğiniz kendi galerisiyle değiştirmek ve etkin tema klasörüne functions.phpadlandırılmış aşağıdaki dosyayı eklemektir download.php. Özel galeride, dosyanın altındaki bir bağlantı, otomatik olarak sabit sürücüye indirilmesini zorlayan download.php dosyasını çağırır. Bunu en son Chrome, Firefox ve Safari sürümlerinde test ettim ve iyi çalışıyor. Yirmi Oniki teması kullanıyordunuz, ancak başkaları üzerinde de çalışmaması için hiçbir neden yok.

a) Aşağıdakileri sonuna ekleyin functions.php. Bu sadece media.php dosyasından alınır.

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) Aşağıdakileri kopyalayıp download.phptemanın temel dizininde adlandırılan bir dosyaya yapıştırın .

<?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). Galerideki dosyaya bağlamayı unutmayın !! Önemli!


Bunun iyi bir fikir olduğunu düşünmüyorum download.phpve $_GETparametrenizi web klasörünüzden (ağ paylaşımlarında da) istediğim tüm dosyaları indirebileceğim gibiwp-config.php
Diego Betto
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.