Custom Post Types: Como Criar Posts Personalizados no WordPress

Custom Post Types: Como Criar Posts Personalizados no WordPress

Neste tutorial, vamos criar um plugin para adicionar dois novos tipos de post no WordPress, conhecido como Custom Post Type. E depois criaremos novos layouts para estes novos tipos de posts WordPress usando templates. Você pode conferir este artigo sobre como criar plugins WordPress caso precise refrescar a memória sobre o assunto. Você também vai aprender como ativar o recurso Campos Personalizados para cada post WordPress, e exibir estes campos nos novos templates.

Ao final do artigo de Como Criar Post Personalizado, vai notar que o custom post type WordPress fornecem total controle em como o conteúdo será exibido para os seus visitantes. Se você escreve posts autorais, você pode criar um layout somente para eles. Também se você escreve reviews de filmes e músicas, você pode adicionar áreas para conteúdos extras e fazer com que estes reviews não sejam exibidos como posts do seu blog.

Mas antes de começar, vamos descobrir o que são tipos de posts personalizadosCustom Post Type WordPress.

O que É Tipo de Post Personalizado?

Em resumo, o tipo de post personalizado WordPress, tradução de Custom Post Types, permite que você classifique seus posts com base no conteúdo de cada um deles. No WordPress, os tipos de post padrão são Posts, Páginas, Arquivos, etc.

Geralmente, você escreve todos os seus posts na seção Posts do Painel de Controle do Administrador, e então seleciona a categoria para cada post. Todos os posts serão exibidos na mesma lista, dificultando assim a diferenciação por tipo de conteúdo que contém nos posts.

Lista dos tipos de post WordPress padrão

Os tipos de posts personalizados têm seu próprio links no painel de controle do administrador. Os posts criados dessa forma podem ser classificados por categorias, como um post normal, então você terá total liberdade para classificar e exibir estes posts do jeito que você quiser.

Vamos deixar claro que, por utilizarmos configuração em inglês, nós vamos prosseguir com os prints deste tutorial em inglês, sempre referenciando movies para filmes e reviews para avaliações, ok? Se tiver alguma dúvida durante o processo, deixe um comentário que vamos te ajudar.

No exemplo acima, se um usuário acessar a seção de banco de dados de filmes no seu site, os posts de avaliações não estarão inclusos. Se você fizer, por exemplo, as categorias “Ação” e “Romance”, seus usuários podem acessar a página da categoria “Ação” e ler todas as avaliações e filmes relacionados a esta categoria.

Quando criar um novo tipo de post, você tem diversas opções como onde o link será exibido no menu do Admin, se os novos tipos de posts estão inclusos nos resultados de pesquisa, se aceita citações, se permite comentários, e assim por diante.

Você pode também alterar várias partes do texto (definido usando a array $labels), renomear Add New Posts (adicionar novos posts) para Add New Movies (adicionar novos filmes). Por exemplo, você pode renomear o texto “feature image” (imagem padrão) para Add Poster (adicionar poster).

Você também pode preferir ativar o recurso de campos personalizados do editor de posts, que está oculto por padrão e deve ser habilitado usando o link Screen Options, na parte superior do editor.

Campos personalizados WordPress

Seguindo com o exemplo dos Movies e Reviews, um post Movies pode adicionar campos personalizados como um release anual, diretor, classificação IMDB, e assim por diante, com as sinopses dos filmes sendo o conteúdo dos posts.

Geralmente, qualquer campo personalizado que você criar poderá ser selecionado em todos os demais tipos de posts, então é preciso um plugin para limitar onde cada um destes campos serão exibidos.

Criando Novos Tipos de Posts

Com todas as mudanças significativas do WordPress, criar um plugin é fortemente recomendado. Você também pode criar um tipo de post personalizado no arquivo functions.php de um tema. Neste tutorial, vamos criar um plugin e continuar usando o exemplo do banco de dados/ reviews, ok?

Para criar um tipo de post personalizado, você deve escrever uma nova função que chame a função WordPress nomeada register_post_type() com dois parâmetros. Sua função deve estar conectada à ação gancho init, caso contrário, seu tipo de post personalizado não será registrado corretamente.

// The custom function MUST be hooked to the init action hook
add_action( 'init', 'lc_register_movie_post_type' );

