123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216 |
- <?php
- /**
- * Blocks API: WP_Block_Type class
- *
- * @package WordPress
- * @subpackage Blocks
- * @since 5.0.0
- */
- /**
- * Core class representing a block type.
- *
- * @since 5.0.0
- *
- * @see register_block_type()
- */
- class WP_Block_Type {
- /**
- * Block type key.
- *
- * @since 5.0.0
- * @var string
- */
- public $name;
- /**
- * Block type render callback.
- *
- * @since 5.0.0
- * @var callable
- */
- public $render_callback;
- /**
- * Block type attributes property schemas.
- *
- * @since 5.0.0
- * @var array
- */
- public $attributes;
- /**
- * Block type editor script handle.
- *
- * @since 5.0.0
- * @var string
- */
- public $editor_script;
- /**
- * Block type front end script handle.
- *
- * @since 5.0.0
- * @var string
- */
- public $script;
- /**
- * Block type editor style handle.
- *
- * @since 5.0.0
- * @var string
- */
- public $editor_style;
- /**
- * Block type front end style handle.
- *
- * @since 5.0.0
- * @var string
- */
- public $style;
- /**
- * Constructor.
- *
- * Will populate object properties from the provided arguments.
- *
- * @since 5.0.0
- *
- * @see register_block_type()
- *
- * @param string $block_type Block type name including namespace.
- * @param array|string $args Optional. Array or string of arguments for registering a block type.
- * Default empty array.
- */
- public function __construct( $block_type, $args = array() ) {
- $this->name = $block_type;
- $this->set_props( $args );
- }
- /**
- * Renders the block type output for given attributes.
- *
- * @since 5.0.0
- *
- * @param array $attributes Optional. Block attributes. Default empty array.
- * @param string $content Optional. Block content. Default empty string.
- * @return string Rendered block type output.
- */
- public function render( $attributes = array(), $content = '' ) {
- if ( ! $this->is_dynamic() ) {
- return '';
- }
- $attributes = $this->prepare_attributes_for_render( $attributes );
- return (string) call_user_func( $this->render_callback, $attributes, $content );
- }
- /**
- * Returns true if the block type is dynamic, or false otherwise. A dynamic
- * block is one which defers its rendering to occur on-demand at runtime.
- *
- * @since 5.0.0
- *
- * @return boolean Whether block type is dynamic.
- */
- public function is_dynamic() {
- return is_callable( $this->render_callback );
- }
- /**
- * Validates attributes against the current block schema, populating
- * defaulted and missing values.
- *
- * @since 5.0.0
- *
- * @param array $attributes Original block attributes.
- * @return array Prepared block attributes.
- */
- public function prepare_attributes_for_render( $attributes ) {
- // If there are no attribute definitions for the block type, skip
- // processing and return vebatim.
- if ( ! isset( $this->attributes ) ) {
- return $attributes;
- }
- foreach ( $attributes as $attribute_name => $value ) {
- // If the attribute is not defined by the block type, it cannot be
- // validated.
- if ( ! isset( $this->attributes[ $attribute_name ] ) ) {
- continue;
- }
- $schema = $this->attributes[ $attribute_name ];
- // Validate value by JSON schema. An invalid value should revert to
- // its default, if one exists. This occurs by virtue of the missing
- // attributes loop immediately following. If there is not a default
- // assigned, the attribute value should remain unset.
- $is_valid = rest_validate_value_from_schema( $value, $schema );
- if ( is_wp_error( $is_valid ) ) {
- unset( $attributes[ $attribute_name ] );
- }
- }
- // Populate values of any missing attributes for which the block type
- // defines a default.
- $missing_schema_attributes = array_diff_key( $this->attributes, $attributes );
- foreach ( $missing_schema_attributes as $attribute_name => $schema ) {
- if ( isset( $schema['default'] ) ) {
- $attributes[ $attribute_name ] = $schema['default'];
- }
- }
- return $attributes;
- }
- /**
- * Sets block type properties.
- *
- * @since 5.0.0
- *
- * @param array|string $args Array or string of arguments for registering a block type.
- */
- public function set_props( $args ) {
- $args = wp_parse_args(
- $args,
- array(
- 'render_callback' => null,
- )
- );
- $args['name'] = $this->name;
- foreach ( $args as $property_name => $property_value ) {
- $this->$property_name = $property_value;
- }
- }
- /**
- * Get all available block attributes including possible layout attribute from Columns block.
- *
- * @since 5.0.0
- *
- * @return array Array of attributes.
- */
- public function get_attributes() {
- return is_array( $this->attributes ) ?
- array_merge(
- $this->attributes,
- array(
- 'layout' => array(
- 'type' => 'string',
- ),
- )
- ) :
- array(
- 'layout' => array(
- 'type' => 'string',
- ),
- );
- }
- }
|