Estrutura

Como criar posts personalizados (custom posts) no WordPress

Google+ Pinterest LinkedIn Tumblr
Anúncios Google

Por padrão, o WordPress tem os posts, que são artigos organizados por data e sem aquela característica fixa das páginas. É o formato “padrão” de publicação, que também usa as taxonomias (como tags e categorias).

Mas digamos que você quer ter tipos específicos de post. Por exemplo, num blog que fala de dois assuntos muito diferentes como “TV” e “Música”, você pode criar um tipo de post “Música”, deixando os posts normais para TV, ou vice-versa.

Qual a vantagem? Organização. Ao definir posts personalizados, pode-se também criar tags e categorias próprias, que só estarão disponíveis para esses posts. Ou não, e usar as categorias que já existiam para posts comuns.

Outra? Personalização. Com um pouco de programação e marcação, dá pra criar posts com aparência totalmente exclusivas em relação aos demais tipos, mudando desde o visual até como o conteúdo publicado.

Vamos ver o básico primeiro: como ativar um post personalizado e criar categorias exclusivas pra ele. Note que só funciona para instalação do WordPress superiores a 3.0, então mantenha seu blog atualizado sempre que possível.

1) Função

Vou seguir o exemplo anterior e criar um post personalizado “Música”. No arquivo functions.php (pode ser no final, antes do fechamento ?>, se tiver) do seu tema, insira todo esse código:

/*** Custom Post MÚSICA ***/
function custom_post_musica() {
$labels = array(
	'name'  			 => _x( 'Músicas', 'post type general name' ),
	'singular_name'		 => _x( 'Música', 'post type singular name' ),
	'add_new'            => _x( 'Adicionar Nova Música', 'musica' ),
	'add_new_item'       => __( 'Nova Música' ),
	'edit_item'          => __( 'Editar Música' ),
	'new_item'           => __( 'Nova Música' ),
	'all_items'          => __( 'Todas as Músicas' ),
	'view_item'          => __( 'Ver Música' ),
	'search_items'       => __( 'Procurar Música' ),
	'not_found'          => __( 'Nenhuma música encontrada' ),
	'not_found_in_trash' => __( 'Nenhuma música na Lixeira' ), 
	'parent_item_colon'  => '',
	'menu_name'          => 'Músicas'
	);
	$args = array(
	'labels'        => $labels,
	'description'   => 'Guarda os dados da música específica.',
	'public'        => true,
	'menu_position' => 5,
	'supports'      => array( 'title', 'editor', 'thumbnail', 'excerpt', 'comments' ),
	'has_archive'   => true,
	'taxonomies' => array( 'musica_category', 'musica_tag' ),
	);
	register_post_type( 'musica', $args );	
}
add_action( 'init', 'custom_post_musica' );

function update_mensagens( $messages ) {
	global $post, $post_ID;
	$messages['musica'] = array(
	0 => '', 
	1 => sprintf( __('Música atualizada. <a href="%s">Ver música'), esc_url( get_permalink($post_ID) ) ),
	2 => __('Campo personalizado atualizado.'),
	3 => __('Campo personalizado excluído.'),
	4 => __('Música atualizada.'),
	5 => isset($_GET['revision']) ? sprintf( __('Restaura música para revisão de %s'), wp_post_revision_title( (int) $_GET['revision'], false ) ) : false,
	6 => sprintf( __('Música publicada. <a href="%s">Ver música'), esc_url( get_permalink($post_ID) ) ),
	7 => __('Música salva.'),
	8 => sprintf( __('Música enviada. <a target="_blank" href="%s">Visualizar música'), esc_url( add_query_arg( 'preview', 'true', get_permalink($post_ID) ) ) ),
	9 => sprintf( __('Música agendada por: %1$s. <a target="_blank" href="%2$s">Visualizar música'), date_i18n( __( 'd/m/Y ás G:i' ), strtotime( $post->post_date ) ), esc_url( get_permalink($post_ID) ) ),
	10 => sprintf( __('Rascunho da música atualizado. <a target="_blank" href="%s">Visualizar música'), esc_url( add_query_arg( 'preview', 'true', get_permalink($post_ID) ) ) ),
	);
	return $messages;
}
add_filter( 'post_updated_messages', 'update_mensagens' );

