Web sites para pessoas, em qualquer lugar ou dispositivo.

 OS MAIS COMENTADOS 

POSTS RECENTES > VOCÊ ESTÁ NO POST:

Otimizando imagens para cada contexto de uso no WordPress

por Bruno Barros | Publicado em 2 OUT 2011
imagem de Otimizando imagens para cada contexto de uso no WordPress
Caso o usuário esteja acessando seu site de um dispositivo móvel não faz sentido carregar as imagens utilizadas nas versões para desktop para então utilizar as técnicas de imagens fluidas. Neste artigo vou demonstrar como usar a detecção de dispositivos do lado do servidor para servir imagens adequadas para cada contexto de uso usando a plataforma WordPress.

Ao desenvolvermos sites adaptáveis uma das principais questões que devemos resolver, principalmente se o site contempla dispositivos móveis, é com relação à otimização do código e imagens de acordo com o contexto de uso. Caso o usuário esteja acessando seu site de um dispositivo móvel não faz sentido carregar as imagens utilizadas nas versões para desktop para então utilizar as técnicas de imagens fluidas.

Dica: cerca de 80% do tempo de carregamento dos sites é em decorrência do processamento dos arquivos enviados pelo servidor, como: HTML, CSS, imagens e JavaScript. (Yahoo! Developer Network)

As técnicas de adaptação são válidas quando o custo-benefício está do lado dos usuários, ou seja, não deve prevalecer a lei do menor esforço. Para entender melhor o que quero dizer assista ao vídeo onde demonstro diferentes abordagens: mobile first vs desktop first.

Neste artigo vou demonstrar detalhadamente como usar a detecção de dispositivos do lado do servidor para servir imagens adequadas (otimizadas) para cada contexto de uso usando a plataforma WordPress, muito embora a mesma técnica possa ser utilizada em qualquer plataforma.

Para os próximos passos vamos precisar de:


Instalando a classe de detecção no seu tema

Para instalar a classe basta copiá-la para dentro do seu tema, por questões de organização vou salvá-la na pasta “class” dentro do meu tema (wp-content/themes/meutema/class).

No arquivo “functions.php” vamos instanciar a classe e salvar o resultado em uma constante (identificador para um único valor) para utilizá-la em qualquer ponto do nosso tema.


1
2
3
4
5
6
7
8
9
10
11
12
<?php
 
  // Disponibiliza a classe
  include(TEMPLATEPATH . '/class/'  . "Mobile_Detect.php");
 
  // Instancia a classe
  $detect = new Mobile_Detect();
 
  // Guarda o resultado em uma constante
  define('ISMOBILE', $detect->isMobile());
 
?>


A classe “Mobile_Detect” pode retornar vários resultados diferentes; se o dispositivo é móvel ou desktop, e também, o tipo de dispositivo, através dos métodos abaixo:

  • isAndroid()
  • isBlackberry()
  • isOpera()
  • isPalm()
  • isWindows()
  • isGeneric()
  • isDevice()


Selecionando o conteúdo de acordo com o contexto

As linguagens de programação possuem formas simples de testar o valor das variáveis, elas recebem o nome de “estruturas condicionais”, ou “estruturas de controle”. No PHP a sintaxe básica é:


1
2
3
4
5
6
7
8
9
if( expressão ){
 
  // Resultado da expressão  foi verdadeiro
 
} else {
 
  // Resultado da expressão  foi falso
 
}


Aplicando esta estrutura em nosso tema ficará assim:

1
2
3
4
5
6
7
8
9
10
11
12
13
<?php
 
  if( ISMOBILE ){
 
  // Exibe conteúdo  otimizado para dispositivos móveis
 
  } else {
 
  // Exibe conteúdo  otimizado para desktops
 
  }
 
?>


Selecionando a imagem correta

O WordPress possui uma função perfeita para esses casos. Ao adicionarmos imagens pela administração, o WordPress redimensionará a imagem em três tamanhos diferentes, além da original. Estes tamanhos podem ser pré-configurados na administração (Configurações > Mídia).

Ao adicionarmos imagens pela administração, o WordPress redimensionará a imagem em três tamanhos diferentes, além da original.


Para acessarmos as diferentes resoluções da imagem podemos utilizar a função do WordPress wp_get_attachment_image_src($attachment_id, $size, $icon). Para entender como usar a função e suas possibilidades acesse a página no codex do WordPress. Basicamente nós entramos com os dados: ID do arquivo anexo (nesse caso a imagem do post) e o tamanho da imagem que queremos e a função retorna uma lista com os dados da imagem, como: url, largura e altura. As opções possíveis para o tamanho da imagem são: thumbnail, medium, large ou full.

Combinando a estrutura condicional com a função WordPress para recuperar a imagem de um tamanho específico nosso trecho de código fica assim:


1
2
3
4
5
6
7
8
9
10
11
12
13
if( ISMOBILE ){
 
// Exibe conteúdo otimizado para dispositivos móveis
$image_attributes = wp_get_attachment_image_src( $attachment_id, “thumbnail” );
 
} else {
 
// Exibe conteúdo otimizado para desktops
$image_attributes = wp_get_attachment_image_src( $attachment_id, “large” );
 
}
 
?>



Em muitos casos precisaremos exibir a galeria completa de imagens otimizadas para cada contexto, nesses casos teremos que fazer um script para carregar as imagens do post. Eu fiz um script simples que faz o trabalho sujo e retorna uma lista (array) para ser iterado no template exibindo as imagens.

