Primero tienes que obtener las imágenes. Aquí se describe cómo obtener todas las imágenes de una galería .
WordPress usa dos clases para descomprimir archivos. El PHP bilt in ZipArchive()
(uso ver David Walsh). Y PclZip , puedes encontrar esta clase en wp-admin/includes/class-pclzip.php
. Si tienes problemas con ZipArchive()
probar la clase PclZip.
Ahora solo tienes que pegar ambos juntos. Tal vez pueda publicar un código de muestra más tarde, actualmente no estoy en mi escritorio.
Actualizar
Su pregunta se puede dividir en dos partes. El primero es obtener todas las imágenes de una galería. El segundo es comprimir las imágenes y enviar el archivo zip.
Solo explicaré la primera parte, obtener todas las imágenes de una galería, porque comprimir los archivos es un poco fuera de tema.
Quizás haya otras soluciones, pero en este ejemplo, reemplazo el shortcode de la galería original por uno personalizado para obtener las imágenes. La razón es que WordPress cambió un poco las galerías en v3.5.
Antes de 3.5, las imágenes de una galería son archivos adjuntos de la publicación. Después de 3.5, las imágenes se pasan al shortcode como un atributo. Desde WP3.5 ya no podemos obtener las imágenes adjuntas de una publicación, tenemos que obtener la lista de los atributos de código corto. Mi estrategia es reemplazar el shortcode original con un shortcode personalizado, tomar los atributos y llamar al shortcode original para obtener la salida de la galería.
Todas las cosas relacionadas con la galería están dentro de una clase. Para crear un archivo zip, podemos usar otra clase que tome como entrada la salida de la clase de la galería. Comencemos con una clase y un constructor simple.
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' ) );
}
}
Llamaremos al método get_instance()
más adelante en el complemento con el gancho plugins_loaded
. En el constructor, eliminamos el shortcode original y lo reemplazamos con nuestro shortcode personalizado gallery_zip_shortcode()
. Ahora necesitamos la devolución de llamada 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;
}
Lo primero en este método es obtener la publicación porque necesitamos la ID de la publicación. De lo que incluimos wp-includes/media.php
, este archivo contiene la función de devolución de llamada para el shortcode de la galería original. Ahora llamamos a un método para obtener una matriz con todas las imágenes, crear la salida de la galería llamando a la devolución de llamada de la galería original, crear un enlace y agregar el enlace a la salida de la galería. Las imágenes en sí, respectivamente, las rutas a las imágenes, se almacenan en la variable de clase $images
, necesitamos esta matriz más adelante.
La variable de clase $image
contiene una entrada para cada publicación con una galería, por lo que podemos usar la función en la página principal o en una vista única. Cada entrada contiene una matriz para cada galería, porque puede haber más de una galería en cada publicación.
El núcleo del complemento es el método para obtener las imágenes del 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;
}
Al principio decidimos si es una publicación única o una lista de ID de publicaciones. Si se trata de una lista de ID de publicaciones, manejamos una galería de WP3.5 +. Después de eso, tenemos que manejar el exclude
atributo. Después de configurar todas las variables, finalmente podemos obtener las imágenes de la galería. Las imágenes recuperadas se insertarán en la clase var $images
para su uso posterior.
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;
}
Este es el oro del complemento. Simplemente configure una matriz con argumentos de consulta, obtenga los archivos adjuntos get_posts()
y recorra los archivos adjuntos recuperados. Para manejar diferentes tamaños, obtenemos la imagen adjunta y la tira de la url. Desde el archivo adjunto, tomamos la ruta y la juntamos con el nombre del archivo. En la matriz $images
ahora están todas las imágenes y sus patrones de la galería.
Básicamente su pregunta es respondida en este punto. Pero también desea crear un archivo zip a partir de las imágenes. Puede crear un archivo zip desde la matriz $images
en el último método. Pero este método se llama cada vez que se muestra una galería y la creación de un archivo zip puede llevar un tiempo. Quizás nadie solicite el archivo zip que creó aquí, esto es un desperdicio de recursos.
¿Cómo podemos hacerlo mejor? ¿Recuerdas que puse todas las imágenes en la variable de clase $images
? Podemos usar esta clase var para una solicitud ajax. Pero una solicitud ajax es solo otra carga de página y podemos acceder a las imágenes solo cuando se crea la salida de la galería. Tenemos que guardar nuestras imágenes en un lugar donde podamos acceder a ellas incluso después de una solicitud de otra página.
En este ejemplo, uso una variable de sesión para almacenar la matriz con imágenes. Se puede acceder a una variable de sesión incluso después de volver a cargar otra página. Para almacenar las imágenes, registro un método con el shutdown
gancho. Después de que WordPress termine de renderizar la página, shutdown
se llamará al gancho. En este punto, deberíamos haber recopilado todas las imágenes de todas las galerías mostradas. Simplemente almacenamos las imágenes y podemos acceder a ellas en una solicitud ajax.
Cuando se activa la solicitud ajax, recuperamos la sesión var y creamos un archivo zip a partir de los datos. Pero esto es un poco fuera de tema para esta pregunta.
Creé un repositorio en GitHub con el código completo del complemento. Espero que te indique la dirección correcta.