Register_meta: novidades da função no WordPress 4.6

0
register_meta

O WordPress possui filtros que possibilitam sanitizar e definir permissões para seus post metas customizados desde a versão 3.3. Isso pode ser através da função register_meta.

Register_meta antes da versão 4.6

Até então utilizávamos essa função da seguinte maneira:

<?php

add_action( 'init', 'register_example' );

function register_example() {
   register_meta(
     'post', 
     'example_meta_key',
     'sanitize_example', 
     'auth_example'
   );
}

function sanitize_example( $meta_value, $meta_key, $meta_type ) {
    return absint( $meta_value );
}

function auth_example( $allowed, $meta_key, $post_ID ) {
    if ( ! current_user_can( 'edit_others_posts' ) ) {
       $allowed = false;
    }

    return $allowed;
}

?>

4.6

Antes de mais nada, vale ressaltar que o código acima continuará funcionando na versão 4.6, embora não será considerado integralmente registrado. Os callbacks serão registrados, entretanto as meta_keys não serão adicionadas ao registro global. Um objeto WP_Error será devolvido com esta explicação. Logo abaixo vamos entender isso.

Mas o que mudou na prática?

A partir de agora existe uma global com todas as meta_keys registradas, seu nome é $wp_meta_keys. Registrando as meta_keys da maneira que fizemos no exemplo acima elas não serão adicionadas dentro dessa global.

A assinatura da função de register_meta() mudou para suportar 3 argumentos, sendo o último um array que aceita os seguintes parâmetros:

  • sanitize_callback, um método de callback para sanitizar o valor. Esta é a nova versão do terceiro parâmetro na atual versão da register_meta().
  • auth_callback, um método de callback para definir a autorização. Esta é a nova versão do quarto parâmetro da register_meta().
  • object_subtype, uma string contendo o subtipo do objeto. Se não houver o subtipo do objeto, o meta não será registrado e um WP_Error será retornado.
  • type,  uma string indicando qual o tipo de dado do valor a ser salvo. (e.g. boolean, integer)
  • description, uma string contendo uma breve descrição do valor a ser salvo.
  • single, define se o código para recuperar essa meta_key deve esperar um valor único e vários resultados quando usar, por exemplo, a função get_post_meta().
  • show_in_rest, define se deve ser exibido nos endpoints da WordPress REST API. Note que isto deve ser tratado como experimental até que a WordPress REST API forneça suporte para metadados.
<?php
$args = array(
    'object_subtype'    => 'post',
    'sanitize_callback' => 'sanitize_my_meta_key',
    'auth_callback'     => 'authorize_my_meta_key',
    'type'              => 'string',
    'description'       => 'My registered meta key',
    'single'            => true,
    'show_in_rest'      => true,
);
register_meta( 'post', 'my_meta_key', $args );
?>

Você precisa saber…

Por padrão, apenas os tipos principais de objeto WordPress (post, user, term, comment) podem ser registrados. Para adicionar suporte para tipos de objetos personalizados, use o filtro wp_object_types.

Object Subtypes (subtipos de objeto) fornecem um registro específico meta_keys a um tipo de dados.

  • Um post padrão tem um tipo de objeto “post” e um subtipo de objeto  “post”.
  • Um tipo de post personalizado registrado com slug  “my_cpt” tem um tipo de objeto “post” e um subtipo de objeto “my_cpt”.
  • Um usuário tem um tipo de objeto  “user” e um subtipo de objeto  “user”.
  • Um comentário padrão tem um tipo de objeto “comment” e um subtipo de objeto “comment”.
  • Um termo de categoria padrão tem um tipo de objeto “term” e um subtipo de objeto “category”.
  • A taxonomia personalizada registrada com slug “my_tax” tem um tipo de objeto “term” e um subtipo de objeto “my_tax”.

As meta_keys devem ser explicitamente registradas para cada tipo de objeto e combinação de subtipo.

Manipulando meta_keys registradas

Para auxiliar a tarefa de consultar/manipular as meta_keys registradas na global $wp_meta_keys foram adicionadas novas funções:

  • get_registered_metadata()
  • get_registered_meta_keys()
  • unregister_meta()
  • registered_meta_key_exists()

As modificações na função register_meta provê aos desenvolvedores de temas e plugins um leque muito grande de possibilidades a serem exploradas.

Pronto para desfrutar de todos os recursos que o WordPress 4.6 tem a oferecer?