Pertama, Anda harus mendapatkan gambar. Cara mendapatkan semua gambar galeri dijelaskan di sini .
WordPress menggunakan dua kelas untuk membuka ritsleting file. PHP bilt in ZipArchive()
(penggunaan lihat David Walsh). Dan PclZip , Anda dapat menemukan kelas ini di wp-admin/includes/class-pclzip.php
. Jika Anda punya masalah denganZipArchive()
mencoba kelas PclZip.
Sekarang Anda hanya harus menempelkan keduanya. Mungkin saya dapat memposting beberapa kode sampel nanti, saat ini saya tidak di meja saya.
Memperbarui
Pertanyaan Anda dapat dibagi menjadi dua bagian. Yang pertama adalah mendapatkan semua gambar dari galeri. Yang kedua adalah zip gambar dan mengirim file zip.
Saya hanya akan menjelaskan bagian pertama, mendapatkan semua gambar dari galeri, karena ripping file agak offtopic.
Mungkin ada solusi lain, tetapi dalam contoh ini saya mengganti shortcode galeri asli dengan yang kustom untuk mendapatkan gambar. Alasannya, WordPress mengubah galeri di v3.5 sedikit.
Sebelum 3.5, gambar untuk galeri adalah lampiran posting. Setelah 3.5, gambar dilewatkan ke kode pendek sebagai atribut. Karena WP3.5 kita tidak bisa lagi mendapatkan gambar lampiran dari sebuah posting, kita harus mengambil daftar dari atribut shortcode. Strategi saya adalah mengganti kode pendek asli dengan kode pendek khusus, ambil atribut dan panggil kode pendek asli untuk mendapatkan output galeri.
Semua hal yang berhubungan dengan galeri berada dalam kelas. Untuk membuat file zip, kita bisa menggunakan kelas lain yang mengambil input dari kelas galeri. Mari kita mulai dengan kelas dan konstruktor sederhana.
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' ) );
}
}
Kami akan memanggil metode get_instance()
nanti di plugin dengan hook plugins_loaded
. Di konstruktor, kami menghapus kode pendek asli dan menggantinya dengan kode pendek khusus kami gallery_zip_shortcode()
. Sekarang kita membutuhkan panggilan balik kode pendek
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;
}
Hal pertama dalam metode ini adalah mendapatkan posting karena kita membutuhkan ID posting. Selain kami sertakan wp-includes/media.php
, file ini berisi fungsi panggilan balik untuk kode singkat galeri asli. Sekarang kita memanggil metode untuk mendapatkan array dengan semua gambar, membuat output galeri dengan memanggil callback galeri asli, membuat tautan dan menambahkan tautan ke output galeri. Gambar itu sendiri, masing-masing jalur ke gambar, disimpan dalam variabel kelas $images
, kita perlu array ini nanti.
Variabel kelas $image
menyimpan entri untuk setiap posting dengan galeri, sehingga kita dapat menggunakan fungsi baik di halaman depan atau dalam tampilan tunggal. Setiap entri berisi larik untuk setiap galeri, karena mungkin ada lebih dari satu galeri di setiap kiriman.
Inti dari plugin adalah metode untuk mendapatkan gambar dari kode pendek.
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;
}
Pada awalnya kami memutuskan apakah itu satu posting atau daftar ID posting. Jika ini adalah daftar ID kiriman, kami menangani galeri dari WP3.5 +. Setelah itu, kita harus menangani exclude
atributnya. Setelah mengatur semua variabel, kami akhirnya bisa mendapatkan gambar dari galeri. Gambar yang diambil akan didorong ke kelas var $images
untuk digunakan nanti.
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;
}
Ini adalah emas dari plugin. Cukup siapkan array dengan argumen kueri, dapatkan lampirannya get_posts()
dan berjalan di atas lampiran yang diambil. Untuk menangani ukuran yang berbeda, kami mendapatkan gambar lampiran dan strip url. Dari file terlampir, kami mengambil path dan menggabungkannya dengan nama file. Dalam array $images
sekarang semua gambar dan jalurnya dari galeri.
Pada dasarnya pertanyaan Anda dijawab pada saat ini. Tetapi Anda juga ingin membuat file zip dari gambar. Anda bisa membuat file zip dari array $images
di metode terakhir. Tetapi metode ini disebut setiap kali galeri ditampilkan dan membuat file zip bisa memakan waktu cukup lama. Mungkin tidak ada yang akan meminta file zip yang Anda buat di sini, ini adalah pemborosan sumber daya.
Bagaimana kita bisa melakukannya dengan lebih baik? Apakah Anda ingat bahwa saya meletakkan semua gambar dalam variabel kelas $images
? Kita bisa menggunakan var kelas ini untuk permintaan ajax. Tetapi permintaan ajax hanyalah pemuatan halaman lain dan kita hanya dapat mengakses gambar ketika output galeri dibuat. Kita harus menyimpan gambar kita di tempat di mana kita dapat mengaksesnya bahkan setelah permintaan halaman lain.
Dalam contoh ini saya menggunakan variabel sesi untuk menyimpan array dengan gambar. Variabel sesi dapat diakses bahkan setelah halaman lain dimuat ulang. Untuk menyimpan gambar, saya mendaftarkan metode dengan shutdown
hook. Setelah WordPress selesai merender halaman, shutdown
hook akan dipanggil. Pada titik ini, kita seharusnya sudah mengumpulkan semua gambar dari semua galeri yang ditampilkan. Kami hanya menyimpan gambar dan dapat mengaksesnya dalam permintaan ajax.
Ketika permintaan ajax dipicu, kami mengingat sesi var dan membuat file zip dari data. Tapi ini agak aneh untuk pertanyaan ini.
Saya membuat repositori di GitHub dengan kode plugin lengkap. Saya harap ini menunjukkan Anda ke arah yang benar.