Você está na página 1de 26

PARTE [1] O QUE SO OS TIPOS DE POSTS E CATEGORIAS CUSTOMIZADOS?

Antes do WordPress 3.0, o utilizador e os developers s podiam usar os tipos de post definidos pelo WordPress:

Posts, Pginas, Mdia e Links eram os nicos tipos de posts que existiam e no era possvel criar novos. Assim os developers, quando necessitavam de criar novos tipos de contedos tinham que se suportar nas Categorias para realizar contedos diferentes para cada post. Com as novas verses do WordPress possvel criar novos tipos de contedos separados dosPosts para gerir estes contedos diferentes. Por exemplo, possvel criar um tipo de contedo para albergar uma base de dados de filmes, criando esse tipo de post e chamando-lhe Filmes. Para isso basta chamar a funo register_post_type() e o WordPress ir encarregar-se por ns de criar o menu na administrao, criar toda a interface de edio e listagem e todas as relaes necessrias. Porm, no so s os tipos de posts que ns podemos criar. Tipos de categoria customizados tambm possvel. Para a tipo Filmes podemos associar, por exemplo, um tipo de categoria:Categoria de Filmes. Se assim o fizermos, este tipo de categoria ir aparecer na interface de edio dos filmes, assim como aparecem Categorias e Tags para os Posts. No nosso ficheiro para download temos os exemplos que apresentamos aqui. Para conveniencia prefervel ir seguindo este tutorial com o ficheiro de exemplos. O ficheiro encontra-se no rodap deste artigo.

CRIAR TIPOS DE POSTS CUSTOMIZADOS


Para adicionar um tipo de post customizado, preciso usar a funo register_post_type. Esta funo permite que voc defina o tipo de post e como ele se comporta dentro doWordPress. Esta funo responsvel por, passando-lhe os parmetros pretendidos, fazer as associaes necessrias e a criao de toda a interface para este tipo de post. Assim, para criar o tipo de post mais simples colocamos o seguinte no ficheiro functions.php:

add_action( 'init', 'create_post_type_film' ); function create_post_type_film() { register_post_type( 'film', array( 'labels' => array( 'name' => __( 'Films' ), 'singular_name' => __( 'Film' ) ),

'public' => true, ) ); }

Esta funo regista um tipo de post film (parmetro passado no primeiro argumento da funo) que pblico, ou seja, pode ser mostrado no blog, e que tem como nome plural Films e nome singular Film. As funes de traduo __() foram includas neste exemplo, uma vez que normal os tipos de post estarem preparados para traduo. Pode encontrar um bom artigo sobre o sistema de tradues no WordPress aqui. Obviamente, estes no so os nicos parmetros de registo dos tipos de post, se assim fosse, serviria para muito pouco no acham? Podemos controlar todo o comportamento deste tipo de post passando-lhe os parmetros que achamos necessrios:

DEFININDO NOVAS LABELS


Para modificar as labels associadas ao tipo de post film, ou seja, as strings usadas na administrao para mostrar este tipo de post, basta passar funo um array com todas as labels modificadas. De outro modo, ir aparecer post em vez de film aquando da visualizao na administrao:

$labels = array( 'name' => _x('Films', 'post type general name'), 'singular_name' => _x('Film', 'post type singular name'), 'add_new' => _x('Add New', 'film'), 'add_new_item' => __('Add New Film'), 'edit_item' => __('Edit Film'), 'new_item' => __('New Film'), 'all_items' => __('All Films'), 'view_item' => __('View Film'), 'search_items' => __('Search Films'), 'not_found' => __('No Films found'), 'not_found_in_trash' => __('No Films found in Trash'), 'parent_item_colon' => '', 'menu_name' => 'Films' );

Este array dever ser includo dentro da funo no lugar de labels para que surta efeito:

'labels' => $labels,

CONTROLANDO O COMPORTAMENTO
Novos parmetros podem ser passados funo de modo a controlar o comportamento deste tipo de post. Para isso podemos criar um array com esses parmetros:

$args = array( 'labels' => $labels, 'public' => true, 'publicly_queryable' => true, 'show_ui' => true, 'show_in_menu' => true, 'rewrite' => true, 'capability_type' => 'post', 'has_archive' => true, 'hierarchical' => false, 'menu_position' => null, 'supports' => array('title','editor','author','thumbnail','excerpt','comments') ); Este array apresenta os parmetros essnciais e mais importantes. Existem mais, e voc pode v-los todos aqui no Codex do WordPress e explorar os tipos de post sua vontade. Tenha sempre em ateno para no o fazer no seu blog de produo, use uma instalao local no seu computador para fazer esses testes. Parmetros aceites pela funo:

public apresenta ou no o tipo de post na administrao do WordPress public_queryable se este tipo de post pode ou no ser visto no front-end do blog show_ui se deve ou no ser construda uma interface por defeito show_in_menu se ou no adicionado um link no menu da asministrao rewrite estando os links permamentes ligados, se deve este post type ter um URL prprio capability_type capacidades que os usurios devero ter para poder editar este tipo de post has_archive se o tipo de post deve ou no ter uma listagem no front-end hierarchical - deve ou no este tipo de post ter a funcionalidade de associar hierarquias como nas pginas

