Introduce font-face styles generator and printer.
Introducing Font Face, a server-side `@font-face` styles generator and printer.
tl;dr:
* Introduces Font Face.
* Deprecates `_wp_theme_json_webfonts_handler()`.
**Introduce Font Face**
From an array of fonts (i.e. each font-family and its font variations to be processed), it:
1. Validates each `font-face` declaration, i.e. the CSS property and value pairing. If validation fails, processing stops with no font-face styles printed.
3. Generates the `@font-face` CSS for each font-family.
4. Prints the CSS within a `<style id="wp-fonts-local">` element.
The entry point into Font Face is through a new global function called `wp_print_font_faces()`, which is automatically called:
* when the `'wp_head'` hook runs (for the front-end).
* when the `'admin_print_styles'` hook runs (for the back-end).
* when `_wp_get_iframed_editor_assets()` runs to inject the `@font-face` styles into the iframed editor.
Once called, it gets the fonts from Theme_JSON merged data layer, which includes theme defined fonts and user activated fonts (once the Font Library #59166 is introduced into Core).
For classic sites, themes and plugins can directly call `wp_print_font_faces()` and pass their fonts array to it for processing.
**Deprecates `_wp_theme_json_webfonts_handler()`.**
As Font Face is a direct replacement, the stopgap code in `_wp_theme_json_webfonts_handler()` (introduced in 6.0.0 via [53282]) is deprecated and unused in Core.
**Props note:**
There's a long multiple year history baked into Font Face, which dates back to the early versions of a web font API (see #46370 and [https://github.com/WordPress/gutenberg/issues/41479 roadmap]. The props list includes those who contributed from those early versions up to this commit.
**References:**
* #46370 original (Web)Fonts API proposal for registering and enqueuing web fonts.
* [https://github.com/WordPress/gutenberg/issues/41479 Gutenberg tracking issue] which includes the evolution from Webfonts API to Fonts API to Font Face.
* [53282] / #55567 Added the stopgap code `_wp_theme_json_webfonts_handler()` in 6.0.
* [https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face @font-face on mdn web docs]
* #59166 Font Library: Font manager for WordPress
Follow-up to [53282].
Props aristath, jonoaldersonwp, hellofromTonya, andraganescu, annezazu, antonvlasenko, arena, askdesign, azaozz, bph, bradley2083, colorful-tones, costdev, davidbaumwald, desrosj, dingo_d, djcowan, domainsupport, dryanpress, elmastudio, flixos90, francina, garrett-eclipse, gigitux, grantmkin, grapplerulrich, gziolo, ironprogrammer, jb510, jeffpaul, jeremyyip, jffng, joostdevalk, jorgefilipecosta, juanmaguitar, mamaduka, matveb, mburridge, mitogh, ndiego, ntsekouras, oandregal, ocean90, oglekler, paaljoachim, pagelab, peterwilsoncc, poena, priethor, scruffian, SergeyBiryukov, shiloey, simison, skorasaurus, soean, westonruter, wildworks, zaguiini.
Fixes #59165.
Built from https://develop.svn.wordpress.org/trunk@56500
git-svn-id: http://core.svn.wordpress.org/trunk@56012 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2023-08-31 23:49:20 +02:00
|
|
|
<?php
|
|
|
|
/**
|
|
|
|
* Fonts functions.
|
|
|
|
*
|
|
|
|
* @package WordPress
|
|
|
|
* @subpackage Fonts
|
|
|
|
* @since 6.4.0
|
|
|
|
*/
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Generates and prints font-face styles for given fonts or theme.json fonts.
|
|
|
|
*
|
|
|
|
* @since 6.4.0
|
|
|
|
*
|
|
|
|
* @param array[][] $fonts {
|
|
|
|
* Optional. The font-families and their font variations. Default empty array.
|
|
|
|
*
|
|
|
|
* @type string $font-family => array[] $variations {
|
|
|
|
* Optional. An associated array of font variations for this font-family.
|
|
|
|
* Each variation has the following structure.
|
|
|
|
*
|
|
|
|
* @type array $font_variation {
|
|
|
|
* @type string $font-family The font-family property.
|
|
|
|
* @type string|string[] $src The URL(s) to each resource containing the font data.
|
2024-01-03 23:13:18 +01:00
|
|
|
* @type string $font-style Optional. The font-style property. Default 'normal'.
|
Introduce font-face styles generator and printer.
Introducing Font Face, a server-side `@font-face` styles generator and printer.
tl;dr:
* Introduces Font Face.
* Deprecates `_wp_theme_json_webfonts_handler()`.
**Introduce Font Face**
From an array of fonts (i.e. each font-family and its font variations to be processed), it:
1. Validates each `font-face` declaration, i.e. the CSS property and value pairing. If validation fails, processing stops with no font-face styles printed.
3. Generates the `@font-face` CSS for each font-family.
4. Prints the CSS within a `<style id="wp-fonts-local">` element.
The entry point into Font Face is through a new global function called `wp_print_font_faces()`, which is automatically called:
* when the `'wp_head'` hook runs (for the front-end).
* when the `'admin_print_styles'` hook runs (for the back-end).
* when `_wp_get_iframed_editor_assets()` runs to inject the `@font-face` styles into the iframed editor.
Once called, it gets the fonts from Theme_JSON merged data layer, which includes theme defined fonts and user activated fonts (once the Font Library #59166 is introduced into Core).
For classic sites, themes and plugins can directly call `wp_print_font_faces()` and pass their fonts array to it for processing.
**Deprecates `_wp_theme_json_webfonts_handler()`.**
As Font Face is a direct replacement, the stopgap code in `_wp_theme_json_webfonts_handler()` (introduced in 6.0.0 via [53282]) is deprecated and unused in Core.
**Props note:**
There's a long multiple year history baked into Font Face, which dates back to the early versions of a web font API (see #46370 and [https://github.com/WordPress/gutenberg/issues/41479 roadmap]. The props list includes those who contributed from those early versions up to this commit.
**References:**
* #46370 original (Web)Fonts API proposal for registering and enqueuing web fonts.
* [https://github.com/WordPress/gutenberg/issues/41479 Gutenberg tracking issue] which includes the evolution from Webfonts API to Fonts API to Font Face.
* [53282] / #55567 Added the stopgap code `_wp_theme_json_webfonts_handler()` in 6.0.
* [https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face @font-face on mdn web docs]
* #59166 Font Library: Font manager for WordPress
Follow-up to [53282].
Props aristath, jonoaldersonwp, hellofromTonya, andraganescu, annezazu, antonvlasenko, arena, askdesign, azaozz, bph, bradley2083, colorful-tones, costdev, davidbaumwald, desrosj, dingo_d, djcowan, domainsupport, dryanpress, elmastudio, flixos90, francina, garrett-eclipse, gigitux, grantmkin, grapplerulrich, gziolo, ironprogrammer, jb510, jeffpaul, jeremyyip, jffng, joostdevalk, jorgefilipecosta, juanmaguitar, mamaduka, matveb, mburridge, mitogh, ndiego, ntsekouras, oandregal, ocean90, oglekler, paaljoachim, pagelab, peterwilsoncc, poena, priethor, scruffian, SergeyBiryukov, shiloey, simison, skorasaurus, soean, westonruter, wildworks, zaguiini.
Fixes #59165.
Built from https://develop.svn.wordpress.org/trunk@56500
git-svn-id: http://core.svn.wordpress.org/trunk@56012 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2023-08-31 23:49:20 +02:00
|
|
|
* @type string $font-weight Optional. The font-weight property. Default '400'.
|
|
|
|
* @type string $font-display Optional. The font-display property. Default 'fallback'.
|
|
|
|
* @type string $ascent-override Optional. The ascent-override property.
|
|
|
|
* @type string $descent-override Optional. The descent-override property.
|
|
|
|
* @type string $font-stretch Optional. The font-stretch property.
|
|
|
|
* @type string $font-variant Optional. The font-variant property.
|
|
|
|
* @type string $font-feature-settings Optional. The font-feature-settings property.
|
|
|
|
* @type string $font-variation-settings Optional. The font-variation-settings property.
|
|
|
|
* @type string $line-gap-override Optional. The line-gap-override property.
|
|
|
|
* @type string $size-adjust Optional. The size-adjust property.
|
|
|
|
* @type string $unicode-range Optional. The unicode-range property.
|
|
|
|
* }
|
|
|
|
* }
|
|
|
|
* }
|
|
|
|
*/
|
|
|
|
function wp_print_font_faces( $fonts = array() ) {
|
|
|
|
|
|
|
|
if ( empty( $fonts ) ) {
|
|
|
|
$fonts = WP_Font_Face_Resolver::get_fonts_from_theme_json();
|
|
|
|
}
|
|
|
|
|
|
|
|
if ( empty( $fonts ) ) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2023-09-07 19:30:17 +02:00
|
|
|
$wp_font_face = new WP_Font_Face();
|
Introduce font-face styles generator and printer.
Introducing Font Face, a server-side `@font-face` styles generator and printer.
tl;dr:
* Introduces Font Face.
* Deprecates `_wp_theme_json_webfonts_handler()`.
**Introduce Font Face**
From an array of fonts (i.e. each font-family and its font variations to be processed), it:
1. Validates each `font-face` declaration, i.e. the CSS property and value pairing. If validation fails, processing stops with no font-face styles printed.
3. Generates the `@font-face` CSS for each font-family.
4. Prints the CSS within a `<style id="wp-fonts-local">` element.
The entry point into Font Face is through a new global function called `wp_print_font_faces()`, which is automatically called:
* when the `'wp_head'` hook runs (for the front-end).
* when the `'admin_print_styles'` hook runs (for the back-end).
* when `_wp_get_iframed_editor_assets()` runs to inject the `@font-face` styles into the iframed editor.
Once called, it gets the fonts from Theme_JSON merged data layer, which includes theme defined fonts and user activated fonts (once the Font Library #59166 is introduced into Core).
For classic sites, themes and plugins can directly call `wp_print_font_faces()` and pass their fonts array to it for processing.
**Deprecates `_wp_theme_json_webfonts_handler()`.**
As Font Face is a direct replacement, the stopgap code in `_wp_theme_json_webfonts_handler()` (introduced in 6.0.0 via [53282]) is deprecated and unused in Core.
**Props note:**
There's a long multiple year history baked into Font Face, which dates back to the early versions of a web font API (see #46370 and [https://github.com/WordPress/gutenberg/issues/41479 roadmap]. The props list includes those who contributed from those early versions up to this commit.
**References:**
* #46370 original (Web)Fonts API proposal for registering and enqueuing web fonts.
* [https://github.com/WordPress/gutenberg/issues/41479 Gutenberg tracking issue] which includes the evolution from Webfonts API to Fonts API to Font Face.
* [53282] / #55567 Added the stopgap code `_wp_theme_json_webfonts_handler()` in 6.0.
* [https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face @font-face on mdn web docs]
* #59166 Font Library: Font manager for WordPress
Follow-up to [53282].
Props aristath, jonoaldersonwp, hellofromTonya, andraganescu, annezazu, antonvlasenko, arena, askdesign, azaozz, bph, bradley2083, colorful-tones, costdev, davidbaumwald, desrosj, dingo_d, djcowan, domainsupport, dryanpress, elmastudio, flixos90, francina, garrett-eclipse, gigitux, grantmkin, grapplerulrich, gziolo, ironprogrammer, jb510, jeffpaul, jeremyyip, jffng, joostdevalk, jorgefilipecosta, juanmaguitar, mamaduka, matveb, mburridge, mitogh, ndiego, ntsekouras, oandregal, ocean90, oglekler, paaljoachim, pagelab, peterwilsoncc, poena, priethor, scruffian, SergeyBiryukov, shiloey, simison, skorasaurus, soean, westonruter, wildworks, zaguiini.
Fixes #59165.
Built from https://develop.svn.wordpress.org/trunk@56500
git-svn-id: http://core.svn.wordpress.org/trunk@56012 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2023-08-31 23:49:20 +02:00
|
|
|
$wp_font_face->generate_and_print( $fonts );
|
|
|
|
}
|
2024-02-06 09:42:12 +01:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Registers a new Font Collection in the Font Library.
|
|
|
|
*
|
|
|
|
* @since 6.5.0
|
|
|
|
*
|
|
|
|
* @param string $slug Font collection slug. May only contain alphanumeric characters, dashes,
|
|
|
|
* and underscores. See sanitize_title().
|
|
|
|
* @param array|string $data_or_file {
|
|
|
|
* Font collection data array or a path/URL to a JSON file containing the font collection.
|
|
|
|
*
|
|
|
|
* @link https://schemas.wp.org/trunk/font-collection.json
|
|
|
|
*
|
|
|
|
* @type string $name Required. Name of the font collection shown in the Font Library.
|
|
|
|
* @type string $description Optional. A short descriptive summary of the font collection. Default empty.
|
|
|
|
* @type array $font_families Required. Array of font family definitions that are in the collection.
|
|
|
|
* @type array $categories Optional. Array of categories, each with a name and slug, that are used by the
|
|
|
|
* fonts in the collection. Default empty.
|
|
|
|
* }
|
|
|
|
* @return WP_Font_Collection|WP_Error A font collection if it was registered
|
|
|
|
* successfully, or WP_Error object on failure.
|
|
|
|
*/
|
|
|
|
function wp_register_font_collection( $slug, $data_or_file ) {
|
|
|
|
return WP_Font_Library::get_instance()->register_font_collection( $slug, $data_or_file );
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Unregisters a font collection from the Font Library.
|
|
|
|
*
|
|
|
|
* @since 6.5.0
|
|
|
|
*
|
|
|
|
* @param string $slug Font collection slug.
|
|
|
|
* @return bool True if the font collection was unregistered successfully, else false.
|
|
|
|
*/
|
|
|
|
function wp_unregister_font_collection( $slug ) {
|
|
|
|
return WP_Font_Library::get_instance()->unregister_font_collection( $slug );
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Returns an array containing the current fonts upload directory's path and URL.
|
|
|
|
*
|
|
|
|
* @since 6.5.0
|
|
|
|
*
|
|
|
|
* @param array $defaults {
|
|
|
|
* Array of information about the upload directory.
|
|
|
|
*
|
|
|
|
* @type string $path Base directory and subdirectory or full path to the fonts upload directory.
|
|
|
|
* @type string $url Base URL and subdirectory or absolute URL to the fonts upload directory.
|
|
|
|
* @type string $subdir Subdirectory
|
|
|
|
* @type string $basedir Path without subdir.
|
|
|
|
* @type string $baseurl URL path without subdir.
|
|
|
|
* @type string|false $error False or error message.
|
|
|
|
* }
|
|
|
|
* @return array $defaults {
|
|
|
|
* Array of information about the upload directory.
|
|
|
|
*
|
|
|
|
* @type string $path Base directory and subdirectory or full path to the fonts upload directory.
|
|
|
|
* @type string $url Base URL and subdirectory or absolute URL to the fonts upload directory.
|
|
|
|
* @type string $subdir Subdirectory
|
|
|
|
* @type string $basedir Path without subdir.
|
|
|
|
* @type string $baseurl URL path without subdir.
|
|
|
|
* @type string|false $error False or error message.
|
|
|
|
* }
|
|
|
|
*/
|
|
|
|
function wp_get_font_dir( $defaults = array() ) {
|
|
|
|
$site_path = '';
|
|
|
|
if ( is_multisite() && ! ( is_main_network() && is_main_site() ) ) {
|
|
|
|
$site_path = '/sites/' . get_current_blog_id();
|
|
|
|
}
|
|
|
|
|
|
|
|
// Sets the defaults.
|
|
|
|
$defaults['path'] = path_join( WP_CONTENT_DIR, 'fonts' ) . $site_path;
|
|
|
|
$defaults['url'] = untrailingslashit( content_url( 'fonts' ) ) . $site_path;
|
|
|
|
$defaults['subdir'] = '';
|
|
|
|
$defaults['basedir'] = path_join( WP_CONTENT_DIR, 'fonts' ) . $site_path;
|
|
|
|
$defaults['baseurl'] = untrailingslashit( content_url( 'fonts' ) ) . $site_path;
|
|
|
|
$defaults['error'] = false;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Filters the fonts directory data.
|
|
|
|
*
|
|
|
|
* This filter allows developers to modify the fonts directory data.
|
|
|
|
*
|
|
|
|
* @since 6.5.0
|
|
|
|
*
|
|
|
|
* @param array $defaults The original fonts directory data.
|
|
|
|
*/
|
|
|
|
return apply_filters( 'font_dir', $defaults );
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Deletes child font faces when a font family is deleted.
|
|
|
|
*
|
|
|
|
* @access private
|
|
|
|
* @since 6.5.0
|
|
|
|
*
|
|
|
|
* @param int $post_id Post ID.
|
|
|
|
* @param WP_Post $post Post object.
|
|
|
|
*/
|
|
|
|
function _wp_after_delete_font_family( $post_id, $post ) {
|
|
|
|
if ( 'wp_font_family' !== $post->post_type ) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
$font_faces = get_children(
|
|
|
|
array(
|
|
|
|
'post_parent' => $post_id,
|
|
|
|
'post_type' => 'wp_font_face',
|
|
|
|
)
|
|
|
|
);
|
|
|
|
|
|
|
|
foreach ( $font_faces as $font_face ) {
|
|
|
|
wp_delete_post( $font_face->ID, true );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Deletes associated font files when a font face is deleted.
|
|
|
|
*
|
|
|
|
* @access private
|
|
|
|
* @since 6.5.0
|
|
|
|
*
|
|
|
|
* @param int $post_id Post ID.
|
|
|
|
* @param WP_Post $post Post object.
|
|
|
|
*/
|
|
|
|
function _wp_before_delete_font_face( $post_id, $post ) {
|
|
|
|
if ( 'wp_font_face' !== $post->post_type ) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
$font_files = get_post_meta( $post_id, '_wp_font_face_file', false );
|
|
|
|
$font_dir = wp_get_font_dir()['path'];
|
|
|
|
|
|
|
|
foreach ( $font_files as $font_file ) {
|
|
|
|
wp_delete_file( $font_dir . '/' . $font_file );
|
|
|
|
}
|
|
|
|
}
|
2024-02-08 08:38:19 +01:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Register the default font collections.
|
|
|
|
*
|
|
|
|
* @access private
|
|
|
|
* @since 6.5.0
|
|
|
|
*/
|
|
|
|
function _wp_register_default_font_collections() {
|
|
|
|
wp_register_font_collection( 'google-fonts', 'https://s.w.org/images/fonts/17.7/collections/google-fonts-with-preview.json' );
|
|
|
|
}
|