// A custom function that calls register_post_type
function lc_register_movie_post_type() {

  // Set various pieces of text, $labels is used inside the $args array
  $labels = array(
     'name' => _x( 'Movies', 'post type general name' ),
     'singular_name' => _x( 'Movie', 'post type singular name' ),
     ...
  );

  // Set various pieces of information about the post type
  $args = array(
    'labels' => $labels,
    'description' => 'My custom post type',
    'public' => true,
    ...
  );

  // Register the movie post type with all the information contained in the $arguments array
  register_post_type( 'movie', $args );
}

Todas as funções customizadas devem estar pré-fixadas para evitar conflitos quando usar outros plugins ou outras funções do tema. Aqui vamos usar aleatoriamente as letras LC, apenas como exemplo.

Os dois parâmetros para register_post_type() são:

  1. O nome do tipo de post, máximo de 20 caracteres e não pode conter espaços ou letras maiúsculas.
  2. Uma array associativa nomeada $args que contém informações chaves sobre os tipos de post em pares ‘key’ => ‘value’.

Como os argumentos e a label são arrays, é mais claro escrever primeiro a label em sua própria variável, depois a variável $args, e só então chamar a função.

O $args Array

As chaves mais usadas para o array $args estão listadas abaixo, e são todas opcionais:

  • labels – um array que define várias partes do texto, por exemplo “Add new post” pode ser renomeado para “Add new movie”. As keys para os labels array serão explicados na lista abaixo.
  • description– um curto e descritivo sumário do tipo de post, isto pode ser exibido nos templates dos tipos de posts mas não  aparecerá em nenhum outro lugar.
  • public – se os tipos de posts estão visíveis para autores e visitantes, o valor padrão é FALSE, e significa que não aparecerá no Painel de Controle do Administrador.
  • exclude_from_search – se os posts deste tipos aparecem normalmente nos resultados de pesquisa. O valor padrão é o oposto do valor do público.
  • publicly_queryable – se os posts deste tipo podem ser recuperadas usando a URL, como http://www.mywebsite.com/?post_type=movie, ou no modo avançado via função query_posts(). O valor padrão é o valor público.
  • show_ui – se o menu de links e o editor de posts serão visíveis no Painel de Controle do Administrador. O valor padrão é o valor público.
  • show_in_nav_menus – se os posts deste tipo podem ser adicionados para navegação nos menus criados via tela Aparência > Menus. O valor padrão é o valor público.
  • show_in_menu – onde o link dos tipos de posts vão aparecer na navegação no painel de controle do administrador. FALSE oculta o link. TRUE adiciona o link como um novo link de nível superior. Digitar uma string permite colocar o link como sublink existente ao link de nível superior, ou seja, digitando options-general.php, será aplicado abaixo do link Configurações.
  • Show_in_admin_bar – se o tipo de posts aparecerá na barra superior do Admin, abaixo do link +novo.
  • Menu_position – posição do novo link na navegação do Painel de Controle do Administrador, 5 coloca-o abaixo dos posts, 100 coloca-o abaixo de Configurações, visite a entrada WordPress Codex para a lista completa de posições.
  • Hierarchical – se os posts podem ser atribuídos a um post Parent, se for TRUE, o array $support deve conter o recurso ‘page-attributes’.
  • supports – habilita de forma seletiva vários recursos de posts, como imagens em destaque, citações, campos personalizados, etc. Se definida como FALSE ao invés de array, desabilitará o editor para este tipo de post – isto é muito útil se você quer bloquear todos os posts deste tipo enquanto os mantém visíveis (lista dos valores arrays, estão logo abaixo).
  • Taxonomies – um array de taxonomias que podem ser aplicadas a posts deste tipo, taxonomias devem já estar registradas – isto não as cria.
  • Has_archive se o tipo de post tem uma página de arquivo, a url segue a estrutura do permalink, e o slug é o nome que você insere no parâmetro 1 do register_post_types(), ou seja, http://www.mysite.com/movies_reviews/ mostra todos posts movies_reviews.
  • query_var  – TRUE ou FALSE define se o post pode ser visualizado ao inserir o tipo de post e o nome do post ao consultar a url, ou seja, ‘http://www.mysite.com/?movie=matrix‘. Se você digitar uma string de texto, você pode configurar o texto para ser usado depois do caractere ?, então ao digitar ‘filme’ resultaria em ‘?filme=matrix’.

Esta lista completa pode ser visualizada no WordPress Codex page for register_post_type().

Os labels Array