menu_position - passando um nmero a este parmetro, controlamos a localizao do link no menu (nota: os nmeros devem ser passados de 5 em 5. Exemplo: 5, 10, 15, 20, . supports o que este tipo de post deve conter ou no
No ficheiro para download encontra-se este cdigo incorporado.

CRIAR CATEGORIAS CUSTOMIZADAS


O processo exatamente o mesmo, mas agora com a funo register_taxonomy(). Esta funo aceita como parmetros o ID da categoria que estamos a adicionar, um array com os tipos de posts associados e um array com os parmetros que alteram o seu comportamento:

add_action( 'init', 'create_taxonomy_film_category' ); function create_taxonomy_film_category() { register_taxonomy( 'film_category', array( 'film' ), array( 'hierarchical' => true, 'label' => __( 'Film Category' ), 'show_ui' => true, 'show_in_tag_cloud' => true, 'query_var' => true, 'rewrite' => true, ) ); }

Neste trecho de cdigo dissemos funo para registar um tipo de categoria chamado film_category, que se associa ao tipo de post film e que recebe uns quantos parmetros para controlo do seu comportamento. Estes so os parmetros:

hierarchical se esta categoria customizada deve conter hierarquia, sCategorias do Posts. Caso seja passado false a categoria ser idntica s Tags dos Posts.

semelhante

label o nome da categoria que ser visvel na administrao. show_ui se deve ou no ser mostrada no menu da administrao. show_in_tag_cloud conhece aquele widget que produz um nvem das tags mais usadas? este parmetro define se deve ou no aparecer nessa nvem. query_var se esta categoria pode ser visualizada a partir do front-end.
Estes so os parmetros mais importantes e usuais. Se quiser aprofundar o seu conhecimento, poder dirigir-se ao Codex do WordPress e ver todos os parmetros que esta funo aceita.

DEFININDO NOVAS LABELS


Tal como nos tipos de post, possvel definir novas labels para as categorias customizadas. Para isso procedemos da mesma maneira, passando funo um array com os labels pretendidos:

'labels' => array( 'name' => _x( 'Categories', 'taxonomy general name' ), 'singular_name' => _x( 'Category', 'taxonomy singular name' ), 'search_items' => __( 'Search Categories' ), 'all_items' => __( 'All Categories' ), 'parent_item' => __( 'Parent Category' ), 'parent_item_colon' => __( 'Parent Category:' ), 'edit_item' => __( 'Edit Category' ), 'update_item' => __( 'Update Category' ), 'add_new_item' => __( 'Add New Category' ), 'new_item_name' => __( 'New Category Name' ), 'menu_name' => __( 'Category' ), ),

EXTENDER AS URLS COM O PARMETRO REWRITE E ADICIONAR TAGS AOS TIPOS DE POSTS

Entender o ciclo interno das ligaes permanentes (rewrite links) algo complicado e ser matria para um dos prximos captulos da srie, porm, sem termos que nos preocupar com as questes desse ciclo, podemos j comear por alterar e mudar o comportamento das URLs para os nossos tipos de posts e de categorias. Para isso passamos um array ao parmetro rewrite para controlar algumas das suas propriedades.

REWRITE NOS TIPOS DE POSTS


Para controlar as URLs dos tipos de posts deve-se passar estes parmetros da seguinte forma:

'has_archive' => 'films', 'rewrite' => array( 'slug' => 'films', 'with_front' => false, ),

Se for passado uma string ao parmetro has_archive, esta ser usada como URL da pgina de listagem dos filmes, aparecendo como http://o-seu-site.com/films/. Para manter uniforme, passamos tambm ao parmetros slug dentro do rewrite a mesma string. Desta maneira o seu site ter a seguinte estrutura de URL para o tipo de post filme:

Listagem de Filmes: http://o-seu-site.com/films/ Pgina de detalhe de um Filme: http://o-seu-site.com/films/o-nome-do-filme/

REWRITE DE CATEGORIAS CUSTOMIZADAS


Para controlar os URLs das categorias customizadas, passamos os parmetros do rewrite da seguinte forma:

'rewrite' => array( 'slug' => 'films/categories', 'with_front' => false, ),

Normalmente uso uma estrutura de URLs adequada, neste caso a todas as categorias de filmes esto sobre a URL http://o-seu-site.com/films/categories/nome-da-categoria Em ambos os casos, se o parmetro with_front for verdadeiro, prefixa a estrutura de URLs com o parmetro de acesso ao blog de posts, por exemplo http://o-seu-site.com/blog/films/o-nome-do-filme/

ADICIONAR TAGS AO TIPO DE POSTS

Para associar as categorias de Tags ao tipo de post, isto , para aparecerem na administrao como tipo de categoria associada aos FIlmes, existe uma funo que o faz facilmente e direitinho:

register_taxonomy_for_object_type( 'tags', 'film' );

Esta funo deve ser chamada aps o registo dos tipos de posts e das categorias envolvidas.

PARTE [2]
Depois de termos criado o nosso tipo de post customizado, nesta parte iremos falar de como estruturar e apresentar da maneira mais conveniente os tipos de post customizados.

SUMRIO
Preparar o seu tema para receber os seus tipos de posts Acrescentar campos usando metaboxes Embeber ficheiros javascript e folhas de estilo CSS no cabealho da pgina da Administrao e no Front-end

PREPARAR O SEU TEMA


O primeiro passo para a criao de um tipo de post responder seguinte questo: para que serve e onde apresentar este tipo de post? inevitvel no ? A no ser que estejamos apenas a experimentar, uma vez respondida a pergunta, tudo fica mais claro. Ento, seguindo com o nosso tipo de post film o mais prtico e realista apresent-lo na front-end do website, e, uma vez que definimos toda a nossa lgica dentro do functions.php podemos integr-lo dentro do tema sem recorrer a nenhum plugin. A hierarquia de templates dos temas no WordPress bastante complexa sendo que se deve planear bem como e onde queremos cada pedao do nosso contedo.

Um template um ficheiro PHP do seu tema que chamado pelo WordPress dependendo do tipo de contedo que est a ser requesitado. Assim, numa chamada homepage do blog o WordPress corre o ficheiro home.php ou front-page.php (dependendo da configurao) e ser um destes ficheiros que ser colocado no ecr do usurio. Para um post, o WordPress chama o ficheirosingle.php e para um arquivo mensal o archives.php. No me vou alongar a explicar cada pedao de lgica nesta hierarquia, nem o propsito deste artigo. Irei apenas mostrar quais so os templates que devem ou podem ser criados para controlar e apresentar os custom post types. Apresentar um Arquivo do tipo de post: archive-nome-do-post-type.php ( archive-film.php ) Ficheiro de detalhe do tipo de post: single-tipo-de-post.php ( single-film.php )

O cdigo a acrescentar em cada ficheiro pode ser variado, e deve ser ao gosto e necessidades de cada um. No entanto, a lgica (o loop) do WordPress deve estar l e genericamente assim:

1 2 3 4 5 6

<?php if ( have_posts() ) : while( have_posts() ) : the_post(); ?>

<div class="entry-title"><?php the_title(); ?></div> <div class="entry-content"><?php the_content(); ?></div>

<?php endwhile; endif; ?>

A funo have_posts() na primeira linha ir retornar sempre true caso existam posts a apresentar. Neste caso, os posts a apresentar so os posts do tipo film. Dentro do ciclo while o programador poder colocar o que quiser, desde o ttulo, o contedo, um link, imagem de destaque, etc. Isso fica ao critrio do programador. Genericamente, sem alongar muito, este o processo para fazer o display dos tipos de post definidos por ns.

ACRESCENTAR CAMPOS COM METABOXES


Se ainda no reparou na possibilidade de criar campos de contedo personalizados na tela de posts, ento vai ficar surpreendido se lhe disser que voc no est restringido aos campos que existem nativamente, tais como o Ttulo, o Contedo, Categorias e Tags. No topo do ecr da administrao, existe uma aba chamada Opes de Tela e se voc a abrir e marcar a checkbox Campos Personalizados, ir fazer aparecer uma caixa por baixo do editor de texto com os campos Nome e Valor, e com a possibilidade de acrescentar mais campos a gosto. Aqui est o poder do WordPress para os tipos de post. Voc pode usar estes valores personalizados no seu tema e apresent-los conjuntamente com todo o resto do contedo. No caso do film, seria interessante poder acrescentar o ano de criao do filme, o nome do realizador, do produtor e do diretor de fotografia. Para isso voc podia apenas digitar para cada um dos filmes, os valores da forma representada na figura:

E poderia com alguma mgica mistura fazer aparecer no seu tema por baixo do seu contedo. Na verdade, existe uma funo responsvel para isso, ela get_post_meta():

1 2 3 4 5 6 7 8 9 10 11 12 13 14
Esta funo aceita como parmetros o ID do post o qual pretende ir buscar o valor do campo personalizado, o nome do campo personalizado e se deve ou no ser retomado o ltimo valor acrescentado tabela. Este ltimo parmetro deve ser sempre true.

<ul> <li> <b>Ano: </b> <?php get_post_meta( $post->ID, 'ano_film', true ); ?> </li> <li> <b>Realizador: </b> <?php get_post_meta( $post->ID, 'realizador_film', true ); ?> </li> <li> <b>Produtor: </b> <?php get_post_meta( $post->ID, 'produtor_film', true ); ?> </li> </ul>

O leitor deve estar neste momento a pensar Que maravilha isto dos campos customizados! Mas para o usurio comum ter que editar ou acrescentar os valores naquela caixinha pode vir a ser dificil. Devido ao facto da caixa de campos personalizados ser muito pouco flexvel, foi possibilitada a criao de metaboxes customizadas para apresentar e receber estes campos personalizados de maneira mais conveniente. Uma metabox uma caixa com campos de formulrio que aparece na tela de criao / edio de um post. Categorias, Tags, Excerto, Discusso e Publicar, so tudo exemplos de metaboxes que existem nativamente na administrao do WordPress. Estas metaboxes apresentam no seu interior campos de formulrio para opes e preenchimento de novos contedos ou capacidades. Assim o usurio ter sua disposio uma caixa com os campos necessrios j prontos para serem adicionados. Para criar uma metabox, primeiro temos adicionar uma chamada aco add_meta_boxes, seguidamente chamar a funo add_meta_box() e passar-lhe os parmetros necessrios, incluindo o HTML que ser mostrado na interface:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

<?php add_action( 'add_meta_boxes', 'film_add_meta_box' );

function film_add_meta_box() { add_meta_box( 'film_metaboxid', 'Atributos do Filme', 'film_inner_meta_box', 'film' ); }

function film_inner_meta_box( $film ) { ?> <p> <label for="realizador">Ano:</label> <br />

16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
Este cdigo, colocado no functions.php cria uma metabox na interface de criao do tipo de postsfilm. A primeira funo chama add_meta_box() que tem como parmetros um ID para colocar na div que envolve a caixa, o ttulo a aparecer no topo da caixa (que no nosso caso Atributos do Filme), o nome da funo a chamar para apresentar o HTML na tela e o tipo de post onde esta metabox deve aparecer (neste caso film). A funo film_inner_meta_box() tem como parmetro o objecto do post corrente. Esta funo responsvel pela apresentao dos campos dentro da metabox. Do mesmo modo que fazemos para o front-end do website, funo get_post_meta()recolhemos os valores de cada campo j colocados pelo utilizador. atravs da

<input type="text" name="ano_film" value="<?php echo get_post_meta( $film->ID, '_ano_f </p> <p> <label for="realizador">Realizador:</label> <br /> <input type="text" name="realizador_film" value="<?php echo get_post_meta( $film->ID, true ); ?>" /> </p> <p> <label for="realizador">Produtor:</label> <br />

<input type="text" name="produtor_film" value="<?php echo get_post_meta( $film->ID, '_ true ); ?>" /> </p> <?php } ?>

Neste momento j temos quase tudo pronto, basta apenas adicionar a funo que vai salvar todos os dados colocados na metabox. muito simples, basta chamar a aco save_post e passar a funo update_post_meta():

1 2 3 4 5 6 7 8 9 10 11 12 13

<?php add_action( 'save_post', 'ewp_film_save_post', 10, 2 );

function ewp_film_save_post( $film_id, $film ) {

// Verificar se os dados foram enviados, neste caso se a metabox existe, garantindopgina de filmes. if ( ! $_POST['ano_film'] ) return;

// Fazer a saneao dos inputs e guard-los update_post_meta( $film_id, '_ano_film', strip_tags( $_POST['ano_film'] ) ); update_post_meta( $film_id, '_produtor_film', strip_tags( $_POST['produtos_film'] )

update_post_meta( $film_id, '_realizador_film', strip_tags( $_POST['realizador_film'

14 15 16 17
} ?>

return true;

Neste trecho de cdigo, ns usmos a aco save_post para chamar a funoewp_film_save_post(). Como esta aco iniciada para o salvamento de qualquer tipo de post, esta funo primeiro verifica se foi enviado pelo formulrio o campo ano_film, indicando implicitamente se estamos ou no a salvar um filme. A funo update_post_meta() tem como parmetros o ID do post, o nome do campo que queremos salvar e o valor para esse campo. O uso do prefixo _ para o nome de cada campo serve como salvaguarda, de modo a no aparecer na dropbox da caixa dos campos personalizados. Com este cdigo temos todas as funes base para colocarmos o nosso tipo de post customizado a funcionar com as metaboxes. Voc pode criar as metaboxes que quiser com os campos que quiser, basta apenas ajustar o cdigo da melhor maneira possvel. Ateno: no recomendamos este cdigo para produo, neste momento existem algumas brechas de segurana que iremos tratar nos prximos artigos da srie.

CARREGAR JAVASCRIPT E CSS NO CABEALHO DA PGINA


Carregar ficheiros de javascript ou CSS diretamente no cabealho da pgina ao invs de se colocar no meio dela tem as suas vantagens. Uma delas o facto de o carregamento da pgina ser mais rpido nos browsers modernos (Firefox 4+, Chrome, IE8+), isto porque estes novos browsers usam o chamado carregamento assincrono para fazer o load de todos os ficheiros JS e CSS que se encontram linkados no cabealho, paralelamente ao carregamento e construo de todo o HTML e de toda a rvore de elementos (DOM no Javascript), permitindo ter maiores ganhos no carregamento dos websites. Vejamos como podemos carregar estes ficheiros JS e CSS no cabealho de uma pgina do front-end. Para isso recorremos funo add_action() que ser colocada dentro do functions.phpchamando a funo wp_enqueue_script(). Primeiro, vamos colocar o nosso ficheiro Javascript, a que iremos chamar nosso-script.js numa pasta dentro do seu tema. Essa pasta dever (no obrigatoriamente) ser /js/. Agora iremos colocar o seguinte cdigo no functions.php:

1 2 3 4 5 6 7 8 9 10

<?php add_action( 'wp_enqueue_scripts', 'ewp_film_scripts' );

function ewp_film_scripts() { if ( is_admin() ) return; wp_enqueue_script( 'jquery' );

wp_enqueue_script( 'nosso-script', get_stylesheet_directory_uri() . '/js/nosso-scrip array( 'jquery' ) );

} ?>

Esta funo wp_enqueue_script() tem duas modalidades de uso. O WordPress regista automaticamente alguns scripts tais como a biblioteca jQuery e a jQuery UI, sendo assim, caso queira carreg-las para o cabealho da pgina, dever apenas passar o nome dos scripts funo. Existem vrios scripts disponveis para si, basta indicar o seu nome. Caso queira carregar ficheiros JS seus, dever passar como parmetros, alm de um nome indicativo nico, o caminho URL para o ficheiro e as dependncias desse script.

No nosso exemplo usamos como nome a string nosso-script, uma vez que nico e no foi registado e mais nenhum lugar. Usamos para nos escrever caminho at ao nosso tema a funoget_stylesheet_directory_uri(). Esta funo retorna o caminho URL completo para a pasta do seu tema, por exemplo, se o seu tema se chamar Tema impecvel, e este se localizar na pasta /tema-impecavel/, ento a funo retorna http://o-seu-site.com/wp-content/themes/tema-impecavel/. A condio if ( is_admin() ) return; garante-nos que os scripts s so carregados no front-end do site.

Carregar ficheiros CSS:


O procedimento similar ao anterior, bastando apenas modificar a aco a ser iniciada e a funo que define o carregamento que passa a ser wp_enqueue_style(). Antes disso, iremos criar a pasta /css/ e o ficheiro nosso-style.css com o nosso estilo a ser carregado. Depois s colocar o script no functions.php:

1 2 3 4 5 6 7 8

<?php add_action( 'wp_print_styles', 'ewp_film_styles' );

function ewp_film_styles() {

wp_enqueue_style( 'nosso-style', get_stylesheet_directory_uri() . '/css/nosso-style.c array( 'jquery' ) );

} ?>

A funo wp_enqueue_style() semelhante que carrega os scripts, sendo assim os seus parmetros so iguais. Et voil, este o resultado final de todo este processo o script agora carregado no cabealho do seu site de maneira segura.

Carregar os ficheiros Javascript e CSS apenas na administrao:


Para o fazer dever apenas modificar a aco de wp_enqueue_scripts para admin_enqueue_scriptse a aco wp_enqueue_styles para admin_print_styles. Desta maneira est a dizer ao WordPress que pretende que os scripts e CSSs sejam carregados apenas na administrao.

PARTE [3]

SUMRIO
Definir mensagens de actualizao customizadas na administrao Criar texto de ajuda contextualizada para o tipo de post Modificar e acrescentar colunas na pgina de listagem do tipo de post Editar e acrescentar Aes em Massa
Customizar a administrao por vezes requer algum trabalho, e entrando agora nesta parte o trabalho j no vai ser mais direto como foi nos ltimos artigos estamos neste momento a escavar fundo no WordPress. Porm, o nosso objectivo apenas proporcionar as ferramentas para voc poder trabalhar e fazer dos tipos de post o que voc quiser, inventando, experienciando e at descobrindo novas funcionalidades, assim sendo ns aqui vamos continuar a seguir uma linha condutora muito directa. O grau da sua experincia voc que define depois de ler e aprender.

MENSAGENS DE ESTADO E ATUALIZAO


As mensagens de estado e atualizao so aquelas mensagens de noticia ou de erro (amarelas e vermelhas, respectivamente) que aparecem no cabealho das pginas da administrao indicando que houve aces de criao, edio, eliminao outras aces ou estados que foram concludos com xito ou no.

Nesta parte iremos tratar de como implementar as nossas prprias mensagens de erro ou de estado quando o nosso tipo de post atualizado, apagado, publicado, removido, etc, mapeando todas as aces possveis. Para isso chamamos o filtro post_updated_messages que contm um array com todas as strings de estado para todos os tipos de post registados. O cdigo abaixo a representao de como possvel modificar essas strings facilmente para o nosso tipo de post film:

1 add_filter( 'post_updated_messages', 'film_updated_messages' ); 2 function film_updated_messages( $messages ) { 3 4 5 6 7 8 9 10 11 12 14 15


); global $post, $post_ID;

$messages['film'] = array( 2 => 'Campo customizado atualizado', 3 => 'Campo customizado apagado', 4 => 'Filme atualizado',

1 => sprintf( 'O filme foi atualizado. <a href="%s">Ver Filme</a>', esc_url( get_perm

5 => isset( $_GET['revision'] ) ? sprintf( 'Filme atualizado para a reviso %s', wp_p 7 => 'Filme guardado.',

6 => sprintf( 'Filme publicado. <a href="%s">Ver Filme</a>', esc_url( get_permalink($

8 => sprintf( 'Filme guardado. <a target="_blank" href="%s">Prever Filme</a>', esc_ur

13>post_date ) ), esc_url( get_permalink($post_ID) ) ),

9 => sprintf( 'Filme agendado para: <strong>%1$s</strong>. <a target="_blank" href="%

10 => sprintf( 'Rascunho de Filme guardado. <a target="_blank" href="%s">Prever Filme

16 17 18} 19
A funo que faz a gesto das mensagens primeiro chama as variveis globais $post e $post_ID de modo a serem acessveis a partir da funo. Seguidamente, modificamos o array que representa este tipo de post, passando novas strings para serem usadas no lugar das strings por defeito. A funo nativa do PHP sprintf() muito usada aqui, uma vez que ela ajuda na inserso de variveis importantes para que as mensagens no fiquem descontextualizadas. Voc deve seguir uma linha igual apresentada no cdigo acima, modificando apenas as strings e fazendo o mnimo de mudanas possveis posio das variveis para que a experincia do usurio seja uniforme em toda a administrao.

return $messages;

AJUDA CONTEXTUALIZADA
A administrao do WordPress tem uma funcionalidade que quase toda a gente desconhece ou simplesmente no liga, mas que deveria ser o primeiro recurso de procura de informao em caso de dvida.

Estou a falar daquela aba que fica no cabealho de quase todas as pginas da Administrao que apresenta o texto Ajuda. Se clicar nessa aba, abre-se um painel que apresenta uma ajuda dedicada apenas pgina que estamos a observar por isso que se chama Ajuda Contextualizada, pois encontra-se no contexto da pgina em que estamos. Por defeito, quando criamos um novo tipo de post a ajuda contextualizada para esse tipo apresenta apenas dois links que ajudam muito pouco quem vai procura de mais informao, na verdade ns podemos (e devemos) modificar esse painel de maneira a apresentar um texto de ajuda contextualizado tanto na pgina de edio de posts como no de listagem. Para isso procedemos como anteriormente, chamando agora a aco contextual_help e passando-lhe uma funo que retorna o texto HTML que queremos para ajuda. O cdigo o seguinte:

1 2 3 4 5 6 7 8 9 10 11 12 13

add_action( 'contextual_help', 'film_help_text', 10, 3 );

function film_help_text( $contextual_help, $screen_id, $screen ) { if ( 'film' == $screen->id ) { $contextual_help = '<p>Este um texto de ajuda ao nosso tipo de post Filme que aparece na pgina de edio.</p>' . '<p>Voc pode criar o texto que quiser aqui</p>'; } elseif ( 'edit-film' == $screen->id ) { $contextual_help = '<p>Este texto aparece na ajuda da pgina de listgem de filmes.</p>'; } return $contextual_help; }

Esta aco procura se a tela atual a pgina de edio ou a pgina de listagem de filmes atravs da varivel id do objecto $screen, retornando para cada um dos casos uma ajuda contextual que vai aparecer na aba de Ajuda. Voc pode colocar o quiser, seja HTML ou cdigo script ou PHP (sendo que este ser escapado e no ir correr, apenas ser apresentaod como referncia), no entanto medida que for escrevendo ser cada vez mais complicado fazer a gesto destas strings escrever HTML dentro de aspas no a melhor coisa para organizao. por isso que normalmente uso outra abordagem: em vez de colocar as strings aqui, crio um ficheiro HTML para cada uma das ajudas contextuais, e leio o ficheiro para a varivel em tempo de execuo com ajuda da funo nativa do PHP file_get_contents(). Desta forma salvaguardo a organizao do espao nesta funo e ao mesmo tempo possibilita-me a modificao do HTML sempre que necessrio. Desta maneira a abordagem ficaria o seguinte:

Ficheiro film_help_text.html:
1 2 3 4 5
<p>Este um texto de ajuda ao nosso tipo de post Filme que aparece na pgina de edio.</p> <p>Voc pode criar o texto que quiser aqui</p> <ul> <li>Aqui sou livre de criar o HTML que quiser.</li> </ul>

Modificao do cdigo acima:


1 2 3 4 5 6 7 8 9 10
} } return $contextual_help;

add_action( 'contextual_help', 'film_help_text', 10, 3 );

function codex_add_help_text( $contextual_help, $screen_id, $screen ) { if ( 'film' == $screen->id ) { $contextual_help = file_get_contents( 'film_help_text.html' ); } elseif ( 'edit-film' == $screen->id ) { $contextual_help = file_get_contents( 'edit-film_help_text.html' );

Para isto funcionar, no se esquea de colocar os ficheiros html no seu Tema WordPress, na mesma directoria que o ficheirofunctions.php. Lembre-se tambm de criar o html para o ficheiro editfilm_help_text.html que ser apresentado na pgina de listagem.

MODIFICAR COLUNAS NA LISTAGEM DE POSTS

A pgina de listagem apresenta por defeito apenas duas colunas: o ttulo do post e a data de criao ou publicao. Porm, como seria bvio, ns vamos agora modificar essa tabela de modo a podermos usar mais colunas de maneira customizada, apresentando apenas os dados que queremos e como queremos. Para modificarmos as colunas teremos que chamar quatro aces e filtros, de modo a termos as funcionalidades necessrias. Isto requer algum treino e experincia pois no muito intuitivo. Penso que a API aqui poderia ser melhorada, e provavelmente ser um dia. Para facilitar esta terefa vamos dividir isto em duas partes: a primeira diz respeito apresentao das colunas em si e a segunda possibilidade de dar a capacidade de sortear os resultados por coluna.

Primeira parte:
Atravs do filtro manage_edit-<tipo-de-post>_columns criamos o cabealho das colunas que queremos que apaream. Lembra-se daqueles campos customizados (ano, realizador e produtor) que crimos na parte dois da srie? Pois bem, vamos us-los aqui apresentando um por cada coluna:

1 2 3 4 5 6 7 8 9 10 11 12 13 14
Neste momento temos as colunas j mapeadas, o WordPress sabe que colunas deve apresentar na pgina de listagem. Nesta funo fizmos passar uma nova organizao de colunas, mantendo as colunas com a Checkbox, Ttulo e Data, e criando novas colunas que faro a apresentao dos campos customizados.

add_filter( 'manage_edit-film_columns', 'film_manage_edit_columns' ); function film_manage_edit_columns( $columns ) {

$film_columns = array( "cb" => $columns["cb"], "title" => $columns["title"], "film_ano" => 'Ano', "film_realizador" => 'Realizador', "film_produtor" => 'Produtor', "date" => $columns["date"], ); return $film_columns;

Seguidamente iremos chamar a aco que ir fazer o display efetivo do contedo de cada post dentro da tabela de listagem. Para isso usamos manage_posts_custom_column :

1 2

add_action( "manage_posts_custom_column", 'film_manage_columns', 10, 2); function film_manage_columns( $column ) { global $post;

3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
Nesta funo procuramos pelo nome da coluna pela condio switch, e caso seja igual a uma daquelas corre o cdigo correspondente. Neste caso fazemos o print dos prprios campos customizados.

switch ($column) { case "film_ano": echo get_post_meta( $post->ID, '_ano_film', true ); break;

case "film_realizador": echo get_post_meta( $post->ID, '_realizador_film', true ); break;

case "film_produtor": echo get_post_meta( $post->ID, '_produtor_film', true ); break;

} }

Segunda Parte:
As colunas j aparecem na pgina de listagem, porm, as nicas colunas que so sorteveis so o ttulo e a data. Caso queiramos sortear os filmes por ano ou realizador teremos que completar esta segunda parte. Usando mais dois filtros, conseguimos fazer com que essas colunas sejam sorteveis:

1 2 3 4 5 6 7 8 9 10 11 12 13 14

// Definindo que colunas devem ter a capacidade de sortear add_filter( 'manage_edit-film_sortable_columns', 'manage_film_sortable_columns' ); function manage_film_sortable_columns( $columns ) { $columns['film_ano'] = 'ano'; $columns['film_realizador'] = 'realizador'; return $columns; }

// Aqui lemos as variveis que esto no URL e fazemos buscas como quisermos add_filter( 'request', 'film_request' ); function film_request( $vars ) { // Procuramos saber se o URL pede para sortear uma das colunas if ( isset( $vars['orderby'] ) ) {

15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
Este cdigo bem maior, mas muito direto e de fcil compreenso. No primeiro filtro ns juntamos s colunas j sorteveis por defeito (Ttulo e Data) as colunas Ano e Realizador. Decidi no colocar a coluna Produtor como sortevel apenas por questes didticas. O segundo filtro define, para cada uma das colunas, caso seja pedido o seu sorteio, o que deve o WordPress fazer. Neste caso, o WordPress vai fazer o pedido base de dados de sortear ascendentemente pelo campos customizado. Na verdade, este filtro serve muito mais do que sortear colunas voc pode criar variveis no URL que iro fazer novos pedidos base de dados e apresentar novos posts, mas isso est fora do escopo deste artigo. Fica s a ideia.

// Sorteamos por coluna switch ( $vars['orderby'] ) {

case 'ano' : $vars = array_merge( $vars, array( 'meta_key' => '_ano_film', 'orderby' => 'meta_value' ) ); break;

case 'realizador' : $vars = array_merge( $vars, array( 'meta_key' => '_realizador_film', 'orderby' => 'meta_value' ) ); break; } } return $vars; }

EDITAR E ACRESENTAR ACES EM MASSA


Este truque por enquanto um pouco tricky, pois a API do WordPress aqui nunca ficou concluda, e possvelmente ainda vai levar algum tempo at ficar concluda. No entanto possvel dar a volta situao. Vamos dividir esta parte em duas uma dedicando-se ao dropdown de aces em massa e outra aos links de estado listados por cima do cabealho da tabela.

Dropdown de Aces em Massa:

Este dropdown um dos exemplos de uma API inacabada. Neste momento voc s poder eliminar opes da dropdown, no podendo acrescentar mais. Existe forma de o fazer, nomeadamente usando jQuery, porm este assunto um tanto complexo, pois ser necessrio trigar a aco que criamos, e por isso ficar para outra altura. No entanto fica aqui como exemplo o cdigo de como remover a aco de editar em massa. Voc poder retirar todas as aces que estiverem pelo dropdown, basta simplesmente procurar a chave do array correspondente aco:

1 2 3 4 5

add_filter( 'bulk_actions-edit-film', 'film_bulk_actions', 10, 1 ); function film_bulk_actions( $actions ){ unset( $actions['edit'] ); return $actions; }

O filtro bulk_actions-edit-<tipo-de-post> recebe um array com as aces disponveis, bastando ao programador retirar as que quiser.

Links de Estados:

Normalmente uso este espao para apresentar links para posts customizados que sejam complexos. Deixo como exemplo daquilo que possvel atingir um printscreen destes links dum plugin de encomendas que criei para um cliente:

fantstico no ? Ento vamos a isso. O cdigo simples e muito direto irei apenas dar os componentes necessrios para voc criar as suas prprias estruturas:

1 2 3 4

add_filter( 'views_edit-film', 'film_views', 10, 1 ); function film_views( $views ){ // Aqui vo as views customizadas }

Este o filtro que pode usar para criar os links de estado customizados. Imagine que gostava de criar novos estados para os filmes, por exemplo: Pr-lanamento e Estreias. Primeiro Passo: vamos criar um campo customizado chamado _estado_film da maneira descrita no artigos anteriores.

Segundo Passo: criamos os links que vo aparecer no espao das views (dentro da funofilm_views): Primeiro vamos pesquisar se no estamos a aceder a um destes estados e seguidamente criamos os links, isto para cada um deles:

1 2 3 4 5 6 7 8 9

// Pr-lanamento

$class = ( isset( $_REQUEST['meta_value'] ) && $_REQUEST['meta_value'] == 'pre' ) ? 'curr

$views['pre'] = '<a class="'.$class.'" href="'.admin_url().'edit.php?post_type=film&meta lanamento</a>';

// Estreias $class = ( isset( $_REQUEST['meta_value'] ) && $_REQUEST['meta_value'] == 'estreias' ) ? $views['estreias'] = '<a class="'.$class.'" href="'.admin_url().'edit.php? post_type=film&meta_key=_estado_film&meta_value=estreias">Estreias</a>';

return $views;

Neste cdigo ns criamos mais dois estados que iro aparecer como links. Em cada um, procuramos se a URL contm a varivel meta_value e se o seu valor um dos dois estados definidos anteriores, para se poder aplicar a class current. Em seguida criamos os links para cada view.

NOTA BREVE SOBRE WORDPRESS E PHP


O WordPress uma fantstica plataforma como framework de criao de novas funcionalidades e bastante bem desenhada e fcil de compreender, pois apresenta uma variedade enorme de filtros e aces para utilizar, isto alm de racionar bastante o uso de classes, fazendo-o onde apenas necessrio. Pessoalmente, no sou muito f do sistema de classes em PHP, primeiro porque instanciar objectos em scripts torna-se lento, e segundo porque o sistema de classes no PHP5 est, no meu entender, mal acabado so muitas as questes que no esto bem explicadas e no se sabe bem para que servem, e portanto na prtica estas no tm muita utilizade. Porm, assim que voc comear a ser um bom programador de tipos de posts vai perceber que so muitas as APIs que necessitam de ser corrigidas ou acabadas, mas h sempre uma forma de se dar a volta. Sempre que voc encontrar alguma lacuna, pode sempre criar um patch e submet-lo no trac do WordPress em http://core.trac.wordpress.org/ Espero que este artigo tenha aumentado a sua viso em relao aos tipos de post. E lembre-se, a curva de aprendizagem existe sempre, mas com gosto e persistncia acabamos sempre por conseguir vencer os obstculos.

PARTE [4]

SUMRIO
Extender, acrescentando novos campos as taxonomias Apresentar as taxonomias customizadas no website Criar um filtro a partir da taxonomia na pgina de listagem de tipos de post
As taxonomias customizadas foram iniciadas no ciclo da verso 2.8 do WordPress tendo a API sido acabada na verso 2.9, antes do lanamento dos Custom Post Types. Com esta nova funcionalidade, os developers tiveram a possibilidade de criar novos tipos de categorias para os posts e pginas, extendendo dessa forma o tipo de categorizao disponvel. Com isto iniciou-se um novo ciclo para o WordPress: de gestor de blog para um verdadeiro CMS personalizvel. possvel criar taxonomias para categorizar no s posts e pginas mas tambm os nossos tipos de post. Pegando no nosso tipo de post Filme, e na categoria customizada que crimos no primeiro artigo, vamos extend-la de modo a termos mais campos para alm dos habituais.

EXTENDER, ACRESCENTANDO NOVOS CAMPOS S TAXONOMIAS

Por defeito, as taxonomias apresentam apenas trs campos Ttulo, Slug e Descrio e sem a possibilidade de acrescentar ou retirar campos. No entanto, com um plugin que cria a funcionalidade de metadata nas taxonomias, conseguimos atingir da mesma forma o pretendido. No nosso caso ns iremos criar um campo muito simples, uma caixa de input onde poderemos colocar a URL de uma imagem que ser usada como imagem de destaque da categoria de filmes. Que tal? Vamos ento! Para comear, colocamos o cdigo que est na parte 1 desta srie para criar a nossa taxonomia. Agora que temos a nossa taxonomia instalada, vamos extend-la. Seguidamente fazemos o download do plugin e instalamo-lo da mesma forma como outro plugin qualquer aqui fica o local para download do nosso plugin. Existem vrios plugins para criar esta funcionalidade, no entanto este aquele com que prefiro trabalhar e que recomendo. Depois de instalado e configurado, j temos a estrutura necessria para trabalhar com estes campos das taxonomias customizadas. Desta forma basta-nos mapear quatro aces para realizarem a tarefa de nos criar a interface visual entre os campos e o WordPress:

1 2 3 4

add_action( 'film_category_add_form_fields', 'film_category_add', 10, 2); add_action( 'film_category_edit_form_fields', 'film_category_edit', 10, 2); add_action( 'edited_film_category', 'film_category_save', 10, 2); add_action( 'save_film_category', 'film_category_save', 10, 2);

Estas quatro aces iro, conjuntamente com as funes que chamam, criar os campos na pgina de adio de termos <taxonomia>_add_form_fields e save_<taxonomia> e os campos na pgina de edio dos termos da taxonomia <taxonomia>_edit_form_fields e save_<taxonomia>. Estes dois conjuntos existem pois as pginas de criao e de edio dos termos das categorias diferente. Agora que temos as aces mapeadas, vamos acrescentar as funes que so necessrias:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
Estas funes so muito simples. A primeira apenas apresenta um HTML que desenha o campo de input para se colocar o URL da imagem. A segunda funo mais complexa, pois a funo que usada na edio dos termos das taxonomias. Primeiro, atravs da funo get_term_meta() uma das funes adicionadas pelo plugin que instalmos pouco retornamos para a varivel $image o URL definido pelo usurio, apresentando-o em seguida no campo de input.

function film_category_add( $tag ) { ?> <div class="form-field"> <p style="color:#222;font-style:normal;">Imagem:</p> <input type="text" name="image" id="image" value="" /> <p>Adicionar uma imagem de destaque para esta categoria.</p> </div> <?php }

function film_category_edit( $tag, $taxonomy ) { $image = get_term_meta( $tag->term_id, '_category_image', true ); ?> <tr class="form-field"> <th scope="row" valign="top"> <p style="color:#222;font-style:normal;">Imagem:</p> </th> <td> <input name="image" id="image" type="text" value="<?php echo $image; ?>" /> <p>Adicionar uma imagem de destaque para esta categoria.</p> </td> </tr> <?php }

Neste momento os campos so apresentados na interface do WordPress, porm nenhum valor guardado quando se salva um termo dessa taxonomia. Precisamos ainda de definir a funo que guarda os valores:

1 2 3 4 5 6 7 8 9 10 11 12 13 14

function film_category_save( $term_id ) { // Se foi inserido algum valor no campo... if ( isset( $_POST['image'] ) ) // ...guarda esse valor update_term_meta( $term_id, '_film_category_image', strip_tags( $_POST['image'] ) );

// seno... else // Remove esse valor delete_term_meta( $term_id, '_film_category_image' );

return $term_id;

Esta funo muito simples: caso o valor image exista (ou seja, caso o utilizador preencha o campo de imagem) ela guarda esse valor, seno ela remove o valor anterior, pois, caso esteja o campo em branco provvel que o usurio tenha querido remover essa imagem do termo da taxonomia. E estamos prontos! O nosso campo customizado ir aparecer em beleza na interface.

APRESENTAR AS TAXONOMIAS CUSTOMIZADAS NO WEBSITE


Como foi visto na parte 2 desta srie, a hierarquia de templates WordPress bastante complexa, dando a possibilidade de se construir o que se quiser. No caso da apresentao de posts em taxonomias, s necessitamos de um template: taxonomy-<taxonomia>.php

No nosso caso vamos primeiro criar um ficheiro no nosso tema com o nome taxonomyfilm_category.php para receber toda a lgica programtica de apresentao dos nossos filmes:

1 2 3 4

<h1 class="entry-title"> <?php single_tag_title(); ?> </h1>

<div class="entry-thumbnail">

5 6 7 8 9 10 11 12 13 14

<img src="<?php echo get_term_meta( $tag->term_id, '_category_image', true ); ?>" /> </div>

<?php if ( have_posts() ) : while( have_posts() ) : the_post(); ?>

<div class="entry-title"><?php the_title(); ?></div> <div class="entry-content"><?php the_content(); ?></div>

<?php endwhile; endif; ?>

Este o cdigo que responsvel pela apresentao dos filmes dentro de cada termo da taxonomia. A diferena para com o cdigo do artigo anterior prende-se com o uso de uma tag H1 e da funo single_tag_title(). Esta reponsvel por apresentar o ttulo da taxonomia que estamos a navegar por exemplo, se estivermos a ver a categoria Drama, esta funo imprime Drama no ecr. Novamente usamos a funo get_term_meta() para retornar deste modo o URL da imagem que se definiu na administrao para cada categoria de filmes. Com alguns ajustes de HTML e CSS conseguimos atingir algo como isto, em que a imagem da esquerda a que usmos colocando o seu URL na caixa de input:

possvel criar e extender muito este exemplo, que deve ser trabalhado e usado para os seus prprios fins. Basta dar uso criatividade.

CRIAR UM FILTRO POR TAXONOMIA NA PGINA DE LISTAGEM DE TIPO DE POSTS


Se voc visualizar a pgina de listagem dos Posts na sua administrao, ver que no topo existem uma srie de filtros, sendo que um deles filtrar os posts por categoria. essa funcionalidade que iremos apresentar nesta seco, filtrando os filmes por categoria.

Com uma simples aco possvel colocar uma caixa dropdown com as categorias da taxonomiafilm_category. Desta forma atingimos algo parecido, apresentando no campo da filtragem a seguinte caixa:

Este o cdigo necessrio:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24

add_action( 'restrict_manage_posts', 'film_retrict_categories' );

function film_retrict_categories() { // Acesso s variveis do tipo de post atual e o array do pedido global $typenow, $wp_query;

// Se o tipo de post for diferente de film no faz nada if ( $typenow != 'film' ) return false;

// Imprime uma select box com todos os termos da taxonomia film_category wp_dropdown_categories(array( 'show_option_all' => 'taxonomy' 'name' 'orderby' 'selected' => => => => 'Mostrar tudo',

'film_category',

'film_category', 'name', $wp_query->query['term'], => 3, => => true, true, true,

'hierarchical' 'depth' 'show_count' 'hide_empty' ) ); } =>

Ao chamarmos a aco restrict_manage_posts com a nossa funo, temos a possibilidade de acrescentar HTML na zona de filtragem, no cabealho da tabela de listagem. Primeiro, caso o tipo de post no seja film a funo retorna sem continuar a sua atividade, assim apenas aplicamos este filtro nas pginas de listagem dos filmes. A funo wp_dropdown_categories responsvel pela impresso da dropdown das categorias da taxonomia passada como argumento, no nosso caso film_category. No me vou alongar mais sobre os argumentos desta funo, pois davam um artigo inteiro, porm deixo o link para estudo mais profundo.

Você também pode gostar