Plugin WordPress: Fast Flickr

Apesar do Flickr não ser mais o mesmo de antes, precisei em um trabalho exibir as fotos de um set em uma janela estilo lightbox. Em 2006 tinha escrito um plugin tosco e resolvi escrever algo novo.

Demo:

Uso:

  1. Faça o download dos arquivos, copie-os para seu diretório de plugins;
  2. Ative o Fast Flickr em seu administrador;
  3. Use em seus posts ou páginas:
  1. [ fastflickr set=ID DO SET ]

Foi algo que escrevi em poucas horas e faz apenas o básico. O código está no GitHub.

Geração de PDFs indolor no PHP

Tempos atrás escrevi um artigo sobre como gerar PDF dentro do Rails usando a gem wicked_pdf e o wkhtmltopdf. Como escrevi no post anterior, o wkhtmltopdf usa Webkit, a engine de renderização do Safari / Chrome para gerar a visualização do documento. Isso o torna superior se comparado com bibliotecas do PHP como o FPDF, pois, geralmente, essa bibliotecas possuem dificuldades para reproduzir efeitos de CSS.

Em um novo projeto, estou usando novamente o wkhtmltopdf, mas agora dentro do PHP. No post anterior, indiquei que você pode usar o binário disponível no site, entretanto no servidor atual, tive alguns problemas com isso. Então, se possível, compile o wkhtmltopdf direto da fonte.

Compilação passo-a-passo

Instale em seu servidor alguns pacotes que irá precisar:

  1. apt-get install openssl build-essential xorg libssl-dev libxrender-dev git-core

… e obtenha o código fonte recente do wkhtmltopdf:

  1. git clone git://github.com/antialize/wkhtmltopdf.git wkhtmltopdf
  2. git clone git://gitorious.org/+wkhtml2pdf/qt/wkhtmltopdf-qt.git wkhtmltopdf-qt

Veja, para usar o wkhtmltopdf você precisará do QT. Nesse caso também vamos compilá-lo manualmente:

  1. cd wkhtmltopdf-qt
  2. git checkout staging
  3. QTDIR=. ./bin/syncqt
  4. ./configure -nomake tools,examples,demos,docs,translations -opensource -prefix "../wkqt"
  5. make -j3 && make install
  6. cd ..

Com o QT gerado, você finalmente poderá compilar o wkhtmltopdf:

  1. cd wkhtmltopdf
  2. ../wkqt/bin/qmake
  3. make && make install

Não inventei a receita acima, mas ela funcionou perfeitamente no Debian. Com a compilação a pasta /usr/bin ganhou 2 novos executáveis: wkhtmltopdf e wkhtmltoimage. Com isso você já pode usar o utilitário pelo shell. Se quiser testá-lo, experimente:

PHP

Dentro do próprio site do wkhtmltopdf há uma classe em PHP para utilizar o aplicativo dentro do seu site, entretanto, optei por uma classe disponível no Github. Um simples exemplo, tirado do próprio repositório:

  1. try {
  2.     $wkhtmltopdf = new Wkhtmltopdf(array('path' => APPLICATION_PATH . '/../public/uploads/'));
  3.     $wkhtmltopdf->setTitle("Title");
  4.     $wkhtmltopdf->setHtml("Content");
  5.     $wkhtmltopdf->output(Wkhtmltopdf::MODE_DOWNLOAD, "file.pdf");
  6. } catch (Exception $e) {
  7.     echo $e->getMessage();
  8. }

O que o exemplo não mostra é como definir uma mensagem de rodapé. Só depois de algum tempo, percebi que o wkhtmltopdf busca um arquivo externo. No meu aplicativo, defino o rodapé dinamicamente:

  1. $wkhtmltopdf->setFooterHtml("footer.php?msg='Hello World!'");

Coletânea de dicas sobre WordPress

Resolvi escrever uma série de posts com diversas dicas para o WordPress.

Temas

Vai escrever um template do zero? Recomendo começar pelo HTML5 Boilerplate. Trata-se de um template com diversas otimizações e resets para garantir a compatibilidade máxima entre browsers.

Também é interessante uma leitura sobre o desenvolvimento de temas, principalmente sobre a hierarquia dos templates e a função get_template. Venho utilizando essa função para não repetir código nos arquivos archive.php, page.php, search.php e single.php.

Rascunhos de posts

O WordPress salva automaticamente seus posts, o que pode aumentar o tamanho de seu banco de dados. Para desabilitar esse recurso, você pode editar o arquivo /wp-config.php:
Continue reading

Busca nos campos personalizados do WordPress

Os campos personalizados é um recurso usado no WordPress para que o autor de um post possa armazenar dados a sua escolha. Você pode usar esse recurso de várias formas: mostrar imagens personalizadas, falar o que você está ouvindo durante a escrita do post, adicionar informação pessoal e muito mais. Em um blog sobre livros, você pode usar tal recurso para criar os campos “Autor”, “Editora”, “Ano” e por aí vai.

Estou trabalhando em um projeto que utiliza os campos personalizados na área de Imprensa, onde cada post aponta em que tipo de imprensa determinada informação foi postada: Rádio, TV, Internet, Jornal. Como dito acima, criar o campo personalizado é simples. Difícil é filtrar os posts de acordo com o valor do campo.

A solução

Descobri um plugin chamado Search Custom Fields. Numa explicação rápida, ele adiciona os Campos Personalizados na query de busca de posts.

Antes:

  1. <a href="/?s=minhabusca">minha busca</a>

Depois:

  1. <a href="?meucampopersonalizado=Veículo&s=meuvalordocampopersonalizado">minha busca pelo campo personalizado</a>

Na documentação do plugin, o autor mostra como turbinar o campo de busca do WordPress. Ao invés disso, escrevi uma pequena função para listar os valores de um atributo personalizado:

  1. function list_custom_fields($metakey, $output) {
  2.     // based on http://sixrevisions.com/wordpress/custom-fields-search/
  3.     global $wpdb;
  4.     $items = $wpdb->get_col($wpdb->prepare("SELECT DISTINCT meta_value FROM $wpdb->postmeta WHERE meta_key = %s ORDER BY meta_value ASC", $metakey) );
  5.     if ($items) {
  6.         if ($output == "dropdown") { // display values in a select
  7.             echo "<form action=\"/\" method=\"get\"><input type=\"hidden\" name=\"key\" value=\"$metakey\" /><select name=\"s\" onchange=\"this.form.submit();\"><option></option>";
  8.             foreach ($items as $item) {
  9.               echo "<option value=\"" . $item . "\">" . $item . "</option>";
  10.             }
  11.             echo "</select></form>";
  12.         } else if ($output == "list") { // display values in a list
  13.             echo "<ul>";
  14.             foreach ($items as $item) {
  15.               echo "<li><a href=\"/?s=$item&key=$metakey\">$item</a></li>";
  16.             }
  17.             echo "</ul>";
  18.         }
  19.     }
  20. }

Coloque a função acima no arquivo functions.php do seu tema e chame-a, de duas formas, em seu sidebar, por exemplo:

  1. < ?php if(function_exists('list_custom_fields')) list_custom_fields("Veículo", "dropdown"); ?>

…para mostrar os valores do campo personalizado “Veículo” em select do HTML ou…

  1. < ?php if(function_exists('list_custom_fields')) list_custom_fields("Veículo", "list"); ?>

…para mostrar os valores do campo personalizado “Veículo” em uma lista.