_block_bindings_post_data_get_value()
云策文档标注
概述
_block_bindings_post_data_get_value() 是 WordPress 中用于从 Post Data 源获取值的函数,主要处理块绑定中的文章数据。它根据参数和块实例计算并返回相应的值,支持多种字段类型,并包含向后兼容性和安全性检查。
关键要点
- 函数接受两个参数:$source_args(数组,包含字段参数)和 $block_instance(WP_Block 实例),返回混合类型的值。
- 支持字段包括 'field' 或 'key'(向后兼容),用于指定要获取的文章数据字段。
- 针对导航块(如 'core/navigation-link' 和 'core/navigation-submenu')有特殊处理,从块属性中获取 post_id,其他块则从上下文中获取。
- 包含安全性检查:如果文章非公开且用户无读取权限,或文章受密码保护,则返回 null。
- 支持特定字段处理:'date' 返回文章发布日期,'modified' 仅在修改日期晚于发布日期时返回修改日期,'link' 返回文章永久链接。
- 函数在 WordPress 6.9.0 版本中引入。
代码示例
_block_bindings_post_data_get_value( array( "field" => "foo" ), $block_instance )注意事项
- 确保 $source_args 中包含 'field' 或 'key' 参数,否则可能返回 null。
- 对于导航块,post_id 从块属性中读取,这有助于在 WordPress 6.9+ 中保持兼容性。
- 函数会进行权限和可见性检查,开发者需注意这些安全机制以避免数据泄露。
原文内容
Gets value for Post Data source.
Parameters
$source_argsarrayrequired-
Array containing arguments used to look up the source value.
Example: array( “field” => “foo” ). $block_instanceWP_Blockrequired-
The block instance.
Source
function _block_bindings_post_data_get_value( array $source_args, $block_instance ) {
if ( empty( $source_args['field'] ) ) {
// Backward compatibility for when the source argument was called `key` in Gutenberg plugin.
if ( empty( $source_args['key'] ) ) {
return null;
}
$field = $source_args['key'];
} else {
$field = $source_args['field'];
}
/*
* BACKWARDS COMPATIBILITY: Hardcoded exception for navigation blocks.
* Required for WordPress 6.9+ navigation blocks. DO NOT REMOVE.
*/
$block_name = $block_instance->name ?? '';
$is_navigation_block = in_array(
$block_name,
array( 'core/navigation-link', 'core/navigation-submenu' ),
true
);
if ( $is_navigation_block ) {
// Navigation blocks: read from block attributes.
$post_id = $block_instance->attributes['id'] ?? null;
} else {
// All other blocks: use context.
$post_id = $block_instance->context['postId'] ?? null;
}
// If we don't have an entity ID, bail early.
if ( empty( $post_id ) ) {
return null;
}
// If a post isn't public, we need to prevent unauthorized users from accessing the post data.
$post = get_post( $post_id );
if ( ( ! is_post_publicly_viewable( $post ) && ! current_user_can( 'read_post', $post_id ) ) || post_password_required( $post ) ) {
return null;
}
if ( 'date' === $field ) {
return esc_attr( get_the_date( 'c', $post_id ) );
}
if ( 'modified' === $field ) {
// Only return the modified date if it is later than the publishing date.
if ( get_the_modified_date( 'U', $post_id ) > get_the_date( 'U', $post_id ) ) {
return esc_attr( get_the_modified_date( 'c', $post_id ) );
} else {
return '';
}
}
if ( 'link' === $field ) {
$permalink = get_permalink( $post_id );
return false === $permalink ? null : esc_url( $permalink );
}
}
Changelog
| Version | Description |
|---|---|
| 6.9.0 | Introduced. |