Adicione o tamanho da imagem se o modelo da página

11

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

Eu 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 não consigo encontrar nada sobre o assunto. Se você pudesse me apontar na direção certa, eu realmente aprecio isso.

    
por Sammy The Salmon 29.03.2014 / 16:48

4 respostas

12

Isso sempre foi um bugbear para mim - a falta de tamanho de imagem sob demanda e o número subseqüente de arquivos que você pode acabar se tiver muitos tamanhos!

Eu posso ver a lógica por trás de seus esforços - o problema é que add_image_size realmente entra em cena apenas no ponto de carregamento. Como tal, is_page_template(..) será sempre false .

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

Na verdade, usei uma técnica semelhante, embora diferente, em vários sites com muitos tamanhos de imagem. Você ainda salva a sobrecarga do WordPress gerando todo tamanho para todas as imagens enviadas - elas são geradas on-the-fly (e em cache) como e quando solicitadas . Onde isso é diferente, você pode simplesmente usar todas as funções de imagem padrão do WP e tags de template 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, uma vez que são salvos no banco de dados & reconhecido 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!

Estou pretendendo transformar isso em um plug-in que converterá automaticamente todas as chamadas add_image_size em redimensionamento sob demanda, portanto, assista a este espaço!

    
por TheDeadMedic 29.03.2014 / 17:16
5

Aviso:
  - Isso não é realmente uma resposta.
  - é destinado a ajudá-lo com sua pesquisa adicional sobre o assunto.
  - Além disso, é refletindo uma ocorrência - pelo menos sentida - ultimamente mais freqüente de questões semelhantes em relação a problemas similares.

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

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

    
por Nicolai 29.03.2014 / 17:55
3

Se você quiser criar miniaturas na hora, pode usar o resizer da imagem Aqua , mas há uma desvantagem de este mini script. Os polegares criados não serão excluídos após a exclusão da imagem da biblioteca. Mas não é grande coisa. Se necessário, pode fazê-lo através dos comandos SHH

    
por wp student 29.03.2014 / 18:00
1

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

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

Assim, o 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 o seu problema ... é uma classe php famosa que está sendo usada para um monte de temas premium para o WordPress. É chamado Aqua-Resizer.

Você pode encontrar mais detalhes aqui enlace Wiki: enlace

Problema que pode surgir:

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

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

Então, quando não pode cortar (para pequena imagem que sua altura ou largura definida) não mostra nada. Você pode superar essa situação verificando se você está obtendo um valor nulo depois de passar a url dentro dessa função com muita facilidade, como a minha 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'; } 
?>

Desta forma, pode garantir que a imagem específica será gerada para um modelo de página específico e, desta forma, o seu Website ficará muito mais limpo.

P.S: esta classe php usa o sistema de corte de núcleo do WordPress para que não haja problemas de segurança.

    
por WpMania.Net 01.04.2014 / 23:17