A primeira key no array $arg é nomeada labels e deve ser um array. Isto define várias partes do texto relacionado a este post. Como isto contém muitas informações, é melhor criar uma variável chamada $labels para armazená-la. O código de exemplo acima deixa isso bem claro.

Abaixo estão algumas importantes keys para os labels arrays, todos são opcionais.

  • name – o nome geral para o tipo de post, por exemplo: movies.
  • singular_name – Nome para um post singular deste tipo, por exemplo: movies.
  • add_new – substitui o texto ‘Add New’ por ‘Add Movie’, por exemplo.
  • add_new_item – substitui o texto ‘Add New Post’ por ‘Add New Movie’
  • edit_item – Substitui ‘Edit Post’ por ‘Edit Movie’.
  • featured_image – Substitui ‘Feature Image’ no editor por ‘Movie Post’
  • set_featured_image –  Substitui ‘Define Feature Image’ por ‘Add Poster Movie’, por exemplo.
  • menu_name – Altera o texto do link de nível superior, o padrão do texto e o nome da key.

Consulte a lista completa no WordPress Codex page for register_post_type().

Os ‘supports’ Array

// Enable specific features in the post editor for my post type
$supports = array ( 'title', 'editor', 'author', 'thumbnail' );

// Disable ALL features of the post editor for my post type
$supports = FALSE;

Uma das keys no array $args é nomeada supports. Esta é uma array simples onde você escreve a lista de recursos do editor de posts personalizados. Por padrão, somente o título e o editor são habilitados.

Você também pode escrever FALSE ao invés de uma array, para desabilitar todos os recursos de edição dos posts, incluindo título e conteúdo. Isto significa que os posts não poderão ser editados, mas continuam completamente visíveis.

Aqui está uma lista de recursos dos editores de post que você pode habilitar na array $supports:

  • Title (título);
  • Editor;
  • Author – (Autor) NOTA: este recurso permite alterar o autor do post;
  • Thumbnail (miniatura);
  • Excerpt (resumo);
  • trackbacks;
  • Custom-fields (campos personalizados);
  • Comments (comentários);
  • Revisions (revisões);
  • Page-attributes (atributos da página);
  • Post-formats (formato dos posts).

Criar Novos Tipos de Post via Plugin

Agora que sabemos quais informações são necessárias para uma função, podemos criar nosso próprio plugin, gravar funções personalizadas, e conectá-las ao gancho init.

<?php
/*
Plugin Name: My Custom Post Types
Description: Add post types for movies and movie reviews
Author: Liam Carberry
*/
 
// Hook <strong>lc_custom_post_movie()</strong> to the init action hook
add_action( 'init', 'lc_custom_post_movie' );
 
// The custom function to register a movie post type
function lc_custom_post_movie() {
 
  // Set the labels, this variable is used in the $args array
  $labels = array(
    'name'               => __( 'Movies' ),
    'singular_name'      => __( 'Movie' ),
    'add_new'            => __( 'Add New Movie' ),
    'add_new_item'       => __( 'Add New Movie' ),
    'edit_item'          => __( 'Edit Movie' ),
    'new_item'           => __( 'New Movie' ),
    'all_items'          => __( 'All Movies' ),
    'view_item'          => __( 'View Movie' ),
    'search_items'       => __( 'Search Movies' ),
    'featured_image'     => 'Poster',
    'set_featured_image' => 'Add Poster'
  );
 
  // The arguments for our post type, to be entered as parameter 2 of register_post_type()
  $args = array(
    'labels'            => $labels,
    'description'       => 'Holds our movies and movie specific data',
    'public'            => true,
    'menu_position'     => 5,
    'supports'          => array( 'title', 'editor', 'thumbnail', 'excerpt', 'comments', 'custom-fields' ),
    'has_archive'       => true,
    'show_in_admin_bar' => true,
    'show_in_nav_menus' => true,
    'has_archive'       => true,
    'query_var'         => 'film'
  );
 
  // Call the actual WordPress function
  // Parameter 1 is a name for the post type
  // Parameter 2 is the $args array
  register_post_type( 'movie', $args);
}
 
// Hook <strong>lc_custom_post_movie_reviews()</strong> to the init action hook
add_action( 'init', 'lc_custom_post_movie_reviews' );
 
