A pedido do leitor Flávio Araújo, vamos hoje falar sobre os Custom Post Types, tendo como base o excelente artigo dos colegas do blog Think Vitamin.
Como referido pelo próprio criador dos Custom Post Types, por vezes o
WordPress introduz novas funcionalidades que de início parecem
muito complexas mas que, na realidade, não o são. Os Custom Post Types
são uma delas. Essa nova funcionalidade deverá ser vista
como conteúdo customizável e nada mais do que isso.
O que são custom post types?
O nome Custom Post Type é, na verdade, bastante confuso, pois introduz o
nome genérico “Post” que, na verdade, nada tem a ver com um post de um
blog. Se pretende compreender melhor essa nova funcionalidade, substitua
esse termo por “content”, ou seja, tipos de conteúdo customizado
(custom content type). Dessa forma é mais fácil compreender o conceito.
Os Custom Post Types não têm regras que definem propriamente e
relativamente aquilo que são. Eles podem representar qualquer
tipo de conteúdo que você deseje. Por exemplo, o WordPress oferece
originalmente diferentes tipos de Custom Post Types:
- Posts do blog
- Páginas
- Anexos
- Revisões
- Menus de navegação (WordPress 3.0)
Basicamente esse tipo de conteúdo utiliza a mesma forma de criação,
edição e armazenamento de um artigo de um blog, mas com muito mais
controle criativo sobre o mesmo.
Ideias Custom Post Types?
Embora o WordPress 3.0 introduza uma série de Custom Post Types
originalmente, existem muitos desenvolvedores e webdesigners que
pretendem levar o WordPress ao próximo nível. Vejamos alguns exemplos
criativos que podem ser construídos a partir de diferentes Custom Post
Types:
- Listas de classificados
- Calendários de eventos
- Base de dados de filmes
- Base de dados de livros
- Integração de um fórum sem problemas de compatibilidade
- Um sistema de tickets de serviço e helpdesk
- Portfolios
- Galeria de design e fotografia
- Etc.
As opções são, na verdade, infinitas e dependem apenas da sua
capacidade criativa. Portanto, evite limitar-se aos exemplos dados e
sempre que sentir necessidade de criar algo no seu blog, provavelmente
irá conseguir fazê-lo utilizando Custom Post Types.
Criando um Custom Post Type
Os Custom Post Types são extremamente simples de utilizar, do ponto de
vista do painel de administração do WordPress. No entanto e tal como
referimos acima, os designers/desenvolvedores ainda necessitam de ter
algum conhecimento de PHP, exceto se optarem por plugins como o Custom Post Template e o Custom Post Type UI.
Neste tutorial, vamos editar o arquivo functions.php, que se
encontra no diretório principal do seu template. Vamos apenas
acrescentar código, portanto, poderá fazer a edição do seu arquivo no
topo ou no fundo do mesmo. Com algumas edições, pretendemos criar um Custom Post Type para o nosso portfolio e um template que irá utilizar
essa informação. No final, acabaremos com um novo menu no nosso painel
administrativo, algo deste tipo:

Uma nova página intitulada “My Portfolio”:

E um novo local onde colocar os conteúdos específicos desta nova seção:

