Articles

Customizing WordPress Archives For Categories, Tags And Other Taxonomies

  • 16 min read
  • WordPress,Techniques (WP)
  • Salvado para leitura offline
  • Partilhar no Twitter, LinkedIn
>
>Os utilizadores do WordPress estão familiarizados com tags e categorias e com a forma de as utilizar para organizar os seus posts no blog. Se você usa tipos de posts personalizados no WordPress, você pode precisar organizá-los como categorias e tags. Categorias e tags são exemplos de taxonomias, e o WordPress permite que você crie quantas taxonomias personalizadas você quiser. Essas taxonomias personalizadas operam como categorias ou tags, mas são separadas. Neste tutorial, vamos explicar as taxonomias personalizadas e como criá-las. Também vamos rever quais arquivos de template em um tema do WordPress controlam os arquivos de taxonomias embutidas e personalizadas, e algumas técnicas avançadas para personalizar o comportamento dos arquivos de taxonomia.

A maioria dos usuários do WordPress estão familiarizados com tags e categorias e com a forma de usá-las para organizar seus posts no blog. Se você usar tipos de posts personalizados no WordPress, você pode precisar organizá-los como categorias e tags. Categorias e tags são exemplos de taxonomias, e o WordPress permite que você crie quantas taxonomias personalizadas você quiser. Estas taxonomias personalizadas operam como categorias ou tags, mas são separadas.

Neste tutorial, vamos explicar as taxonomias personalizadas e como criá-las. Também vamos rever quais arquivos template em um tema do WordPress controlam os arquivos de taxonomias embutidas e personalizadas, e algumas técnicas avançadas para personalizar o comportamento dos arquivos de taxonomia.

Leitura adicional no SmashingMag:

  • Construir uma página de arquivo personalizada para WordPress
  • Design de arquivos do site: Boas Práticas e Exemplos
  • Um Guia Detalhado de Modelos de Páginas Personalizadas para WordPress

Terminologia

Antes de continuar, vamos esclarecer nossa terminologia. Uma taxonomia é um tipo de conteúdo WordPress, usado principalmente para organizar conteúdo de qualquer outro tipo de conteúdo. As duas taxonomias com as quais todos estão familiarizados são incorporadas: categorias e tags. Tendemos a chamar “tag” a uma publicação individual de uma tag, mas para sermos mais precisos, devemos nos referir a ela como um “termo” na taxonomia “tag”. Nós quase sempre nos referimos a itens em uma taxonomia personalizada como “termos”

Categorias e tags representam os dois tipos de taxonomias: hierárquica e não-hierárquica. Como as categorias, as taxonomias hierárquicas podem ter relações pai-filho entre os termos na taxonomia. Por exemplo, você pode ter em seu blog uma categoria “filmes” que tem várias categorias infantis, com nomes como “estrangeiro” e “doméstico”. Taxonomias personalizadas também podem ser hierárquicas, como categorias, ou não-hierárquicas, como tags.

wordpress-categories-taxonomies-opt
Uma pequena parte da “Hierarquia de Modelos do WordPress”. (Fonte)

O arquivo de uma taxonomia é a lista de posts de uma taxonomia que é gerada automaticamente pelo WordPress. Por exemplo, esta seria a página que você vê quando clica em um link de categoria e vê todos os posts dessa categoria. Vamos rever como alterar o comportamento dessas páginas e saber quais os arquivos de template que as geram.

Como funcionam os arquivos de tag, categoria e taxonomia personalizada

Para cada categoria, tag e taxonomia personalizada, o WordPress gera automaticamente um arquivo que lista cada postagem associada a essa taxonomia, em ordem cronológica inversa. O sistema funciona muito bem se você organizar suas postagens no blog com categorias e tags. Se você tem um sistema complexo de organização de tipos de posts personalizados com taxonomias personalizadas, então pode não ser o ideal. Vamos rever as várias maneiras de modificar esses arquivos.

