WordPress 3.0, novas funcionalidades (Parte II) – Custom Posts

A titulo de exemplo, imaginem que estão a trabalhar para uma empresa que pretende ter uma listagem de todos os seus colaboradores, com o seu nome, observações do cargo que ocupa, e-mail, naturalidade e respectiva extensão telefónica.

Até agora, teríamos de adicionar meta informação manualmente, ou então desenhar directamente no texto do post… Talvez até já tenha ouvido um colega seu dizer que basta um template diferente e um método “XPTO” para retornar meta-informação de um post ou as primeiras “X” linhas, ou até mesmo cair no erro de criar uma página estática com todas as fotografias dos colaboradores com links para outros posts, pois bem… estão errados

Com a versão 3.0 do WordPress isso já não é necessário! Usem Custom Posts!

Para Começar, teríamos de definir um novo tipo de post. Neste caso será o ”Person”

Adicionamos um callback para quando o WordPress inicializar, adicionar um novo tipo de Post

add_action('init', 'whos_who_init');

Logo de seguida, teremos de criar o método que atribui, cria, regista e interliga com todas as propriedades de um post:

function whos_who_init()
{
    $args = array(
            'label' => __('Persons'),
            'singular_label' => __('Person'),
            'public' => true,
            'show_ui' => true,
            'capability_type' => 'post',
            'hierarchical' => false,
            'rewrite' => array(
                    'slug' => 'whos'),  // Novo aliás para o Rewrite
            'supports' => array(
                    'title',
                    'editor',
                    'department',
                    'email',
                    'thumbnail',
                    'birthplace',
                    'extension'));//o supports serve para definir todos os campos que serão suportados pelo tipo de post, estes campos serão automaticamente adicionados ao WP_Query para efectuar listagens…

    /**
    *  Com o tipo de Post criado, teremos de o registar para o podermos usar
    */
    register_post_type('person', $args);

    /**
     * Para organizar todos os colaboradores por departamentos, teremos de adicionar uma nova relação pessoa -> departamento
     */
    register_taxonomy('department', array(
            'person'), array(
            'hierarchical' => true,
            'label' => 'Departments',
            'singular_label' => 'Department',
            'rewrite' => array(
                    'slug' => 'department')));
}

Depois de inicializado o tipo, e reconhecido pelo WordPress, chega a hora de facilitar a vida, criando uma box com um formulário especifico para o nosso tipo de Post.

Para isso, iremos adicionar um callback para quando o painel administrativo seja carregado para que seja invocado o método que cria uma nova box com o nosso formulário.

/**
 * Adicionamos uma meta box no post
 */
add_action('admin_init', 'whos_who_admin_init');
function whos_who_admin_init()
{
    add_meta_box('person-meta', 'Person Options', 'whos_who_meta_options', 'person', 'side', 'low');
}

/**
 * Conforme invocado anteriormente, o método fica responsável por desenhar um formulário bem como nós queremos!
 *
 */
function whos_who_meta_options()
{
    global $post;
    $custom = get_post_custom($post->ID);
    ?>
    <ul>
             <li><label><?php echo(__('Email')); ?>:</label><input name='email' value="<?php    echo $custom['email'][0];    ?>" /></li>
             <li><label><?php echo(__('Birthplace')); ?>:</label><input name='birthplace' value="<?php    echo $custom['birthplace'][0];    ?>" /></li>
             <li><label><?php echo(__('Extension')); ?>:</label><input name='extension' value="<?php    echo $custom['extension'][0];    ?>" /></li>
       </ul>
<?php
}

Já temos o nosso novo tipo de post e o formulário especifico!

E agora?

…Agora temos de tratar toda a nossa meta-informação, por isso, adicionamos um callback para quando os dados do formulário forem guardados:


/**
 * Define-se um callback para o evento "guardar post"
 */
add_action('save_post', 'save_whos_who_meta');
/**
 * Este método encarrega-se de guardar toda a meta informação de um post
 *
 */
function save_whos_who_meta()
{
    global $post;
    update_post_meta($post->ID, 'email', $_POST['email']);
    update_post_meta($post->ID, 'birthplace', $_POST['birthplace']);
    update_post_meta($post->ID, 'extension', $_POST['extension']);
}

