summaryrefslogtreecommitdiff
path: root/inc/customizer/class-astra-fonts.php
diff options
context:
space:
mode:
Diffstat (limited to 'inc/customizer/class-astra-fonts.php')
-rw-r--r--inc/customizer/class-astra-fonts.php200
1 files changed, 200 insertions, 0 deletions
diff --git a/inc/customizer/class-astra-fonts.php b/inc/customizer/class-astra-fonts.php
new file mode 100644
index 0000000..fc2ae34
--- /dev/null
+++ b/inc/customizer/class-astra-fonts.php
@@ -0,0 +1,200 @@
+<?php
+/**
+ * Helper class for font settings.
+ *
+ * @package Astra
+ * @author Astra
+ * @copyright Copyright (c) 2020, Astra
+ * @link https://wpastra.com/
+ * @since Astra 1.0.0
+ */
+
+// Exit if accessed directly.
+if ( ! defined( 'ABSPATH' ) ) {
+ exit;
+}
+
+/**
+ * Astra Fonts
+ */
+final class Astra_Fonts {
+
+ /**
+ * Get fonts to generate.
+ *
+ * @since 1.0.0
+ * @var array $fonts
+ */
+ private static $fonts = array();
+
+ /**
+ * Adds data to the $fonts array for a font to be rendered.
+ *
+ * @since 1.0.0
+ * @param string $name The name key of the font to add.
+ * @param array $variants An array of weight variants.
+ * @return void
+ */
+ public static function add_font( $name, $variants = array() ) {
+
+ if ( 'inherit' == $name ) {
+ return;
+ }
+ if ( ! is_array( $variants ) ) {
+ // For multiple variant selectons for fonts.
+ $variants = explode( ',', str_replace( 'italic', 'i', $variants ) );
+ }
+
+ if ( is_array( $variants ) ) {
+ $key = array_search( 'inherit', $variants );
+ if ( false !== $key ) {
+
+ unset( $variants[ $key ] );
+
+ if ( ! in_array( 400, $variants ) ) {
+ $variants[] = 400;
+ }
+ }
+ } elseif ( 'inherit' == $variants ) {
+ $variants = 400;
+ }
+
+ if ( isset( self::$fonts[ $name ] ) ) {
+ foreach ( (array) $variants as $variant ) {
+ if ( ! in_array( $variant, self::$fonts[ $name ]['variants'] ) ) {
+ self::$fonts[ $name ]['variants'][] = $variant;
+ }
+ }
+ } else {
+ self::$fonts[ $name ] = array(
+ 'variants' => (array) $variants,
+ );
+ }
+ }
+
+ /**
+ * Get Fonts
+ */
+ public static function get_fonts() {
+
+ do_action( 'astra_get_fonts' );
+ return apply_filters( 'astra_add_fonts', self::$fonts );
+ }
+
+ /**
+ * Renders the <link> tag for all fonts in the $fonts array.
+ *
+ * @since 1.0.16 Added the filter 'astra_render_fonts' to support custom fonts.
+ * @since 1.0.0
+ * @return void
+ */
+ public static function render_fonts() {
+
+ $font_list = apply_filters( 'astra_render_fonts', self::get_fonts() );
+
+ $google_fonts = array();
+ $font_subset = array();
+
+ $system_fonts = Astra_Font_Families::get_system_fonts();
+
+ foreach ( $font_list as $name => $font ) {
+ if ( ! empty( $name ) && ! isset( $system_fonts[ $name ] ) ) {
+
+ // Add font variants.
+ $google_fonts[ $name ] = $font['variants'];
+
+ // Add Subset.
+ $subset = apply_filters( 'astra_font_subset', '', $name );
+ if ( ! empty( $subset ) ) {
+ $font_subset[] = $subset;
+ }
+ }
+ }
+
+ $google_font_url = self::google_fonts_url( $google_fonts, $font_subset );
+
+ // Do not load Google font remote or local font asset if not any font selected.
+ if ( '' === $google_font_url ) {
+ return;
+ }
+
+ /**
+ * Support self hosted Google Fonts.
+ *
+ * @since 3.6.0
+ */
+ if ( astra_get_option( 'load-google-fonts-locally' ) && ! is_customize_preview() && ! is_admin() ) {
+ if ( astra_get_option( 'preload-local-fonts' ) ) {
+ ast_load_preload_local_fonts( $google_font_url );
+ }
+ wp_enqueue_style( 'astra-google-fonts', ast_get_webfont_url( $google_font_url ), array(), ASTRA_THEME_VERSION, 'all' );
+ } else {
+ wp_enqueue_style( 'astra-google-fonts', $google_font_url, array(), ASTRA_THEME_VERSION, 'all' );
+ }
+ }
+
+ /**
+ * Google Font URL
+ * Combine multiple google font in one URL
+ *
+ * @link https://shellcreeper.com/?p=1476
+ * @param array $fonts Google Fonts array.
+ * @param array $subsets Font's Subsets array.
+ *
+ * @return string
+ */
+ public static function google_fonts_url( $fonts, $subsets = array() ) {
+
+ /* URL */
+ $base_url = 'https://fonts.googleapis.com/css';
+ $font_args = array();
+ $family = array();
+
+ // This is deprecated filter hook.
+ $fonts = apply_filters( 'astra_google_fonts', $fonts );
+
+ $fonts = apply_filters( 'astra_google_fonts_selected', $fonts );
+
+ /* Format Each Font Family in Array */
+ foreach ( $fonts as $font_name => $font_weight ) {
+ $font_name = str_replace( ' ', '+', $font_name );
+ if ( ! empty( $font_weight ) ) {
+ if ( is_array( $font_weight ) ) {
+ $font_weight = implode( ',', $font_weight );
+ }
+ $font_family = explode( ',', $font_name );
+ $font_family = str_replace( "'", '', astra_get_prop( $font_family, 0 ) );
+ $family[] = trim( $font_family . ':' . rawurlencode( trim( $font_weight ) ) );
+ } else {
+ $family[] = trim( $font_name );
+ }
+ }
+
+ /* Only return URL if font family defined. */
+ if ( ! empty( $family ) ) {
+
+ /* Make Font Family a String */
+ $family = implode( '|', $family );
+
+ /* Add font family in args */
+ $font_args['family'] = $family;
+
+ /* Add font subsets in args */
+ if ( ! empty( $subsets ) ) {
+
+ /* format subsets to string */
+ if ( is_array( $subsets ) ) {
+ $subsets = implode( ',', $subsets );
+ }
+
+ $font_args['subset'] = rawurlencode( trim( $subsets ) );
+ }
+
+ $font_args['display'] = astra_get_fonts_display_property();
+
+ return add_query_arg( $font_args, $base_url );
+ }
+
+ return '';
+ }
+}