May 23, 2024
Ariane G.
11min Ler
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 personalizados – Custom Post Type WordPress.

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.

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.

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.
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:
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.
As chaves mais usadas para o array $args estão listadas abaixo, e são todas opcionais:
Esta lista completa pode ser visualizada no WordPress Codex page for register_post_type().
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.
Consulte a lista completa no WordPress Codex page for register_post_type().
// 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:
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.
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.

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.
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.
A parte {post-type} dos nomes dos arquivos deve ser o nome do parâmetro 1 do register_post_type().
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.
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.
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.
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.
// 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.
Exibe o valor do campo específico, e você deve usar o Nome do Campo que inseriu quando criou o grupo de Campos.
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.
Você pode exibir os campos diretamente em um post usando o shortcode acima.
/ 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:
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().
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.
Todo o conteúdo dos tutoriais deste site segue os rigorosos padrões editoriais e valores da Hostinger.
Comentários
November 05 2020
Questão, criei um custom post type para o meu site, a ideia seria criar um campo de data para que conforme a data enviada o post fosse deletado ou a visibilidade dele fosse mudado para privado. Pode me ajudar nessa questão?
November 09 2020
Claro, Maik, qual seria a sua dúvida? Algo não funcionou nesse custom post type?
October 05 2021
Olá, tudo bem? Obrigado pelo o tutorial, tá de parabéns. Gostaria de tirar uma dúvida. É possível fazer com o que o post type, apareça também como "ultimas noticias" no site? não somente aparecer naquele determinado ponto que programei. E consigo colocar vídeos nesses campos personalizados?
October 08 2021
Olá, Joaby! Nesse caso você precisa usar um tema que suporte esse recurso de últimas notícias ou mexer na programação do seu site para ter essa funcionalidade mesmo ?