[갤러리]에 표시되는 모든 이미지를 압축하여 다운로드 링크로 제공


13

방문자에게 전체 사진 갤러리 (전용 [갤러리] 페이지에 표시됨)를 각 갤러리 페이지 하단에 표시되는 ZIP 파일로 다운로드 할 수있는 옵션을 제공하고 싶습니다. -전체 크기의 이미지가 포함되어야합니다.

David Walsh는 파일을 압축하기 위해 여기 에 자신의 게시물에 코드를 제공 했지만 Wordpress 기능과 통합하는 데 문제가 있습니다.

NextGEN 갤러리 다운로드 플러그인이 있다는 것을 알고 있지만 기본 워드 프레스 갤러리 기능을 사용할 때 사용할 수 없습니다.

위의 작업을 완료하는 대안 (수동 방법)과 비슷한 질문이 여기에 있습니다. 첨부 된 미디어 파일을 다운로드하기위한 플러그인?

도움을 주시면 감사하겠습니다. 감사.


전용 갤러리 페이지 란 무엇입니까?
NoBugs

갤러리 단축 코드 [gallery columns = "4"link = "file"] 만 표시하고 페이지에 다른 컨텐츠는 표시하지 않는 표준 게시물. 설명에 개발자를 돕기 위해 포함 시켰습니다.
Paul Thomson

답변:


14

먼저 이미지를 얻어야합니다. 갤러리의 모든 이미지를 얻는 방법은 여기 에 설명되어 있습니다 .

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에 리포지토리를 만들었습니다 . 나는 그것이 올바른 방향으로 당신을 가리 키기를 바랍니다.


새로운 3.5 스타일 갤러리를 다루는 경우 갤러리에서 이미지를 검색하는 방법이 적합하지 않을 수 있습니다.
Milo

명확히하기 위해 최신 버전의 Wordpress 3.5.1을 사용하고 있습니다. Johannes, 데스크탑 옆에있을 때 샘플 코드를 제공 할 수 있다면 대단히 감사하겠습니다. 감사합니다. Paul
Paul Thomson

랄프, 이건 멋진 일이야! 공유해 주셔서 감사합니다. 내 갤러리 이미지가 제대로 표시 되려면 단축 코드에 link = "file"을 포함시켜야합니다. 즉, 단축 코드가 코드를 통해 다시 작성 될 때 [gallery link = "file"]은 생략 된 것으로 생각됩니다. 결과 내 갤러리가 올바르게 표시되지 않습니다. 해당 인수를 코드에 수정하는 방법이 있습니까?
Paul Thomson 12

일반적으로 속성은 원래 단축 코드로 전달되며 수정되지 않습니다. 갤러리는 정상적으로 표시되지만 일부 HTML이 추가됩니다. 내 테스트 (20 개의 standrad 테마로)에서 갤러리가 올바르게 표시됩니다.
Ralf912

@PaulThomson github 저장소에서 몇 가지 문제를 해결했습니다. 코드가 깨끗하지 않았습니다.
Ralf912

0

Ralf의 플러그인이라는 아이디어가 전체 갤러리를 한 번에 다운로드 할 수 있다는 점이 마음에 들지만 작동시킬 수는 없었습니다. 나는 우리의 목적에 맞는 해결책을 생각해 냈습니다. 방법은 기본 WP 갤러리를 테마 functions.php파일 의 끝에 배치 한 고유 한 갤러리로 바꾸고 download.php활성 테마 폴더에 이름이 지정된 다음 파일을 추가하는 것 입니다. 사용자 정의 갤러리에서 파일 아래의 링크는 download.php 파일을 호출하여 자동으로 파일을 하드 드라이브로 다운로드합니다. 최신 Chrome, Firefox 및 Safari 버전에서 이것을 테스트했으며 정상적으로 작동합니다. Twenty Twelve 테마를 사용해 왔지만 다른 테마에서도 작동하지 않는 이유는 없습니다.

a) 끝에 다음을 추가합니다 functions.php. 이것은 단순히 media.php에서 가져온 것입니다

