函数文档

_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.

Return

mixed The value computed for the source.

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.