// The custom function to register a movie review post type
function lc_custom_post_movie_reviews() {
 
  // Set the labels, this variable is used in the $args array
  $labels = array(
    'name'               => __( 'Movie Reviews' ),
    'singular_name'      => __( 'Movie Review' ),
    'add_new'            => __( 'Add New Movie Review' ),
    'add_new_item'       => __( 'Add New Movie Review' ),
    'edit_item'          => __( 'Edit Movie Review' ),
    'new_item'           => __( 'New Movie Review' ),
    'all_items'          => __( 'All Movie Reviews' ),
    'view_item'          => __( 'View Movie Reviews' ),
    'search_items'       => __( 'Search Movie Reviews' )
  );
 
  // The arguments for our post type, to be entered as parameter 2 of register_post_type()
  $args = array(
    'labels'            => $labels,
    'description'       => 'Holds our movie reviews',
    'public'            => true,
    'menu_position'     => 6,
    'supports'          => array( 'title', 'editor', 'thumbnail', 'excerpt', 'comments', 'custom-fields' ),
    'has_archive'       => true,
    'show_in_admin_bar' => true,
    'show_in_nav_menus' => true,
    'has_archive'       => true
  );
 
  // Call the actual WordPress function
  // Parameter 1 is a name for the post type
  // $args array goes in parameter 2.
  register_post_type( 'review', $args);
}

Se você habilitar este plugin, você agora deve ver dois novos links na navegação do Painel de Controle do Administrador, logo abaixo o link Posts.

Ao passar o mouse sobre os sublinks, você vai ver “View all” e “Add new”, o texto será definido na array $labels. Confira o seu editor e veja que as labels mudaram.

Limitando Campos Personalizados ao Tipo de Post Específico

Quando adicionar um campo personalizado a um post, este campo já permanece salvo e então você pode rapidamente adicioná-lo a qualquer post. Os campos personalizados que você adicionar, aparecerão em uma lista suspensa em cada post.

Isto pode dificultar a localização dos campos que você precisa em tipos de posts específicos. Se você quer limitar os campos personalizados para que estejam disponíveis somente em determinados tipos de posts, o jeito mais fácil é usar um plugin.

O plugin avançado de campos personalizados adiciona um simples editor ao WordPress que permite criar campos personalizados e definir que sejam exibidos somente no seus tipos de post.

Menu suspenso dos tipos de post, passo necessário para criar custom post type

Você pode definir qual tipo de entrada cada campo deverá ter, como por exemplo caixa de texto, área de texto, endereço de email, etc., ou algo mais avançado como embedar o Google Maps, com o qual você pode selecionar uma localização para destacar e exibir nos seus posts.

Você também pode definir onde, na tela do editor, os campos personalizados serão exibidos. Como estes campos são criados via plugin, você deve usar a função desse plugin para exibi-las. Isto será explicado na próxima seção.

Estilizando Novos Tipos de Posts

Para criar temas de templates para seus tipos de posts, você precisa somente tem que criar arquivos dentro do diretório principal do seu tema com os nomes corretos. Se você não criar templates, o WordPress usará single.php e archive.php no lugar, mantendo todos os seus posts e arquivos idênticos.

  • Template para um post individual  – single-{post-type}.php
  • Template para uma página de arquivo – archive-{post-type}.php.

A parte {post-type} dos nomes dos arquivos deve ser o nome do parâmetro 1 do register_post_type().

  • Para o nosso tipo de post Movie, os nomes dos arquivos são single-movie.php and archive-movie.php.
  • Para nosso tipo de post Review, os nomes dos arquivos são single-review.php e archive-review.php.

O melhor caminho para começar, é duplicando single.php ou archive.php e renomeá-los como acima. Isto significa que no geral, a estrutura é idêntica ao restante do tema, e todos as tags dos templates necessárias já estão no devido lugar.

Exibindo Campos Personalizados nos Posts

Para exibir campos personalizados criados no editor padrão do WordPress, você pode usar duas funções.

// Generates all custom fields attached to the post in a <ul> list
the_meta();

// Get a specific piece of information
echo get_post_meta( $post->ID, 'Budget', TRUE );

Estas funções devem estar nos arquivos dos templates  usados para exibir os seus posts.

the_meta()

Exibe todos os campos personalizados anexados ao post na lista <ul>. A tag final <ul> se parecerá com isto:

<ul class='post-meta'>
  <li>
    <span class='post-meta-key'>{your_key}</span> {your_value}
  </li>
</ul>

