Önce görüntüleri almalısınız. Bir galerinin tüm görüntülerinin nasıl alınacağı burada açıklanmaktadır .
WordPress, dosyaları açmak için iki sınıf kullanır. PHP bilt ZipArchive()
(kullanım bkz. David Walsh). Ve PclZip , bu sınıfı içinde bulabilirsiniz wp-admin/includes/class-pclzip.php
. Eğer sorun ZipArchive()
yaşarsanız PclZip sınıfını deneyin.
Şimdi ikisini de yapıştırmanız gerekiyor. Belki daha sonra bazı örnek kod gönderebilirim, şu anda masamda değilim.
Güncelleme
Sorunuz iki kısma ayrılabilir. Birincisi bir galeriden tüm görüntüleri almak. İkincisi görüntüleri sıkıştırıyor ve zip dosyasını gönderiyor.
Sadece ilk bölümü açıklayacağım, bir galerinin tüm görüntülerini alacağım, çünkü dosyaları sıkıştırmak biraz oftopik.
Belki başka çözümler var, ancak bu örnekte görüntüleri almak için orijinal galeri kısa kodunu özel bir kodla değiştiriyorum. Nedeni, WordPress'in v3.5'teki galerileri biraz değiştirdi.
3.5'ten önce, bir galeri için görüntüler gönderinin ekleridir. 3.5'ten sonra görüntüler öznitelik olarak kısa koda iletilir. WP3.5'ten beri artık bir gönderinin ekli görüntülerini alamıyoruz, listeyi kısa kod özelliklerinden almamız gerekiyor. Stratejim, orijinal kısa kodu özel bir kısa kodla değiştirmek, nitelikleri almak ve galeri çıktısını almak için orijinal kısa kodu çağırmaktır.
Galeri ile ilgili tüm şeyler bir sınıf içinde. Bir zip dosyası oluşturmak için, galeri sınıfının çıktısını girdi olarak alan başka bir sınıf kullanabiliriz. Bir sınıf ve basit bir kurucu ile başlayalım.
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' ) );
}
}
Yöntemi get_instance()
daha sonra eklentide kanca ile çağıracağız plugins_loaded
. Yapıcıda, orijinal kısa kodu kaldırırız ve özel kısa kodumuzla değiştiririz gallery_zip_shortcode()
. Şimdi kısa kod geri aramasına ihtiyacımız var
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;
}
Bu yöntemdeki ilk şey gönderiyi almaktır çünkü gönderi kimliğine ihtiyacımız var. Dahil ettiğimizden wp-includes/media.php
, bu dosya orijinal galeri kısa kodu için geri arama işlevini içeriyor. Şimdi, tüm görüntülerle bir dizi elde etmek, orijinal galeri geri aramasını arayarak galeri çıktısını oluşturmak, bir bağlantı oluşturmak ve galeri çıktısına bağlantı eklemek için bir yöntem çağırıyoruz. Görüntülerin kendisi, sırasıyla görüntülerin yolları, sınıf değişkeninde saklanır, $images
daha sonra bu diziye ihtiyacımız var.
Sınıf değişkeni $image
, galeriye sahip her yazı için bir giriş tutar, böylece işlevi ön sayfada veya tek görünümde kullanabiliriz. Her yazı, her yazı için bir dizi içerir, çünkü her yazıda birden fazla galeri olabilir.
Eklentinin çekirdeği, görüntüleri kısa koddan alma yöntemidir.
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;
}
İlk önce tek bir gönderi mi yoksa posta kimlikleri listesi mi olduğuna karar veririz. Posta kimlikleri listesi ise, WP3.5 + 'dan bir galeriyi ele alıyoruz. Bundan sonra, exclude
niteliği ele almalıyız. Tüm değişkenleri kurduktan sonra, görüntüleri galeriden alabiliriz. Geri alınan görüntüler $images
daha sonra kullanılmak üzere sınıf var'a aktarılacaktır .
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;
}
Bu eklentinin altını. Sorgu bağımsız değişkenleri içeren bir dizi kurmanız, ekleri almanız get_posts()
ve geri alınan eklerin üzerinden geçmeniz yeterlidir . Farklı boyutları işlemek için, URL'nin ek görüntüsünü ve şeridini alırız. Ekli dosyadan yolu alıp dosya adıyla bir araya getiriyoruz. Dizide $images
artık galeriden tüm görüntüler ve yolları var.
Temel olarak sorunuz bu noktada cevaplanmaktadır. Ama aynı zamanda görüntülerden zip dosyası kreatea istiyorum. $images
Son yöntemde diziden bir zip dosyası oluşturabilirsiniz . Ancak bu yöntem her galeri görüntülendiğinde çağrılır ve bir zip dosyası oluşturmak biraz zaman alabilir. Belki hiç kimse burada oluşturduğunuz zip dosyasını istemez, bu bir kaynak israfıdır.
Nasıl daha iyi yapabiliriz? Tüm resimleri sınıf değişkenine koyduğumu hatırlıyor musunuz $images
? Bu sınıf var ajax isteği için kullanabilirsiniz. Ancak ajax isteği yalnızca başka bir sayfa yüküdür ve görüntülere yalnızca galerinin çıktısı oluşturulduğunda erişebiliriz. Görüntülerimizi başka bir sayfa isteğinden sonra bile erişebileceğimiz bir yere kaydetmemiz gerekiyor.
Bu örnekte diziyi görüntülerle birlikte saklamak için bir oturum değişkeni kullanıyorum. Bir oturum değişkenine başka bir sayfa yeniden yüklendikten sonra bile erişilebilir. Görüntüleri saklamak için shutdown
kancaya bir yöntem kaydediyorum. WordPress sayfayı oluşturmayı bitirdikten sonra shutdown
kanca çağrılır. Bu noktada, görüntülenen tüm galerilerden tüm görüntüleri toplamalıydık. Sadece görüntüleri saklıyoruz ve bir ajax isteğinde bunlara erişebiliyoruz.
Ajax isteği tetiklendiğinde, session var'ı hatırlar ve verilerden bir zip dosyası oluştururuz. Ancak bu, bu soru için biraz konu dışı.
GitHub'da tam eklenti kodunu içeren bir depo oluşturdum . Umarım sizi doğru yöne yönlendirir.