Passo a passo
Eis a primeira porção de código que teremos de adicionar ao arquivo functions.php:
add_action('init', 'portfolio_register');<br /> <br />function portfolio_register() {<br /> <br /> $labels = array(<br /> 'name' => _x('My Portfolio', 'post type general name'),<br /> 'singular_name' => _x('Portfolio Item', 'post type singular name'),<br /> 'add_new' => _x('Add New', 'portfolio item'),<br /> 'add_new_item' => __('Add New Portfolio Item'),<br /> 'edit_item' => __('Edit Portfolio Item'),<br /> 'new_item' => __('New Portfolio Item'),<br /> 'view_item' => __('View Portfolio Item'),<br /> 'search_items' => __('Search Portfolio'),<br /> 'not_found' => __('Nothing found'),<br /> 'not_found_in_trash' => __('Nothing found in Trash'),<br /> 'parent_item_colon' => ''<br /> );<br /> <br /> $args = array(<br /> 'labels' => $labels,<br /> 'public' => true,<br /> 'publicly_queryable' => true,<br /> 'show_ui' => true,<br /> 'query_var' => true,<br /> 'menu_icon' => get_stylesheet_directory_uri() . '/article16.png',<br /> 'rewrite' => true,<br /> 'capability_type' => 'post',<br /> 'hierarchical' => false,<br /> 'menu_position' => null,<br /> 'supports' => array('title','editor','thumbnail')<br /> );<br /> <br /> register_post_type( 'portfolio' , $args );<br />}Todos aqueles que já trabalharam com o WordPress no passado irão
certamente reconhecer a estrutura. Iremos adicionar uma ação quando o
painel de administração do WP inicializar para que este chame a função portfolio_register(). Nessa função, iremos criar duas arrays, $labels e $args, e depois utilizar o register_post_type para juntar tudo. Para fazer isso, vamos atribuir o nome ‘portfolio’ e dizer-lhe para utilizar os argumentos da array $ags.
A parte mais complexa está no detalhe, portanto vamos analisar alguns desses argumentos. A lista completa encontra-se em http://codex.wordpress.org/Function_Reference/register_post_type.
Primeiro analisemos a array $labels:
- name este é o (provavelmente plural) nome para o nosso novo post type
- singular_name a forma como você se refere a ele no singular (do tipo: ‘Adicionar novo ****’)
Provavelmente você poderá trabalhar o resto das $labels sozinho, uma vez que eles apenas se referem a diferentes circunstâncias nas quais o nome do nosso custom post type será usado.
E agora analisemos a array $args:
- public serão apresentadas no admin UI
- show_ui deveremos mostrar um painel de admin para este custom post type
- menu_icon um ícone customizado para o painel de admin
- capability_type – o WordPress irá tratar este como um ‘post’ para leitura, edição, e capacidade de eliminação
- hierarchical ele é hierárquico, como as páginas
- rewrite reescrever os permalinks utilizando a slug ‘portfolio’
- supports que items pretendemos mostrar no adicionar/editar post page
Esse é o primeiro passo, e já será o suficiente para que possa ver o
seu novo Custom Post Type no seu painel de administração do WordPress.
Guarde o arquivo functions.php e veja-o!
A próxima coisa a fazer é o registro da taxonomia. Basicamente é criar categorias para esse novo tipo de conteúdo.
Por exemplo, no nosso portfolio, desejamos incluir os nomes das
tecnologias e do software utilizados para criar o trabalho. Iremos chamar
essa taxonomia de ‘Skills’, e preenchê-la com nomes tipo HTML, CSS e
jQuery.
É apenas uma linha de código:
register_taxonomy("Skills", array("portfolio"), array("hierarchical" => true, "label" => "Skills", "singular_label" => "Skill", "rewrite" => true));O primeiro item é o nome da taxonomia, ‘Skills’. O segundo é o nome
do tipo de objeto que estamos aplicando, que, no nosso caso, é o
nosso Custom Post Type ‘portfolio’ (que é uma array). Finalmente os
nossos argumentos: poderá encontrar uma listagem completa em http://codex.wordpress.org/Function_Reference/register_taxonomy, e aqui iremos utilizar apenas três que tenham as características que desejamos, tal como explicado no primeiro passo.
Adicionando essa linha de código, já poderá ver algo deste tipo:

Posteriormente poderá adicionar ‘skills’ tal como faz com as categorias dos seus blogs. Será algo deste tipo:

O terceiro passo é adicionar campos de informação customizados no adicionar/editar post page.
Para o nosso portfolio, poderemos adicionar coisas como o ano em que a
peça foi publicada e detalhes de quem a desenhou, construiu e produziu
o site/design.
Nesse caso, existe um pouco mais de código, mas se você o ler, compreenderá facilmente o seu sentido:
add_action("admin_init", "admin_init");<br /> <br />function admin_init(){<br /> add_meta_box("year_completed-meta", "Year Completed", "year_completed", "portfolio", "side", "low");<br /> add_meta_box("credits_meta", "Design & Build Credits", "credits_meta", "portfolio", "normal", "low");<br />}<br /> <br />function year_completed(){<br /> global $post;<br /> $custom = get_post_custom($post->ID);<br /> $year_completed = $custom["year_completed"][0];<br /> ?><br /> <label>Year:</label><br /> <input name="year_completed" value="<?php echo $year_completed; ?>" /><br /> <?php<br />}<br /> <br />function credits_meta() {<br /> global $post;<br /> $custom = get_post_custom($post->ID);<br /> $designers = $custom["designers"][0];<br /> $developers = $custom["developers"][0];<br /> $producers = $custom["producers"][0];<br /> ?><br /> <p><label>Designed By:</label><br /><br /> <textarea cols="50" rows="5" name="designers"><?php echo $designers; ?></textarea></p><br /> <p><label>Built By:</label><br /><br /> <textarea cols="50" rows="5" name="developers"><?php echo $developers; ?></textarea></p><br /> <p><label>Produced By:</label><br /><br /> <textarea cols="50" rows="5" name="producers"><?php echo $producers; ?></textarea></p><br /> <?php<br />}Primeiro de tudo, chamamos a função adicionar do admin_init quando o
painel administrativo do WordPress se inicializa, e dentro dessa função adicionamos duas meta boxes locais para introduzir os nossos dados. O contexto para essas duas boxes é:
<?php add_meta_box( $id, $title, $callback, $page, $context, $priority ); ?>A única diferença entre essas duas é o local onde as colocamos na tela. O ‘year completed’ é colocado na barra lateral utilizando o ‘side’,
enquanto os ‘credits’ são colocados no interior da página utilizando o
‘normal’.
Dentro de ambas as funções existe algum código PHP do WordPress e
HTML para nos ajudar a definir corretamente os velhinhos custom fields.
Tenha a certeza de que inclui:
global $post;para que possamos depois correr uma query
$custom = get_post_custom($post->ID);Depois das duas meta boxes serem adicionadas, você irá visualizar algo deste tipo:

