एक [गैलरी] में प्रदर्शित सभी छवियों को ज़िप करें और डाउनलोड लिंक के रूप में पेश करें


13

मैं अपने आगंतुकों को पूरी फोटो गैलरी (समर्पित [गैलरी] पृष्ठों पर प्रदर्शित) डाउनलोड करने के लिए प्रत्येक गैलरी पृष्ठ के नीचे प्रदर्शित ज़िप फ़ाइल के रूप में पेश करना चाहूंगा। - पूर्ण आकार की छवि को शामिल करना होगा।

डेविड वॉल्श ने फाइलों को ज़िप करने के लिए यहां अपने पोस्ट में कुछ कोड दिया है, लेकिन मुझे वर्डप्रेस फ़ंक्शन के साथ एकीकृत करने में परेशानी हो रही है।

मुझे पता है कि नेक्स्टजेन गैलरी डाउनलोड प्लगइन है, लेकिन मैं इसका उपयोग करने की स्थिति में नहीं हूं क्योंकि मैं मूल वर्डप्रेस गैलरी फ़ंक्शन का उपयोग करता हूं।

उपरोक्त पूरा करने के विकल्प (मैनुअल विधि) के साथ एक समान प्रश्न यहां पाया जा सकता है: संलग्न मीडिया फ़ाइलों को डाउनलोड करने के लिए प्लगइन?

किसी भी तरह की सहायता का स्वागत किया जाएगा। धन्यवाद।


समर्पित गैलरी पृष्ठों से आपका क्या तात्पर्य है?
NoBugs

मानक पोस्ट जो केवल गैलरी शोर्ट [गैलरी कॉलम = "4" लिंक = "फ़ाइल"] प्रदर्शित करते हैं और पृष्ठ पर कोई अन्य सामग्री नहीं है। मैंने इसे वर्णन में शामिल किया है कि यह केवल डेवलपर्स को मदद करता है।
पॉल थॉमसन

जवाबों:


14

सबसे पहले आपको चित्र प्राप्त करने होंगे। गैलरी की सभी छवियों को कैसे प्राप्त करें, यहां वर्णित है

फ़ाइलों को अनज़िप करने के लिए वर्डप्रेस दो वर्गों का उपयोग करता है। PHP में झुकाव ZipArchive()(उपयोग डेविड वॉल्श देखें)। और PclZip , आप इस वर्ग में पा सकते हैं wp-admin/includes/class-pclzip.php। यदि आपको ZipArchive()PclZip वर्ग की कोशिश करने में समस्या आती है।

अब आपको बस दोनों को एक साथ मिलाना है। शायद मैं बाद में कुछ नमूना कोड पोस्ट कर सकता हूं, वर्तमान में मैं अपने डेस्क पर नहीं हूं।

अपडेट करें

आपके प्रश्न को दो भागों में विभाजित किया जा सकता है। पहले वाले को एक गैलरी से सभी चित्र मिल रहे हैं। दूसरा चित्र ज़िप कर रहा है और ज़िप फ़ाइल भेजें।
मैं केवल पहले भाग की व्याख्या करूंगा, गैलरी की सभी छवियां प्राप्त करना, क्योंकि फाइलों को ज़िप करना थोड़ा ऑफटॉपिक है।

हो सकता है कि अन्य समाधान भी हों, लेकिन इस उदाहरण में मैं छवियों को प्राप्त करने के लिए एक कस्टम एक के साथ मूल गैलरी शोर्ट को प्रतिस्थापित करता हूं। कारण है, वर्डप्रेस ने v3.5 में दीर्घाओं को थोड़ा बदल दिया।
3.5 से पहले, गैलरी के लिए चित्र पोस्ट के अटैचमेंट हैं। 3.5 के बाद, छवियों को एक विशेषता के रूप में शोर्ट-पास किया जाता है। WP3.5 के बाद से हम एक पोस्ट की संलग्न छवियों को प्राप्त नहीं कर सकते हैं, हमें सूची को शोर्ट विशेषताओं से प्राप्त करना होगा। मेरी रणनीति मूल शोर्ट को एक कस्टम शोर्ट के साथ बदलने की है, विशेषताओं को पकड़ो और गैलरी आउटपुट प्राप्त करने के लिए मूल शोर्ट को कॉल करें।

सभी गैलरी से संबंधित चीजें एक कक्षा के भीतर हैं। ज़िप फ़ाइल बनाने के लिए, हम एक अन्य वर्ग का उपयोग कर सकते हैं जो गैलरी क्लास के आउटपुट के रूप में लेता है। आइए एक कक्षा और एक साधारण कंस्ट्रक्टर के साथ शुरू करें।

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

