12 ago

Custom Post Types: criação, uso e dicas – Parte 1

Categoria: - Comentários (18)

Custom Post Type, também conhecido por “CPT”, é um recurso que foi introduzido no WordPress na versão 3.0 e isso já tem mais de um ano, mas até hoje tem muita gente que ainda não sabe como usar ou não entende como funciona. Infelizmente isso faz com que essas pessoas não usufruam das infinitas possibilidades que este recurso nos dá, por pura falta de conhecimento ou medo de usar.

Neste artigo eu gostaria de tentar ensinar, de uma forma bem didática, essa funcionalidade, desde a criação, seu uso e resolução de possíveis problemas.

Primeiramente precisamos ter em mente o seguinte:

  • Meu sistema realmente precisa ter Custom Post Type? Será que se eu usar posts simples não resolveria o meu problema?
  • Não sobrecarregue seu sistema à toa. Diariamente eu vejo gente usando Custom Post Types indiscriminadamente.

Bom, partindo do princípio que a resposta à pergunta foi “Sim”, então vamos ao trabalho!

O que vamos precisar

  • O seu tema precisa ter um arquivo functions.php, se não tiver, crie-o.
  • Atenção, boa vontade e muita paciência.

Aprendendo a organizar o sistema

Em meus trabalhos costumo utilizar a seguinte estrutura de pastas:

/app/
/css/
/images/
/js/ 

Estrutura de Pastas

Estrutura de Pastas – Tema WordPress (clique na imagem para ampliar)

Na pasta app vão todos os arquivos que podem modificar meu sistema, com a adição ou remoção de recursos. Na pasta css, vão os estilos do sistema, na pasta images, as imagens e na pasta js, os scripts.

Meio óbvio mas esta estruturação faz toda diferença na hora de programar e também na hora de fazer manutenção. Nós vamos trabalhar na pasta app, pois queremos adicionar recursos ao nosso sistema.

Em nosso exemplo, nós vamos criar um novo tipo de post para gerenciar Produtos. Então, crie um arquivo PHP e coloque o nome de produto_cpt.php. Feito isso, abra o arquivo functions.php do tema ativo e faça a inclusão do arquivo recém criado:

Conforme o Codex diz, a estrutura mais simples para criação de Custom Post Types é a seguinte:

Este código irá criar um  novo tipo de post chamado “produto”. Sempre use nomes no singular para nomear seus post types. Como podemos ver, o código acima apresenta dois argumentos importantes “labels” e “public”. O argumento “labels” é usado para definirmos os nomes que são exibidos na interface e o “public”, diz ao WordPress se o post type será visível somente na interface administrativa (back-end) ou se será visível também na interface de usuário final (front-end).

Note que no parâmetro “labels”, nós definimos apenas dois argumentos: name e singular_name. Existem outros argumentos que podem ser definidos ali, são eles:

  • ‘add_new’ – Adicionar novo
  • ‘all_items’ – Todos os produtos
  • ‘add_new_item’ – Adicionar novo produto
  • ‘edit_item’ – Editar produto
  • ‘new_item’ – Novo produto
  • ‘view_item’ – Ver produto
  • ‘search_items’ – Procurar produtos
  • ‘not_found’ – Nenhum produto encontrado
  • ‘not_found_in_trash’ – Nenhum produto encontrado na lixeira
  • ‘parent_item_colon’ – Produto pai. Esta string não é usada em post types do tipo “post” (não hierárquicos), somente nos post types do tipo “page” (hierárquicos)
  • ‘menu_name’ – Produtos. Esta string dá nome ao item do menu administrativo, se não informado, será usada a mesma string definida em “name” inicialmente

Veja agora como ficou o nosso código:

Boas práticas na hora de nomear seu post type

Embora seja conveniente nomear seu custom post type simplesmente como “produto”, o que é bem consistente como ocorre com os post types padrão — “post”, “page”, “revision” ou “attachment” — é interessante utilizarmos um pequeno prefixo que define uma identificação para o seu tema ou plugin, por exemplo:

  • sr_produto: post type “produto” usado no site da empresa “Santa Rita”.
  • wpcomm_produto: post type “produto” usado no plugin wp commerce

