ก่อนอื่นคุณต้องได้ภาพมาก่อน วิธีการรับภาพทั้งหมดของแกลเลอรี่อธิบายไว้ที่นี่
WordPress ใช้สองคลาสสำหรับการคลายไฟล์ PHP bilt in ZipArchive()
(การใช้งานดู David Walsh) และPclZipคุณสามารถพบคลาสนี้wp-admin/includes/class-pclzip.php
ได้ หากคุณมีปัญหากับการZipArchive()
ลองคลาส PclZip
ตอนนี้คุณต้องติดกาวทั้งสองเข้าด้วยกัน บางทีฉันสามารถโพสต์โค้ดตัวอย่างบางส่วนได้ในขณะนี้ฉันไม่ได้อยู่ที่โต๊ะทำงาน
ปรับปรุง
คำถามของคุณสามารถแยกออกเป็นสองส่วน คนแรกคือการรับภาพทั้งหมดจากแกลเลอรี่ อันที่สองคือการซิปภาพและส่งไฟล์ซิป
ฉันจะอธิบายเฉพาะตอนแรกเพื่อให้ได้ภาพทั้งหมดของแกลเลอรี่เพราะการซิปไฟล์เป็นเรื่องเล็กน้อย
อาจมีวิธีแก้ไขปัญหาอื่น ๆ แต่ในตัวอย่างนี้ฉันแทนที่รหัสย่อแกลเลอรีดั้งเดิมด้วยรหัสที่กำหนดเองเพื่อรับรูปภาพ เหตุผลคือ WordPress เปลี่ยนแกลเลอรี่เป็น v3.5 นิดหน่อย
ก่อนหน้า 3.5 ภาพสำหรับแกลเลอรี่เป็นสิ่งที่แนบมากับโพสต์ หลังจาก 3.5 รูปภาพจะถูกส่งไปยังรหัสย่อในฐานะแอตทริบิวต์ เนื่องจาก WP3.5 เราไม่สามารถรับภาพที่แนบมาของโพสต์ได้อีกต่อไปเราจึงต้องดึงรายการจากแอตทริบิวต์รหัสย่อ กลยุทธ์ของฉันคือการแทนที่รหัสเดิมด้วยรหัสย่อที่กำหนดเองคว้าแอตทริบิวต์และเรียกรหัสย่อดั้งเดิมเพื่อรับเอาท์พุทแกลเลอรี่
สิ่งที่เกี่ยวข้องกับแกลเลอรี่ทั้งหมดอยู่ในชั้นเรียน เพื่อสร้างไฟล์ zip เราสามารถใช้คลาสอื่นที่ใช้เป็นอินพุตเอาต์พุตของคลาสแกลเลอรี เริ่มจากคลาสและคอนสตรัคเตอร์เรียบง่ายกันเถอะ
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
ใน Constructor 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;
}
ตอนแรกเราจะตัดสินใจว่าเป็นโพสต์เดียวหรือรายการรหัสโพสต์ หากเป็นรายการของโพสต์ ID เราจัดการแกลเลอรี่จาก WP3.5 + หลังจากนั้นเราต้องจัดการexclude
คุณสมบัติ หลังจากตั้งค่า varibles ทั้งหมดในที่สุดเราก็สามารถรับภาพจากแกลเลอรี่ ภาพที่ถูกดึงกลับมาจะถูกส่งไปยัง var class $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()
และเดินผ่านสิ่งที่แนบมาที่ดึงมา เพื่อจัดการกับขนาดที่แตกต่างกันเราจะได้ภาพและแถบของ URL จากไฟล์ที่แนบมาเรานำพา ธ และใส่มันพร้อมกับชื่อไฟล์ ในอาร์เรย์$images
ตอนนี้ภาพทั้งหมดและเส้นทางของพวกเขาจากแกลเลอรี่
โดยทั่วไปคำถามของคุณจะได้รับคำตอบ ณ จุดนี้ แต่คุณยังต้องการสร้างไฟล์ zip จากภาพ คุณสามารถสร้างไฟล์ zip จากอาเรย์$images
ในวิธีสุดท้าย แต่วิธีนี้เรียกว่าทุกครั้งที่แกลเลอรี่ปรากฏขึ้นและการสร้างไฟล์ zip อาจใช้เวลาสักครู่ อาจไม่มีใครขอไฟล์ซิปที่คุณสร้างขึ้นที่นี่นี่เป็นการสิ้นเปลืองทรัพยากร
เราจะทำให้ดีขึ้นได้อย่างไร คุณจำได้ไหมว่าฉันใส่ภาพทั้งหมดในตัวแปรคลาส$images
? เราสามารถใช้ var class นี้สำหรับคำขอ ajax แต่คำขอ ajax เป็นเพียงการโหลดหน้าอื่นและเราสามารถเข้าถึงภาพได้ก็ต่อเมื่อสร้างเอาท์พุทแกลเลอรี่ เราต้องบันทึกภาพของเราในสถานที่ที่เราสามารถเข้าถึงได้แม้จะมีคำขอหน้าอื่น
ในตัวอย่างนี้ฉันใช้ตัวแปรเซสชั่นเพื่อเก็บอาร์เรย์ด้วยภาพ ตัวแปรเซสชั่นสามารถเข้าถึงได้แม้หลังจากโหลดหน้าอื่น ในการจัดเก็บภาพฉันลงทะเบียนวิธีการด้วยshutdown
เบ็ด หลังจาก WordPress แสดงผลหน้าเว็บเสร็จshutdown
ตะขอจะถูกเรียก ณ จุดนี้เราควรรวบรวมภาพทั้งหมดจากแกลเลอรี่ที่แสดงทั้งหมด เราเพียงเก็บรูปภาพและสามารถเข้าถึงได้ในคำขอ ajax
เมื่อมีการเรียกใช้คำขอ ajax เราจะเรียกคืนเซสชัน var และสร้างไฟล์ zip จากข้อมูล แต่นี่เป็นหัวข้อสำหรับคำถามนี้เล็กน้อย
ฉันสร้างที่เก็บบน GitHubด้วยรหัสปลั๊กอินที่สมบูรณ์ ฉันหวังว่ามันจะชี้ให้คุณในทิศทางที่ถูกต้อง