페이지 템플릿 인 경우 이미지 크기 추가


13

WordPress Multisite로 회원 웹 사이트를 만들고 있습니다. 선택한 템플릿에 따라 생성되는 이미지 수를 제한 할 수 있습니까?

갤러리 템플릿에서 특정 이미지를 생성하기 위해 다음 코드 줄을 시도했습니다.

// Generate on all uploads
add_theme_support('post-thumbnails');
set_post_thumbnail_size( 1440, 350, true ); 
add_image_size( 'standard_box', 450, 215, true );
add_image_size( 'default_image', 691, 9999 );

// Generate on gallery template only
if ( is_page_template('page-gallery.php') ) {
add_image_size( 'gallery', 900, 9999 );
add_image_size( 'gallery_thumb', 450, 450, true );
}

이것은 효과가 없었다. 나는 약간의 연구를 해왔고 그 주제에 대해 아무것도 찾지 못하는 것 같습니다. 당신이 올바른 방향으로 나를 가리킬 수 있다면 정말 감사하겠습니다.


1
오토의 다이내믹 이미지 리사이 저 (Dynamic Image Resizer )는 원하는만큼 이미지 크기를 정의 할 수 있지만 필요할 때 특정 크기의 이미지 만 생성합니다. 예를 들어 갤러리 축소판은 page-gallery.php 템플릿에 나타나는 이미지에 대해서만 생성됩니다.
helgatheviking

2
@kaiser의 Dynamic Image Resize 와 JetPack 의 Photon 서비스 와 같은 두 가지 훌륭한 옵션을 언급하고 싶습니다 .
birgire

답변:


13

주문형 이미지 크기가 부족하고 크기가 많은 경우 파일 수를 줄일 수 있습니다.

나는 당신의 노력의 배후에있는 논리를 볼 수 있습니다. 문제는 add_image_size단지 업로드 시점에서만 작용합니다. 따라서 is_page_template(..)항상입니다 false.

빠른 구글 은이 문제를 해결하기 위해 설계된 스크립트 인 Aqua Resizer를 파헤 쳤습니다 . 을 사용하는 대신 테마에서 직접 add_image_size사용 aq_resize하고 이미지의 크기가 존재하지 않으면 이미지를 즉시 생성하여 캐시합니다.

실제로 나는 많은 이미지 크기를 가진 여러 사이트에서 비슷하지만 다른 기술을 사용했습니다. 업로드 된 모든 이미지에 대해 모든 크기를 생성하는 WordPress의 오버 헤드를 여전히 저장합니다. 이미지는 요청에 따라 즉시 생성 (및 캐시)됩니다. 다른 점은 평소처럼 WP의 표준 이미지 기능과 템플릿 태그를 모두 사용할 수 있다는 것입니다!

또한 @Waq에서 언급했듯이 Aqua Resizer를 사용하면 미디어 라이브러리에서 이미지를 삭제할 때 고아 파일이 남습니다. 내 기술을 사용하면 모든 파일이 데이터베이스에 저장되고 WordPress에서 인식되기 때문에 모든 파일이 삭제됩니다.

/**
 * Resize internally-registered image sizes on-demand.
 *
 * @link    http://wordpress.stackexchange.com/q/139624/1685
 * 
 * @param   mixed   $null
 * @param   int     $id
 * @param   mixed   $size
 * @return  mixed
 */
function wpse_139624_image_downsize( $null, $id, $size ) {
    static $sizes = array(
        'post-thumbnail' => array(
            'height' => 350,
            'width'  => 1440,
            'crop'   => true,
        ),

        'standard_box' => array(
            'height' => 215,
            'width'  => 450,
            'crop'   => true,
        ),

        'default_image' => array(
            'height' => 9999,
            'width'  => 691,
            'crop'   => false,
        ),

        'gallery' => array(
            'height' => 900,
            'width'  => 9999,
            'crop'   => false,
        ),

        'gallery_thumb' => array(
            'height' => 450,
            'width'  => 450,
            'crop'   => true,
        ),
    );

    if ( ! is_string( $size ) || ! isset( $sizes[ $size ] ) )
        return $null;
    if ( ! is_array( $data = wp_get_attachment_metadata( $id ) ) )
        return $null;
    if ( ! empty( $data['sizes'][ $size ] ) )
        return $null;
    if ( $data['height'] <= $sizes[ $size ]['height'] && $data['width'] <= $sizes[ $size ]['width'] )
        return $null;
    if ( ! $file = get_attached_file( $id ) )
        return $null;

    $editor = wp_get_image_editor( $file );

    if ( ! is_wp_error( $editor ) ) {
        $data['sizes'] += $editor->multi_resize(
            array(
                $size => $sizes[ $size ],
            )
        );

        wp_update_attachment_metadata( $id, $data );
    }

    return $null;
}