function ajuda_contextual_musica( $contextual_help, $screen_id, $screen ) { 
	if ( 'musica' == $screen->id ) {
	$contextual_help = '<h2>Músicas</h2>
	<p>Coloque aqui a descrição do que publicar nesse tipo de post. Vai aparecer na guia Ajuda no painel do WordPress.</p>'; 
	} 
	
	elseif ( 'edit-musica' == $screen->id ) {
	$contextual_help = '<h2>Editando Músicas</h2>
	<p>E aqui, instruções sobre a edição dos posts do tipo personalizado.</p>';
	}
	return $contextual_help;
}
add_action( 'contextual_help', 'ajuda_contextual_musica', 10, 3 );

São três funções. A primeira, custom_post_musica, é a que cria o novo tipo de post, define labels (o rótulo de cada menu, atalho e título nos menus do post personalizado) e argumentos.

A segunda, update_mensagens, define algumas coisas quando um post personalizado do tipo Música estiver sendo editado.

A terceira, ajuda_contextual_musica, cria os textos nos painéis de Ajuda do seus posts personalizados.

Como o alvo desse artigo não são desenvolvedores experientes e sim blogueiros em busca de solução, acho que não vale a pena entranhar muito em cada função. O que você precisa saber é que, para editar o tipo de post, basta alterar os termos “Música” ou “musica” pelo que quiser criar.

Precisa de um post tipo “Games”? Altere o código anterior, tirando todas as ocorrências. Exemplos:

  • Música: troque por Game
  • Músicas: troque por Músicas
  • edit-musica: troque por edit-game
  • taxonomies’ => array( ‘musica_category’, ‘musica_tag’ ): troque por taxonomies’ => array( ‘game_category’, ‘game_tag’ )

Ficou claro? Basta respeitar plurais e maiúsculas para ter o resultado esperado. Com tudo feito, salve seu functions.php e deverá ver o novo post no menu do seu painel, logo abaixo do tipo padrão de posts.

post personalizado criado

Mas está faltando alguma coisa aí, não? Cadê a caixa de tags e categorias? Vamos colocar já. Insira todo o código abaixo logo depois do que colou antes:

function taxonomias_musica() {
 $labels = array(
 'name'              => _x( 'Categorias', 'taxonomy general name' ),
 'singular_name'     => _x( 'Categoria', 'taxonomy singular name' ),
 'search_items'      => __( 'Procurar Categorias' ),
 'all_items'         => __( 'Categorias' ),
 'parent_item'       => __( 'Categoria-pai' ),
 'parent_item_colon' => __( 'Categoria-pai:' ),
 'edit_item'         => __( 'Editar Categoria' ), 
 'update_item'       => __( 'Atualizar Categoria' ),
 'add_new_item'      => __( 'Adicionar Nova Categoria' ),
 'new_item_name'     => __( 'Nova Categoria' ),
 'menu_name'         => __( 'Categorias' ),
 );
$args = array(
'labels' => $labels,
'hierarchical' => true,
); 
register_taxonomy( 'musica_category', 'musica', $args ); 
register_taxonomy('musica_tag', 'musica');
}
add_action( 'init', 'taxonomias_musica', 0 );

Salve. Agora você já tem categorias e tags próprias que vão aparecer só para seu post personalizado.

post personalizado com taxonomias

Mas e se eu quiser usar as categorias e tags que já existem para posts comuns?

É só alterar o primeiro código, no trecho que define quais as taxonomias do seu post personalizado.

Em…

'taxonomies' => array( 'musica_category', 'musica_tag' ),

Altere para…

'taxonomies' => array( 'category', 'post_tag' ),

Assim as taxonomias padrão vão aparecer no lugar.

Como listar os posts personalizados?

Se depois de criar posts personalizados, voltar à homepage do seu blog, vai notar que eles não ficam listados lá junto com os demais, mas em seublog.com/musica (ou em seublog.com/?post_type=musica, dependendo de como está a estrutura dos seus links).

Se quiser todos listados juntos, vai precisar de mais uma função. Junte isso ao seu arquivo functions.php:

function custom_loop( $query ) {
if ( is_home() && $query->is_main_query() )
$query->set( 'post_type', array( 'post', 'musica') );
return $query;
}
add_filter( 'pre_get_posts', 'custom_loop' );

Com isso os posts personalizados serão listados na página inicial do blog junto com os outros, e também no feed dos posts.

Não consegui…

Se não funcionou, pode ser algum problema com o tema do seu blog. Experimente trocar de tema. Outra dica é uma ferramenta automática para gerar o código, como esse GenerateWP.

Fundador do Tutoriart em 2010, é ex-instrutor de Photoshop, design web e gráfico. Em quase uma década de redação online, tem cerca de 1500 artigos publicados. Gerencia também o Memória BIT.

Pin