(os nomes acima são meramente ilustrativos)

Você pode não querer usar um prefixo, mas isso pode acarretar algum tipo de conflito futuramente, dependendo do nome escolhido para o post type, com outros plugins ou post types criados no seu sistema posteriormente.

Tudo depende do caso, portanto seja consciente e faça uma boa análise antes de criar o seu sistema.

Nomes reservados

Tome bastante cuidado com isso. Como já vimos anteriormente o WordPress já possui alguns post types pré-definidos, são eles:

  • post
  • page
  • attachment
  • revision
  • nav_menu_item

Há rumores de que no futuro, os desenvolvedores do WordPress irão aplicar o prefixo wp_ aos post types que forem criados futuramente no “core”, por exemplo, se o time de desenvolvimento decidir adicionar um post type para Eventos, provavelmente usarão o prefixo wp_ no nome, ficando assim wp_event. Então é uma boa idéia evitarmos o uso deste prefixo nos nossos post types.

A interface administrativa

Quando um post type é criado, ele ganha uma entrada no menu administrativo para que possamos gerenciar os posts do nosso post type.

WordPress - Custom Post Type Produto

WordPress – Custom Post Type Produto (clique na imagem para ampliar)

Sistema de URLs

Como ocorre com os tipos de post padrão, os custom post types também poderão ter URLs amigáveis — desde que sua hospedagem permita isso.

Eu apresento a vocês mais um parâmetro para o nosso código inicial, o “rewrite”. Com este parâmetro nós vamos poder definir o slug do nosso post type. Veja o código abaixo:

O código acima resultará em algo do tipo: http://exemplo.com/produtos.

Note que agora nós usamos a forma plural do post type, o que é mais lógico.

Os arquivos de template

O sistema de temas do WordPress suporta Custom Post Types também. O WordPress adicionou suporte para single-{posttype}.php na versão 3.0 e para archive-{posttype}.php, na versão 3.1.

É importante dizer que muitas vezes é necessário atualizar a estrutura de permalinks para que estes templates funcionem sem causar erros 404 (página não encontrada). Para fazer isso, basta ir no menu Configurações > Links Permanentes e simplesmente clicar no botão “Salvar alterações”. Isto fará com que o WordPress “recrie” as regras de rewrite.

O template single-produto.php

Da mesma maneira que o arquivo single.php, o single-produto.php serve para visualizarmos um post do nosso custom post type.

Note que mesmo tendo definido o slug dos links (estrutura de links) na forma plural, nós sempre devemos usar a forma singular para nomear este arquivo.

O template archive-produto.php

Da mesma maneira que o arquivo archive.php, o archive-produto.php serve para visualizarmos uma listagem de posts do nosso custom post type.

Para que este arquivo funcione, é necessário que o parâmetro ‘has_archive’ seja configurado como ‘true’.

Conheça os outros parâmetros que podem ser usados na criação do seu post type

Além dos parâmetros que foram mostrados aqui, ainda existem uma série de outros parâmetros interessantes que podem ajudá-los a configurar melhor as funcionalidades do seu novo post type. Visite o Codex para maiores informações: http://codex.wordpress.org/Function_Reference/register_post_type#Parameters.

Consultando o banco de dados usando WP_Query()

Muitas veze nós precisamos listar em nosso sistema, alguns posts de algum post type. Assim como ocorre com os tipos de post padrão, nós também podemos utilizar a classe WP_Query() para listar os posts de um custom post type.

O código acima cria basicamente uma consulta ao banco de dados, trazendo 10 posts do nosso post type “produto“.

