먼저 이미지를 얻어야합니다. 갤러리의 모든 이미지를 얻는 방법은 여기 에 설명되어 있습니다 .
WordPress는 파일 압축 해제를 위해 두 가지 클래스를 사용합니다. PHP가 빌려 ZipArchive()
왔다 (데이비드 월시 참조). 그리고 PclZip 에서이 클래스를 찾을 수 있습니다 wp-admin/includes/class-pclzip.php
. ZipArchive()
PclZip 클래스에 문제가있는 경우
이제 둘을 서로 붙이기 만하면됩니다. 어쩌면 나중에 샘플 코드를 게시 할 수 있습니다. 현재 책상에 없습니다.
최신 정보
질문은 두 부분으로 나눌 수 있습니다. 첫 번째는 갤러리에서 모든 이미지를 가져 오는 것입니다. 두 번째는 이미지를 압축하고 zip 파일을 보내는 것입니다.
파일을 압축하는 것이 약간 주제가 아니기 때문에 첫 번째 부분 만 설명하고 갤러리의 모든 이미지를 가져옵니다.
다른 솔루션이있을 수 있지만이 예제에서는 원본 갤러리 단축 코드를 사용자 정의 코드로 대체하여 이미지를 얻습니다. 그 이유는 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;
}
이 방법의 첫 번째는 게시물 ID가 필요하기 때문에 게시물을 얻는 것입니다. 우리가 포함보다 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;
}
처음에는 단일 게시물인지 또는 게시물 ID 목록인지를 결정합니다. 게시물 ID 목록 인 경우 WP3.5 +의 갤러리를 처리합니다. 그런 다음 exclude
속성 을 처리해야 합니다. 모든 변수를 설정 한 후 갤러리에서 이미지를 가져올 수 있습니다. 검색된 이미지는 $images
나중에 사용하기 위해 클래스 var로 푸시됩니다 .
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 파일을 만들고자합니다. $images
마지막 방법으로 배열 에서 zip 파일을 만들 수 있습니다 . 그러나이 방법은 갤러리가 표시 될 때마다 호출되며 zip 파일을 만드는 데 시간이 걸릴 수 있습니다. 여기에서 생성 한 zip 파일을 아무도 요청하지 않을 수도 있습니다. 이는 리소스 낭비입니다.
어떻게 더 잘할 수 있습니까? 모든 이미지를 클래스 변수에 넣었다는 것을 기억하십니까 $images
? 이 클래스 var를 ajax 요청에 사용할 수 있습니다. 그러나 아약스 요청은 또 다른 페이지로드 일 뿐이며 갤러리의 출력이 생성 된 경우에만 이미지에 액세스 할 수 있습니다. 다른 페이지 요청 후에도 이미지에 액세스 할 수있는 곳에 이미지를 저장해야합니다.
이 예제에서는 세션 변수를 사용하여 이미지와 함께 배열을 저장합니다. 다른 페이지를 다시로드 한 후에도 세션 변수에 액세스 할 수 있습니다. 이미지를 저장하기 위해 shutdown
후크 로 메소드를 등록합니다 . WordPress에서 페이지 렌더링을 완료하면 shutdown
후크가 호출됩니다. 이제 표시된 모든 갤러리에서 모든 이미지를 수집해야합니다. 이미지를 저장하고 아약스 요청으로 액세스 할 수 있습니다.
아약스 요청이 트리거되면 세션 var를 리콜하고 데이터에서 zip 파일을 만듭니다. 그러나 이것은이 질문에 대한 약간의 주제입니다.
완전한 플러그인 코드로 GitHub에 리포지토리를 만들었습니다 . 나는 그것이 올바른 방향으로 당신을 가리 키기를 바랍니다.