A partir da versão 4.4 o WordPress passou a aceitar o recurso de meta dados para os Termos. Com isso uma determinada categoria, tag ou mesmo taxonomia personalizada pode receber e armazenar informações complementares a ela de maneira simplificada e seguindo o método de trabalho dos posts, comentários e usuários que já possuíam tal recurso dos campos meta.

Para fazer uso desse recurso e gerenciar as informações da nova tabela wp_termmeta, o procedimento é similar as demais tabelas e suas auxiliares; o WordPress oferece as funções add, update, delete e get para adicionar, atualizar, remover e obter os valores do banco de dados.

add_term_meta

Função usada para inserir um novo meta dado aos termos. Se o parâmetro $unique for verdadeiro não adiciona outra chave caso ela já exista no banco de dados.

// declaração da função:
// add_term_meta( int $term_id, string $meta_key, mixed $meta_value, bool $unique = false )
// para adicionar o meta dado 'campo' com valor 'Teste' ao termo com identificador igual a 1 use:
add_term_meta( 1, 'campo', 'Teste' );

update_term_meta

Altera um meta dado dos termos. Se o parâmetro $prev_value for definido, a função altera o valor do registro apenas onde o valor em banco de dados seja igual ao valor informado nesse parâmetro.

// declaração da função:
// update_term_meta( int $term_id, string $meta_key, mixed $meta_value, mixed $prev_value = '' )
// para atualizar o valor da chave 'campo' informado acima
update_term_meta( 1, 'campo', 'Teste atualizado' );

get_term_meta

Para recuperar um ou mais registros de wp_termmeta usa-se a função get_term_meta. Caso o parâmetro $single seja verdadeiro a função retorna o último valor adicionado com a chave passada, do contrário traz um array com todos os registros que possuem a tal chave, meta_key.

// declaração da função:
// get_term_meta( int $term_id, string $key = '', bool $single = false )
// exibindo o valor do metadado com a chave 'campo' do mesmo termo de exemplo
echo get_term_meta( 1, 'campo', true );

delete_term_meta

Quando é preciso remover um meta dado dos termos essa função é utilizada. A função remove do banco de dados todos os registros que possuam a chave definida no parâmetro $meta_key. Caso o parâmetro $meta_value seja informado, a função remove apenas o registro cujo valor em banco de dados seja igual ao valor definido nesse parâmetro.

// declaração da função:
// delete_term_meta( int $term_id, string $meta_key, mixed $meta_value = '' )
// para apagar o meta dado com a chave 'campo'
delete_term_meta( 1, 'campo' );

Campos personalizados para os Termos

Por padrão o sistema traz registrado os termos Categorias e Tags, ambos para o tipo de post Post. Por isso o exemplo que segue fará uso de um desses tipos, especificamente o termo com a taxonomia Categoria.  Será criada uma classe em formato de plugin para criar essa funcionalidade, em um arquivo único mesmo.

<?php

// Plugin Name: Subtítulo para as Categorias

class Term_Field
{
    public static function setup()
    {
        // função de setup do plugin
    }
}

add_action( 'plugins_loaded', array( 'Term_Field', 'setup' ) );

define( 'TAX_SLUG', 'category' );

Primeiramente para a inserção do campo logo na tela de cadastro das categorias é preciso acrescentar o campo que se deseja ao formulário existente. Dentro do método de configuração setup, será acrescentado o gancho que permite tal incorporação; e em seu callback será exibido o novo campo.

    public static function setup()
    {
        add_action( TAX_SLUG . '_add_form_fields',  array( 'Term_Field', 'edit' ) );
    }
    public static function edit()
    {
        $subtitle = '';
        $label = '<label for="subtitle">Subtítulo</label>';
        $field = sprintf(
            '<input id="subtitle" name="_subtitle" type="text" value="%s">', $subtitle
        );
        printf(
            '<tr class="form-field"><th>%s</th><td>%s</td>&lt/tr>',
            $label, $field
        );
    }

