Vous devez d'abord obtenir les images. Comment obtenir toutes les images d'une galerie est décrit ici .
WordPress utilise deux classes pour décompresser les fichiers. PHP bilt in ZipArchive()
(utilisation voir David Walsh). Et PclZip , vous pouvez trouver cette classe dans wp-admin/includes/class-pclzip.php
. Si vous avez des problèmes avec ZipArchive()
la classe PclZip.
Il ne vous reste plus qu'à coller les deux ensemble. Je peux peut-être poster un exemple de code plus tard, actuellement je ne suis pas à mon bureau.
Mise à jour
Votre question peut être divisée en deux parties. Le premier obtient toutes les images d'une galerie. Le second zippe les images et envoie le fichier zip.
Je vais seulement expliquer la première partie, obtenir toutes les images d'une galerie, car la fermeture éclair des fichiers est légèrement hors sujet.
Il existe peut-être d'autres solutions, mais dans cet exemple, je remplace le shortcode de la galerie d'origine par un personnalisé pour obtenir les images. La raison en est que WordPress a un peu changé les galeries en v3.5.
Avant la 3.5, les images d'une galerie sont des pièces jointes de l'article. Après 3.5, les images sont transmises au shortcode en tant qu'attribut. Depuis WP3.5, nous ne pouvons plus obtenir les images jointes d'un message, nous devons récupérer la liste à partir des attributs de shortcode. Ma stratégie consiste à remplacer le shortcode d'origine par un shortcode personnalisé, récupérer les attributs et appeler le shortcode d'origine pour obtenir la sortie de la galerie.
Toutes les choses liées à la galerie sont dans une classe. Pour créer un fichier zip, nous pouvons utiliser une autre classe qui prend en entrée la sortie de la classe gallery. Commençons par une classe et un constructeur 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' ) );
}
}
Nous appellerons la méthode get_instance()
plus tard dans le plugin avec le hook plugins_loaded
. Dans le constructeur, nous supprimons le shortcode d'origine et le remplaçons par notre shortcode personnaliségallery_zip_shortcode()
. Maintenant, nous avons besoin du rappel de 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 première chose dans cette méthode est d'obtenir le message car nous avons besoin de l'ID du message. Que nous incluons wp-includes/media.php
, ce fichier contient la fonction de rappel pour le shortcode de la galerie d'origine. Maintenant, nous appelons une méthode pour obtenir un tableau avec toutes les images, créer la sortie de la galerie en appelant le rappel de la galerie d'origine, créer un lien et ajouter le lien à la sortie de la galerie. Les images elles-mêmes, respectivement les chemins d'accès aux images, sont stockées dans la variable de classe $images
, nous aurons besoin de ce tableau plus tard.
La variable de classe $image
contient une entrée pour chaque article avec une galerie, nous pouvons donc utiliser la fonction en première page ou en vue unique. Chaque entrée contient un tableau pour chaque galerie, car il peut y avoir plus d'une galerie dans chaque publication.
Le cœur du plugin est la méthode pour obtenir les images du 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;
}
Dans un premier temps, nous décidons s'il s'agit d'un poste unique ou d'une liste d'ID de poste. S'il s'agit d'une liste d'ID de publication, nous gérons une galerie de WP3.5 +. Après cela, nous devons gérer l' exclude
attribut. Après avoir configuré toutes les variables, nous pouvons enfin obtenir les images de la galerie. Les images récupérées seront poussées dans la classe var $images
pour une utilisation ultérieure.
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;
}
Ceci est l'or du plugin. Configurez simplement un tableau avec des arguments de requête, récupérez les pièces jointes avec get_posts()
et parcourez les pièces jointes récupérées. Pour gérer différentes tailles, nous obtenons l'image de la pièce jointe et la bande de l'url. À partir du fichier joint, nous prenons le chemin et le mettons ensemble avec le nom de fichier. Dans le tableau $images
sont maintenant toutes les images et leurs chemins de la galerie.
Fondamentalement, votre question reçoit une réponse à ce stade. Mais vous souhaitez également créer un fichier zip à partir des images. Vous pouvez créer un fichier zip à partir du tableau$images
dans la dernière méthode. Mais cette méthode est appelée à chaque fois qu'une galerie est affichée et la création d'un fichier zip peut prendre un certain temps. Peut-être que personne ne demanderait le fichier zip que vous avez créé ici, c'est un gaspillage de ressources.
Comment pouvons-nous faire mieux? Vous souvenez-vous que j'ai mis toutes les images dans la variable de classe $images
? Nous pouvons utiliser cette classe var pour une requête ajax. Mais une requête ajax n'est qu'un chargement de page supplémentaire et nous ne pouvons accéder aux images que lorsque la sortie de la galerie est créée. Nous devons enregistrer nos images dans un endroit où nous pouvons y accéder même après une autre demande de page.
Dans cet exemple, j'utilise une variable de session pour stocker le tableau avec des images. Une variable de session est accessible même après un autre rechargement de page. Pour stocker les images, j'enregistre une méthode avec le shutdown
crochet. Une fois que WordPress a terminé de rendre la page, le shutdown
crochet sera appelé. À ce stade, nous aurions dû collecter toutes les images de toutes les galeries affichées. Nous stockons simplement les images et pouvons y accéder dans une demande ajax.
Lorsque la demande ajax est déclenchée, nous rappelons la session var et créons un fichier zip à partir des données. Mais c'est un peu hors sujet pour cette question.
J'ai créé un référentiel sur GitHub avec le code complet du plugin. J'espère que cela vous indique la bonne direction.