A última coisa a fazer no terceiro passo é termos a certeza de que guardamos esses valores. Para o fazer, utilizamos:
add_action('save_post', 'save_details');e
function save_details(){<br /> global $post;<br /> <br /> update_post_meta($post->ID, "year_completed", $_POST["year_completed"]);<br /> update_post_meta($post->ID, "designers", $_POST["designers"]);<br /> update_post_meta($post->ID, "developers", $_POST["developers"]);<br /> update_post_meta($post->ID, "producers", $_POST["producers"]);<br />}Não existe nada muito complexo aqui. Estamos novamente adicionando uma ação, dessa vez para efetuar o ‘save_post’. Ele dispara a
função save_details() que utiliza o update_post_meta (http://codex.wordpress.org/Function_Reference/update_post_meta) para guardar a informação relevante.
Agora é hora de dar um toque à página My Portfolio para mostrar alguma dessa informação. Vejamos:
add_action("manage_posts_custom_column", "portfolio_custom_columns");<br />add_filter("manage_edit-portfolio_columns", "portfolio_edit_columns");<br /> <br />function portfolio_edit_columns($columns){<br /> $columns = array(<br /> "cb" => "<input type=\"checkbox\" />",<br /> "title" => "Portfolio Title",<br /> "description" => "Description",<br /> "year" => "Year Completed",<br /> "skills" => "Skills",<br /> );<br /> <br /> return $columns;<br />}<br />function portfolio_custom_columns($column){<br /> global $post;<br /> <br /> switch ($column) {<br /> case "description":<br /> the_excerpt();<br /> break;<br /> case "year":<br /> $custom = get_post_custom();<br /> echo $custom["year_completed"][0];<br /> break;<br /> case "skills":<br /> echo get_the_term_list($post->ID, 'Skills', '', ', ','');<br /> break;<br /> }<br />}Aqui estamos adicionando duas novas funções ao WordPress Admin. A primeira, portfolio_edit_columns($columns),
define simplesmente as colunas. Os primeiros dois argumentos “cb” e
“title” são parte do core, por isso não recomendamos que mexa neles. Os
outros três surgem do nosso custom post type, “description”, “year” e
“skills”.
Temos também mais uma função para dizer ao WordPress onde ir buscar essa informação portfolio_custom_columns($column).
Utilizando um simples switch podemos definir qual a informação será mostrada em cada uma das colunas do layout. Para a “description”
utilizamos o the_excerpt(), para o “year” vamos buscar o custom field utilizando o get_post_custom(), e para as “skills” vamos buscar uma lista de termos/taxonomias/categorias, separadas por vírgulas, utilizando o get_the_term_list().
Com isso, teremos as nossas colunas definidas:

Originalmente os Custom Post Types são mostrados utilizando o
fallback single.php, ou index.php. Uma das coisas fantásticas é que
podemos criar nossos próprios templates customizados utilizando
nomes do tipo single-xxxxxx.php. Nesse caso, iremos utilizar o
single-portfolio.php. Crie apenas o seu arquivo de template no seu diretório e o custom post type irá utilizá-lo. A forma como depois
mostra a informação, já é com você!
Problemas para reescrever endereços
Existem alguns problemas reportados relativamente ao reescrever
endereços URL; por vezes não funcionam. No entanto, se está com esse
problema existem uma série de formas de solucioná-lo.
Primeiro, vá no seu menu Opções > Permalinks, e faça gravar.
Normalmente esse truque resolve o problema, tendo em consideração que o
seu WordPress consegue gravar facilmente a informação no arquivo .htaccess.
Se isso não funcionar, você pode acrescentar uma linha de código depois de registar o tipo de post:
register_post_type( 'portfolio' , $args );<br />flush_rewrite_rules();Isto poderá resolver de vez o seu problema
Leitura adicional:
- http://thinkvitamin.com/dev/create-your-first-wordpress-custom-post-type/
- http://justintadlock.com/archives/2010/04/29/custom-post-types-in-wordpress
Até a próxima!