Adicionar categoria com um novo campo personalizado

Uma vez que o campo fora adicionado com ‘category_add_form_fields’, é preciso processar o seu envio quando uma nova categoria é adicionada ao WordPress. O gancho a ser utilizado será  o ‘created_category’.

    public static function setup()
    {
        add_action( TAX_SLUG . '_add_form_fields',  array( 'Term_Field', 'edit' ) );
        add_action( 'created_' . TAX_SLUG,  array( 'Term_Field', 'save' ) );
    }

    public static function save( $term_id )
    {
        $subtitle = ( isset( $_POST[ '_subtitle' ] ) ) ?
            sanitize_text_field( $_POST[ '_subtitle' ] ) : false;

        if ( $subtitle ) {
            update_term_meta( $term_id, '_subtitle', $subtitle );
        } else {
            delete_term_meta( $term_id, '_subtitle' );
        }
    }

Com o método save recebendo o identificador do termo é possível realizar a interação com banco de dados utilizando as funções da Metadata API apresentadas anteriormente. Quando um meta dado específico não existe no MySQL, a função update_term_meta cria um novo registro; por isso a simplificação do código como demonstrado. Se o valor do campo foi submetido cria ou atualiza o valor na base de dados, do contrário o remove.

Edição do campo personalizado da Categoria

Para finalizar o gerenciamento desse campo personalizado para as categorias, é preciso permitir também sua edição. Antes foi criado o campo no momento da inserção, agora você pode reaproveitar esse mesmo método edit para inserir o campo para edição. Quando uma categoria for editada o mesmo método save pode ser disparado também, no entanto sem ajustes nesse. Segue o código completo do plugin.

<?php

// Plugin Name: Subtítulo para as Categorias

class Term_Field
{

    public static function setup()
    {
        add_action( TAX_SLUG . '_add_form_fields',  array( 'Term_Field', 'edit' ) );
        add_action( TAX_SLUG . '_edit_form_fields', array( 'Term_Field', 'edit' ) );

        add_action( 'created_' . TAX_SLUG,  array( 'Term_Field', 'save' ) );
        add_action( 'edit_' . TAX_SLUG,     array( 'Term_Field', 'save' ) );
    }

    public static function edit( $term )
    {
        $term_id = ( is_a( $term, 'WP_Term' ) ) ?
            $term->term_id : false;
        $subtitle = ( $term_id ) ?
            get_term_meta( $term_id, '_subtitle', true ) : '';

        $label = '<label for="subtitle">Subtítulo</label>';
        $field = sprintf(
            '<input type="text" name="_subtitle" id="subtitle" value="%s">', $subtitle
        );
        if ( !$term_id ) {
            printf(
                '<div class="form-field"><p>%s</p><p>%s</p></div>',
                $label, $field
            );
        } else {
            printf(
                '<tr class="form-field"><th>%s</th><td>%s</td></tr>',
                $label, $field
            );
        }
    }

    public static function save( $term_id )
    {
        $subtitle = ( isset( $_POST[ '_subtitle' ] ) ) ?
            sanitize_text_field( $_POST[ '_subtitle' ] ) : false;

        if ( $subtitle ) {
            update_term_meta( $term_id, '_subtitle', $subtitle );
        } else {
            delete_term_meta( $term_id, '_subtitle' );
        }
    }

}

add_action( 'plugins_loaded', array( 'Term_Field', 'setup' ) );

define( 'TAX_SLUG', 'category' );

Quando o método edit é disparado na edição da categoria ele traz consigo a instância daquela categoria como parâmetro do gancho. A partir disso é possível recuperar o valor do campo personalizado e exibí-lo em tela. A escolha de quais tags HTML seriam exibidas foi feita para manter a exibição padrão do WordPress, mantendo assim a aparência e responsividade do recurso também.

Clique aqui para fazer o download da classe Term_Field