Сначала вы должны получить изображения. Как получить все изображения галереи описано здесь .
WordPress использует два класса для распаковки файлов. PHP встроен ZipArchive()
(см. Дэвид Уолш). И PclZip , вы можете найти этот класс в wp-admin/includes/class-pclzip.php
. Если у вас возникли проблемы, ZipArchive()
попробуйте класс PclZip.
Теперь вам просто нужно склеить оба вместе. Может быть, я могу опубликовать пример кода позже, в настоящее время я не на моем столе.
Обновить
Ваш вопрос можно разделить на две части. Первый получает все изображения из галереи. Второй - архивирование изображений и отправка zip-файла.
Я объясню только первую часть, получая все изображения галереи, потому что архивирование файлов слегка оффтопично.
Возможно, есть и другие решения, но в этом примере я заменяю оригинальный шорткод галереи на собственный, чтобы получить изображения. Причина в том, что WordPress немного изменил галереи в версии 3.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
атрибут. После настройки всех переменных мы наконец можем получить изображения из галереи. Полученные изображения будут помещены в класс var $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 с полным кодом плагина. Я надеюсь, что это указывает вам в правильном направлении.