PluginProbe
Gutenberg / 23.5.3
Gutenberg v23.5.3
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 / content-types / page-wp-admin.php

page-wp-admin.php in Gutenberg 23.5.3, at build/pages/content-types/page-wp-admin.php

324 lines 9.8 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 /**
3 * Page: content-types (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 content-types routes and menu items
14 global $gutenberg_content_types_wp_admin_routes, $gutenberg_content_types_wp_admin_menu_items;
15 $gutenberg_content_types_wp_admin_routes = array();
16 $gutenberg_content_types_wp_admin_menu_items = array();
17
18 /**
19 * Register a route for the content-types-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_content_types_wp_admin_route( $path, $content_module = null, $route_module = null ) {
26 global $gutenberg_content_types_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_content_types_wp_admin_routes[] = $route;
37 }
38
39 /**
40 * Register a menu item for the content-types-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_content_types_wp_admin_menu_item( $id, $label, $to, $parent_id = '' ) {
49 global $gutenberg_content_types_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_content_types_wp_admin_menu_items[] = $menu_item;
62 }
63
64 /**
65 * Get all registered routes for the content-types-wp-admin page.
66 *
67 * @return array Array of route objects.
68 */
69 function gutenberg_get_content_types_wp_admin_routes() {
70 global $gutenberg_content_types_wp_admin_routes;
71 return $gutenberg_content_types_wp_admin_routes ?? array();
72 }
73
74 /**
75 * Get all registered menu items for the content-types-wp-admin page.
76 *
77 * @return array Array of menu item objects.
78 */
79 function gutenberg_get_content_types_wp_admin_menu_items() {
80 global $gutenberg_content_types_wp_admin_menu_items;
81 return $gutenberg_content_types_wp_admin_menu_items ?? array();
82 }
83
84 /**
85 * Preload REST API data for the content-types-wp-admin page.
86 * Automatically called during page rendering.
87 */
88 function gutenberg_content_types_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 content-types-wp-admin page.
116 * Hooked to admin_enqueue_scripts.
117 *
118 * @param string $hook_suffix The current admin page.
119 */
120 function gutenberg_content_types_wp_admin_enqueue_scripts( $hook_suffix ) {
121 // Check all possible ways this page can be accessed:
122 // 1. Menu page via admin.php?page=content-types-wp-admin (plugin)
123 // 2. Direct file via content-types.php (Core) - screen ID will be 'content-types'
124 $current_screen = get_current_screen();
125 $is_our_page = (
126 ( isset( $_GET['page'] ) && 'content-types-wp-admin' === $_GET['page'] ) || // phpcs:ignore WordPress.Security.NonceVerification.Recommended
127 ( $current_screen && 'content-types' === $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 /**
138 * Fires when the content-types admin page is initialized so extensions can register routes and menu items.
139 */
140 do_action( 'content-types-wp-admin_init' );
141
142 // Preload REST API data
143 gutenberg_content_types_wp_admin_preload_data();
144
145 // Get all registered routes
146 $routes = gutenberg_get_content_types_wp_admin_routes();
147
148 // Get boot module asset file for dependencies
149 $asset_file = __DIR__ . '/../../modules/boot/index.min.asset.php';
150 if ( file_exists( $asset_file ) ) {
151 $asset = require $asset_file;
152
153 // This script serves two purposes:
154 // 1. It ensures all the globals that are made available to the modules are loaded.
155 // 2. It initializes the boot module as an inline script.
156 wp_register_script( 'content-types-wp-admin-prerequisites', '', $asset['dependencies'], $asset['version'], true );
157
158 $init_modules = [];
159
160 /*
161 * Add inline script to initialize the app using initSinglePage (no menuItems).
162 * The dynamic import is deferred until DOMContentLoaded so that all classic
163 * script dependencies of @wordpress/boot (wp-private-apis, wp-components,
164 * wp-theme, etc.) have finished parsing and executing before the boot module
165 * evaluates. Otherwise, a modulepreloaded @wordpress/boot can win the race
166 * against the classic-script-printing pass on fast CDN-fronted hosts in
167 * Chrome, evaluating before wp.theme.privateApis is defined and throwing
168 * "Cannot unlock an undefined object". See <https://core.trac.wordpress.org/ticket/65103>.
169 */
170 $init_js_function = <<<'JS'
171 ( mountId, routes, initModules ) => {
172 const run = async () => {
173 const mod = await import( "@wordpress/boot" );
174 mod.initSinglePage( { mountId, routes, initModules } );
175 };
176 if ( document.readyState === "loading" ) {
177 document.addEventListener( "DOMContentLoaded", run );
178 } else {
179 run();
180 }
181 }
182 JS;
183 wp_add_inline_script(
184 'content-types-wp-admin-prerequisites',
185 sprintf(
186 '( %s )( %s, %s, %s );',
187 $init_js_function,
188 wp_json_encode( 'content-types-wp-admin-app', JSON_HEX_TAG | JSON_UNESCAPED_SLASHES ),
189 wp_json_encode( $routes, JSON_HEX_TAG | JSON_UNESCAPED_SLASHES ),
190 wp_json_encode( $init_modules, JSON_HEX_TAG | JSON_UNESCAPED_SLASHES )
191 )
192 );
193
194 // Register prerequisites style by filtering script dependencies to find registered styles
195 $style_dependencies = array_filter(
196 $asset['dependencies'],
197 function ( $handle ) {
198 return wp_style_is( $handle, 'registered' );
199 }
200 );
201 wp_register_style( 'content-types-wp-admin-prerequisites', false, $style_dependencies, $asset['version'] );
202
203 // Build dependencies for content-types-wp-admin module
204 $boot_dependencies = array(
205 array(
206 'import' => 'static',
207 'id' => '@wordpress/boot',
208 ),
209 );
210
211 // Add init modules as static dependencies
212 // No init modules configured
213
214 // Add all registered routes as dependencies
215 foreach ( $routes as $route ) {
216 if ( isset( $route['route_module'] ) ) {
217 $boot_dependencies[] = array(
218 'import' => 'static',
219 'id' => $route['route_module'],
220 );
221 }
222 if ( isset( $route['content_module'] ) ) {
223 $boot_dependencies[] = array(
224 'import' => 'dynamic',
225 'id' => $route['content_module'],
226 );
227 }
228 }
229
230 /**
231 * Filters the boot script-module dependencies for the
232 * content-types-wp-admin page.
233 *
234 * Surfaces extending this page can append entries to the boot
235 * dependency list. Each entry is an array with 'import' (string
236 * 'static' or 'dynamic') and 'id' (script-module handle) keys.
237 *
238 * @param array $boot_dependencies Boot dependencies for the page.
239 */
240 $boot_dependencies = apply_filters(
241 'content-types-wp-admin_boot_dependencies',
242 $boot_dependencies
243 );
244
245 // Dummy script module to ensure dependencies are loaded
246 wp_register_script_module(
247 'content-types-wp-admin',
248 $build_constants['build_url'] . 'pages/content-types/loader.js',
249 $boot_dependencies
250 );
251
252 // Enqueue the boot scripts and styles
253 wp_enqueue_script( 'content-types-wp-admin-prerequisites' );
254 wp_enqueue_script_module( 'content-types-wp-admin' );
255 wp_enqueue_style( 'content-types-wp-admin-prerequisites' );
256 }
257 }
258
259 /**
260 * Render the content-types-wp-admin page.
261 * Call this function from add_menu_page or add_submenu_page.
262 * This renders within the normal WordPress admin interface.
263 */
264 function gutenberg_content_types_wp_admin_render_page() {
265 ?>
266 <style>
267 /* Critical styles to prevent layout shifts - inlined for immediate application */
268
269 #wpwrap {
270 overflow-y: auto;
271 }
272 body {
273 background: #fff;
274 }
275
276 /* Reset wp-admin padding */
277 #wpcontent {
278 padding-inline-start: 0;
279 }
280 #wpbody-content {
281 padding-bottom: 0;
282 }
283
284 /* Hide legacy admin elements */
285 #wpbody-content > div:not(.boot-layout-container):not(#screen-meta) {
286 display: none;
287 }
288 #wpfooter {
289 display: none;
290 }
291
292 /* Accessibility regions */
293 .a11y-speak-region {
294 inset-inline-start: -1px;
295 top: -1px;
296 }
297
298 /* Admin menu indicators */
299 ul#adminmenu a.wp-has-current-submenu::after,
300 ul#adminmenu > li.current > a.current::after {
301 border-inline-end-color: #fff;
302 }
303
304 /* Media frame fix */
305 .media-frame select.attachment-filters:last-of-type {
306 width: auto;
307 max-width: 100%;
308 }
309
310 /* Responsive overflow fix for #wpwrap */
311 @media (min-width: 782px) {
312 #wpwrap {
313 overflow-y: initial;
314 }
315 }
316 </style>
317 <div id="content-types-wp-admin-app" class="boot-layout-container"></div>
318 <?php
319 }
320
321 // Hook the enqueue function to admin_enqueue_scripts
322 add_action( 'admin_enqueue_scripts', 'gutenberg_content_types_wp_admin_enqueue_scripts' );
323
324