Alterar a ordem dos custom posts no WordPress

O facto do WordPress não ter nascido como CMS ainda se nota com alguma regularidade. Um exemplo disso é quando queremos mostrar, com uma ordem definida por nós, um série de elementos pertencentes a um custom post type, que por sua vez pertencem a uma custom taxonomy  (num URL do tipo  /<taxonomy-name>/<taxonomy-term>). Por defeito são mostrados por ordem de criação.

Isto implica criar uma nova instância do WP_Query com todos os argumentos necessários para obter o que pretendemos.

Criar o array com os argumentos tem que se lhe diga. Principalmente porque é preciso saber quais são, quais precisamos, quais podemos ignorar, etc. A forma mais simples de criar esse array é aproveitar o trabalho que o WordPress já fez.

Basta aceder ao array da query original e juntar-lhe apenas os argumentos que queremos alterados. Neste exemplo, o orderby e o order. Fazemos isso com a função do PHP array_merge , que concatena uma série de arrays usando sempre os valores do último array em caso de conflito (exactamente o que pretendemos).

Simples e eficaz.

Dica relacionada: Alternativamente a definir a ordem na página de edição de cada post é melhor usar um plugin como o Simple Page Ordering.

Site multilingue com o Polylang

Rosetta StoneAndava há uns tempos a pensar em disponibilizar este site em português e inglês. Precisava de um plugin para isso, mas andava a adiar porque as duas opções que conhecia não me agradavam muito.

Um dos plugins, o qTranslate, é gratuito mas a forma como funciona, colocando todas as traduções dentro do mesmo post (com tags próprias), não me agrada muito. Além disso, parece que não consegue acompanhar o desenvolvimento do WordPress. Já me aconteceu não poder actualizar o WordPress por causa do qTranslate. Aliás, isso parece estar a acontecer neste momento. O plugin não é actualizado desde Janeiro e, segundo a informação na página do plugin, não funciona com as versões mais recentes do WordPress.

A outra opção, o WPML, é, penso eu, uma das soluções mais usadas para sites WordPress multilingue e bastante boa, pelo que leio. Mas é um plugin pago e eu não sei se justificaria o investimento. Embora seja interessante ter o site em inglês, não era uma prioridade.

O facto é que, com uma pesquisa rápida, foi fácil encontrar algumas alternativas. Destas, o Polylang, destacou-se. Parece ser relativamente usado (300 mil downloads) e com desenvolvimento activo (última actualização há uns dias).

Depois de configurado e todo o conteúdo traduzido, queria aqui deixar as minhas primeiras impressões sobre o plugin.

Prós

  • Cria um post para cada língua e liga-os como traduções do mesmo artigo. Isto traz algumas vantagens, nomeadamente, cada post ter um link próprio e não ser necessário indicar a linguagem no URL (embora seja possível).
  • Ficamos, automaticamente, com feeds RSS para cada linguagem.
  • Além do tradicional widget, o alternador de linguagem pode ser adicionado como uma entrada de menu, o que facilita bastante a sua inserção no site.
  • Os widgets não são propriamente traduzidos mas temos a opção, para cada um, de o mostrar apenas numa determinada língua. O mesmo com os menus. Todas as zonas de menus são multiplicadas pelo número de línguas, tendo depois que criar um menu para cada uma delas.
  • Várias funções e filtros para serem usados no theme, caso seja necessário (a documentação é bastante boa).

Contras

  • O workflow de escrita pode ser algo tedioso. O Polylang oferece a possibilidade de, entre outras coisas, sincronizar tags e categorias entre traduções, mas, para isso, têm que estar traduzidas. O que quer dizer que, depois de escrever o post original, temos que traduzir tags e categorias (se forem novas) antes de criar as traduções. Além disso, as páginas de media (imagens) também têm que ser traduzidas antes de estarem disponíveis para inserir nas traduções.
  • Não traduz slugs de custom post types. Por exemplo, o endereço ‘zecipriano.com/trabalho’ fica ‘zecipriano.com/en/trabalho’ em vez de termos a possibilidade de traduzir para ‘zecipriano.com/work’.

Conclusão

O WordPress nunca foi pensado para sites multilingue pelo que nenhuma solução será perfeita, mas no geral estou satisfeito com o Polylang. Especialmente tendo em conta que é um plugin gratuito. Tudo funciona como esperado e as desvantagens acabam por ser de pouca relevância.

Finalmente, referir que para termos uma tradução perfeita também é necessário criar, se não existir, uma tradução do theme. Usando as funções do gettext [ __(‘string’) ] e depois traduzindo, por exemplo, com o plugin CodeStyling Localization.