remove_shortcode('gallery');
function gallery_with_download_links($attr) {
    $post = get_post();
    static $instance = 0;
    $instance++;
    if ( ! empty( $attr['ids'] ) ) {
        // 'ids' is explicitly ordered, unless you specify otherwise.
        if ( empty( $attr['orderby'] ) )
            $attr['orderby'] = 'post__in';
        $attr['include'] = $attr['ids'];
    }
    // Allow plugins/themes to override the default gallery template.
    $output = apply_filters('post_gallery', '', $attr);
    if ( $output != '' )
        return $output;
    // We're trusting author input, so let's at least make sure it looks like a valid orderby statement
    if ( isset( $attr['orderby'] ) ) {
        $attr['orderby'] = sanitize_sql_orderby( $attr['orderby'] );
        if ( !$attr['orderby'] )
            unset( $attr['orderby'] );
    }

    extract(shortcode_atts(array(
        'order'      => 'ASC',
        'orderby'    => 'menu_order ID',
        'id'         => $post->ID,
        'itemtag'    => 'dl',
        'icontag'    => 'dt',
        'captiontag' => 'dd',
        'columns'    => 3,
        'size'       => 'thumbnail',
        'include'    => '',
        'exclude'    => ''
    ), $attr));

    $id = intval($id);
    if ( 'RAND' == $order )
        $orderby = 'none';

    if ( !empty($include) ) {
        $_attachments = get_posts( array('include' => $include, 'post_status' => 'inherit', 'post_type' => 'attachment', 'post_mime_type' => 'image', 'order' => $order, 'orderby' => $orderby) );

        $attachments = array();
        foreach ( $_attachments as $key => $val ) {
            $attachments[$val->ID] = $_attachments[$key];
        }
    } elseif ( !empty($exclude) ) {
        $attachments = get_children( array('post_parent' => $id, 'exclude' => $exclude, 'post_status' => 'inherit', 'post_type' => 'attachment', 'post_mime_type' => 'image', 'order' => $order, 'orderby' => $orderby) );
    } else {
        $attachments = get_children( array('post_parent' => $id, 'post_status' => 'inherit', 'post_type' => 'attachment', 'post_mime_type' => 'image', 'order' => $order, 'orderby' => $orderby) );
    }

    if ( empty($attachments) )
        return '';

    if ( is_feed() ) {
        $output = "\n";
        foreach ( $attachments as $att_id => $attachment )
            $output .= wp_get_attachment_link($att_id, $size, true) . "\n";
        return $output;
    }

    $itemtag = tag_escape($itemtag);
    $captiontag = tag_escape($captiontag);
    $icontag = tag_escape($icontag);
    $valid_tags = wp_kses_allowed_html( 'post' );
    if ( ! isset( $valid_tags[ $itemtag ] ) )
        $itemtag = 'dl';
    if ( ! isset( $valid_tags[ $captiontag ] ) )
        $captiontag = 'dd';
    if ( ! isset( $valid_tags[ $icontag ] ) )
        $icontag = 'dt';

    $columns = intval($columns);
    $itemwidth = $columns > 0 ? floor(100/$columns) : 100;
    $float = is_rtl() ? 'right' : 'left';

    $selector = "gallery-{$instance}";

    $gallery_style = $gallery_div = '';
    if ( apply_filters( 'use_default_gallery_style', true ) )
        $gallery_style = "
        <style type='text/css'>
            #{$selector} {
                margin: auto;
            }
            #{$selector} .gallery-item {
                float: {$float};
                margin-top: 10px;
                text-align: center;
                width: {$itemwidth}%;
            }
            #{$selector} img {
                border: 2px solid #cfcfcf;
            }
            #{$selector} .gallery-caption {
                margin-left: 0;
            }
        </style>
        <!-- see gallery_shortcode() in wp-includes/media.php -->";
    $size_class = sanitize_html_class( $size );
    $gallery_div = "<div id='$selector' class='gallery galleryid-{$id} gallery-columns-{$columns} gallery-size-{$size_class}'>";
    $output = apply_filters( 'gallery_style', $gallery_style . "\n\t\t" . $gallery_div );

    $i = 0;
    foreach ( $attachments as $id => $attachment ) {
        $link = isset($attr['link']) && 'file' == $attr['link'] ? wp_get_attachment_link($id, $size, false, false) : wp_get_attachment_link($id, $size, true, false);

        $output .= "<{$itemtag} class='gallery-item'>";
        $output .= "
            <{$icontag} class='gallery-icon'>
                $link
            </{$icontag}>";
        if ( $captiontag && trim($attachment->post_excerpt) ) {
            $output .= "
                <{$captiontag} class='wp-caption-text gallery-caption'>
                " . wptexturize($attachment->post_excerpt) . "
                </{$captiontag}>";
        }
// This is my addon which outputs a link to download the file through download.php . NB your file uri will be public! 
        $output .= '<br/ ><a href="'.get_template_directory_uri().'/download.php?file='.get_attached_file( $id ).'">Download image</a>';
        $output .= "</{$itemtag}>";
        if ( $columns > 0 && ++$i % $columns == 0 )
            $output .= '<br style="clear: both" />';
    }

    $output .= "
            <br style='clear: both;' />
        </div>\n";

    return $output;
}
add_shortcode( 'gallery' , 'gallery_with_download_links' );

b) download.php테마의 기본 디렉토리에 있는 파일에 다음을 복사하여 붙여 넣습니다 .

<?php
$file = $_GET['file'];
if (file_exists($file)) {
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename='.basename($file));
header('Content-Transfer-Encoding: binary');
header('Expires: 0');
header('Cache-Control: must-revalidate');
header('Pragma: public');
header('Content-Length: ' . filesize($file));
ob_clean();
flush();
readfile($file);
exit;
}
?>

씨). 갤러리의 파일에 연결하는 것을 잊지 마십시오! 중대한!


나는 이것이 좋은 생각이라고 생각하지 않으며 download.php, $_GET매개 변수를 사용 하여 매개 변수를 사용 하여 웹 폴더 (네트워크 공유에서도)에서 원하는 모든 파일을 다운로드 할 수 있습니다.wp-config.php
Diego Betto
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.