Para facilitar a vida do administrador quando lista no painel administrativo todos os colaboradores, iremos mostrar somente as colunas que nos interessam.

Para isso, adicionamos um filtro para as colunas da listagem:

/**
 * Definimos quais as colunas a serem apresentadas
 */
add_filter('manage_edit_whos_who_columns', 'whos_who_edit_columns');
function whos_who_edit_columns($columns)
{
    $columns = array(
            'cb' => '<input type="checkbox" />',
            'title' => 'Person Title',
            'description' => 'Description',
            'email' => 'Email',
            'department' => 'Department',
            'birthplace' => 'Birthplace',
            'extension' => 'Extension');

    return $columns;
}
/**
 * Invoca-se o método que se encarrega de definir quais as colunas a serem mostradas numa listagem
 */
add_filter('manage_posts_columns', 'whos_who_add_custom_column');

function whos_who_add_custom_column($defaults)
{
    /**
     * Para evitar partir todas as outras listagens, vamos verificar se o tipo do post que está a ser iterado é do tipo que queremos...
     */
    if (get_post_type() == 'person')
    {
        $defaults['department'] = __('Department'); //Nome do departamento
        $defaults['email'] = __('Email'); //Extensão telefónica
        $defaults['birthplace'] = __('Birthplace'); //Data de Nascimento
        $defaults['extension'] = __('Extension'); //Extensão telefónica
        unset($defaults['date']); //não quero a data de alteração  na listagem
        unset($defaults['author']); //não quero o outor do post na listagem

    }
    return $defaults;
}

Neste momento, poderão observar que apenas são mostradas as colunas que definimos mas sem qualquer conteúdo, por isso temos de adicionar um callback para quando o engine estiver a iterar os colaboradores e passar por uma das nossas meta-informações, retorná-las, para assim serem visíveis.

add_action('manage_posts_custom_column', 'whos_who_custom_columns');
/**
 * Este método irá servir como callback na iteração de cada post no painel administrativo
 *
 * @param array $column
 */
function whos_who_custom_columns($column)
{
    global $post;
    switch ($column)
    {
        case 'email':
            $custom = get_post_custom();
            echo $custom['email'][0];
            break;
        case 'birthplace':
            $custom = get_post_custom();
            echo $custom['birthplace'][0];
            break;
        case 'extension':
            $custom = get_post_custom();
            echo $custom['extension'][0];
            break;
        case 'department':
            /**
             * Como um empregado pode estar em mais de um departamento, vamos então listar tudo direitinho!
             */
            $sOutput = array();
            $aDepartments = get_the_terms($post->ID, 'department');
            if ($aDepartments)
            {
                foreach ( $aDepartments as $department )
                {
                    $sOutput[] = $department->name;
                }
            }
            echo (implode(',', $sOutput));
            break;
        default:
            //pode sempre adicionar outras opções...
            break;
    }
}

E pronto, fica uma listagem mais ou menos assim:

Espero ter ajudado com este tutorial!

No próximo tutorial irei falar sobre os menus!

15 pensamentos sobre “WordPress 3.0, novas funcionalidades (Parte II) – Custom Posts

    1. Claro que irei continuar!

      Caso não tenham reparado estou a lançar um artigo por semana, espero conseguir manter o ritmo e ter sempre uma “horinha” para poder continuar a ajudar-vos!

      Obrigado pelo apoio ninja_corp!

    1. Obrigado Caio!
      Se surgir alguma duvida no processo de migração estarei sempre disponível no suporte WordPress Portugal 🙂

    1. Obrigado pelo comentário Vitor M. Costa! Estive a ver o video desse plugin muito rapidamente e acho (note-se que ainda não experimentei) que só deixa colocar os valores por defeito do engine, ou seja, titulo, excerto meta info etc, e este tutorial mostra como fazer algo totalmente personalizável sem ter de andar a colocar “a mão” na meta informação. De qualquer das formas, pelo que vi acho um plugin bastante útil para quem pretende unicamente diferenciar posts em vários tipos de posts 🙂

    1. Obrigado eu pelo teu comentário!

      Caso queiras ver / saber mais sobre algum tema especifico aqui no wp-portugal é só pedir^^

Leave a Reply