O primeiro passo para personalizar é saber quais arquivos do seu tema são usados para exibir o arquivo. Temas diferentes têm ficheiros de template diferentes, mas todos os temas têm um index.php template. O modelo index.php é utilizado para exibir todo o conteúdo, a menos que exista um modelo mais alto na hierarquia. A hierarquia de modelos do WordPress é o sistema que dita qual arquivo de modelos é utilizado para exibir qual conteúdo. Vamos rever brevemente a hierarquia de modelos para categorias, tags e taxonomias personalizadas. Se você quiser saber mais, estes recursos são altamente recomendados:

  • “Template Hierarchy”, Cód. WordPress
  • “Template Hierarchy”, Chip Bennett Um diagrama de fluxo
  • “The WordPress Template Hierarchy”: A Mini Resource, Rami Abraham e Michelle Schulp Um gráfico interativo
  • Reveal Template, Scott Reilly A WordPress plugin

Muitos temas têm um template archive.php, que é usado para arquivos de categorias e tags, assim como arquivos de data e autor. Você pode adicionar um arquivo de template para tratar os arquivos de categoria e tag separadamente. Estes templates seriam nomeados category.php ou tag.php, respectivamente. Você também pode criar modelos para tags ou categorias específicas, usando o ID ou slug da categoria ou tag. Por exemplo, uma tag com o ID de 7 usaria tag-7.php, se existir, em vez de tag.php ou archive.php. Uma tag com a lesma de “abacate” seria exibida usando a tag-avocado.php template.

Uma coisa complicada a ter em mente é que um template com o nome de uma lesma irá substituir um template com o nome de um número de ID. Então, se uma tag com a lesma de “abacate” tivesse um ID de 7, então tag-avocado.php substituiria tag-7.php, se ela existir.

A hierarquia de templates para taxonomias personalizadas é um pouco diferente, porque existem templates para todas as taxonomias, para taxonomias específicas e para termos específicos em uma taxonomia específica. Então, imagine que você tem duas taxonomias, “frutas” e “vegetais”, e a taxonomia “frutas” tem dois termos, “maçãs” e “laranjas”, enquanto “vegetais” tem dois termos, “cenouras” e “aipo”. Vamos adicionar três modelos ao tema do nosso site: taxonomy.php, taxonomy-fruits.php e taxonomy-vegetables-carrots.php.

Para os termos na taxonomia “frutas”, todos os arquivos seriam gerados usando taxonomy-fruits.php porque não existe nenhum template com termos específicos. Por outro lado, o termo “cenouras” nos arquivos da taxonomia “vegetais” seria gerado usando taxonomy-vegetables-carrots.php. Porque não existe taxonomy-vegetables.php template, todos os outros termos em “vegetais” seriam gerados usando taxonomy.php.

Usando Tags Condicionais

Embora você possa adicionar qualquer um dos templates personalizados listados acima para criar uma visão totalmente única para qualquer categoria, tag, taxonomia personalizada ou termo de taxonomia personalizada, às vezes tudo o que você quer fazer é fazer uma ou duas pequenas mudanças. Na verdade, tente evitar criar muitos templates porque você precisará ajustar cada um deles quando fizer alterações gerais na marcação HTML básica que você usa em cada template do tema. A menos que eu precise de um template que seja radicalmente diferente do tema archive.php, eu tendo a aderir a adicionar alterações condicionais a archive.php.

WordPress fornece funções condicionais para determinar se uma categoria, tag ou taxonomia personalizada está sendo exibida. Para determinar se um arquivo de categorias está sendo exibido, você pode usar is_category() para categorias, is_tag() para tags e is_tax() para taxonomias personalizadas. As funções is_tag() e is_category() também podem testar para categorias ou tags específicas por slug ou ID. Por exemplo:

<?php if ( is_tag() ) { echo "True for any tag!"; } if ( is_tag( 'jedis' ) ) { echo "True for the tag whose slug is jedi"; } if ( is_tag( array( 'jedi', 'sith' ) ) ) { echo "True for tags whose slug is jedi or sith"; } if ( is_tag( 7 ) ) { echo "You can also use tag IDs. This is true for tag ID 7"; }?>