Isto funciona em qualquer lugar de um template de post de individual, mas se você está exibindo em algum outro lugar, deverá ser inserida no WordPress loop.

get_post_meta()

  • Usa 3 parâmetros e retorna um resultado.
  • O primeiro parâmetro é o ID do post, você pode usar aqui o $post->ID para conseguir a ID do post atual.
  • O segundo parâmetro é o nome do campo personalizado, e é case-sensitive.
  • O terceiro parâmetro é um boolean nomeado $single e pode ser  TRUE (retorna o resultado como uma string) ou FALSE (retorna uma array).

NOTA: Você pode criar múltiplos campos personalizados com o mesmo nome e diferentes valores. Se existir múltiplos campos com o mesmo nome, configurando FALSE retornará uma array de todos eles.

<?php
  $movie_box_art = get_post_meta( $post->ID, 'Box Art', TRUE );

if (!empty($movie_box_art)) { ?>
  <div class="movie-poster-box">
    <img src="<?php echo $movie_poster ?>" alt="<?php single_post_title(); ?> ">
  </div>
<? } ?>

Como a função get_post_meta() retorna um valor, você pode usar o valor em uma instrução condicional para alterar o layout apropriadamente.

No exemplo acima, nós verificamos se ‘movie’ tem uma caixa de arte atribuída a ele via um campo personalizado. Se $movie_box_art não está vazio, copie o div e a imagem.

Exibindo Campos Personalizados Avançados

// Display field value
the_field( 'FIELD NAME' );

// Return field value
get_field( 'FIELD NAME' );

Os plugins de campos personalizados avançados fornecem sua própria função e shortcodes para exibir os campos.

the_field(  ‘ FIELD NAME’  );

Exibe o valor do campo específico, e você deve usar o Nome do Campo que inseriu quando criou o grupo de Campos.

get_field( ‘FIELD NAME’ );

Retorna o valor do campo específico, útil para instruções condicionais.

Estas são as funções que você deve usar com mais frequência. Mas existem funções mais avançadas e você pode consultá-las no Documento Oficial.

Shortcode





Você pode exibir os campos diretamente em um post usando o shortcode acima.

Exibindo Tipos de Posts Personalizados na Página Inicial

/ Hook our custom function to the pre_get_posts action hook
add_action( 'pre_get_posts', 'add_reviews_to_frontpage' );
 
// Alter the main query
function add_reviews_to_frontpage( $query ) {
    if ( is_home() && $query->is_main_query() ) {
        $query->set( 'post_type', array( 'post', 'movie', 'review' ) );
    }
    return $query;
}

Por padrão, os tipos de posts personalizados não são exibidos na página inicial, então você tem que gravar uma nova função que chame o método set do WordPress’ WP_Query.

A função verifica se o visitante está na página inical e se a query ativa é a principal gerada pelo WordPress.

$query->set() usa dois parâmetros:

  • O primeiro parâmetro é a propriedade que você quer alterar, neste caso pretendemos querer alterar a propriedade post_type.
  • O segundo parâmetro é a array que você quer como valor da propriedade post_type.

No código acima, o array começa com ‘post’ – isto acontece porque cada post no WordPress tem um tipo de post ‘post’, e nós queremos incluí-los na página inicial.

Se você quer personalizar os posts de um determinado tipo na página inicial, você pode remover o tipo ‘posts’ e aplicar somente o seu tipo de post personalizado. Nós adicionamos ‘movie’ e ‘review’ na array, então a página inicial agora exibe posts regulares, todos os posts de filmes e todos os posts de avaliações.

O valor que você inserir deve ser o nome usado no parâmetro 1 da função register_post_type().

Conclusão

Neste tutorial você aprendeu como criar tipos de posts personalizados (custom post types), e as informações que você precisa para fazer isso. A flexibilidade que um tipo de post personalizado fornece faz disso um recurso essencial para qualquer site desenvolvido no WordPress.

Quando alinhado com categorias e taxonomias, você tem controle total de como os seus usuários visualizam os seus posts.

Author
O autor

Ariane G.

A Ariane é SEO Team Leader com experiência em conteúdo, localização e SEO. Seu desafio é levar a Hostinger ao topo dos resultados no Brasil, França e Reino Unido. Eventualmente ela compartilha seu conhecimento no blog e nos tutoriais da Hostinger e no tempo livre ela gosta de explorar lugares novos e viver intencionalmente.