[ Index ] |
PHP Cross Reference of WordPress |
[Summary view] [Print] [Text view]
1 <?php 2 /** 3 * Widget API: WP_Widget_Block class 4 * 5 * @package WordPress 6 * @subpackage Widgets 7 * @since 5.8.0 8 */ 9 10 /** 11 * Core class used to implement a Block widget. 12 * 13 * @since 5.8.0 14 * 15 * @see WP_Widget 16 */ 17 class WP_Widget_Block extends WP_Widget { 18 19 /** 20 * Default instance. 21 * 22 * @since 5.8.0 23 * @var array 24 */ 25 protected $default_instance = array( 26 'content' => '', 27 ); 28 29 /** 30 * Sets up a new Block widget instance. 31 * 32 * @since 5.8.0 33 */ 34 public function __construct() { 35 $widget_ops = array( 36 'classname' => 'widget_block', 37 'description' => __( 'A widget containing a block.' ), 38 'customize_selective_refresh' => true, 39 'show_instance_in_rest' => true, 40 ); 41 $control_ops = array( 42 'width' => 400, 43 'height' => 350, 44 ); 45 parent::__construct( 'block', __( 'Block' ), $widget_ops, $control_ops ); 46 47 add_filter( 'is_wide_widget_in_customizer', array( $this, 'set_is_wide_widget_in_customizer' ), 10, 2 ); 48 } 49 50 /** 51 * Outputs the content for the current Block widget instance. 52 * 53 * @since 5.8.0 54 * 55 * @param array $args Display arguments including 'before_title', 'after_title', 56 * 'before_widget', and 'after_widget'. 57 * @param array $instance Settings for the current Block widget instance. 58 */ 59 public function widget( $args, $instance ) { 60 $instance = wp_parse_args( $instance, $this->default_instance ); 61 62 echo str_replace( 63 'widget_block', 64 $this->get_dynamic_classname( $instance['content'] ), 65 $args['before_widget'] 66 ); 67 68 /** 69 * Filters the content of the Block widget before output. 70 * 71 * @since 5.8.0 72 * 73 * @param string $content The widget content. 74 * @param array $instance Array of settings for the current widget. 75 * @param WP_Widget_Block $widget Current Block widget instance. 76 */ 77 echo apply_filters( 78 'widget_block_content', 79 $instance['content'], 80 $instance, 81 $this 82 ); 83 84 echo $args['after_widget']; 85 } 86 87 /** 88 * Calculates the classname to use in the block widget's container HTML. 89 * 90 * Usually this is set to `$this->widget_options['classname']` by 91 * dynamic_sidebar(). In this case, however, we want to set the classname 92 * dynamically depending on the block contained by this block widget. 93 * 94 * If a block widget contains a block that has an equivalent legacy widget, 95 * we display that legacy widget's class name. This helps with theme 96 * backwards compatibility. 97 * 98 * @since 5.8.0 99 * 100 * @param string $content The HTML content of the current block widget. 101 * @return string The classname to use in the block widget's container HTML. 102 */ 103 private function get_dynamic_classname( $content ) { 104 $blocks = parse_blocks( $content ); 105 106 $block_name = isset( $blocks[0] ) ? $blocks[0]['blockName'] : null; 107 108 switch ( $block_name ) { 109 case 'core/paragraph': 110 $classname = 'widget_block widget_text'; 111 break; 112 case 'core/calendar': 113 $classname = 'widget_block widget_calendar'; 114 break; 115 case 'core/search': 116 $classname = 'widget_block widget_search'; 117 break; 118 case 'core/html': 119 $classname = 'widget_block widget_custom_html'; 120 break; 121 case 'core/archives': 122 $classname = 'widget_block widget_archive'; 123 break; 124 case 'core/latest-posts': 125 $classname = 'widget_block widget_recent_entries'; 126 break; 127 case 'core/latest-comments': 128 $classname = 'widget_block widget_recent_comments'; 129 break; 130 case 'core/tag-cloud': 131 $classname = 'widget_block widget_tag_cloud'; 132 break; 133 case 'core/categories': 134 $classname = 'widget_block widget_categories'; 135 break; 136 case 'core/audio': 137 $classname = 'widget_block widget_media_audio'; 138 break; 139 case 'core/video': 140 $classname = 'widget_block widget_media_video'; 141 break; 142 case 'core/image': 143 $classname = 'widget_block widget_media_image'; 144 break; 145 case 'core/gallery': 146 $classname = 'widget_block widget_media_gallery'; 147 break; 148 case 'core/rss': 149 $classname = 'widget_block widget_rss'; 150 break; 151 default: 152 $classname = 'widget_block'; 153 } 154 155 /** 156 * The classname used in the block widget's container HTML. 157 * 158 * This can be set according to the name of the block contained by the block widget. 159 * 160 * @since 5.8.0 161 * 162 * @param string $classname The classname to be used in the block widget's container HTML, 163 * e.g. 'widget_block widget_text'. 164 * @param string $block_name The name of the block contained by the block widget, 165 * e.g. 'core/paragraph'. 166 */ 167 return apply_filters( 'widget_block_dynamic_classname', $classname, $block_name ); 168 } 169 170 /** 171 * Handles updating settings for the current Block widget instance. 172 * 173 * @since 5.8.0 174 175 * @param array $new_instance New settings for this instance as input by the user via 176 * WP_Widget::form(). 177 * @param array $old_instance Old settings for this instance. 178 * @return array Settings to save or bool false to cancel saving. 179 */ 180 public function update( $new_instance, $old_instance ) { 181 $instance = array_merge( $this->default_instance, $old_instance ); 182 183 if ( current_user_can( 'unfiltered_html' ) ) { 184 $instance['content'] = $new_instance['content']; 185 } else { 186 $instance['content'] = wp_kses_post( $new_instance['content'] ); 187 } 188 189 return $instance; 190 } 191 192 /** 193 * Outputs the Block widget settings form. 194 * 195 * @since 5.8.0 196 * 197 * @see WP_Widget_Custom_HTML::render_control_template_scripts() 198 * 199 * @param array $instance Current instance. 200 */ 201 public function form( $instance ) { 202 $instance = wp_parse_args( (array) $instance, $this->default_instance ); 203 ?> 204 <p> 205 <label for="<?php echo $this->get_field_id( 'content' ); ?>"> 206 <?php 207 /* translators: HTML code of the block, not an option that blocks HTML. */ 208 _e( 'Block HTML:' ); 209 ?> 210 </label> 211 <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> 212 </p> 213 <?php 214 } 215 216 /** 217 * Makes sure no block widget is considered to be wide. 218 * 219 * @since 5.8.0 220 * 221 * @param bool $is_wide Whether the widget is considered wide. 222 * @param string $widget_id Widget ID. 223 * @return bool Updated `is_wide` value. 224 */ 225 public function set_is_wide_widget_in_customizer( $is_wide, $widget_id ) { 226 if ( strpos( $widget_id, 'block-' ) === 0 ) { 227 return false; 228 } 229 230 return $is_wide; 231 } 232 }
title
Description
Body
title
Description
Body
title
Description
Body
title
Body
Generated: Thu Nov 21 01:00:03 2024 | Cross-referenced by PHPXref 0.7.1 |