Đầu tiên bạn phải có được những hình ảnh. Làm thế nào để có được tất cả các hình ảnh của một bộ sưu tập được mô tả ở đây .
WordPress sử dụng hai lớp để giải nén các tập tin. Các bilt PHP trong ZipArchive()
(sử dụng xem David Walsh). Và PclZip , bạn có thể tìm thấy lớp này trong wp-admin/includes/class-pclzip.php
. Nếu bạn gặp vấn đề với ZipArchive()
hãy thử lớp PclZip.
Bây giờ bạn chỉ cần phải dán cả hai với nhau. Có lẽ tôi có thể đăng một số mã mẫu sau, hiện tại tôi không ở bàn làm việc của mình.
Cập nhật
Câu hỏi của bạn có thể được chia thành hai phần. Người đầu tiên nhận được tất cả hình ảnh từ một bộ sưu tập. Cái thứ hai là nén hình ảnh và gửi tệp zip.
Tôi sẽ chỉ giải thích phần đầu tiên, lấy tất cả hình ảnh của một bộ sưu tập, bởi vì việc nén các tập tin hơi khác thường.
Có thể có các giải pháp khác, nhưng trong ví dụ này tôi thay thế shortcode bộ sưu tập ban đầu bằng một tùy chỉnh để lấy hình ảnh. Lý do là, WordPress đã thay đổi các phòng trưng bày trong phiên bản 3.5 một chút.
Trước 3.5, hình ảnh cho một bộ sưu tập là tệp đính kèm của bài đăng. Sau 3.5, các hình ảnh được chuyển đến shortcode dưới dạng một thuộc tính. Vì WP3.5, chúng tôi không thể nhận được các hình ảnh đính kèm của bài đăng, chúng tôi phải tìm nạp danh sách từ các thuộc tính shortcode. Chiến lược của tôi là thay thế mã ngắn ban đầu bằng một mã ngắn tùy chỉnh, lấy các thuộc tính và gọi mã ngắn gốc để lấy đầu ra của thư viện.
Tất cả những thứ liên quan đến bộ sưu tập là trong một lớp học. Để tạo một tệp zip, chúng ta có thể sử dụng một lớp khác lấy đầu vào là đầu ra của lớp bộ sưu tập. Hãy bắt đầu với một lớp và một hàm tạo đơn giản.
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' ) );
}
}
Chúng ta sẽ gọi phương thức get_instance()
sau trong plugin bằng hook plugins_loaded
. Trong hàm tạo, chúng tôi xóa mã ngắn ban đầu và thay thế bằng mã ngắn tùy chỉnh gallery_zip_shortcode()
. Bây giờ chúng ta cần gọi lại 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;
}
Điều đầu tiên trong phương pháp này là để có được bài viết vì chúng ta cần ID bài đăng. Hơn chúng tôi bao gồm wp-includes/media.php
, tệp này chứa chức năng gọi lại cho mã ngắn thư viện gốc. Bây giờ chúng ta gọi một phương thức để có được một mảng với tất cả các hình ảnh, tạo đầu ra của thư viện bằng cách gọi lại cuộc gọi bộ sưu tập ban đầu, tạo một liên kết và nối thêm liên kết vào đầu ra của thư viện. Các hình ảnh, tương ứng các đường dẫn đến hình ảnh, được lưu trữ trong biến lớp $images
, chúng ta cần mảng này sau.
Biến lớp $image
giữ một mục nhập cho mỗi bài đăng với một bộ sưu tập, vì vậy chúng ta có thể sử dụng chức năng này trên frontpage hoặc trong một chế độ xem. Mỗi mục chứa một mảng cho mỗi thư viện, bởi vì có thể có nhiều hơn một thư viện trong mỗi bài.
Cốt lõi của plugin là phương pháp để lấy hình ảnh từ shortcode.
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;
}
Đầu tiên, chúng tôi quyết định nếu đó là một bài đăng hoặc một danh sách ID bài đăng. Nếu đó là danh sách ID bài đăng, chúng tôi sẽ xử lý một thư viện từ WP3.5 +. Sau đó, chúng ta phải xử lý exclude
thuộc tính. Sau khi thiết lập tất cả các varibles, cuối cùng chúng ta có thể lấy hình ảnh từ thư viện. Các hình ảnh được gỡ lại sẽ được đẩy vào var lớp $images
để sử dụng sau.
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;
}
Đây là vàng của plugin. Đơn giản chỉ cần thiết lập một mảng với các đối số truy vấn, nhận các tệp đính kèm get_posts()
và đi qua các tệp đính kèm được truy xuất. Để xử lý các kích thước khác nhau, chúng tôi lấy hình ảnh đính kèm và dải url. Từ tệp đính kèm, chúng tôi lấy đường dẫn và đặt nó cùng với tên tệp. Trong mảng $images
bây giờ là tất cả các hình ảnh và đường dẫn của chúng từ bộ sưu tập.
Về cơ bản câu hỏi của bạn được trả lời tại thời điểm này. Nhưng bạn cũng muốn tạo tệp zip từ hình ảnh. Bạn có thể tạo một tệp zip từ mảng $images
trong phương thức cuối cùng. Nhưng phương pháp này được gọi mỗi khi một thư viện được hiển thị và việc tạo tệp zip có thể mất một lúc. Có lẽ không ai sẽ yêu cầu tệp zip bạn tạo ở đây, đây là một sự lãng phí tài nguyên.
Làm thế nào chúng ta có thể làm điều đó tốt hơn? Bạn có nhớ rằng tôi đặt tất cả các hình ảnh trong biến lớp $images
không? Chúng ta có thể sử dụng var lớp này cho một yêu cầu ajax. Nhưng một yêu cầu ajax chỉ là một tải trang khác và chúng ta chỉ có thể truy cập các hình ảnh khi đầu ra của thư viện được tạo. Chúng tôi phải lưu hình ảnh của chúng tôi ở một nơi mà chúng tôi có thể truy cập chúng ngay cả sau khi yêu cầu trang khác.
Trong ví dụ này tôi sử dụng biến phiên để lưu trữ mảng bằng hình ảnh. Một biến phiên có thể được truy cập ngay cả sau khi tải lại trang khác. Để lưu trữ hình ảnh, tôi đăng ký một phương thức với shutdown
hook. Sau khi WordPress kết xuất trang xong, shutdown
hook sẽ được gọi. Tại thời điểm này, chúng ta nên thu thập tất cả các hình ảnh từ tất cả các phòng trưng bày được hiển thị. Chúng tôi chỉ cần lưu trữ hình ảnh và có thể truy cập chúng trong một yêu cầu ajax.
Khi yêu cầu ajax được kích hoạt, chúng tôi gọi lại var phiên và tạo tệp zip từ dữ liệu. Nhưng đây là một chủ đề hơi xa cho câu hỏi này.
Tôi đã tạo một kho lưu trữ trên GitHub với mã plugin hoàn chỉnh. Tôi hy vọng nó chỉ cho bạn đi đúng hướng.