Copie o código abaixo e cole no arquivo “functions.php” do seu tema.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
/**
 * Pequisa e retorna uma lista com as imagens do post de acordo com o tamanho especificado.
 *
 * @autor Bruno Barros <bruno@brunobarros.com>
 *
 * @param int $post_id ID do post.
 * @param int $size Tamanho das imagens (thumbnail, medium, large or full).
 * @param int $start Exibe as imagens a partir desta (1 == primeira).
 * @return array Retorna uma array multidimencional.
 */
function my_galeria_adaptavel($post_id, $tamanho = 'thumbnail', $start = 1)
{
 
    $saida = array();
    $ordem = array();
 
    // Existe ID?
    if(! is_numeric($post_id)){
        return false;
    }
 
    // retorna todas as imagens continas neste post
    $consulta_filhos = &get_children('post_type=attachment&post_mime_type=image&post_parent=' . $post_id);
 
    // percorre as imagens do post
    foreach($consulta_filhos as $i) {
 
        // dados do POST/imagem
        $img_id = $i->ID;
 
        // detalha dados da imagem (thumbnail, medium, large or full)
        $dados = wp_get_attachment_image_src($img_id, $tamanho);
 
        // se não é thumbnail insere nos dados do thumbnail também
        if($tamanho != 'thumbnail'){
            $dadosThumb = wp_get_attachment_image_src($img_id, 'thumbnail');
        } else {
            $dadosThumb = $dados;
        }
 
          // retorna a ordem das imagens
        $ordem[] = $i->menu_order;
 
        // coloca os dados das imagens em um array
        $saida[] = array(
            'src'    => $dados[0],
            'width'  => $dados[1],
            'height' => $dados[2],
            'title'  => $i->post_content,
            'full'   => $i->guid,
            'thumb'  => $dadosThumb[0]
        );
 
    }
 
    // ordena como na administração
    array_multisort($ordem, $saida);
 
    // retorna a lista de imagens a partir de uma imagem
    // definida no argumento $start
    return array_slice($saida, ($start - 1));
}


Para gerar a galeria no seu post você terá que criar um laço de repetição (looping) com a lista de imagens retornadas pela função my_galeria_adaptavel(). O trecho de código abaixo é um exemplo de como gerar o código HTML para nossa galeria.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
<?php
// LOOP WP DO POST
 
    // galeria adaptável
    if(ISMOBILE){
        $tamanho = 'medium';
    } else {
        $tamanho = 'large';
    }
 
    // guarda os dados da galeria na variável $galeria
    $galeria = my_galeria_adaptavel(get_the_ID(), $tamanho, 1);    
 
    echo '
<ul class="galeria">';
 
    // loop para montar as miniaturas
    for($x = 1; $x <= count($galeria); $x++):
 
        // endereço da imagem na resolução para o contexto
        $img = $galeria[$x-1]['src'];
 
        // endereço da miniatura para navegação da galeria
        $thumb = $galeria[$x-1]['thumb'];
 
        // atributo title da imagem
        $title = $galeria[$x-1]['title'];
    ?>
<li class="mini-<?php echo $x;?>">
        <a href="<?php echo $img;?>" title="<?php echo $title;?>">
        <img src="<?php echo $thumb;?>" alt=" " class="thumb">
        </a>
    </li>
 
    <?php
    endfor;// fim do loop
 
    echo '</ul>
 
';
    // fim // galeria adaptável     
 
// FIM // LOOP WP DO POST
?>


Se tudo foi feito corretamente até aqui o resultado será semelhante a este:

1
2
3
4
5
6
<ul class="galeria">
<li class="mini-1"><a href="link/img/grande-1.jpg" title="descrição da imagem"><img src="link/img/pequena-1.jpg" alt=" " class="thumb" /></a></li>
<li class="mini-2"><a href="link/img/grande-2.jpg" title="descrição da imagem"><img src="link/img/pequena-2.jpg" alt=" " class="thumb" /></a></li>
<li class="mini-3"><a href="link/img/grande-3.jpg" title="descrição da imagem"><img src="link/img/pequena-3.jpg" alt=" " class="thumb" /></a></li>
<li>...</li>
</ul>


A imagem menor será sempre a miniatura, mas a imagem que será ampliada dependerá do contexto de acesso do usuário, nesse caso: medium (médio) para dispositivos móveis e large (grande) para desktops.


Conclusão

As técnicas de adaptação podem e devem ser complementadas com técnicas do lado do servidor. Como projetistas que tem um real interesse pela experiência de navegação, não basta que o site seja adaptável se isso trouxer uma sobrecarga para os usuários. Além de se adaptar as necessidades dos usuários o site deve estar otimizado para a capacidade de banda e processamento dos mesmos.

O WordPress tem uma função para recuperar a imagem thumbnail do post de forma bastante prática, ela se chama the_post_thumbnail(). Veja como utilizá-la no codex.

Os códigos utilizados neste artigo podem ser livremente alterados de acordo com a sua necessidade. Caso tenha alguma dificuldade não hesite em escrever.

COMPARTILHE ESTE CONHECIMENTO

  • GALERIA DO POST
  • Galeria #1

2 respostas para “Otimizando imagens para cada contexto de uso no WordPress”

  1. juancbdm7 disse:

    Parabens pelo post, realmente muito bom =D

  2. Ricardo de Castro disse:

    Muito bom! Gostei do texto e da dica!

Deixe uma resposta