প্রথমে আপনাকে ছবিগুলি পেতে হবে। কোনও গ্যালারির সমস্ত চিত্র কীভাবে পাবেন তা এখানে বর্ণিত হয়েছে ।
ওয়ার্ডপ্রেস ফাইল আনজিপিংয়ের জন্য দুটি ক্লাস ব্যবহার করে। পিএইচপি বিল্ট ইন ZipArchive()
(ব্যবহার দেখুন ডেভিড ওয়ালশ)। এবং পিসিএলজিপ , আপনি এই ক্লাসটি খুঁজে পেতে পারেন wp-admin/includes/class-pclzip.php
। আপনার যদি সমস্যা হয় ZipArchive()
তবে প্লেসিপ জিপ ক্লাসটি ব্যবহার করে দেখুন।
এখন আপনি উভয় একসাথে আঠালো করতে হবে। হয়তো আমি পরে কিছু নমুনা কোড পোস্ট করতে পারি, বর্তমানে আমি আমার ডেস্কে নেই।
হালনাগাদ
আপনার প্রশ্ন দুটি ভাগে বিভক্ত করা যেতে পারে। প্রথমটি একটি গ্যালারী থেকে সমস্ত চিত্র পাচ্ছে। দ্বিতীয়টি চিত্রগুলি জিপ করছে এবং জিপ ফাইলটি প্রেরণ করছে।
আমি কেবল প্রথম অংশটি ব্যাখ্যা করব, গ্যালারির সমস্ত চিত্র পেয়েছি, কারণ ফাইলগুলি জিপ করা কিছুটা অফটোপিক।
সম্ভবত অন্যান্য সমাধান রয়েছে, তবে এই উদাহরণে আমি চিত্রগুলি পেতে একটি কাস্টম দিয়ে আসল গ্যালারী শর্টকোডটি প্রতিস্থাপন করি। কারণটি হ'ল, ওয়ার্ডপ্রেস কিছুটা 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
একটি গ্যালারী সহ প্রতিটি পোস্টের জন্য একটি এন্ট্রি ধারণ করে, যাতে আমরা ফাংশনটি সম্মুখ পৃষ্ঠায় বা একক দৃশ্যে ব্যবহার করতে পারি। প্রতিটি এন্ট্রি প্রতিটি গ্যালারী জন্য একটি অ্যারে ধারণ করে, কারণ প্রতিটি পোস্টে একাধিক গ্যালারী থাকতে পারে।
প্লাগইনটির মূলটি হ'ল শর্টকোড থেকে চিত্রগুলি পাওয়ার পদ্ধতি the
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
হুক কল করা হবে। এই মুহুর্তে, আমাদের প্রদর্শিত সমস্ত গ্যালারী থেকে সমস্ত চিত্র সংগ্রহ করা উচিত ছিল। আমরা কেবল চিত্রগুলি সঞ্চয় করি এবং একটি অজ্যাক্স অনুরোধে এগুলি অ্যাক্সেস করতে পারি।
যখন এজাক্স অনুরোধটি ট্রিগার করা হয়, তখন আমরা সেশনের ভারগুলি পুনরায় স্মরণ করি এবং ডেটা থেকে একটি জিপ ফাইল তৈরি করি। তবে এই প্রশ্নের জন্য এটি কিছুটা বন্ধ।
আমি সম্পূর্ণ প্লাগইন কোড সহ গিটহাবে একটি সংগ্রহস্থল তৈরি করেছি । আমি আশা করি এটি আপনাকে সঠিক দিকে নির্দেশ করবে।