O WordPress tem em sua essência o conceito de tipo de posts. Até a versão 3.0 éramos fadados a utilizar os tipos já presentes no sistema: Posts, Páginas, Mídia (ou Anexo) e Links. A utilização de plugins específicos era a solução para alguns problemas que poderiam facilmente ser resolvidos com tipos de posts. Muitas vezes utilizar diferentes categorias para separar diferentes tipos de conteúdo era uma alternativa fácil e que funcionava bem.

Então, a partir da terceira versão do WordPress, foi introduzido a possibilidade de estender e criar novos tipos de posts (comumente chamados de post types). Para entendermos melhor, vamos criar uma situação hipotética de um site que terá como conteúdo Artigos escritos por colunistas, Notícias escritas por jornalistas e Vídeos publicados por leitores. Com este ambiente, poderíamos criar os post types Artigos, Notícias e Vídeos, possibilitando separar os diferentes formatos de conteúdo e mídia (e taxonomias, mas veremos isso mais à frente).

Para trabalhar com post types personalizados, usaremos a função register_post_type(), juntamente com alguns parâmetros que determinarão, entre muitas coisas, posições no menu de administração, nomes de labels etc.

Criando um Custom Post Type

Seguindo a hipotética situação em que estamos trabalhando com um portal de conteúdo onde precisaremos de Artigos, basicamente a criação do post type seria com o seguinte código adicionado ao functions.php:

add_action( 'init', 'post_type_artigo' );
function post_type_artigo() {
  register_post_type( 'bl_artigo',
    array(
      'labels' => array(
        'name' => 'Artigos',
        'singular_name' => 'Artigo'
      ),
      'public' => true,
      'has_archive' => true,
    )
  );
}

Certo, primeiro passo foi dado. Vamos entender o código? Primeiramente nós usamos o add_action com dois parâmetros: o gancho (onde a função vai rodar) e a função callback (a função que será rodada). Em seguida usamos o register_post_type dentro de uma função para criar o tipo bl_artigo, onde passamos os parâmetros de labels para definir o nome do nosso tipo de post. Este é um exemplo muito simples, mas já teremos como resultado um menu na administração onde poderemos começar a adicionar Artigos separadamente.

Trabalhando as labels

Podemos melhorar nossa função para personalizar outras labels para que não seja usado o simples padrão caso não definimos nada. Vamos lá!

$labels = array(
  'name'               => 'Artigos',
  'singular_name'      => 'Artigo',
  'add_new'            => 'Adicionar novo',
  'add_new_item'       => 'Adicionar novo artigo',
  'edit_item'          => 'Editar artigo',
  'new_item'           => 'Novo artigo',
  'all_items'          => 'Todos os artigos',
  'view_item'          => 'Visualizar artigo',
  'search_items'       => 'Buscar artigos',
  'not_found'          => 'Nenhum artigo encontrado',
  'not_found_in_trash' => 'Nenhum artigo encontrado na lixeira',
  'menu_name'          => 'Artigos'
);

Com este código, nós passamos para a variável $labels um array contendo todas as labels que queremos para nosso post type Artigo. Para efetivar a alteração, vamos modificar nossa função post_type_artigo para incluir a variável. Segue:

'labels' => $labels,

Adicionando novos parâmetros

Podemos adicionar diversos outros parâmetros para nossa função, modificando assim o comportamento final do post type. Vamos ao exemplo:

$args = array(
  'labels'             => $labels,
  'public'             => true,
  'publicly_queryable' => true,
  'show_ui'            => true,
  'show_in_menu'       => true,
  'query_var'          => true,
  'rewrite'            => array( 'slug' => 'artigos' ),
  'capability_type'    => 'post',
  'has_archive'        => true,
  'hierarchical'       => false,
  'menu_position'      => null,
  'supports'           => array( 'title', 'editor', 'author' ),
);

Vamos entender cada um dos parâmetros.

  • labels: como já vimos, podemos definir os textos que serão exibidos na administração;
  • public: define se o post type será visível na administração;
  • public_queryable:  define se o post type será visível no front-end do site;
  • show_ui: define se será apresentado a interface de edição;
  • show_in_menu: define se será criado um link no menu de administração para edição;
  • query_var: define se será possível e qual String será usada para consultas específicas com o post type;
  • rewrite: define qual a base de URL para o tipo de post;
  • capability_type: define as capacidades que os usuários precisam ter para editar o post type;
  • has_archive: define se será criado um arquivo listando todas as entradas;
  • hierarchical: define se poderá haver entradas hierárquicas (como Páginas) ou não (como Posts);
  • menu_position: define a posição do link no menu de administração;
  • supports: define o que será suportado pelo post type.

Passando todos os parâmetros necessários para a criação do post type para a variável $args, podemos resumir nossa função para:

