Спочатку ви повинні отримати зображення. Як отримати всі зображення галереї описано тут .
WordPress використовує два класи для розпакування файлів. PHP з'явився ZipArchive()
(використання див. Девід Уолш). І PclZip , ви можете знайти цей клас у wp-admin/includes/class-pclzip.php
. Якщо у вас виникли проблеми із ZipArchive()
спробуйте клас PclZip.
Тепер вам просто доведеться склеїти обидва разом. Можливо, я можу опублікувати якийсь зразок коду пізніше, в даний час я не в моєму столі.
Оновлення
Ваше питання можна розділити на дві частини. Перший - це отримання всіх зображень із галереї. Другий - стискає зображення та надсилає поштовий файл.
Я поясню лише першу частину, отримавши всі зображення з галереї, тому що перетягування файлів трохи офтопічне.
Можливо, є й інші рішення, але в цьому прикладі я замінюю оригінальний короткий код галереї на власний, щоб отримати зображення. Причина в тому, що WordPress трохи змінив галереї в v3.5.
До 3,5 зображення для галереї - це додатки до публікації. Після 3,5 зображення передаються в короткий код як атрибут. Оскільки WP3.5 ми не можемо отримувати додані зображення допису, ми повинні отримати список з атрибутів короткого коду. Моя стратегія полягає в заміні оригінального короткого коду на власний короткий код, захоплення атрибутів та виклик оригінального короткого коду, щоб отримати вихід галереї.
Усі речі, пов’язані з галереєю, знаходяться в класі. Для створення zip-файлу ми можемо використовувати інший клас, який приймає як вихід вихід класу галереї. Почнемо з класу та простого конструктора.
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' ) );
}
}
Ми будемо називати метод get_instance()
пізніше у плагіні з гаком plugins_loaded
. У конструкторі ми видаляємо оригінальний короткий код і замінюємо його нашим власним шорт-кодом gallery_zip_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;
}
Перше, що в цьому методі - отримати посаду, оскільки нам потрібен ідентифікатор публікації. Окрім того, що ми включаємо wp-includes/media.php
, цей файл містить функцію зворотного дзвінка для оригінального короткого коду галереї. Тепер ми називаємо метод отримання масиву з усіма зображеннями, створюємо вихід галереї, викликаючи вихідний зворотний виклик галереї, створюємо посилання та додаючи посилання до виходу галереї. Самі зображення, відповідно пати до зображень, зберігаються у змінній класу $images
, цей масив нам знадобиться пізніше.
Змінна класу $image
містить запис для кожної публікації з галереєю, тому ми можемо використовувати функцію або на передній сторінці, або в одному перегляді. Кожен запис містить масив для кожної галереї, оскільки в кожній публікації може бути більше однієї галереї.
Основою плагіна є метод отримання зображень із шорт-коду.
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;
}
Спочатку ми вирішуємо, чи це одна публікація чи список ідентифікаторів публікації. Якщо це список ідентифікаторів публікацій, ми обробляємо галерею з WP3.5 +. Після цього ми маємо обробити exclude
атрибут. Після налаштування всіх змінних, ми можемо нарешті отримати зображення з галереї. Отримані зображення будуть висунуті в клас класу $images
для подальшого використання.
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;
}
Це золото плагіна. Просто встановіть масив із аргументами запитів, отримайте вкладені файли get_posts()
та перейдіть до отриманих вкладень. Для обробки різних розмірів ми отримуємо зображення вкладення та смужку URL-адреси. Із вкладеного файлу ми беремо шлях і складаємо його разом з назвою файлу. У масиві $images
тепер усі зображення та їхні патьоки з галереї.
В основному, на ваше запитання дано відповідь. Але ви також хочете створити ZIP-файл із зображень. Ви можете створити zip-файл із масиву $images
останнім методом. Але цей метод називається щоразу, коли відображається галерея, і створення zip-файлу може зайняти деякий час. Можливо, ніхто не запитає створений тут zip-файл, це марна трата ресурсів.
Як ми можемо це зробити краще? Ви пам’ятаєте, що я помістив усі зображення у змінну класу $images
? Ми можемо використовувати цей клас var для запиту на ajax. Але запит ajax - це лише чергове завантаження сторінки, і ми можемо отримати доступ до зображень лише тоді, коли буде створено вихід з галереї. Ми повинні зберігати наші зображення в місці, де ми можемо отримати доступ до них навіть після чергового запиту на сторінку.
У цьому прикладі я використовую змінну сеансу для зберігання масиву із зображеннями. До змінної сеансу можна отримати доступ навіть після перезавантаження іншої сторінки. Для зберігання зображень я реєструю метод за допомогою shutdown
гачка. Після завершення візуалізації сторінки WordPress shutdown
буде викликано гачок. На даний момент ми повинні були зібрати всі зображення з усіх відображених галерей. Ми просто зберігаємо зображення та отримуємо доступ до них у запиті на ajax.
Коли спрацьовує запит ajax, ми згадуємо var сесії та створюємо zip-файл із даних. Але це трохи поза темою для цього питання.
Я створив сховище на GitHub з повним кодом плагіна. Я сподіваюся, що це вказує на вас у правильному напрямку.