हम get_instance()हुक के साथ प्लगइन में बाद में विधि को कॉल करेंगे plugins_loaded। कंस्ट्रक्टर में, हम मूल शोर्ट को हटा देते हैं और इसे हमारे कस्टम शोर्ट के साथ बदल देते हैं gallery_zip_shortcode()। अब हमें शोर्ट कॉलबैक की आवश्यकता है

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;

}

इस विधि में पहली बात यह है कि पोस्ट प्राप्त करना है क्योंकि हमें पोस्ट आईडी की आवश्यकता है। हम इसमें शामिल हैं wp-includes/media.php, इस फ़ाइल में मूल गैलरी शोर्ट के लिए कॉलबैक फ़ंक्शन है। अब हम सभी छवियों के साथ एक सरणी प्राप्त करने के लिए एक विधि कहते हैं, मूल गैलरी कॉलबैक को कॉल करके गैलरी आउटपुट बनाते हैं, एक लिंक बनाते हैं और गैलरी आउटपुट के लिंक को जोड़ते हैं। छवियों के पथ, क्रमशः छवियों को, वर्ग चर में संग्रहीत किया जाता है $images, हमें बाद में इस सरणी की आवश्यकता है।
क्लास वेरिएबल $imageगैलरी के साथ प्रत्येक पोस्ट के लिए एक प्रविष्टि रखता है, इसलिए हम फ़ंक्शन का उपयोग फ्रंटपेज पर या एकल दृश्य में भी कर सकते हैं। प्रत्येक प्रविष्टि में प्रत्येक गैलरी के लिए एक सरणी होती है, क्योंकि प्रत्येक पोस्ट में एक से अधिक गैलरी हो सकती हैं।

प्लगइन का मुख्य तरीका शॉर्टकोड से छवियों को प्राप्त करने की विधि है।

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;

}

सबसे पहले हम यह तय करते हैं कि यह एकल पोस्ट है या पोस्ट आईडी की सूची। यदि यह पोस्ट आईडी की सूची है, तो हम WP3.5 + से एक गैलरी को संभालते हैं। उसके बाद, हमें excludeविशेषता को संभालना होगा । सभी वेरिबल्स को सेटअप करने के बाद, हम अंततः गैलरी से चित्र प्राप्त कर सकते हैं। $imagesबाद में उपयोग के लिए पुनर्प्राप्त छवियों को कक्षा के संस्करण में धकेल दिया जाएगा ।

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

यह प्लगइन का सोना है। बस क्वेरी तर्कों के साथ एक सरणी सेट करें, संलग्नक प्राप्त करें get_posts()और पुनः प्राप्त अनुलग्नकों पर चलें। विभिन्न आकारों को संभालने के लिए, हमें यूआरएल की अनुलग्नक छवि और पट्टी मिलती है। संलग्न फ़ाइल से, हम पथ लेते हैं और इसे फ़ाइल नाम के साथ जोड़ते हैं। सरणी $imagesमें अब गैलरी से सभी चित्र और उनके रास्ते हैं।

मूल रूप से इस बिंदु पर आपके प्रश्न का उत्तर दिया गया है। लेकिन आप छवियों से ज़िप फ़ाइल बनाना भी चाहते हैं। आप $imagesअंतिम विधि में सरणी से एक ज़िप फ़ाइल बना सकते हैं । लेकिन इस पद्धति को हर बार एक गैलरी प्रदर्शित किया जाता है और एक ज़िप फ़ाइल बनाने में थोड़ी देर लग सकती है। हो सकता है कि कोई आपके द्वारा बनाई गई ज़िप फ़ाइल का अनुरोध करे, यह संसाधनों की बर्बादी है।

हम इसे बेहतर कैसे कर सकते हैं? क्या आपको याद है कि मैंने सभी छवियों को वर्ग चर में रखा था $images? हम एक अजाक्स अनुरोध के लिए इस वर्ग संस्करण का उपयोग कर सकते हैं। लेकिन अजाक्स अनुरोध केवल एक अन्य पेज लोड है और हम केवल गैलरी के आउटपुट के निर्माण के समय ही छवियों तक पहुंच सकते हैं। हमें अपनी छवियों को एक ऐसे स्थान पर सहेजना होगा जहां हम दूसरे पृष्ठ के अनुरोध के बाद भी उन्हें एक्सेस कर सकें।
इस उदाहरण में मैं छवियों के साथ सरणी को संग्रहीत करने के लिए एक सत्र चर का उपयोग करता हूं। एक सत्र चर दूसरे पृष्ठ पुनः लोड करने के बाद भी पहुँचा जा सकता है। छवियों को संग्रहीत करने के लिए, मैं shutdownहुक के साथ एक विधि पंजीकृत करता हूं । वर्डप्रेस पेज को रेंडर करने के बाद, shutdownहुक कहलाएगा। इस बिंदु पर, हमें सभी प्रदर्शित दीर्घाओं से सभी छवियों को एकत्र करना चाहिए। हम बस छवियों को संग्रहीत करते हैं और उन्हें एक अजाक्स अनुरोध में एक्सेस कर सकते हैं।