register_post_type( 'bl_artigo', $args );

Vale notar que este é um exemplo simples, o Codex (documentação do WordPress) traz muito mais informação a respeito dos post types e como utilizá-los. Recomendamos que, por mais simples que seja seu uso, você leia atentamente todos os detalhes lá publicados para conhecer e saber como trabalhar de forma correta em diferentes situações. As referências para criar post types personalizados estão disponíveis neste link.

Criando novas taxonomias

De forma simples, taxonomias são as Categorias e Tags que temos por padrão no WordPress. Assim como podemos criar novos tipos de posts, também podemos criar novas taxonomias para esses tipos.

Há dois tipos de taxonomias: hierárquico e não-hierárquico. Este primeiro é como Categorias, onde é possível relacionar uma com as outras, definindo sub-categorias; Enquanto o segundo é como Tags, onde simplesmente definimos o nome da etiqueta, comumente separando mais de uma com vírgula.

Para exemplificar seguindo nossa situação onde estamos criando um tipo de post Artigos, vamos criar a taxonomia Editoria, onde poderemos selecionar uma ou mais áreas da qual o artigo seja relacionado.

add_action( 'init', 'taxonomy_editoria' );
function taxonomy_editoria() {
  register_taxonomy( 'bl_editoria', array( 'bl_artigo' ), 
    array(
      'hierarchical' => true,
      'label' => 'Editorias',
      'show_ui' => true,
      'query_var' => true,
      'rewrite' => array( 'slug' => 'editorias' ),
    )
  );
}

Utilizamos a função register_taxonomy com alguns parâmetros e criamos a taxonomia bl_editoria para o post type bl_artigo. Vamos entender os parâmetros que utilizamos no código acima:

  • hierarchical: define qual o tipo de taxonomia será criada (hierárquico ou não-hierárquico);
  • label: define o nome da taxonomia que será exibida na administração;
  • show_ui: define se será mostrado um submenu na administração;
  • query_var: define se será possível e qual String será usada para consultas específicas com a taxonomia;
  • rewrite: define qual a base URL para a taxonomia.

Assim como para post types, nós podemos personalizar a taxonomia com suas labels e outros parâmetros, mas vamos ficar no básico para explicar seu funcionamento e como utilizá-los. Ainda assim, nós recomendamos que acesse o Codex para conhecer todas as possibilidades e como utilizar da melhor forma de acordo com suas necessidades. A documentação para esta função está disponível nesta página.

Código final

Ao final do nosso trabalho, teremos o seguinte código para criar o post type Artigo com a taxonomia Editoria:

/* Criando post type bl_artigo */

add_action( 'init', 'post_type_artigo' );
function post_type_artigo() {
  $labels = array(
    'name'               => 'Artigos',
    'singular_name'      => 'Artigo',
    'add_new'            => 'Adicionar novo',
    'add_new_item'       => 'Adicionar novo artigo',
    'edit_item'          => 'Editar artigo',
    'new_item'           => 'Novo artigo',
    'all_items'          => 'Todos os artigos',
    'view_item'          => 'Visualizar artigo',
    'search_items'       => 'Buscar artigos',
    'not_found'          => 'Nenhum artigo encontrado',
    'not_found_in_trash' => 'Nenhum artigo encontrado na lixeira',
    'menu_name'          => 'Artigos'
  );

  $args = array(
    'labels'             => $labels,
    'public'             => true,
    'publicly_queryable' => true,
    'show_ui'            => true,
    'show_in_menu'       => true,
    'query_var'          => true,
    'rewrite'            => array( 'slug' => 'artigos' ),
    'capability_type'    => 'post',
    'has_archive'        => true,
    'hierarchical'       => false,
    'menu_position'      => null,
    'supports'           => array( 'title', 'editor', 'author' ),
  );
  register_post_type( 'bl_artigo', $args );
}

/* Criando taxonomia bl_editoria */

add_action( 'init', 'taxonomy_editoria' );
function taxonomy_editoria() {
  register_taxonomy( 'bl_editoria', array( 'bl_artigo' ), 
    array(
      'hierarchical' => true,
      'label' => 'Editorias',
      'show_ui' => true,
      'query_var' => true,
      'rewrite' => array( 'slug' => 'editorias' ),
    )
  );
}

As possibilidades utilizando post types e taxonomies são infinitas. Podemos usar o WordPress como solução para diferentes projetos apenas estendendo suas funções e adaptando-as às nossas necessidades. Como já falamos, o Codex é a documentação oficial do WordPress e possui todas as informações detalhadas sobre as funções abordadas neste post e todas as outras, portanto, vale a pesquisa para aumentar o conhecimento.

Espero que este pequeno guia seja útil e tire suas dúvidas quanto a post types! Deixe seu comentário aqui também para tirar suas dúvidas e participar da discussão!