Najpierw musisz zdobyć obrazy. Jak uzyskać wszystkie obrazy galerii opisano tutaj .
WordPress używa dwóch klas do rozpakowywania plików. Wtargnięcie PHP ZipArchive()
(użycie patrz David Walsh). I PclZip , możesz znaleźć tę klasę w wp-admin/includes/class-pclzip.php
. Jeśli masz problemy z ZipArchive()
wypróbowaniem klasy PclZip.
Teraz musisz po prostu skleić oba razem. Może później mogę opublikować przykładowy kod, obecnie nie ma mnie przy biurku.
Aktualizacja
Twoje pytanie można podzielić na dwie części. Pierwszym z nich jest pobranie wszystkich zdjęć z galerii. Drugi polega na kompresowaniu obrazów i wysyłaniu pliku zip.
Wyjaśnię tylko pierwszą część, uzyskanie wszystkich zdjęć galerii, ponieważ spakowanie plików jest nieco nie na temat.
Być może istnieją inne rozwiązania, ale w tym przykładzie zamieniam oryginalny skrót galerii na niestandardowy, aby uzyskać obrazy. Powodem jest to, że WordPress nieco zmienił galerie w wersji 3.5.
Przed wersją 3.5 obrazy do galerii są załącznikami postu. Po 3.5 obrazy są przekazywane jako krótki kod jako atrybut. Ponieważ WP3.5 nie możemy już uzyskać załączonych obrazów postu, musimy pobrać listę z atrybutów shortcode. Moją strategią jest zastąpienie oryginalnego kodu krótkiego niestandardowym kodem, pobranie atrybutów i wywołanie oryginalnego kodu, aby uzyskać wynik galerii.
Wszystkie rzeczy związane z galerią należą do klasy. Aby utworzyć plik zip, możemy użyć innej klasy, która przyjmuje jako dane wyjściowe klasy galerii. Zacznijmy od klasy i prostego konstruktora.
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' ) );
}
}
Wywołamy tę metodę get_instance()
później we wtyczce z hakiem plugins_loaded
. W konstruktorze usuwamy oryginalny skrót i zastępujemy go naszym niestandardowym skrótem gallery_zip_shortcode()
. Teraz potrzebujemy oddzwonienia 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;
}
Pierwszą rzeczą w tej metodzie jest uzyskanie posta, ponieważ potrzebujemy jego identyfikatora. Niż ten dołączamy wp-includes/media.php
, ten plik zawiera funkcję wywołania zwrotnego dla oryginalnego skrótu galerii. Teraz wywołujemy metodę uzyskania tablicy ze wszystkimi obrazami, tworzymy wyjście galerii, wywołując oryginalne wywołanie zwrotne galerii, tworzymy link i dołączamy link do wyjścia galerii. Same obrazy, odpowiednio ścieżki do obrazów, są przechowywane w zmiennej klasy $images
, potrzebujemy tej tablicy później.
Zmienna class $image
zawiera wpis dla każdego postu z galerią, dzięki czemu możemy użyć funkcji na pierwszej stronie lub w pojedynczym widoku. Każdy wpis zawiera tablicę dla każdej galerii, ponieważ w każdym poście może znajdować się więcej niż jedna galeria.
Rdzeniem wtyczki jest metoda uzyskiwania obrazów z krótkiego kodu.
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;
}
Najpierw decydujemy, czy jest to pojedynczy post, czy lista identyfikatorów postów. Jeśli jest to lista identyfikatorów postów, obsługujemy galerię z wersji WP3.5 +. Następnie musimy obsłużyć exclude
atrybut. Po skonfigurowaniu wszystkich zmiennych możemy wreszcie pobrać obrazy z galerii. Pobrane obrazy zostaną przeniesione do var klasy $images
do późniejszego wykorzystania.
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;
}
To jest złoto wtyczki. Wystarczy ustawić tablicę z argumentami zapytania, pobrać załączniki get_posts()
i przejrzeć pobrane załączniki. Aby obsłużyć różne rozmiary, otrzymujemy obraz załącznika i pasek adresu URL. Z załączonego pliku bierzemy ścieżkę i łączymy ją z nazwą pliku. W tablicy $images
są teraz wszystkie obrazy i ich ścieżki z galerii.
Zasadniczo odpowiedź na twoje pytanie jest w tym momencie. Ale chcesz również utworzyć plik zip z obrazów. Możesz utworzyć plik zip z tablicy $images
w ostatniej metodzie. Ale ta metoda jest wywoływana za każdym razem, gdy wyświetlana jest galeria, a utworzenie pliku zip może chwilę potrwać. Może nikt nie poprosiłby o utworzony tutaj plik zip, to marnowanie zasobów.
Jak możemy to zrobić lepiej? Czy pamiętasz, że umieściłem wszystkie obrazy w zmiennej klasy $images
? Możemy użyć tej klasy var do żądania ajax. Ale żądanie ajax to tylko kolejne ładowanie strony i możemy uzyskać dostęp do obrazów tylko wtedy, gdy tworzony jest wynik galerii. Musimy zapisać nasze zdjęcia w miejscu, w którym możemy uzyskać do nich dostęp nawet po kolejnym żądaniu strony.
W tym przykładzie używam zmiennej sesji do przechowywania tablicy z obrazami. Dostęp do zmiennej sesji można uzyskać nawet po ponownym załadowaniu innej strony. Aby zapisać obrazy, rejestruję metodę za pomocą shutdown
haka. Po zakończeniu renderowania strony przez WordPress shutdown
hak zostanie wywołany. W tym momencie powinniśmy zebrać wszystkie obrazy ze wszystkich wyświetlanych galerii. Po prostu przechowujemy obrazy i możemy uzyskać do nich dostęp w żądaniu ajax.
Po uruchomieniu żądania ajax przywołujemy zmienną sesji i tworzymy plik zip z danych. Ale to trochę nie na temat tego pytania.
Utworzyłem repozytorium na GitHub z pełnym kodem wtyczki. Mam nadzieję, że wskaże ci właściwy kierunek.