Chciałbym zaoferować odwiedzającym opcję pobrania całej galerii zdjęć (wyświetlanej na dedykowanych stronach [galerii]) jako pliku ZIP wyświetlanego na dole każdej strony galerii. - Konieczne będzie dołączenie pełnowymiarowego obrazu.
David Walsh dał jakiś kod w swoim poście tutaj aby zapiąć pliki ale mam problemy integracyjne, które z funkcji Wordpress.
Wiem, że istnieje wtyczka pobierania galerii NextGEN, ale nie jestem w stanie jej używać, ponieważ używam natywnych funkcji galerii wordpress.
Podobne pytanie z alternatywną (ręczną metodą) wykonania powyższego można znaleźć tutaj: Wtyczka do pobierania załączonych plików multimedialnych?
Każda pomoc byłaby bardzo mile widziana. Dzięki.
Odpowiedzi:
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ę wwp-admin/includes/class-pclzip.php
. Jeśli masz problemy zZipArchive()
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.
Wywołamy tę metodę
get_instance()
później we wtyczce z hakiemplugins_loaded
. W konstruktorze usuwamy oryginalny skrót i zastępujemy go naszym niestandardowym skrótemgallery_zip_shortcode()
. Teraz potrzebujemy oddzwonienia shortcodePierwszą 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.
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.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 WordPressshutdown
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.
źródło
Podoba mi się pomysł, aby wtyczka Ralfa mogła pobierać całą galerię za jednym razem, ale nie udało mi się sprawić, żeby działała. Wymyśliłem obejście, które działa dla naszych celów. Metoda polega na zamianie natywnej galerii WP na własną, którą umieszczasz na końcu
functions.php
pliku motywu ORAZ dodaj następujący plik, nazwanydownload.php
w aktywnym folderze motywu. W galerii niestandardowej link pod plikiem wywołuje plik download.php, który automatycznie wymusza pobranie pliku na dysk twardy. Przetestowałem to w najnowszych wersjach Chrome, Firefox i Safari i działa dobrze. Używam motywu Twenty Twelve, ale nie ma powodu, dla którego nie powinien on działać również na innych.a) Dodaj następujące na końcu
functions.php
. Jest to po prostu wzięte z media.phpb) Skopiuj i wklej następujące elementy do pliku wywoływanego
download.php
w katalogu podstawowym motywu.do). Nie zapomnij o linku do pliku w galerii !! Ważny!
źródło
download.php
i$_GET
parametru, który mogę pobrać wszystkie pliki, które chcę z twojego folderu internetowego (również z udziałów sieciowych), na przykładwp-config.php