metadata_exists()
云策文档标注
概述
metadata_exists() 函数用于检查指定对象 ID 的元数据字段是否存在。它支持多种对象类型,如 'post'、'user'、'term' 等,并利用缓存机制优化性能。
关键要点
- 函数签名:metadata_exists( $meta_type, $object_id, $meta_key ),返回布尔值表示元字段是否存在
- 参数要求:$meta_type 必须为字符串(如 'blog'、'post'、'comment'、'term'、'user'),$object_id 必须为数字,$meta_key 必须为字符串
- 内部流程:先应用 get_{$meta_type}_metadata 过滤器,然后检查缓存,必要时更新缓存,最后判断元键是否存在
- 相关函数:与 update_meta_cache()、wp_cache_get()、absint()、apply_filters() 等协同工作
- 使用场景:常用于在获取元数据前检查其存在性,避免不必要的数据库查询
代码示例
// Check and get a term meta
if ( metadata_exists( 'term', $term_id, '_meta_key' ) ) {
$meta_value = get_term_meta( $term_id, '_meta_key', true );
}
// Check and get a post meta
if ( metadata_exists( 'post', $post_id, '_meta_key' ) ) {
$meta_value = get_post_meta( $post_id, '_meta_key', true );
}
// Check and get a user meta
if ( metadata_exists( 'user', $user_id, '_meta_key' ) ) {
$meta_value = get_user_meta( $user_id, '_meta_key', true );
}注意事项
- 函数自 WordPress 3.3.0 版本引入,兼容性良好
- 用户贡献笔记中提到关于下划线前缀元键的讨论,但官方文档未明确限制,建议以实际测试为准
- 注意参数验证:如果 $meta_type 为空或 $object_id 非数字,函数会直接返回 false
原文内容
Determines if a meta field with the given key exists for the given object ID.
Parameters
$meta_typestringrequired-
Type of object metadata is for. Accepts
'blog','post','comment','term','user', or any other object type with an associated meta table. $object_idintrequired-
ID of the object metadata is for.
$meta_keystringrequired-
Metadata key.
Source
function metadata_exists( $meta_type, $object_id, $meta_key ) {
if ( ! $meta_type || ! is_numeric( $object_id ) ) {
return false;
}
$object_id = absint( $object_id );
if ( ! $object_id ) {
return false;
}
/** This filter is documented in wp-includes/meta.php */
$check = apply_filters( "get_{$meta_type}_metadata", null, $object_id, $meta_key, true, $meta_type );
if ( null !== $check ) {
return (bool) $check;
}
$meta_cache = wp_cache_get( $object_id, $meta_type . '_meta' );
if ( ! $meta_cache ) {
$meta_cache = update_meta_cache( $meta_type, array( $object_id ) );
$meta_cache = $meta_cache[ $object_id ];
}
if ( isset( $meta_cache[ $meta_key ] ) ) {
return true;
}
return false;
}
Hooks
- apply_filters( “get_{$meta_type}_metadata”, mixed $value, int $object_id, string $meta_key, bool $single, string $meta_type )
-
Short-circuits the return value of a meta field.
Changelog
| Version | Description |
|---|---|
| 3.3.0 | Introduced. |
Skip to note 3 content
vutuansw
// Check and get a term meta if ( metadata_exists( 'term', $term_id, '_meta_key' ) ) { $meta_value = get_term_meta( $term_id, '_meta_key', true ); } // Check and get a post meta if ( metadata_exists( 'post', $post_id, '_meta_key' ) ) { $meta_value = get_post_meta( $post_id, '_meta_key', true ); } // Check and get a user meta if ( metadata_exists( 'user', $user_id, '_meta_key' ) ) { $meta_value = get_user_meta( $user_id, '_meta_key', true ); }Skip to note 4 content
tgiokdi
Please note that as of 2024 this function no longer supports meta keys that start with an underscore.