Para taxonomias personalizadas, a função is_tax() pode ser usada para verificar se alguma taxonomia (não incluindo categorias e tags), uma taxonomia específica ou um termo específico em uma taxonomia está sendo mostrado. Por exemplo:

<?php if ( is_tax() ) { echo "True for any custom taxonomy."; } if ( is_tax( 'vegetable' ) ) { echo "True for any term in the vegetable taxonomy."; } if ( is_tax( 'vegetable', 'celery' ) ) { echo "True only for the term celery, in the vegetable taxonomy."; }?>

Criar taxonomias personalizadas

Adicionar uma taxonomia personalizada pode ser feito de uma de três maneiras: codificando-a manualmente de acordo com as instruções no Codex, o que eu não recomendo; gerando o código usando GenerateWP; ou usando um plugin para tipos de conteúdo personalizados, como Pods ou Types. Plugins para tipos de conteúdo personalizados permitem que você crie taxonomias personalizadas e tipos de posts personalizados no back end do WordPress sem ter que escrever nenhum código. Usar um é a maneira mais fácil de adicionar uma taxonomia personalizada e obter um framework para trabalhar com tipos de conteúdo personalizados.

Se você optar por uma das duas primeiras opções, ao invés de um plugin, então você precisará adicionar o código no arquivo functions.php do seu tema ou em um plugin personalizado. Eu recomendo fortemente a criação de um plugin personalizado, em vez de adicionar o código a functions.php. Mesmo que você nunca tenha criado um plugin antes, eu recomendo que você o faça. Enquanto adicionar o código ao seu tema functions.php irá funcionar, quando você trocar de tema (digamos, porque você quer usar um novo tema ou para solucionar um problema), a taxonomia não irá mais funcionar.

Se você escrever seu código de taxonomia personalizado seguindo as instruções no Codex ou gerando-o com o GenerateWP, basta colá-lo em um arquivo texto e adicionar uma linha de código antes dele e você terá um plugin. Carregue-o e instale-o como qualquer outro plugin.

A única linha que você precisa para criar um plugin personalizado é /* Plugin name: Custom Taxonomy */.

Below é um plugin para registrar uma taxonomia personalizada chamada “vegetais”, que eu criei usando GenerateWP porque é significativamente mais fácil e muito menos susceptível de conter erros do que fazê-lo manualmente:

