Per prima cosa devi ottenere le immagini. Come ottenere tutte le immagini di una galleria è descritto qui .
WordPress utilizza due classi per decomprimere i file. PHP integrato ZipArchive()
(utilizzo vedi David Walsh). E PclZip , puoi trovare questa classe in wp-admin/includes/class-pclzip.php
. Se hai problemi con ZipArchive()
prova la classe PclZip.
Ora devi solo incollare entrambi insieme. Forse potrò pubblicare qualche codice di esempio in seguito, al momento non sono alla mia scrivania.
Aggiornare
La tua domanda può essere divisa in due parti. Il primo è ottenere tutte le immagini da una galleria. Il secondo è zippare le immagini e inviare il file zip.
Spiegherò solo la prima parte, ottenendo tutte le immagini di una galleria, perché zippare i file è leggermente offtopico.
Forse ci sono altre soluzioni, ma in questo esempio sostituisco lo shortcode della galleria originale con uno personalizzato per ottenere le immagini. Il motivo è che WordPress ha cambiato un po 'le gallerie in v3.5.
Prima del 3.5, le immagini per una galleria sono allegati del post. Dopo 3.5, le immagini vengono passate allo shortcode come attributo. Dal momento che WP3.5 non possiamo più ottenere le immagini allegate di un post, dobbiamo recuperare l'elenco dagli attributi shortcode. La mia strategia è quella di sostituire lo shortcode originale con uno shortcode personalizzato, afferrare gli attributi e chiamare lo shortcode originale per ottenere l'output della galleria.
Tutte le cose relative alla galleria sono all'interno di una classe. Per creare un file zip, possiamo usare un'altra classe che accetta come input l'output della classe gallery. Cominciamo con una classe e un semplice costruttore.
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' ) );
}
}
Chiameremo il metodo get_instance()
più avanti nel plugin con l'hook plugins_loaded
. Nel costruttore, rimuoviamo lo shortcode originale e lo sostituiamo con il nostro shortcode personalizzato gallery_zip_shortcode()
. Ora abbiamo bisogno del callback dello 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;
}
La prima cosa in questo metodo è ottenere il post perché abbiamo bisogno dell'ID post. Di ciò che includiamo wp-includes/media.php
, questo file contiene la funzione di callback per lo shortcode della galleria originale. Ora chiamiamo un metodo per ottenere un array con tutte le immagini, creare l'output della galleria chiamando il callback originale della galleria, creare un collegamento e aggiungere il collegamento all'output della galleria. Le immagini stesse, rispettivamente i percorsi delle immagini, sono archiviate nella variabile di classe $images
, abbiamo bisogno di questo array in seguito.
La variabile di classe $image
contiene una voce per ogni post con una galleria, quindi possiamo usare la funzione in prima pagina o in vista singola. Ogni voce contiene un array per ogni galleria, perché in ogni post può esserci più di una galleria.
Il nucleo del plugin è il metodo per ottenere le immagini dallo 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;
}
Inizialmente decidiamo se si tratta di un singolo post o di un elenco di ID post. Se è un elenco di ID post, gestiamo una galleria da WP3.5 +. Successivamente, dobbiamo gestire l' exclude
attributo. Dopo aver impostato tutte le variabili, possiamo finalmente ottenere le immagini dalla galleria. Le immagini recuperate verranno inserite nella classe var $images
per un uso successivo.
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;
}
Questo è l'oro del plugin. Basta impostare un array con argomenti di query, ottenere gli allegati get_posts()
e camminare sugli allegati recuperati. Per gestire dimensioni diverse, otteniamo l'immagine dell'allegato e la striscia dell'URL. Dal file allegato, prendiamo il percorso e lo mettiamo insieme al nome del file. Nell'array $images
sono ora presenti tutte le immagini e i relativi percorsi dalla galleria.
Fondamentalmente la tua domanda ha una risposta a questo punto. Ma vuoi anche creare un file zip dalle immagini. È possibile creare un file zip dall'array $images
nell'ultimo metodo. Ma questo metodo viene chiamato ogni volta che viene visualizzata una galleria e la creazione di un file zip potrebbe richiedere del tempo. Forse nessuno richiederebbe il file zip che hai creato qui, questo è uno spreco di risorse.
Come possiamo farlo meglio? Ti ricordi che ho inserito tutte le immagini nella variabile di classe $images
? Possiamo usare questa classe var per una richiesta Ajax. Ma una richiesta Ajax è solo un altro caricamento della pagina e possiamo accedere alle immagini solo quando viene creato l'output della galleria. Dobbiamo salvare le nostre immagini in un luogo in cui possiamo accedervi anche dopo un'altra richiesta di pagina.
In questo esempio utilizzo una variabile di sessione per memorizzare l'array con le immagini. È possibile accedere a una variabile di sessione anche dopo il ricaricamento di un'altra pagina. Per memorizzare le immagini, registro un metodo con il shutdown
gancio. Dopo che WordPress ha terminato il rendering della pagina, shutdown
verrà chiamato l' hook. A questo punto, avremmo dovuto raccogliere tutte le immagini da tutte le gallerie visualizzate. Memorizziamo semplicemente le immagini e possiamo accedervi in una richiesta Ajax.
Quando viene attivata la richiesta Ajax, ricordiamo la sessione var e creiamo un file zip dai dati. Ma questo è un po 'fuori tema per questa domanda.
Ho creato un repository su GitHub con il codice plugin completo. Spero che ti indichi nella giusta direzione.