Algumas dicas úteis

  • Você pode usar a função post_type_archive_title() para imprimir o nome do seu post type no título do seu template archive-produto.php.
  • Talvez você prefira usar plugins para criar seus post types, tudo bem, é um direito seu. Já eu prefiro manter o controle sobre o código; gosto de ver tudo o que está acontecendo. Então, minha dica é usar esse gerador online: http://themergency.com/generators/wordpress-custom-post-types/
  • Você pode utilizar a função flush_rewrite_rules() para recriar automaticamente as regras de rewrite do WordPress quando estiver trabalhando com seu post type.

Note que o código acima está sendo chamado quando o tema é ativado. Não use esta função indiscriminadamente, pois pode causar uma sobrecarga no sistema.

Outra forma de fazer:

Bom pessoal, por enquanto é só. Em breve eu publicarei o segundo artigo da série, ensinando a definir capacidades personalizadas ao nosso custom post type. Até breve :-)

Comentários ( 18 )

  • Olá Miriam, tudo bem? Muito bom seu post, foi muito útil! Estou com duas dúvidas aqui:

    No meu single-{posttype}.php terá um formulário onde o usuário poderá fazer upload de determinado arquivo. A primeira questão: é melhor eu criar uma nova tabela no banco de dados para receber esses arquivos ou salvá-los como post_type=attachment na própria tabela wp_posts?

    A segunda questão: Ao criar um CPT, aparece um novo menu à esquerda. Como faço para inserir um novo menu, filho do CPT?

    Obrigado!

  • Maury Cattermol

    Eu não sei o motivo mas sempre o conteúdo está indo para o single.php e não para o single-portfolio.php (como criei). Acho que fiz corretamente o passo-a-passo.

    functions.php:

    _x( ‘Portfolios’, ‘portfoliokey’ ),
    ‘singular_name’ => _x( ‘Portfolio’, ‘portfoliokey’ ),
    ‘add_new’ => _x( ‘Adicionar novo’, ‘portfoliokey’ ),
    ‘add_new_item’ => _x( ‘Adicionar novo Portfolio’, ‘portfoliokey’ ),
    ‘edit_item’ => _x( ‘Editar Portfolio’, ‘portfoliokey’ ),
    ‘new_item’ => _x( ‘Novo Portfolio’, ‘portfoliokey’ ),
    ‘view_item’ => _x( ‘Ver Portfolio’, ‘portfoliokey’ ),
    ‘search_items’ => _x( ‘Procurar Portfolios’, ‘portfoliokey’ ),
    ‘not_found’ => _x( ‘Nenhum portfolio encontrado’, ‘portfoliokey’ ),
    ‘not_found_in_trash’ => _x( ‘No portfolios found in Trash’, ‘portfoliokey’ ),
    ‘parent_item_colon’ => _x( ‘Parent Portfolio:’, ‘portfoliokey’ ),
    ‘menu_name’ => _x( ‘Portfolios’, ‘portfoliokey’ ),
    );

    $args = array(
    ‘labels’ => $labels,
    ‘hierarchical’ => true,

    ‘supports’ => array( ‘title’, ‘editor’, ‘thumbnail’, ‘custom-fields’, ‘revisions’, ‘add_theme_support’),
    ‘taxonomies’ => array( ‘category’, ‘post_tag’ ),
    ‘public’ => true,
    ‘show_ui’ => true,
    ‘show_in_menu’ => true,

    ‘show_in_nav_menus’ => true,
    ‘publicly_queryable’ => true,
    ‘exclude_from_search’ => false,
    ‘has_archive’ => true,
    ‘query_var’ => true,
    ‘can_export’ => true,
    ‘rewrite’ => true,
    ‘capability_type’ => ‘post’
    );

    register_post_type( ‘portfoliokey’, $args );
    flush_rewrite_rules();
    }
    ?>

    single-portfolio.php:

    <a href="”>

    Nenhum post encontrado!

    Tem alguma coisa errada?

    • wpmidia

      Olá!
      Tenta ir em Configurações > Links Permanentes e clique no botão SALVAR
      Veja se resolve….

      Qualquer coisa estamos ai.

      Abs.
      Miriam de Paula

Envie seu comentário

Resize-me!