PluginProbe
Gutenberg / 9.7.2
Gutenberg v9.7.2
24.0.0 23.9.1 23.9.0 23.8.0 23.7.2 23.7.1 23.7.0 23.6.1 23.6.2 23.6.0 23.5.3 23.5.2 23.5.1 23.5.0 23.4.0 23.3.2 23.3.1 23.3.0 23.2.0 23.2.1 23.2.2 23.1.1 23.1.0 23.0.1 12.6.0 All 403 releases
← All changes | lib/widgets.php +138 -94 7.4.09.7.2 View file →
@@ -19,14 +19,33 @@
19 19 $screen = get_current_screen();
20 20 return ! empty( $screen ) &&
21 21 (
22 22 $screen->is_block_editor() ||
23 - 'gutenberg_page_gutenberg-widgets' === $screen->id ||
24 - 'gutenberg_page_gutenberg-edit-site' === $screen->id
23 + 'appearance_page_gutenberg-widgets' === $screen->id ||
24 + ( function_exists( 'gutenberg_is_edit_site_page' ) && gutenberg_is_edit_site_page( $screen->id ) )
25 25 );
26 26 }
27 27
28 28 /**
29 + * Whether or not to use the block editor to manage widgets. Defaults to true
30 + * unless a theme has removed support for widgets-block-editor or a plugin has
31 + * filtered the return value of this function.
32 + *
33 + * @return boolean Whether or not to use the block editor to manage widgets.
34 + */
35 +function gutenberg_use_widgets_block_editor() {
36 + /**
37 + * Filters whether or not to use the block editor to manage widgets.
38 + *
39 + * @param boolean $use_widgets_block_editor Whether or not to use the block editor to manage widgets.
40 + */
41 + return apply_filters(
42 + 'gutenberg_use_widgets_block_editor',
43 + get_theme_support( 'widgets-block-editor' )
44 + );
45 +}
46 +
47 +/**
29 48 * Emulates the Widgets screen `admin_print_styles` when at the block editor
30 49 * screen.
31 50 */
32 51 function gutenberg_block_editor_admin_print_styles() {
@@ -43,8 +62,14 @@
43 62 * screen.
44 63 */
45 64 function gutenberg_block_editor_admin_print_scripts() {
46 65 if ( gutenberg_is_block_editor() ) {
66 + /** This action is documented in wp-admin/includes/ajax-actions.php */
67 + do_action( 'load-widgets.php' ); // phpcs:ignore WordPress.NamingConventions.ValidHookName.UseUnderscores
68 + /** This action is documented in wp-admin/includes/ajax-actions.php */
69 + do_action( 'widgets.php' ); // phpcs:ignore WordPress.NamingConventions.ValidHookName.UseUnderscores
70 + /** This action is documented in wp-admin/widgets.php */
71 + do_action( 'sidebar_admin_setup' );
47 72 // phpcs:ignore WordPress.NamingConventions.ValidHookName.UseUnderscores
48 73 do_action( 'admin_print_scripts-widgets.php' );
49 74 }
50 75 }
@@ -67,17 +92,8 @@
67 92 * Emulates the Widgets screen `admin_footer` when at the block editor screen.
68 93 */
69 94 function gutenberg_block_editor_admin_footer() {
70 95 if ( gutenberg_is_block_editor() ) {
71 - // The function wpWidgets.save needs this nonce to work as expected.
72 - echo implode(
73 - "\n",
74 - array(
75 - '<form method="post">',
76 - wp_nonce_field( 'save-sidebar-widgets', '_wpnonce_widgets', false ),
77 - '</form>',
78 - )
79 - );
80 96 /** This action is documented in wp-admin/admin-footer.php */
81 97 // phpcs:ignore WordPress.NamingConventions.ValidHookName.UseUnderscores
82 98 do_action( 'admin_footer-widgets.php' );
83 99 }
@@ -83,9 +99,25 @@
83 99 }
84 100 }
85 101 add_action( 'admin_footer', 'gutenberg_block_editor_admin_footer' );
86 102
103 +/**
104 + * Adds a save widgets nonce required by the legacy widgets block.
105 + */
106 +function gutenberg_print_save_widgets_nonce() {
107 + // The function wpWidgets.save needs this nonce to work as expected.
108 + echo implode(
109 + "\n",
110 + array(
111 + '<form method="post">',
112 + wp_nonce_field( 'save-sidebar-widgets', '_wpnonce_widgets', false ),
113 + '</form>',
114 + )
115 + );
116 +}
117 +add_action( 'admin_footer-widgets.php', 'gutenberg_print_save_widgets_nonce' );
87 118
119 +
88 120 /**
89 121 * Returns the settings required by legacy widgets blocks.
90 122 *
91 123 * @return array Legacy widget settings.
@@ -91,40 +123,49 @@
91 123 * @return array Legacy widget settings.
92 124 */
93 125 function gutenberg_get_legacy_widget_settings() {
94 126 $settings = array();
127 +
95 128 /**
96 - * TODO: The hardcoded array should be replaced with a mechanism to allow
97 - * core and third party blocks to specify they already have equivalent
98 - * blocks, and maybe even allow them to have a migration function.
129 + * Filters the list of widget classes that should **not** be offered by the legacy widget block.
130 + *
131 + * Returning an empty array will make all the widgets available.
132 + *
133 + * @param array $widgets An array of excluded widgets classnames.
134 + *
135 + * @since 5.6.0
99 136 */
100 - $core_widgets = array(
101 - 'WP_Widget_Pages',
102 - 'WP_Widget_Calendar',
103 - 'WP_Widget_Archives',
104 - 'WP_Widget_Media_Audio',
105 - 'WP_Widget_Media_Image',
106 - 'WP_Widget_Media_Gallery',
107 - 'WP_Widget_Media_Video',
108 - 'WP_Widget_Meta',
109 - 'WP_Widget_Search',
110 - 'WP_Widget_Text',
111 - 'WP_Widget_Categories',
112 - 'WP_Widget_Recent_Posts',
113 - 'WP_Widget_Recent_Comments',
114 - 'WP_Widget_RSS',
115 - 'WP_Widget_Tag_Cloud',
116 - 'WP_Nav_Menu_Widget',
117 - 'WP_Widget_Custom_HTML',
137 + $widgets_to_exclude_from_legacy_widget_block = apply_filters(
138 + 'widgets_to_exclude_from_legacy_widget_block',
139 + array(
140 + 'WP_Widget_Block',
141 + 'WP_Widget_Pages',
142 + 'WP_Widget_Calendar',
143 + 'WP_Widget_Archives',
144 + 'WP_Widget_Media_Audio',
145 + 'WP_Widget_Media_Image',
146 + 'WP_Widget_Media_Gallery',
147 + 'WP_Widget_Media_Video',
148 + 'WP_Widget_Meta',
149 + 'WP_Widget_Search',
150 + 'WP_Widget_Text',
151 + 'WP_Widget_Categories',
152 + 'WP_Widget_Recent_Posts',
153 + 'WP_Widget_Recent_Comments',
154 + 'WP_Widget_RSS',
155 + 'WP_Widget_Tag_Cloud',
156 + 'WP_Nav_Menu_Widget',
157 + 'WP_Widget_Custom_HTML',
158 + )
118 159 );
119 160
120 - $has_permissions_to_manage_widgets = current_user_can( 'edit_theme_options' );
121 - $available_legacy_widgets = array();
161 + $available_legacy_widgets = array();
122 162 global $wp_widget_factory;
123 163 if ( ! empty( $wp_widget_factory ) ) {
124 164 foreach ( $wp_widget_factory->widgets as $class => $widget_obj ) {
125 165 $available_legacy_widgets[ $class ] = array(
126 166 'name' => html_entity_decode( $widget_obj->name ),
167 + 'id_base' => $widget_obj->id_base,
127 168 // wp_widget_description is not being used because its input parameter is a Widget Id.
128 169 // Widgets id's reference to a specific widget instance.
129 170 // Here we are iterating on all the available widget classes even if no widget instance exists for them.
130 171 'description' => isset( $widget_obj->widget_options['description'] ) ?
@@ -130,9 +171,9 @@
130 171 'description' => isset( $widget_obj->widget_options['description'] ) ?
131 172 html_entity_decode( $widget_obj->widget_options['description'] ) :
132 173 null,
133 174 'isReferenceWidget' => false,
134 - 'isHidden' => in_array( $class, $core_widgets, true ),
175 + 'isHidden' => in_array( $class, $widgets_to_exclude_from_legacy_widget_block, true ),
135 176 );
136 177 }
137 178 }
138 179 global $wp_registered_widgets;
@@ -156,12 +197,11 @@
156 197 );
157 198 }
158 199 }
159 200
160 - $settings['hasPermissionsToManageWidgets'] = $has_permissions_to_manage_widgets;
161 - $settings['availableLegacyWidgets'] = $available_legacy_widgets;
201 + $settings['availableLegacyWidgets'] = $available_legacy_widgets;
162 202
163 - return gutenberg_experiments_editor_settings( $settings );
203 + return $settings;
164 204 }
165 205
166 206 /**
167 207 * Extends default editor settings with values supporting legacy widgets.
@@ -175,68 +215,72 @@
175 215 }
176 216 add_filter( 'block_editor_settings', 'gutenberg_legacy_widget_settings' );
177 217
178 218 /**
179 - * Registers a wp_area post type.
219 + * Function to enqueue admin-widgets as part of the block editor assets.
180 220 */
181 -function gutenberg_create_wp_area_post_type() {
182 - register_post_type(
183 - 'wp_area',
184 - array(
185 - 'description' => __( 'Experimental custom post type that will store block areas referenced by themes.', 'gutenberg' ),
186 - 'labels' => array(
187 - 'name' => _x( 'Block Area (Experimental)', 'post type general name', 'gutenberg' ),
188 - 'singular_name' => _x( 'Block Area (Experimental)', 'post type singular name', 'gutenberg' ),
189 - 'menu_name' => _x( 'Block Areas', 'admin menu', 'gutenberg' ),
190 - 'name_admin_bar' => _x( 'Block Area', 'add new on admin bar', 'gutenberg' ),
191 - 'add_new' => _x( 'Add New', 'Block', 'gutenberg' ),
192 - 'add_new_item' => __( 'Add New Block Area', 'gutenberg' ),
193 - 'new_item' => __( 'New Block Area', 'gutenberg' ),
194 - 'edit_item' => __( 'Edit Block Area', 'gutenberg' ),
195 - 'view_item' => __( 'View Block Area', 'gutenberg' ),
196 - 'all_items' => __( 'All Block Areas', 'gutenberg' ),
197 - 'search_items' => __( 'Search Block Areas', 'gutenberg' ),
198 - 'not_found' => __( 'No block area found.', 'gutenberg' ),
199 - 'not_found_in_trash' => __( 'No block areas found in Trash.', 'gutenberg' ),
200 - 'filter_items_list' => __( 'Filter block areas list', 'gutenberg' ),
201 - 'items_list_navigation' => __( 'Block areas list navigation', 'gutenberg' ),
202 - 'items_list' => __( 'Block areas list', 'gutenberg' ),
203 - 'item_published' => __( 'Block area published.', 'gutenberg' ),
204 - 'item_published_privately' => __( 'Block area published privately.', 'gutenberg' ),
205 - 'item_reverted_to_draft' => __( 'Block area reverted to draft.', 'gutenberg' ),
206 - 'item_scheduled' => __( 'Block area scheduled.', 'gutenberg' ),
207 - 'item_updated' => __( 'Block area updated.', 'gutenberg' ),
208 - ),
209 - 'public' => false,
210 - 'show_ui' => false,
211 - 'show_in_menu' => false,
212 - 'show_in_rest' => true,
213 - 'rest_base' => '__experimental/block-areas',
214 - 'capabilities' => array(
215 - 'read' => 'edit_posts',
216 - 'create_posts' => 'edit_theme_options',
217 - 'edit_posts' => 'edit_theme_options',
218 - 'edit_published_posts' => 'edit_theme_options',
219 - 'delete_published_posts' => 'edit_theme_options',
220 - 'edit_others_posts' => 'edit_theme_options',
221 - 'delete_others_posts' => 'edit_theme_options',
222 - ),
223 - 'map_meta_cap' => true,
224 - 'supports' => array(
225 - 'title',
226 - 'editor',
227 - ),
228 - )
229 - );
221 +function gutenberg_enqueue_widget_scripts() {
222 + wp_enqueue_script( 'admin-widgets' );
230 223 }
231 -add_action( 'init', 'gutenberg_create_wp_area_post_type' );
232 224
233 -add_filter( 'sidebars_widgets', 'Experimental_WP_Widget_Blocks_Manager::swap_out_sidebars_blocks_for_block_widgets' );
225 +add_action( 'enqueue_block_editor_assets', 'gutenberg_enqueue_widget_scripts' );
234 226
235 227 /**
236 - * Function to enqueue admin-widgets as part of the block editor assets.
228 + * Overrides dynamic_sidebar_params to make sure Blocks are not wrapped in <form> tag.
229 + *
230 + * @param array $arg Dynamic sidebar params.
231 + * @return array Updated dynamic sidebar params.
237 232 */
238 -function gutenberg_enqueue_widget_scripts() {
239 - wp_enqueue_script( 'admin-widgets' );
233 +function gutenberg_override_sidebar_params_for_block_widget( $arg ) {
234 + if ( 'Block' === $arg[0]['widget_name'] ) {
235 + $arg[0]['before_form'] = '';
236 + $arg[0]['before_widget_content'] = '<div class="widget-content">';
237 + $arg[0]['after_widget_content'] = '</div><form class="block-widget-form">';
238 + $arg[0]['after_form'] = '</form>';
239 + }
240 +
241 + return $arg;
240 242 }
241 243
242 -add_action( 'enqueue_block_editor_assets', 'gutenberg_enqueue_widget_scripts' );
244 +/**
245 + * Registers the WP_Widget_Block widget
246 + */
247 +function gutenberg_register_widgets() {
248 + if ( ! gutenberg_use_widgets_block_editor() ) {
249 + return;
250 + }
251 +
252 + register_widget( 'WP_Widget_Block' );
253 + // By default every widget on widgets.php is wrapped with a <form>.
254 + // This means that you can sometimes end up with invalid HTML, e.g. when
255 + // one of the widgets is a Search block.
256 + //
257 + // To fix the problem, let's add a filter that moves the form below the actual
258 + // widget content.
259 + global $pagenow;
260 + if ( 'widgets.php' === $pagenow ) {
261 + add_filter(
262 + 'dynamic_sidebar_params',
263 + 'gutenberg_override_sidebar_params_for_block_widget'
264 + );
265 + }
266 +}
267 +
268 +add_action( 'widgets_init', 'gutenberg_register_widgets' );
269 +
270 +/**
271 + * Hook into before the widgets editor screen is loaded and, if widget-preview
272 + * is set, render the requested preview of a legacy widget instead. This powers
273 + * the Preview option in the Legacy Widget block.
274 + */
275 +function gutenberg_load_widget_preview_if_requested() {
276 + if (
277 + isset( $_GET['widget-preview'] ) &&
278 + current_user_can( 'edit_theme_options' )
279 + ) {
280 + define( 'IFRAME_REQUEST', true );
281 + require_once __DIR__ . '/widget-preview-template.php';
282 + exit;
283 + }
284 +}
285 +add_filter( 'load-appearance_page_gutenberg-widgets', 'gutenberg_load_widget_preview_if_requested' );
286 +