PluginProbe
Gutenberg / 23.2.1
Gutenberg v23.2.1
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 7.4.0 All 402 releases
gutenberg / build / pages / experiments / page-wp-admin.php

page-wp-admin.php in Gutenberg 23.2.1, at build/pages/experiments/page-wp-admin.php

295 lines 8.6 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 /**
3 * Page: experiments (wp-admin integrated)
4 * Auto-generated by build process.
5 * Do not edit this file manually.
6 *
7 * This version integrates with the standard WordPress admin interface,
8 * keeping the wp-admin sidebar and scripts/styles intact.
9 *
10 * @package gutenberg
11 */
12
13 // Global storage for experiments routes and menu items
14 global $gutenberg_experiments_wp_admin_routes, $gutenberg_experiments_wp_admin_menu_items;
15 $gutenberg_experiments_wp_admin_routes = array();
16 $gutenberg_experiments_wp_admin_menu_items = array();
17
18 /**
19 * Register a route for the experiments-wp-admin page.
20 *
21 * @param string $path Route path (e.g., '/types/$type/edit/$id').
22 * @param string|null $content_module Script module ID for content (stage/inspector).
23 * @param string|null $route_module Script module ID for route lifecycle hooks.
24 */
25 function gutenberg_register_experiments_wp_admin_route( $path, $content_module = null, $route_module = null ) {
26 global $gutenberg_experiments_wp_admin_routes;
27
28 $route = array( 'path' => $path );
29 if ( ! empty( $content_module ) ) {
30 $route['content_module'] = $content_module;
31 }
32 if ( ! empty( $route_module ) ) {
33 $route['route_module'] = $route_module;
34 }
35
36 $gutenberg_experiments_wp_admin_routes[] = $route;
37 }
38
39 /**
40 * Register a menu item for the experiments-wp-admin page.
41 * Note: Menu items are registered but not displayed in single-page mode.
42 *
43 * @param string $id Menu item ID.
44 * @param string $label Display label.
45 * @param string $to Route path to navigate to.
46 * @param string $parent_id Optional. Parent menu item ID.
47 */
48 function gutenberg_register_experiments_wp_admin_menu_item( $id, $label, $to, $parent_id = '' ) {
49 global $gutenberg_experiments_wp_admin_menu_items;
50
51 $menu_item = array(
52 'id' => $id,
53 'label' => $label,
54 'to' => $to,
55 );
56
57 if ( ! empty( $parent_id ) ) {
58 $menu_item['parent'] = $parent_id;
59 }
60
61 $gutenberg_experiments_wp_admin_menu_items[] = $menu_item;
62 }
63
64 /**
65 * Get all registered routes for the experiments-wp-admin page.
66 *
67 * @return array Array of route objects.
68 */
69 function gutenberg_get_experiments_wp_admin_routes() {
70 global $gutenberg_experiments_wp_admin_routes;
71 return $gutenberg_experiments_wp_admin_routes ?? array();
72 }
73
74 /**
75 * Get all registered menu items for the experiments-wp-admin page.
76 *
77 * @return array Array of menu item objects.
78 */
79 function gutenberg_get_experiments_wp_admin_menu_items() {
80 global $gutenberg_experiments_wp_admin_menu_items;
81 return $gutenberg_experiments_wp_admin_menu_items ?? array();
82 }
83
84 /**
85 * Preload REST API data for the experiments-wp-admin page.
86 * Automatically called during page rendering.
87 */
88 function gutenberg_experiments_wp_admin_preload_data() {
89 // Define paths to preload - same for all pages
90 // Please also change packages/core-data/src/entities.js when changing this.
91 $preload_paths = array(
92 '/?_fields=description,gmt_offset,home,image_sizes,image_size_threshold,name,site_icon,site_icon_url,site_logo,timezone_string,url,page_for_posts,page_on_front,show_on_front',
93 array( '/wp/v2/settings', 'OPTIONS' ),
94 );
95
96 // Use rest_preload_api_request to gather the preloaded data
97 $preload_data = array_reduce(
98 $preload_paths,
99 'rest_preload_api_request',
100 array()
101 );
102
103 // Register the preloading middleware with wp-api-fetch
104 wp_add_inline_script(
105 'wp-api-fetch',
106 sprintf(
107 'wp.apiFetch.use( wp.apiFetch.createPreloadingMiddleware( %s ) );',
108 wp_json_encode( $preload_data )
109 ),
110 'after'
111 );
112 }
113
114 /**
115 * Enqueue scripts and styles for the experiments-wp-admin page.
116 * Hooked to admin_enqueue_scripts.
117 *
118 * @param string $hook_suffix The current admin page.
119 */
120 function gutenberg_experiments_wp_admin_enqueue_scripts( $hook_suffix ) {
121 // Check all possible ways this page can be accessed:
122 // 1. Menu page via admin.php?page=experiments-wp-admin (plugin)
123 // 2. Direct file via experiments.php (Core) - screen ID will be 'experiments'
124 $current_screen = get_current_screen();
125 $is_our_page = (
126 ( isset( $_GET['page'] ) && 'experiments-wp-admin' === $_GET['page'] ) || // phpcs:ignore WordPress.Security.NonceVerification.Recommended
127 ( $current_screen && 'experiments' === $current_screen->id )
128 );
129
130 if ( ! $is_our_page ) {
131 return;
132 }
133
134 // Load build constants
135 $build_constants = require __DIR__ . '/../../constants.php';
136
137 // Fire init action for extensions to register routes and menu items
138 do_action( 'experiments-wp-admin_init' );
139
140 // Preload REST API data
141 gutenberg_experiments_wp_admin_preload_data();
142
143 // Get all registered routes
144 $routes = gutenberg_get_experiments_wp_admin_routes();
145
146 // Get boot module asset file for dependencies
147 $asset_file = __DIR__ . '/../../modules/boot/index.min.asset.php';
148 if ( file_exists( $asset_file ) ) {
149 $asset = require $asset_file;
150
151 // This script serves two purposes:
152 // 1. It ensures all the globals that are made available to the modules are loaded.
153 // 2. It initializes the boot module as an inline script.
154 wp_register_script( 'experiments-wp-admin-prerequisites', '', $asset['dependencies'], $asset['version'], true );
155
156 // Add inline script to initialize the app using initSinglePage (no menuItems)
157 wp_add_inline_script(
158 'experiments-wp-admin-prerequisites',
159 sprintf(
160 'import("@wordpress/boot").then(mod => mod.initSinglePage({mountId: "%s", routes: %s}));',
161 'experiments-wp-admin-app',
162 wp_json_encode( $routes, JSON_HEX_TAG | JSON_UNESCAPED_SLASHES )
163 )
164 );
165
166 // Register prerequisites style by filtering script dependencies to find registered styles
167 $style_dependencies = array_filter(
168 $asset['dependencies'],
169 function ( $handle ) {
170 return wp_style_is( $handle, 'registered' );
171 }
172 );
173 wp_register_style( 'experiments-wp-admin-prerequisites', false, $style_dependencies, $asset['version'] );
174
175 // Build dependencies for experiments-wp-admin module
176 $boot_dependencies = array(
177 array(
178 'import' => 'static',
179 'id' => '@wordpress/boot',
180 ),
181 );
182
183 // Add all registered routes as dependencies
184 foreach ( $routes as $route ) {
185 if ( isset( $route['route_module'] ) ) {
186 $boot_dependencies[] = array(
187 'import' => 'static',
188 'id' => $route['route_module'],
189 );
190 }
191 if ( isset( $route['content_module'] ) ) {
192 $boot_dependencies[] = array(
193 'import' => 'dynamic',
194 'id' => $route['content_module'],
195 );
196 }
197 }
198
199 /**
200 * Filters the boot script-module dependencies for the
201 * experiments-wp-admin page.
202 *
203 * Surfaces extending this page can append entries to the boot
204 * dependency list. Each entry is an array with 'import' (string
205 * 'static' or 'dynamic') and 'id' (script-module handle) keys.
206 *
207 * @param array $boot_dependencies Boot dependencies for the page.
208 */
209 $boot_dependencies = apply_filters(
210 'experiments-wp-admin_boot_dependencies',
211 $boot_dependencies
212 );
213
214 // Dummy script module to ensure dependencies are loaded
215 wp_register_script_module(
216 'experiments-wp-admin',
217 $build_constants['build_url'] . 'pages/experiments/loader.js',
218 $boot_dependencies
219 );
220
221 // Enqueue the boot scripts and styles
222 wp_enqueue_script( 'experiments-wp-admin-prerequisites' );
223 wp_enqueue_script_module( 'experiments-wp-admin' );
224 wp_enqueue_style( 'experiments-wp-admin-prerequisites' );
225 }
226 }
227
228 /**
229 * Render the experiments-wp-admin page.
230 * Call this function from add_menu_page or add_submenu_page.
231 * This renders within the normal WordPress admin interface.
232 */
233 function gutenberg_experiments_wp_admin_render_page() {
234 ?>
235 <style>
236 /* Critical styles to prevent layout shifts - inlined for immediate application */
237
238 /* Background colors */
239 #wpwrap {
240 background: var(--wpds-color-fg-content-neutral, #1e1e1e);
241 overflow-y: auto;
242 }
243 body {
244 background: #fff;
245 }
246
247 /* Reset wp-admin padding */
248 #wpcontent {
249 padding-inline-start: 0;
250 }
251 #wpbody-content {
252 padding-bottom: 0;
253 }
254
255 /* Hide legacy admin elements */
256 #wpbody-content > div:not(.boot-layout-container):not(#screen-meta) {
257 display: none;
258 }
259 #wpfooter {
260 display: none;
261 }
262
263 /* Accessibility regions */
264 .a11y-speak-region {
265 inset-inline-start: -1px;
266 top: -1px;
267 }
268
269 /* Admin menu indicators */
270 ul#adminmenu a.wp-has-current-submenu::after,
271 ul#adminmenu > li.current > a.current::after {
272 border-inline-end-color: #fff;
273 }
274
275 /* Media frame fix */
276 .media-frame select.attachment-filters:last-of-type {
277 width: auto;
278 max-width: 100%;
279 }
280
281 /* Responsive overflow fix for #wpwrap */
282 @media (min-width: 782px) {
283 #wpwrap {
284 overflow-y: initial;
285 }
286 }
287 </style>
288 <div id="experiments-wp-admin-app" class="boot-layout-container"></div>
289 <?php
290 }
291
292 // Hook the enqueue function to admin_enqueue_scripts
293 add_action( 'admin_enqueue_scripts', 'gutenberg_experiments_wp_admin_enqueue_scripts' );
294
295