class WP_Widget_Block {}

Core class used to implement a Block widget.

Description

See also

Methods

NameDescription
WP_Widget_Block::__constructSets up a new Block widget instance.
WP_Widget_Block::formOutputs the Block widget settings form.
WP_Widget_Block::get_dynamic_classnameCalculates the classname to use in the block widget’s container HTML.
WP_Widget_Block::set_is_wide_widget_in_customizerMakes sure no block widget is considered to be wide.
WP_Widget_Block::updateHandles updating settings for the current Block widget instance.
WP_Widget_Block::widgetOutputs the content for the current Block widget instance.

Source

class WP_Widget_Block extends WP_Widget {	/** * Default instance. * * @since 5.8.0 * @var array */	protected $default_instance = array(	'content' => '',	);	/** * Sets up a new Block widget instance. * * @since 5.8.0 */	public function __construct() {	$widget_ops = array(	'classname' => 'widget_block',	'description' => __( 'A widget containing a block.' ),	'customize_selective_refresh' => true,	'show_instance_in_rest' => true,	);	$control_ops = array(	'width' => 400,	'height' => 350,	);	parent::__construct( 'block', __( 'Block' ), $widget_ops, $control_ops );	add_filter( 'is_wide_widget_in_customizer', array( $this, 'set_is_wide_widget_in_customizer' ), 10, 2 );	}	/** * Outputs the content for the current Block widget instance. * * @since 5.8.0 * * @param array $args Display arguments including 'before_title', 'after_title', * 'before_widget', and 'after_widget'. * @param array $instance Settings for the current Block widget instance. */	public function widget( $args, $instance ) {	$instance = wp_parse_args( $instance, $this->default_instance );	echo str_replace(	'widget_block',	$this->get_dynamic_classname( $instance['content'] ),	$args['before_widget']	);	/** * Filters the content of the Block widget before output. * * @since 5.8.0 * * @param string $content The widget content. * @param array $instance Array of settings for the current widget. * @param WP_Widget_Block $widget Current Block widget instance. */	echo apply_filters(	'widget_block_content',	$instance['content'],	$instance,	$this	);	echo $args['after_widget'];	}	/** * Calculates the classname to use in the block widget's container HTML. * * Usually this is set to `$this->widget_options['classname']` by * dynamic_sidebar(). In this case, however, we want to set the classname * dynamically depending on the block contained by this block widget. * * If a block widget contains a block that has an equivalent legacy widget, * we display that legacy widget's class name. This helps with theme * backwards compatibility. * * @since 5.8.0 * * @param string $content The HTML content of the current block widget. * @return string The classname to use in the block widget's container HTML. */	private function get_dynamic_classname( $content ) {	$blocks = parse_blocks( $content );	$block_name = isset( $blocks[0] ) ? $blocks[0]['blockName'] : null;	switch ( $block_name ) {	case 'core/paragraph':	$classname = 'widget_block widget_text';	break;	case 'core/calendar':	$classname = 'widget_block widget_calendar';	break;	case 'core/search':	$classname = 'widget_block widget_search';	break;	case 'core/html':	$classname = 'widget_block widget_custom_html';	break;	case 'core/archives':	$classname = 'widget_block widget_archive';	break;	case 'core/latest-posts':	$classname = 'widget_block widget_recent_entries';	break;	case 'core/latest-comments':	$classname = 'widget_block widget_recent_comments';	break;	case 'core/tag-cloud':	$classname = 'widget_block widget_tag_cloud';	break;	case 'core/categories':	$classname = 'widget_block widget_categories';	break;	case 'core/audio':	$classname = 'widget_block widget_media_audio';	break;	case 'core/video':	$classname = 'widget_block widget_media_video';	break;	case 'core/image':	$classname = 'widget_block widget_media_image';	break;	case 'core/gallery':	$classname = 'widget_block widget_media_gallery';	break;	case 'core/rss':	$classname = 'widget_block widget_rss';	break;	default:	$classname = 'widget_block';	}	/** * The classname used in the block widget's container HTML. * * This can be set according to the name of the block contained by the block widget. * * @since 5.8.0 * * @param string $classname The classname to be used in the block widget's container HTML, * e.g. 'widget_block widget_text'. * @param string $block_name The name of the block contained by the block widget, * e.g. 'core/paragraph'. */	return apply_filters( 'widget_block_dynamic_classname', $classname, $block_name );	}	/** * Handles updating settings for the current Block widget instance. * * @since 5.8.0 * @param array $new_instance New settings for this instance as input by the user via * WP_Widget::form(). * @param array $old_instance Old settings for this instance. * @return array Settings to save or bool false to cancel saving. */	public function update( $new_instance, $old_instance ) {	$instance = array_merge( $this->default_instance, $old_instance );	if ( current_user_can( 'unfiltered_html' ) ) {	$instance['content'] = $new_instance['content'];	} else {	$instance['content'] = wp_kses_post( $new_instance['content'] );	}	return $instance;	}	/** * Outputs the Block widget settings form. * * @since 5.8.0 * * @see WP_Widget_Custom_HTML::render_control_template_scripts() * * @param array $instance Current instance. */	public function form( $instance ) {	$instance = wp_parse_args( (array) $instance, $this->default_instance );	?>	<p>	<label for="<?php echo $this->get_field_id( 'content' ); ?>">	<?php	/* translators: HTML code of the block, not an option that blocks HTML. */	_e( 'Block HTML:' );	?>	</label>	<textarea id="<?php echo $this->get_field_id( 'content' ); ?>" name="<?php echo $this->get_field_name( 'content' ); ?>" rows="6" cols="50" class="widefat code"><?php echo esc_textarea( $instance['content'] ); ?></textarea>	</p>	<?php	}	/** * Makes sure no block widget is considered to be wide. * * @since 5.8.0 * * @param bool $is_wide Whether the widget is considered wide. * @param string $widget_id Widget ID. * @return bool Updated `is_wide` value. */	public function set_is_wide_widget_in_customizer( $is_wide, $widget_id ) {	if ( str_starts_with( $widget_id, 'block-' ) ) {	return false;	}	return $is_wide;	} } 

Changelog

VersionDescription
5.8.0Introduced.

User Contributed Notes

You must log in before being able to contribute a note or feedback.