<?php /* Plugin Name: Veggie Taxonomy */ if ( ! function_exists( 'slug_veggies_tax' ) ) { // Register Custom Taxonomy function slug_veggies_tax() { $labels = array( 'name' => _x( 'Vegetables', 'Taxonomy General Name', 'text_domain' ), 'singular_name' => _x( 'Vegetable', 'Taxonomy Singular Name', 'text_domain' ), 'menu_name' => __( 'Taxonomy', 'text_domain' ), 'all_Veggies' => __( 'All Veggies', 'text_domain' ), 'parent_Veggie' => __( 'Parent Veggie', 'text_domain' ), 'parent_Veggie_colon' => __( 'Parent Veggie:', 'text_domain' ), 'new_Veggie_name' => __( 'New Veggie name', 'text_domain' ), 'add_new_Veggie' => __( 'Add new Veggie', 'text_domain' ), 'edit_Veggie' => __( 'Edit Veggie', 'text_domain' ), 'update_Veggie' => __( 'Update Veggie', 'text_domain' ), 'separate_Veggies_with_commas' => __( 'Separate Veggies with commas', 'text_domain' ), 'search_Veggies' => __( 'Search Veggies', 'text_domain' ), 'add_or_remove_Veggies' => __( 'Add or remove Veggies', 'text_domain' ), 'choose_from_most_used' => __( 'Choose from the most used Veggies', 'text_domain' ), 'not_found' => __( 'Not Found', 'text_domain' ), ); $args = array( 'labels' => $labels, 'hierarchical' => false, 'public' => true, 'show_ui' => true, 'show_admin_column' => true, 'show_in_nav_menus' => true, 'show_tagcloud' => false, ); register_taxonomy( 'vegetable', array( 'post' ), $args ); } // Hook into the 'init' action add_action( 'init', 'slug_veggies_tax', 0 ); }?>

Por falar nisso, eu criei este código usando GenerateWP em menos de dois minutos! O serviço é ótimo, e escrever manualmente o código que este site pode gerar automaticamente para você não faz sentido. Para tornar o processo ainda mais fácil, você pode usar o plugin Pluginception para criar um plugin em branco para você e depois colar o código do GenerateWP nele usando o editor de plugins do WordPress.

Usando WP_Query With Custom Taxonomies

Após ter adicionado uma taxonomia personalizada, você pode querer consultar os posts com termos nessa taxonomia. Para fazer isso, podemos usar consultas de taxonomia com WP_QUERY.

Perguntas de taxonomia podem ser muito simples ou complicadas. A consulta mais simples seria para todas as postagens com um determinado termo. Por exemplo, se você tivesse um tipo de post chamado “jedi” e uma taxonomia personalizada associada chamada “level”, então você poderia obter todos os mestres Jedi como este:

<?php $args = array( 'post_type' => 'jedi', 'level' => 'master' ); $query = new WP_Query( $args );?>

Se você adicionasse uma segunda taxonomia personalizada chamada “era”, então você poderia encontrar todos os mestres Jedi da República Velha como este:

<?php $args = array( 'post_type' => 'jedi', 'level' => 'master', 'era' => 'old-republic', ); $query = new WP_Query( $args );?>

Nós também podemos fazer comparações mais complicadas, usando um completo tax_query. O argumento tax_query permite-nos procurar por ID ao invés de slug (como fizemos antes) e procurar por mais de um termo. Ele também nos permite combinar múltiplas consultas de taxonomia e definir a relação entre os dois. Além disso, podemos até usar operadores SQL como NOT IN para excluir termos.

As possibilidades são infinitas. Explore a seção “Parâmetros de Taxonomia” da página do Codex para “Referência de Classe/WP_Query” para obter informações completas. O trecho abaixo procura no nosso tipo de post “jedi” por cavaleiros e mestres Jedi que não são da era da República Velha:

<?php $args = array( 'post_type' => 'jedi', 'tax_query' => array( 'relation' => 'AND', array( 'taxonomy' => 'level', 'field' => 'slug', 'terms' => array( 'master', 'knight' ) ), array( 'taxonomy' => 'era', 'field' => 'slug', 'terms' => array( 'old-republic' ), 'operator' => 'NOT IN' ) ) ); $query = new WP_Query( $args );?>

Customizing Taxonomy Archives

Até agora, nós cobrimos como as taxonomias, tags e categorias funcionam por padrão, bem como como criar taxonomias personalizadas. Se algum deste comportamento padrão não se ajusta às suas necessidades, você pode sempre modificá-lo. Vamos rever algumas maneiras de modificar a funcionalidade incorporada do WordPress para aqueles de vocês que usam o WordPress menos como plataforma de blogs e mais como sistema de gerenciamento de conteúdo, o que muitas vezes requer taxonomias personalizadas.

Hello pre_get_posts

Antes de qualquer mensagem ser enviada pelo loop do WordPress, o WordPress automaticamente recupera as mensagens para o usuário de acordo com a página em que ele está, usando a classe WP_QUERY. Por exemplo, no índice principal do blog, ele recebe os posts mais recentes. Em um arquivo de taxonomia, ele recebe os posts mais recentes nessa taxonomia.

Para alterar essa consulta, você pode usar o filtro pre_get_posts antes que o WordPress receba qualquer post. Este filtro expõe o objecto da consulta após ter sido definido mas antes de ser usado para receber qualquer mensagem. Isto significa que você pode modificar a consulta usando os métodos de classe antes que o loop principal do WordPress seja executado. Se isso parecer confuso, não se preocupe – as próximas seções deste artigo dão exemplos práticos de como isso funciona.

Adicionando tipos de posts personalizados ao arquivo de categorias ou tags

Um grande uso de modificar o objeto WP_QUERY usando pre_get_posts é adicionar posts de um tipo de post personalizado ao arquivo de categorias. Por padrão, os tipos de posts personalizados não são incluídos nesta consulta. Se estivéssemos construindo argumentos a serem passados para WP_Query e quiséssemos incluir tanto posts regulares quanto posts no tipo de post personalizado “jedi”, então nosso argumento ficaria assim:

<?php $args = array( 'post_type' => array( 'post', 'jedi' ) );?>

Na chamada de retorno para nosso filtro pre_get_posts, precisamos passar um argumento similar. O problema é que o objeto WP_QUERY já existe, então não podemos passar um argumento para ele como fazemos ao criar uma instância da classe. Em vez disso, usamos o método de classe set(), que nos permite alterar qualquer um dos argumentos após a classe ter sido criada.

No snippet abaixo, usamos set() para alterar o argumento post_type do valor padrão, que é post, para um array de tipos de posts, incluindo posts e o nosso post personalizado do tipo “jedi”. Note que estamos usando a tag condicional is_category() para que a alteração aconteça somente quando arquivos de categoria estão sendo exibidos.

<?php add_filter( 'pre_get_posts', 'slug_cpt_category_archives' ); function slug_cpt_category_archives( $query ) { if ( $query->is_category() && $query->is_main_query() ) { $query->set( 'post_type', array( 'post', 'jedi' ) ); } return $query; }?>

Esta função tem como parâmetro $query o objeto WP_QUERY antes de ser usado para preencher o laço principal. Como uma página pode incluir vários loops, como aqueles usados por widgets, usamos a função condicional is_main_query() para garantir que isso afeta apenas o loop principal e não qualquer loop secundário na página, como aqueles usados por widgets.

Making Category or Hierarchical Taxonomy Archives Hierarchical

Por padrão, os arquivos para categorias e outras taxonomias hierárquicas agem como qualquer outro arquivo de taxonomia: eles mostram todos os posts nessa categoria ou com esse termo de taxonomia. Para mostrar apenas os termos dos pais e excluir termos filhos, você usaria o filtro pre_get_posts novamente.

Apenas como ao criar o seu próprio WP_QUERY para posts em uma taxonomia, o laço principal do WP_QUERY usa os argumentos tax_query para obter posts por taxonomia. O tax_query tem um argumento include_children, que por padrão está definido para 1 ou true. Ao alterá-lo para 0 ou false, podemos evitar que posts com um termo infantil sejam incluídos no arquivo:

<?php add_action( 'pre_get_posts', 'slug_cpt_category_archives' ); function slug_cpt_category_archives( $query ) { if ( is_tax( 'TAXONOMY NAME') ) { $tax_query = $query->tax_query->queries; $tax_query = 0; $query->set( 'tax_query', $tax_query ); } }?>

O resultado parece desejável mas tem várias falhas importantes. Tudo bem, porque se resolvermos essas falhas, teremos dado o primeiro passo para criar algo muito legal.

O primeiro e maior problema é que o resultado não é uma página do arquivo que mostra os termos filhos; ainda é um post com o termo pai. O outro problema é que não temos uma boa maneira de navegar para os arquivos de termos infantis.

Uma boa maneira de lidar com isso é combinar o filtro pre_get_post acima com uma modificação no template que mostra a categoria ou taxonomia. Discutimos anteriormente como determinar qual template é usado para sair dos arquivos de categoria ou de taxonomia personalizada. Tenha também em mente que você pode sempre embrulhar suas alterações em tags condicionais, tais como is_category() ou is_tax(), mas isso pode se tornar complicado rapidamente; assim, fazer uma cópia do seu archive.php e remover qualquer código desnecessário provavelmente faz mais sentido.

O primeiro passo é embrulhar tudo em uma verificação para ver se o termo taxonomia atual tem filhos. Se não tiver, então nós não queremos emitir nada. Para fazer isso, usamos get_term_children(), que retornará um array vazio se o termo atual não tiver filhos e que podemos testar com !empty().

Para fazer isso funcionar para qualquer taxonomia que possa ser exibida, precisamos obter o termo atual de taxonomia e taxonomia do array query_vars do objeto global $wp_query. A lesma da taxonomia está contida na chave taxonomy, e a lesma do termo está na chave tax.

Para usar get_term_children(), precisamos ter o ID do termo. O ID não está em query_vars, mas podemos passar o slug para get_term_by() para obtê-lo.

Aqui está como obtemos toda a informação que precisamos nas variáveis:

<?php global $wp_query; $taxonomy = $wp_query->query_vars; $term = $wp_query->query_vars; $term_id = get_term_by( 'slug', $term, $taxonomy ); $term_id = $term_id->term_id; $terms = get_term_children( $term_id, $taxonomy );?>

Agora só continuaremos se $terms não for um array vazio. Para ver se ele está vazio em nossa verificação, primeiro vamos repopular os termos usando get_terms(). Isto é necessário porque get_term_children retorna apenas um array de IDs, e nós precisamos de IDs e nomes, ambos estão no objeto retornado por get_terms(). Podemos fazer um loop através deste objeto, emitindo o nome como um link. O link pode ser gerado passando o ID do termo para get_term_link().

Aqui está o código completo:

<?php global $wp_query; $taxonomy = $wp_query->query_vars; $term = $wp_query->query_vars; $term_id = get_term_by( 'slug', $term, $taxonomy ); $term_id = $term_id->term_id; $terms = get_term_children( $term_id, $taxonomy ); if ( !empty( $terms ) ) { $terms = get_terms( $taxonomy, array( 'child_of' => $term_id ) ); echo '<ul class="child-term-list">'; foreach ( $terms as $term ) { echo '<li><a href="'.$term->term_id.'">'.$term->name.'</a></li>'; } echo '</ul>';?>

Criar uma página de aterragem personalizada para arquivos de taxonomia

Se a sua taxonomia hierárquica não tem termos no termo pai, então o sistema de arquivo de taxonomia regular não terá qualquer utilidade para si. Você realmente quer mostrar links de taxonomia em vez disso.

Neste caso, uma boa opção é criar uma página de aterrissagem personalizada para o termo. Usaremos query_vars novamente para determinar se o usuário está na primeira página de um arquivo de taxonomia; se estiver, usaremos o filtro taxonomy_archive para incluir um template separado, como este:

<?php add_filter( 'taxonomy_archive ', 'slug_tax_page_one' ); function slug_tax_page_one( $template ) { if ( is_tax( 'TAXONOMY_NAME' ) ) { global $wp_query; $page = $wp_query->query_vars; if ( $page = 0 ) { $template = get_stylesheet_directory(). '/taxonomy-page-one.php'; } } return $template; }?>

Esta chamada de retorno verifica primeiro se o usuário está na taxonomia que queremos alvejar. Nós podemos direcionar todas as taxonomias mudando isso para apenas is_tax(). Em seguida, ele recebe a página atual usando o query_var chamado paged, e se o usuário estiver na primeira página, então ele retorna o endereço para o novo arquivo template. Se não, ele retorna o arquivo de template padrão.

O que você coloca nesse arquivo de template é com você. Você pode criar uma lista de termos usando o código mostrado acima. Você pode usá-lo para produzir qualquer conteúdo, realmente – por exemplo, mais informações sobre o termo taxonomia ou links para posts específicos.

Taking Control

Com um pouco de trabalho, a arquitetura básica do WordPress, que ainda reflete suas origens como uma plataforma de blogs, pode ser personalizada para caber em quase qualquer site ou aplicativo da Web. Usar taxonomias personalizadas para organizar seu conteúdo e fazê-lo de uma forma que se adapte às suas necessidades será um passo importante em muitos de seus projetos WordPress. Esperamos que este post tenha lhe trazido um passo mais próximo de tirar o máximo proveito deste poderoso aspecto do WordPress.

Smashing Editorial(dp, al, il)