Files
revision/core/customizer/modules/class-fonts-google.php
2025-08-21 14:40:43 +02:00

219 lines
5.9 KiB
PHP

<?php
/**
* Customizer Fonts Google
*
* @package Revision
*/
if ( ! class_exists( 'CSCO_Customizer_Fonts_Google' ) ) {
/**
* Customizer Fonts Google Class.
*/
final class CSCO_Customizer_Fonts_Google {
/**
* The array of fonts
*
* @var array
*/
public $fonts_output = array();
/**
* An array of all google fonts.
*
* @var array
*/
private $google_fonts = array();
/**
* Fonts to load.
*
* @var array
*/
protected $fonts_to_load = array();
/**
* The class constructor.
*/
public function __construct() {
$this->google_fonts = CSCO_Customizer_Fonts::get_google_fonts();
/** Initialize actions */
add_action( 'wp_loaded', array( $this, 'populate_fonts' ) );
add_filter( 'wp_resource_hints', array( $this, 'resource_hints' ), 10, 2 );
if ( ! is_admin() || is_customize_preview() ) {
add_action( 'wp_enqueue_scripts', array( $this, 'enqueue_google_fonts' ), 999 );
} else {
add_action( 'enqueue_block_assets', array( $this, 'enqueue_google_fonts' ), 999 );
}
}
/**
* Loader for Google Fonts.
*/
public function populate_fonts() {
// Go through our fields and populate $this->fonts_output.
$this->loop_fields();
// Goes through $this->fonts_output and adds or removes things as needed.
$this->process_fonts();
foreach ( $this->fonts_output as $font => $weights ) {
foreach ( $weights as $key => $value ) {
if ( 'italic' === $value ) {
$weights[ $key ] = '400i';
} else {
$weights[ $key ] = str_replace( array( 'regular', 'bold', 'italic' ), array( '400', '', 'i' ), $value );
}
}
$this->fonts_to_load[] = array(
'family' => $font,
'weights' => $weights,
);
}
}
/**
* Goes through all our fields and then populates the $this->fonts_output property.
*/
public function loop_fields() {
$fields = CSCO_Customizer::$fields;
if ( is_array( $fields ) && $fields ) {
foreach ( $fields as $field ) {
if ( ! isset( $field['type'] ) || false === strpos( $field['type'], 'typography' ) ) {
continue;
}
// Check active callback.
if ( ! CSCO_Customizer_Helper::active_callback( $field ) ) {
continue;
}
// Get the value.
$value = CSCO_Customizer_Helper::get_value( $field['settings'] );
// If we don't have a font-family then we can skip this.
if ( ! isset( $value['font-family'] ) ) {
continue;
}
// If not a google-font, then we can skip this.
if ( ! isset( $value['font-family'] ) || ! CSCO_Customizer_Fonts::is_google_font( $value['font-family'] ) ) {
continue;
}
// Set a default value for variants.
if ( ! isset( $value['variant'] ) ) {
$value['variant'] = 'regular';
}
// Add the requested google-font.
if ( ! isset( $this->fonts_output[ $value['font-family'] ] ) ) {
$this->fonts_output[ $value['font-family'] ] = array();
}
if ( ! in_array( $value['variant'], $this->fonts_output[ $value['font-family'] ], true ) ) {
$this->fonts_output[ $value['font-family'] ][] = $value['variant'];
}
if ( isset( $field['choices']['variant'] ) && is_array( $field['choices']['variant'] ) ) {
foreach ( $field['choices']['variant'] as $extra_variant ) {
if ( ! in_array( $extra_variant, $this->fonts_output[ $value['font-family'] ], true ) ) {
$this->fonts_output[ $value['font-family'] ][] = $extra_variant;
}
}
}
}
}
}
/**
* Determines the vbalidity of the selected font as well as its properties.
* This is vital to make sure that the google-font script that we'll generate later
* does not contain any invalid options.
*/
public function process_fonts() {
// Early exit if font-family is empty.
if ( empty( $this->fonts_output ) ) {
return;
}
foreach ( $this->fonts_output as $font => $variants ) {
// Determine if this is indeed a google font or not.
// If it's not, then just remove it from the array.
if ( ! array_key_exists( $font, $this->google_fonts ) ) {
unset( $this->fonts_output[ $font ] );
continue;
}
// Get all valid font variants for this font.
$font_variants = array();
if ( isset( $this->google_fonts[ $font ]['variants'] ) ) {
$font_variants = $this->google_fonts[ $font ]['variants'];
}
foreach ( $variants as $variant ) {
// If this is not a valid variant for this font-family
// then unset it and move on to the next one.
if ( ! in_array( strval( $variant ), $font_variants, true ) ) {
$variant_key = array_search( $variant, $this->fonts_output[ $font ], true );
unset( $this->fonts_output[ $font ][ $variant_key ] );
continue;
}
}
}
}
/**
* Add preconnect for Google Fonts.
*
* @param array $urls URLs to print for resource hints.
* @param string $relation_type The relation type the URLs are printed.
*/
public function resource_hints( $urls, $relation_type ) {
$fonts_to_load = $this->fonts_output;
if ( ! empty( $fonts_to_load ) && 'preconnect' === $relation_type ) {
$urls[] = array(
'href' => 'https://fonts.gstatic.com',
'crossorigin',
);
}
return $urls;
}
/**
* Enqueue Google fonts.
*/
public function enqueue_google_fonts() {
foreach ( $this->fonts_to_load as $font ) {
// Set family.
$family = str_replace( ' ', '+', trim( $font['family'] ) );
// Set weights.
$weights = join( ',', $font['weights'] );
/**
* The csco_customizer_google_fonts_subset hook.
*
* @since 1.0.0
*/
$subset = apply_filters( 'csco_customizer_google_fonts_subset', 'latin,latin-ext,cyrillic,cyrillic-ext,vietnamese' );
$url = "https://fonts.googleapis.com/css?family={$family}:{$weights}&subset={$subset}&display=swap";
wp_enqueue_style( md5( $url ), $url, array(), csco_get_theme_data( 'Version' ) );
}
}
}
new CSCO_Customizer_Fonts_Google();
}