Title: wp_font_library_render_page
Published: May 20, 2026

---

# wp_font_library_render_page()

## In this article

 * [Description](https://developer.wordpress.org/reference/functions/wp_font_library_render_page/?output_format=md#description)
 * [Source](https://developer.wordpress.org/reference/functions/wp_font_library_render_page/?output_format=md#source)
 * [Hooks](https://developer.wordpress.org/reference/functions/wp_font_library_render_page/?output_format=md#hooks)
 * [Related](https://developer.wordpress.org/reference/functions/wp_font_library_render_page/?output_format=md#related)

[ Back to top](https://developer.wordpress.org/reference/functions/wp_font_library_render_page/?output_format=md#wp--skip-link--target)

Render the font-library page.

## 󠀁[Description](https://developer.wordpress.org/reference/functions/wp_font_library_render_page/?output_format=md#description)󠁿

Call this function from add_menu_page or add_submenu_page.

## 󠀁[Source](https://developer.wordpress.org/reference/functions/wp_font_library_render_page/?output_format=md#source)󠁿

    ```php
    function wp_font_library_render_page() {
    	// Load build constants
    	$build_constants = require __DIR__ . '/../../constants.php';

    	// Set current screen
    	set_current_screen();

    	// Remove unwanted deprecated handler
    	remove_action( 'admin_head', 'wp_admin_bar_header' );

    	// Remove unwanted scripts and styles that were enqueued during `admin_init`
    	foreach ( wp_scripts()->queue as $script ) {
    		wp_dequeue_script( $script );
    	}
    	foreach ( wp_styles()->queue as $style ) {
    		wp_dequeue_style( $style );
    	}

    	// Fire init action for extensions to register routes and menu items
    	do_action( 'font-library_init' );

    	// Enqueue command palette assets for boot-based pages
    	if ( function_exists( 'wp_enqueue_command_palette_assets' ) ) {
    		wp_enqueue_command_palette_assets();
    	}

    	// Preload REST API data
    	wp_font_library_preload_data();

    	// Get all registered routes and menu items
    	$menu_items = wp_get_font_library_menu_items();
    	$routes = wp_get_font_library_routes();

    	// Get boot module asset file for dependencies
    	$asset_file = ABSPATH . WPINC . '/js/dist/script-modules/boot/index.min.asset.php';
    	if ( file_exists( $asset_file ) ) {
    		$asset = require $asset_file;

    		// This script serves two purposes:
    		// 1. It ensures all the globals that are made available to the modules are loaded.
    		// 2. It initializes the boot module as an inline script.
    		wp_register_script( 'font-library-prerequisites', '', $asset['dependencies'], $asset['version'], true );

    		// Add inline script to initialize the app
    		$init_modules = [];
    		wp_add_inline_script(
    			'font-library-prerequisites',
    			sprintf(
    				'import("@wordpress/boot").then(mod => mod.init({mountId: "%s", menuItems: %s, routes: %s, initModules: %s, dashboardLink: "%s"}));',
    				'font-library-app',
    				wp_json_encode( $menu_items, JSON_HEX_TAG | JSON_UNESCAPED_SLASHES ),
    				wp_json_encode( $routes, JSON_HEX_TAG | JSON_UNESCAPED_SLASHES ),
    				wp_json_encode( $init_modules, JSON_HEX_TAG | JSON_UNESCAPED_SLASHES ),
    				esc_url( admin_url( '/' ) )
    			)
    		);

    		// Register prerequisites style by filtering script dependencies to find registered styles
    		$style_dependencies = array_filter(
    			$asset['dependencies'],
    			function ( $handle ) {
    				return wp_style_is( $handle, 'registered' );
    			}
    		);
    		wp_register_style( 'font-library-prerequisites', false, $style_dependencies, $asset['version'] );

    		// Build dependencies for font-library module
    		$boot_dependencies = array(
    			array(
    				'import' => 'static',
    				'id'     => '@wordpress/boot',
    			),
    		);

    		// Add init modules as static dependencies
    			// No init modules configured

    		// Add all registered routes as dependencies
    		foreach ( $routes as $route ) {
    			if ( isset( $route['route_module'] ) ) {
    				$boot_dependencies[] = array(
    					'import' => 'static',
    					'id'     => $route['route_module'],
    				);
    			}
    			if ( isset( $route['content_module'] ) ) {
    				$boot_dependencies[] = array(
    					'import' => 'dynamic',
    					'id'     => $route['content_module'],
    				);
    			}
    		}

    		// Dummy script module to ensure dependencies are loaded
    		wp_register_script_module(
    			'font-library',
    			$build_constants['build_url'] . 'pages/font-library/loader.js',
    			$boot_dependencies
    		);

    		// Enqueue the boot scripts and styles
    		wp_enqueue_script( 'font-library-prerequisites' );
    		wp_enqueue_script_module( 'font-library' );
    		wp_enqueue_style( 'font-library-prerequisites' );
    	}

    	// Output the HTML
    	?>
    	<!DOCTYPE html>
    	<html <?php language_attributes(); ?>>
    	<head>
    		<meta charset="<?php bloginfo( 'charset' ); ?>">
    		<meta name="viewport" content="width=device-width, initial-scale=1">
    		<title><?php echo esc_html( get_admin_page_title() ); ?></title>
    		<style>
    			html {
    				background: #f1f1f1;
    				color: #444;
    				font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif;
    				font-size: 13px;
    				line-height: 1.4em;
    			}
    			body {
    				margin: 0;
    			}
    			#wpadminbar { display: none; }
    		</style>
    	<?php
    	global $hook_suffix;
    	// phpcs:ignore WordPress.WP.GlobalVariablesOverride.Prohibited
    	$hook_suffix = 'font-library';

    	// BEGIN see wp-admin/admin-header.php
    	print_admin_styles();
    	print_head_scripts();

    	/**
    	 * Fires in head section for a specific admin page.
    	 *
    	 * @since 2.1.0
    	 */
    	do_action( "admin_head-{$hook_suffix}" ); // phpcs:ignore WordPress.NamingConventions.ValidHookName.UseUnderscores

    	/**
    	 * Fires in head section for all admin pages.
    	 *
    	 * @since 2.1.0
    	 */
    	do_action( 'admin_head' );
    	// END see wp-admin/admin-header.php
    	?>
    	</head>
    	<body class="font-library">
    		<div id="font-library-app" style="height: 100vh; box-sizing: border-box;"></div>
    	<?php
    	// BEGIN see wp-admin/admin-footer.php

    	/**
    	 * Prints scripts or data before the default footer scripts.
    	 *
    	 * @since 1.2.0
    	 */
    	do_action( 'admin_footer', '' );

    	// Print import map first so it's available for inline scripts
    	wp_script_modules()->print_import_map();
    	print_footer_scripts();
    	wp_script_modules()->print_enqueued_script_modules();
    	wp_script_modules()->print_script_module_preloads();
    	wp_script_modules()->print_script_module_data();

    	/**
    	 * Prints scripts or data after the default footer scripts.
    	 *
    	 * @since 2.8.0
    	 */
    	do_action( "admin_footer-{$hook_suffix}" ); // phpcs:ignore WordPress.NamingConventions.ValidHookName.UseUnderscores
    	// END see wp-admin/admin-footer.php
    	?>
    	</body>
    	</html>
    	<?php
    	exit;
    }
    ```

[View all references](https://developer.wordpress.org/reference/files/wp-includes/build/pages/font-library/page.php/)
[View on Trac](https://core.trac.wordpress.org/browser/tags/7.0/src/wp-includes/build/pages/font-library/page.php#L119)
[View on GitHub](https://github.com/WordPress/wordpress-develop/blob/7.0/src/wp-includes/build/pages/font-library/page.php#L119-L302)

## 󠀁[Hooks](https://developer.wordpress.org/reference/functions/wp_font_library_render_page/?output_format=md#hooks)󠁿

 [do_action( ‘admin_footer’ )](https://developer.wordpress.org/reference/hooks/admin_footer/)

Prints scripts or data before the default footer scripts.

 [do_action( “admin_footer-{$hook_suffix}” )](https://developer.wordpress.org/reference/hooks/admin_footer-hook_suffix/)

Prints scripts or data after the default footer scripts.

 [do_action( ‘admin_head’ )](https://developer.wordpress.org/reference/hooks/admin_head/)

Fires in head section for all admin pages.

 [do_action( “admin_head-{$hook_suffix}” )](https://developer.wordpress.org/reference/hooks/admin_head-hook_suffix/)

Fires in head section for a specific admin page.

## 󠀁[Related](https://developer.wordpress.org/reference/functions/wp_font_library_render_page/?output_format=md#related)󠁿

| Uses | Description | 
| [wp_font_library_preload_data()](https://developer.wordpress.org/reference/functions/wp_font_library_preload_data/)`wp-includes/build/pages/font-library/page.php` |

Preload REST API data for the font-library page.

  | 
| [wp_get_font_library_menu_items()](https://developer.wordpress.org/reference/functions/wp_get_font_library_menu_items/)`wp-includes/build/pages/font-library/page.php` |

Get all registered menu items for the font-library page.

  | 
| [wp_get_font_library_routes()](https://developer.wordpress.org/reference/functions/wp_get_font_library_routes/)`wp-includes/build/pages/font-library/page.php` |

Get all registered routes for the font-library page.

  | 
| [wp_enqueue_command_palette_assets()](https://developer.wordpress.org/reference/functions/wp_enqueue_command_palette_assets/)`wp-includes/script-loader.php` |

Enqueues the assets required for the Command Palette.

  | 
| [WP_Script_Modules::print_script_module_data()](https://developer.wordpress.org/reference/classes/wp_script_modules/print_script_module_data/)`wp-includes/class-wp-script-modules.php` |

Print data associated with Script Modules.

  | 
| [WP_Script_Modules::print_import_map()](https://developer.wordpress.org/reference/classes/wp_script_modules/print_import_map/)`wp-includes/class-wp-script-modules.php` |

Prints the import map using a script tag with a type=”importmap” attribute.

  | 
| [WP_Script_Modules::print_script_module_preloads()](https://developer.wordpress.org/reference/classes/wp_script_modules/print_script_module_preloads/)`wp-includes/class-wp-script-modules.php` |

Prints the static dependencies of the enqueued script modules using link tags with rel=”modulepreload” attributes.

  | 
| [WP_Script_Modules::print_enqueued_script_modules()](https://developer.wordpress.org/reference/classes/wp_script_modules/print_enqueued_script_modules/)`wp-includes/class-wp-script-modules.php` |

Prints the enqueued script modules in footer.

  | 
| [wp_register_script_module()](https://developer.wordpress.org/reference/functions/wp_register_script_module/)`wp-includes/script-modules.php` |

Registers the script module if no script module with that script module identifier has already been registered.

  | 
| [wp_enqueue_script_module()](https://developer.wordpress.org/reference/functions/wp_enqueue_script_module/)`wp-includes/script-modules.php` |

Marks the script module to be enqueued in the page.

  | 
| [wp_script_modules()](https://developer.wordpress.org/reference/functions/wp_script_modules/)`wp-includes/script-modules.php` |

Retrieves the main [WP_Script_Modules](https://developer.wordpress.org/reference/classes/wp_script_modules/) instance.

  | 
| [wp_add_inline_script()](https://developer.wordpress.org/reference/functions/wp_add_inline_script/)`wp-includes/functions.wp-scripts.php` |

Adds extra code to a registered script.

  | 
| [wp_styles()](https://developer.wordpress.org/reference/functions/wp_styles/)`wp-includes/functions.wp-styles.php` |

Initializes $wp_styles if it has not been set.

  | 
| [wp_scripts()](https://developer.wordpress.org/reference/functions/wp_scripts/)`wp-includes/functions.wp-scripts.php` |

Initializes $wp_scripts if it has not been set.

  | 
| [set_current_screen()](https://developer.wordpress.org/reference/functions/set_current_screen/)`wp-admin/includes/screen.php` |

Set the current screen object

  | 
| [get_admin_page_title()](https://developer.wordpress.org/reference/functions/get_admin_page_title/)`wp-admin/includes/plugin.php` |

Gets the title of the current admin page.

  | 
| [language_attributes()](https://developer.wordpress.org/reference/functions/language_attributes/)`wp-includes/general-template.php` |

Displays the language attributes for the ‘html’ tag.

  | 
| [bloginfo()](https://developer.wordpress.org/reference/functions/bloginfo/)`wp-includes/general-template.php` |

Displays information about the current site.

  | 
| [wp_dequeue_script()](https://developer.wordpress.org/reference/functions/wp_dequeue_script/)`wp-includes/functions.wp-scripts.php` |

Removes a previously enqueued script.

  | 
| [wp_register_script()](https://developer.wordpress.org/reference/functions/wp_register_script/)`wp-includes/functions.wp-scripts.php` |

Registers a new script.

  | 
| [wp_dequeue_style()](https://developer.wordpress.org/reference/functions/wp_dequeue_style/)`wp-includes/functions.wp-styles.php` |

Removes a previously enqueued CSS stylesheet.

  | 
| [wp_style_is()](https://developer.wordpress.org/reference/functions/wp_style_is/)`wp-includes/functions.wp-styles.php` |

Checks whether a CSS stylesheet has been added to the queue.

  | 
| [wp_register_style()](https://developer.wordpress.org/reference/functions/wp_register_style/)`wp-includes/functions.wp-styles.php` |

Registers a CSS stylesheet.

  | 
| [remove_action()](https://developer.wordpress.org/reference/functions/remove_action/)`wp-includes/plugin.php` |

Removes a callback function from an action hook.

  | 
| [print_admin_styles()](https://developer.wordpress.org/reference/functions/print_admin_styles/)`wp-includes/script-loader.php` |

Prints the styles queue in the HTML head on admin pages.

  | 
| [print_head_scripts()](https://developer.wordpress.org/reference/functions/print_head_scripts/)`wp-includes/script-loader.php` |

Prints the script queue in the HTML head on admin pages.

  | 
| [print_footer_scripts()](https://developer.wordpress.org/reference/functions/print_footer_scripts/)`wp-includes/script-loader.php` |

Prints the scripts that were queued for the footer or too late for the HTML head.

  | 
| [wp_json_encode()](https://developer.wordpress.org/reference/functions/wp_json_encode/)`wp-includes/functions.php` |

Encodes a variable into JSON, with some confidence checks.

  | 
| [esc_url()](https://developer.wordpress.org/reference/functions/esc_url/)`wp-includes/formatting.php` |

Checks and cleans a URL.

  | 
| [esc_html()](https://developer.wordpress.org/reference/functions/esc_html/)`wp-includes/formatting.php` |

Escaping for HTML blocks.

  | 
| [wp_enqueue_script()](https://developer.wordpress.org/reference/functions/wp_enqueue_script/)`wp-includes/functions.wp-scripts.php` |

Enqueues a script.

  | 
| [admin_url()](https://developer.wordpress.org/reference/functions/admin_url/)`wp-includes/link-template.php` |

Retrieves the URL to the admin area for the current site.

  | 
| [wp_enqueue_style()](https://developer.wordpress.org/reference/functions/wp_enqueue_style/)`wp-includes/functions.wp-styles.php` |

Enqueues a CSS stylesheet.

  | 
| [do_action()](https://developer.wordpress.org/reference/functions/do_action/)`wp-includes/plugin.php` |

Calls the callback functions that have been added to an action hook.

  |

[Show 29 more](https://developer.wordpress.org/reference/functions/wp_font_library_render_page/?output_format=md#)
[Show less](https://developer.wordpress.org/reference/functions/wp_font_library_render_page/?output_format=md#)

| Used by | Description | 
| [wp_font_library_intercept_render()](https://developer.wordpress.org/reference/functions/wp_font_library_intercept_render/)`wp-includes/build/pages/font-library/page.php` |

Intercept admin_init to render the page early.

  |

## User Contributed Notes

You must [log in](https://login.wordpress.org/?redirect_to=https%3A%2F%2Fdeveloper.wordpress.org%2Freference%2Ffunctions%2Fwp_font_library_render_page%2F)
before being able to contribute a note or feedback.