add_filter( 'image_downsize', 'wpse_139624_image_downsize', 10, 3 );

그리고 실제로 :

wp_get_attachment_image( $id, 'gallery' ); // Resized if not already
wp_get_attachment_image_src( $id, 'standard_box' ); // Resized if not already
the_post_thumbnail(); // You get the idea!
// And so forth!

나는 모든 add_image_size호출을 주문형 크기 조정 으로 자동 변환하는 플러그인으로 바꾸려고합니다. 그래서이 공간을보십시오!


시간을내어 큰 답을 남겨 주셔서 감사합니다. 나는 확실히 이것을 갈 것이다. 서버를 여러 사용자에게 열기 전에 바로 이것을 얻는 것이 중요합니다. 더 궁금한 점이 있으면 소리 지르겠습니다.
Sam

2
나는 이것을 the_post_thumbnail (); 완벽하게 작동합니다. 한 가지 문제 : 이미지를 삭제하면 스크립트에서 크기가 조정 된 이미지가 남습니다. 어떤 아이디어?
Sam

5


면책 조항 :
-이것은 실제로 대답 이 아닙니다 .
- 되는 주제에 대한 귀하의 추가 연구를 도움을주기위한 것.
- 또한이 된다 반사 - 유사한 문제에 관한 유사한 질문이 더 최근 빈발 - 이상에서 펠트.


Wordpress Development에 관한이 주제에 관한 추가 정보 :

참고 : 이 목록은 어떤 방식으로도 주문 및 종합되지 않습니다.


3

즉시 엄지 손가락을 만들려면 Aqua image resizer를 사용할 수 있지만 이 미니 스크립트의 단점이 있습니다. 라이브러리에서 이미지를 삭제할 때 생성 된 엄지 손가락은 삭제되지 않습니다. 그러나 큰 문제는 아닙니다. 필요한 경우 SHH 명령을 통해 그렇게 할 수 있습니다


1
파일이 삭제되지 않는 것에 대한 좋은 지적. 내 솔루션은 이것으로 고통받지 않을 것입니다! (업데이트 된 답변 참조).
TheDeadMedic

1

문제에 대한 직접적인 대답은 아닙니다. 하지만 필요에 따라 이미지를 만드는 데 도움을 드리겠습니다.

add_image_size를 사용하면 기존 이미지의 크기가 조정되지 않습니다. add_image_size 함수를 추가 한 후 업로드 될 새 이미지에만 작동합니다.

따라서 코드는 is_page_template 함수에 대한 새로운 이미지를 생성하지 않습니다.

그러나 당신은 당신의 문제를 해결하기 위해 간단한 PHP 클래스를 사용할 수 있습니다 .... WordPress에 대한 많은 프리미엄 테마에 사용되고있는 유명한 PHP 클래스입니다. Aqua-Resizer라고합니다.

자세한 내용은 https://github.com/syamilmj/Aqua-Resizer Wiki 에서 확인할 수 있습니다 : https://github.com/syamilmj/Aqua-Resizer/wiki

발생할 수있는 문제 :

이 기능은 이런 식으로 작동합니다 ....

<?php aq_resize( $url, $width, $height, $crop, $single ) ?>

따라서 자르지 못하면 (높이 또는 너비가 정의한 작은 이미지의 경우) 아무것도 표시되지 않습니다. 이 함수 내에서 URL을 전달한 후 null 값을 얻는 지 여부를 확인하면이 상황을 극복 할 수 있습니다.

<?php 
$thumb = wp_get_attachment_url( get_post_thumbnail_id($post->ID), 'full' ); if($thumb){ $url = aq_resize( $thumb, 400, 200, true, true ); if(!$url){ $url = WPM_DIR.'/assets/images/demo/wrong_image_size.jpg'; } }else{ $url = WPM_DIR.'/assets/images/demo/400x200_no_feature_image.jpg'; } 
?>

이러한 방식으로 특정 페이지 템플릿에 대해 특정 이미지가 생성되고 웹 사이트가 훨씬 깨끗해집니다.

추신 :이 PHP 클래스 사용법 WordPress 핵심 자르기 시스템이므로 보안 문제가 없습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.