Zuerst müssen Sie die Bilder bekommen. Wie Sie alle Bilder einer Galerie erhalten, wird hier beschrieben .
WordPress verwendet zwei Klassen zum Entpacken von Dateien. Das PHP ist eingebunden ZipArchive()
(Verwendung siehe David Walsh). Und PclZip , Sie können diese Klasse in finden wp-admin/includes/class-pclzip.php
. Wenn Sie Probleme mit ZipArchive()
der PclZip-Klasse haben, versuchen Sie es.
Jetzt musst du nur noch beides zusammenkleben. Vielleicht kann ich später einen Beispielcode posten, zur Zeit bin ich nicht an meinem Schreibtisch.
Aktualisieren
Ihre Frage kann in zwei Teile geteilt werden. Die erste Methode ruft alle Bilder aus einer Galerie ab. Der zweite ist das Zippen der Bilder und das Senden der Zip-Datei.
Ich werde nur den ersten Teil erläutern, in dem alle Bilder einer Galerie angezeigt werden, da das Komprimieren der Dateien nicht immer aktuell ist.
Vielleicht gibt es andere Lösungen, aber in diesem Beispiel ersetze ich den ursprünglichen Galerie-Shortcode durch einen benutzerdefinierten, um die Bilder zu erhalten. Der Grund ist, dass WordPress die Galerien in v3.5 ein wenig verändert hat.
Vor 3.5 sind die Bilder für eine Galerie Anhänge des Beitrags. Nach 3.5 werden die Bilder als Attribut an den Shortcode übergeben. Da wir in WP3.5 die angehängten Bilder eines Posts nicht mehr erhalten können, müssen wir die Liste aus den Shortcode-Attributen abrufen. Meine Strategie besteht darin, den ursprünglichen Shortcode durch einen benutzerdefinierten Shortcode zu ersetzen, die Attribute zu erfassen und den ursprünglichen Shortcode aufzurufen, um die Galerieausgabe zu erhalten.
Alle galeriebezogenen Dinge gehören zu einer Klasse. Um eine zip-Datei zu erstellen, können wir eine andere Klasse verwenden, die die Ausgabe der Galerieklasse als Eingabe verwendet. Beginnen wir mit einer Klasse und einem einfachen Konstruktor.
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' ) );
}
}
Wir werden die Methode get_instance()
später im Plugin mit dem Hook aufrufen plugins_loaded
. Im Konstruktor entfernen wir den ursprünglichen Shortcode und ersetzen ihn durch unseren benutzerdefinierten Shortcode gallery_zip_shortcode()
. Jetzt brauchen wir den Shortcode-Rückruf
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;
}
Bei dieser Methode müssen Sie zuerst den Beitrag abrufen, da wir die Beitrags-ID benötigen. Als wir enthalten wp-includes/media.php
, enthält diese Datei die Rückruffunktion für den ursprünglichen Galerie-Shortcode. Nun rufen wir eine Methode auf, um ein Array mit allen Bildern zu erhalten, erstellen die Galerie-Ausgabe durch Aufrufen des ursprünglichen Galerie-Rückrufs, erstellen einen Link und hängen den Link an die Galerie-Ausgabe an. Die Bilder selbst bzw. die Pfade zu den Bildern werden in der Klassenvariablen gespeichert $images
, wir brauchen dieses Array später.
Die Klassenvariable $image
enthält einen Eintrag für jeden Beitrag mit einer Galerie, sodass wir die Funktion entweder auf der Startseite oder in der Einzelansicht verwenden können. Jeder Eintrag enthält ein Array für jede Galerie, da jeder Beitrag mehrere Galerien enthalten kann.
Der Kern des Plugins ist die Methode, um die Bilder aus dem Shortcode zu erhalten.
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;
}
Zuerst entscheiden wir, ob es sich um einen einzelnen Beitrag oder eine Liste von Beitrags-IDs handelt. Wenn es sich um eine Liste mit Beitrags-IDs handelt, wird eine Galerie ab WP3.5 + verarbeitet. Danach müssen wir das exclude
Attribut behandeln. Nachdem wir alle Variablen eingerichtet haben, können wir endlich die Bilder aus der Galerie bekommen. Die abgerufenen Bilder werden $images
zur späteren Verwendung in die Klasse var verschoben .
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;
}
Das ist das Gold des Plugins. Richten Sie einfach ein Array mit Abfrageargumenten ein, rufen Sie die Anhänge mit ab get_posts()
und gehen Sie über die abgerufenen Anhänge. Um mit unterschiedlichen Größen umgehen zu können, erhalten wir das angehängte Bild und den URL-Streifen. Aus der angehängten Datei nehmen wir den Pfad und fügen ihn mit dem Dateinamen zusammen. Im Array $images
befinden sich nun alle Bilder und deren Pfade aus der Galerie.
Grundsätzlich ist Ihre Frage an dieser Stelle beantwortet. Sie möchten aber auch eine Zip-Datei aus den Bildern erstellen. Sie können mit $images
der letzten Methode eine Zip-Datei aus dem Array erstellen . Diese Methode wird jedoch jedes Mal aufgerufen, wenn eine Galerie angezeigt wird und das Erstellen einer ZIP-Datei eine Weile dauern kann. Vielleicht würde niemand die hier erstellte Zip-Datei anfordern, dies ist eine Verschwendung von Ressourcen.
Wie können wir es besser machen? Erinnerst du dich, dass ich alle Bilder in die Klassenvariable gestellt habe $images
? Wir können diese Klassenvariable für eine Ajax-Anfrage verwenden. Eine Ajax-Anfrage ist jedoch nur ein weiterer Seitenaufruf, und wir können nur dann auf die Bilder zugreifen, wenn die Ausgabe der Galerie erstellt wird. Wir müssen unsere Bilder an einem Ort speichern, auf den wir auch nach einer erneuten Seitenanforderung zugreifen können.
In diesem Beispiel verwende ich eine Sitzungsvariable, um das Array mit Bildern zu speichern. Auf eine Sitzungsvariable kann auch nach einem erneuten Laden der Seite zugegriffen werden. Um die Bilder zu speichern, registriere ich eine Methode mit dem shutdown
Haken. Nachdem WordPress das Rendern der Seite beendet hat, wird der shutdown
Hook aufgerufen. Zu diesem Zeitpunkt sollten wir alle Bilder aus allen angezeigten Galerien gesammelt haben. Wir speichern einfach die Bilder und können auf sie in einer Ajax-Anfrage zugreifen.
Wenn die Ajax-Anforderung ausgelöst wird, rufen wir die Sitzungsvariable auf und erstellen aus den Daten eine ZIP-Datei. Aber das ist ein bisschen unangebrachtes Thema für diese Frage.
Ich habe auf GitHub ein Repository mit dem kompletten Plugin-Code erstellt. Ich hoffe, es weist Sie in die richtige Richtung.