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 daregister_meta()
.auth_callback
, um método de callback para definir a autorização. Esta é a nova versão do quarto parâmetro daregister_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 umWP_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çãoget_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?