1<?php
2/**
3 * The block-based widgets editor, for use in widgets.php.
4 *
5 * @package WordPress
6 * @subpackage Administration
7 */
8
9// Don't load directly.
10if ( ! defined( 'ABSPATH' ) ) {
11 die( '-1' );
12}
13
14// Flag that we're loading the block editor.
15$current_screen = get_current_screen();
16$current_screen->is_block_editor( true );
17
18$block_editor_context = new WP_Block_Editor_Context( array( 'name' => 'core/edit-widgets' ) );
19
20$preload_paths = array(
21 array( rest_get_route_for_post_type_items( 'attachment' ), 'OPTIONS' ),
22 '/wp/v2/widget-types?context=edit&per_page=-1',
23 '/wp/v2/sidebars?context=edit&per_page=-1',
24 '/wp/v2/widgets?context=edit&per_page=-1&_embed=about',
25);
26block_editor_rest_api_preload( $preload_paths, $block_editor_context );
27
28$editor_settings = get_block_editor_settings(
29 array_merge( get_legacy_widget_block_editor_settings(), array( 'styles' => get_block_editor_theme_styles() ) ),
30 $block_editor_context
31);
32
33// The widgets editor does not support the Block Directory, so don't load any of
34// its assets. This also prevents 'wp-editor' from being enqueued which we
35// cannot load in the widgets screen because many widget scripts rely on `wp.editor`.
36remove_action( 'enqueue_block_editor_assets', 'wp_enqueue_editor_block_directory_assets' );
37
38wp_add_inline_script(
39 'wp-edit-widgets',
40 sprintf(
41 'wp.domReady( function() {
42 wp.editWidgets.initialize( "widgets-editor", %s );
43 } );',
44 wp_json_encode( $editor_settings, JSON_HEX_TAG | JSON_UNESCAPED_SLASHES )
45 )
46);
47
48// Preload server-registered block schemas.
49wp_add_inline_script(
50 'wp-blocks',
51 'wp.blocks.unstable__bootstrapServerSideBlockDefinitions(' . wp_json_encode( get_block_editor_server_block_settings(), JSON_HEX_TAG | JSON_UNESCAPED_SLASHES ) . ');'
52);
53
54// Preload server-registered block bindings sources.
55$registered_sources = get_all_registered_block_bindings_sources();
56if ( ! empty( $registered_sources ) ) {
57 $filtered_sources = array();
58 foreach ( $registered_sources as $source ) {
59 $filtered_sources[] = array(
60 'name' => $source->name,
61 'label' => $source->label,
62 'usesContext' => $source->uses_context,
63 );
64 }
65 $script = sprintf( 'for ( const source of %s ) { wp.blocks.registerBlockBindingsSource( source ); }', wp_json_encode( $filtered_sources, JSON_HEX_TAG | JSON_UNESCAPED_SLASHES ) );
66 wp_add_inline_script(
67 'wp-blocks',
68 $script
69 );
70}
71
72wp_add_inline_script(
73 'wp-blocks',
74 sprintf( 'wp.blocks.setCategories( %s );', wp_json_encode( get_block_categories( $block_editor_context ), JSON_HEX_TAG | JSON_UNESCAPED_SLASHES ) ),
75 'after'
76);
77
78wp_enqueue_script( 'wp-edit-widgets' );
79wp_enqueue_script( 'admin-widgets' );
80wp_enqueue_style( 'wp-edit-widgets' );
81
82/** This action is documented in wp-admin/edit-form-blocks.php */
83do_action( 'enqueue_block_editor_assets' );
84
85/** This action is documented in wp-admin/widgets-form.php */
86do_action( 'sidebar_admin_setup' );
87
88require_once ABSPATH . 'wp-admin/admin-header.php';
89
90/** This action is documented in wp-admin/widgets-form.php */
91do_action( 'widgets_admin_page' );
92?>
93
94<div id="widgets-editor" class="blocks-widgets-container">
95 <?php // JavaScript is disabled. ?>
96 <div class="wrap hide-if-js widgets-editor-no-js">
97 <h1 class="wp-heading-inline"><?php echo esc_html( $title ); ?></h1>
98 <?php
99 if ( file_exists( WP_PLUGIN_DIR . '/classic-widgets/classic-widgets.php' ) ) {
100 // If Classic Widgets is already installed, provide a link to activate the plugin.
101 $installed = true;
102 $plugin_activate_url = wp_nonce_url( 'plugins.php?action=activate&plugin=classic-widgets/classic-widgets.php', 'activate-plugin_classic-widgets/classic-widgets.php' );
103 $message = sprintf(
104 /* translators: %s: Link to activate the Classic Widgets plugin. */
105 __( 'The block widgets require JavaScript. Please enable JavaScript in your browser settings, or activate the <a href="%s">Classic Widgets plugin</a>.' ),
106 esc_url( $plugin_activate_url )
107 );
108 } else {
109 // If Classic Widgets is not installed, provide a link to install it.
110 $installed = false;
111 $plugin_install_url = wp_nonce_url( self_admin_url( 'update.php?action=install-plugin&plugin=classic-widgets' ), 'install-plugin_classic-widgets' );
112 $message = sprintf(
113 /* translators: %s: A link to install the Classic Widgets plugin. */
114 __( 'The block widgets require JavaScript. Please enable JavaScript in your browser settings, or install the <a href="%s">Classic Widgets plugin</a>.' ),
115 esc_url( $plugin_install_url )
116 );
117 }
118 /**
119 * Filters the message displayed in the block widget interface when JavaScript is
120 * not enabled in the browser.
121 *
122 * @since 6.4.0
123 *
124 * @param string $message The message being displayed.
125 * @param bool $installed Whether the Classic Widget plugin is installed.
126 */
127 $message = apply_filters( 'block_widgets_no_javascript_message', $message, $installed );
128 wp_admin_notice(
129 $message,
130 array(
131 'type' => 'error',
132 'additional_classes' => array( 'hide-if-js' ),
133 )
134 );
135 ?>
136 </div>
137</div>
138
139<?php
140/** This action is documented in wp-admin/widgets-form.php */
141do_action( 'sidebar_admin_page' );
142
143require_once ABSPATH . 'wp-admin/admin-footer.php';
144