जब अजाक्स अनुरोध शुरू हो जाता है, तो हम सत्र संस्करण को याद करते हैं और डेटा से एक ज़िप फ़ाइल बनाते हैं। लेकिन इस सवाल के लिए यह थोड़ा सा विषय है।

मैंने पूरी प्लगइन कोड के साथ GitHub पर एक रिपॉजिटरी बनाई । मुझे आशा है कि यह आपको सही दिशा में इंगित करता है।


ध्यान दें कि यदि आप नई 3.5-शैली की दीर्घाओं के साथ काम कर रहे हैं, तो गैलरी से छवियों को पुनः प्राप्त करने का वह तरीका आपके लिए काम नहीं कर सकता है।
मिलो

स्पष्ट करने के लिए मैं Wordpress 3.5.1 के नवीनतम संस्करण का उपयोग कर रहा हूं। जोहानस, अगर आप अपने डेस्कटॉप पर अगली बार कुछ नमूना कोड प्रदान करने में सक्षम थे, तो मैं बहुत आभारी रहूंगा। धन्यवाद, पॉल
पॉल थॉमसन

हे राल्फ, यह कुछ शानदार काम है! साझा करने के लिए धन्यवाद। मेरी गैलरी छवियों को ठीक से प्रदर्शित करने के लिए मुझे शोर्ट में "= फ़ाइल" को शामिल करना होगा: यानी [गैलरी लिंक = "फ़ाइल"] क्योंकि शोर्ट आपके कोड के माध्यम से फिर से लिखा गया है मुझे लगता है कि छोड़ा जा रहा है और एक के रूप में परिणाम मेरी दीर्घाओं को सही ढंग से प्रदर्शित नहीं किया जा रहा है। क्या उस तर्क को अपने कोड में ठीक करने का कोई तरीका है?
पॉल थॉमसन

आम तौर पर एट्रिब्यूशन बस मूल शोर्ट के माध्यम से पारित किए जाते हैं और संशोधित नहीं किए जाएंगे। दीर्घाओं को सामान्य रूप में प्रदर्शित किया जाता है, लेकिन कुछ HTML के साथ जोड़ा जाता है। मेरे परीक्षणों में (बीसवें स्टैंडरैड थीम के साथ) दीर्घाओं को सही ढंग से प्रदर्शित किया गया है।
राल्फ

@PaulThomson मैंने गितुब भंडार में कुछ मुद्दे तय किए। कोड साफ नहीं था।
राल्फ

0

मुझे राल्फ के प्लगइन का विचार पसंद है जो एक बार में पूरी गैलरी डाउनलोड करने में सक्षम है, लेकिन मैं इसे काम करने में सक्षम नहीं कर पाया हूं। मैं अपने उद्देश्यों के लिए काम करने वाले वर्कअराउंड के साथ आया हूं। यह विधि मूल WP गैलरी को अपने स्वयं के साथ बदलने के लिए है जिसे आप अपनी थीम की functions.phpफ़ाइल के अंत में रखते हैं और निम्नलिखित फ़ाइल को जोड़ते हैं, जिसे download.phpसक्रिय थीम फ़ोल्डर में नाम दिया गया है। कस्टम गैलरी में फ़ाइल के तहत एक लिंक फ़ाइल को डाउनलोड करता है। पीडीएफ जो स्वचालित रूप से आपकी फ़ाइल को हार्ड ड्राइव पर डाउनलोड करने के लिए मजबूर करता है। मैंने इसे नवीनतम क्रोम, फ़ायरफ़ॉक्स और सफारी संस्करणों पर परीक्षण किया है और यह ठीक काम करता है। ट्वेंटी बारह विषय का उपयोग कर रहे हैं, लेकिन कोई कारण नहीं है कि यह अन्य लोगों पर भी काम नहीं करना चाहिए।

a) निम्नलिखित को अंत में जोड़ें functions.php। यह केवल media.php से लिया गया है

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

बी) download.phpथीम के आधार निर्देशिका में एक फ़ाइल में निम्नलिखित को कॉपी और पेस्ट करें ।

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

सी)। गैलरी में फ़ाइल से लिंक करने के लिए मत भूलना !! महत्वपूर्ण!


मुझे नहीं लगता कि यह एक अच्छा विचार है, का उपयोग करते हुए download.phpऔर $_GETपैरामीटर मैं आपके वेब फ़ोल्डर (नेटवर्क शेयरों पर भी) से सभी फाइलें डाउनलोड कर सकता हूं, जैसेwp-config.php
डिएगो बेटो
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.