Adicionar tamanho da imagem se o modelo da página


13

Estou construindo um site para membros com o WordPress Multisite. É possível restringir quantas imagens estão sendo geradas, dependendo do modelo selecionado?

Tentei as seguintes linhas de código para gerar determinadas imagens no modelo da galeria:

// 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 );
}

Isso não funcionou. Eu fiz algumas pesquisas e parece que não consigo encontrar nada sobre o assunto. Se você pudesse me apontar na direção certa, eu realmente aprecio isso.


1
Há também o Dynamic Image Resizer da Otto, que permite definir quantos tamanhos de imagem você desejar, mas só gera uma imagem em um tamanho específico quando necessário. Portanto, para o seu exemplo, as miniaturas da galeria seriam geradas apenas para as imagens que aparecem no modelo page-gallery.php.
helgatheviking

2
Só quero mencionar outras duas ótimas opções: @ Dynamic Image Resize do kaiser e o serviço Photon no JetPack.
birgire

Respostas:


13

Isso sempre foi um problema para mim - a falta de dimensionamento de imagens sob demanda e o número subseqüente de arquivos com os quais você pode terminar se tiver vários tamanhos!

Eu posso ver a lógica por trás de seus esforços - o problema é que add_image_sizesó entra de fato no ponto de upload. Como tal, is_page_template(..)sempre será false.

Um rápido google descobriu o Aqua Resizer , um script criado para resolver esse problema. Em vez de usar add_image_size, você usa aq_resizediretamente no seu tema e, se não existir um tamanho para a imagem, ela será criada e armazenada em cache on-the-fly.

Na verdade, eu usei uma técnica semelhante, embora diferente, em vários sites com muitos tamanhos de imagem. Você ainda salva a sobrecarga do WordPress, gerando todos os tamanhos para cada imagem carregada - elas são geradas on-the-fly (e armazenadas em cache) como e quando solicitadas. Onde difere, é que você pode simplesmente usar todas as funções de imagem padrão do WP e tags de modelo como faria normalmente!

Além disso, como o @Waqas mencionou, o uso do Aqua Resizer deixará arquivos órfãos quando você excluir uma imagem da sua biblioteca de mídia. Com a minha técnica, todos os arquivos serão excluídos, pois são salvos no banco de dados e reconhecidos pelo 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 );

E na prática:

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!

Pretendo transformar isso em um plug-in que converterá automaticamente todas as add_image_sizechamadas em redimensionamento sob demanda. Portanto, observe este espaço!


Obrigado por dedicar um tempo para deixar uma ótima resposta. Certamente vou tentar. É importante que eu acerte isso antes de abrir meu servidor para vários usuários. Vou gritar se tiver mais alguma pergunta.
29414 Sam

2
Eu testei com the_post_thumbnail (); e funciona perfeitamente. Um problema: quando eu excluo a imagem, ela deixa para trás a que foi redimensionada pelo seu script. Alguma ideia?
Sam

5


Disclaimer:
- Esta não é realmente uma resposta.
- Destina - se a ajudá-lo com sua pesquisa adicional sobre o assunto.
- Além disso, está refletindo uma ocorrência - pelo menos sentida - ultimamente mais frequente de perguntas semelhantes sobre problemas semelhantes.


Informações adicionais sobre este tópico sobre desenvolvimento do Wordpress:

Nota: A lista não é ordenada e abrangente por qualquer meio.


3

Se você deseja criar um polegar em tempo real, pode usar o redimensionador de imagens Aqua , mas há uma desvantagem neste mini script. As miniaturas criadas não serão excluídas ao excluir a imagem da biblioteca. Mas não é grande coisa. Se necessário, você pode fazê-lo através dos comandos SHH


1
Bom ponto sobre arquivos não serem excluídos. Minha solução não vai sofrer com isso! (veja resposta atualizada).
TheDeadMedic 29/03

1

Não é uma resposta direta para o seu problema. Mas eu vou ajudá-lo a fazer a imagem de acordo com sua necessidade.

Quando você usa add_image_size, ele não redimensiona as imagens existentes. funciona apenas para as novas imagens que serão carregadas depois de adicionar sua função add_image_size.

Portanto, seu código não gerará novas imagens para a função is_page_template.

Mas você pode usar uma classe php simples para resolver seu problema .... é uma classe php famosa que está sendo usada para muitos temas premium disponíveis no WordPress. É chamado Aqua-Resizer.

Você pode encontrar mais detalhes aqui https://github.com/syamilmj/Aqua-Resizer Wiki: https://github.com/syamilmj/Aqua-Resizer/wiki

Problema que pode surgir:

Esta função funciona desta maneira ....

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

Portanto, quando não é possível cortar (para imagem pequena que sua altura ou largura definida) não mostra nada. Você pode superar essa situação verificando se está obtendo um valor nulo após passar o URL dentro desta função com muita facilidade como o meu aqui ....

<?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'; } 
?>

Dessa forma, você pode garantir que a imagem específica seja gerada para um modelo de página específico e, dessa forma, seu site ficará muito mais limpo.

PS: esta classe php usa o sistema de corte central do WordPress, para que não haja problemas de segurança.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.