सबसे पहले आपको चित्र प्राप्त करने होंगे। गैलरी की सभी छवियों को कैसे प्राप्त करें, यहां वर्णित है ।
फ़ाइलों को अनज़िप करने के लिए वर्डप्रेस दो वर्गों का उपयोग करता है। 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 पर एक रिपॉजिटरी बनाई । मुझे आशा है कि यह आपको सही दिशा में इंगित करता है।