aristath/kirki

View on GitHub
packages/kirki-framework/googlefonts/src/GoogleFonts.php

Summary

Maintainability
A
0 mins
Test Coverage
<?php
/**
 * Processes typography-related fields
 * and generates the google-font link.
 *
 * @package kirki-framework/googlefonts
 * @author Ari Stathopoulos (@aristath)
 * @copyright Copyright (c) 2019, Ari Stathopoulos (@aristath)
 * @license https://opensource.org/licenses/MIT
 * @since 1.0.0
 */

namespace Kirki;

/**
 * Manages the way Google Fonts are enqueued.
 */
final class GoogleFonts {

    /**
     * An array of our google fonts.
     *
     * @static
     * @access public
     * @since 1.0.0
     * @var array
     */
    public static $google_fonts;

    /**
     * The class constructor.
     *
     * @access public
     * @since 1.0.0
     */
    public function __construct() {
        add_action( 'wp_ajax_kirki_fonts_google_all_get', [ $this, 'print_googlefonts_json' ] );
        add_action( 'wp_ajax_nopriv_kirki_fonts_google_all_get', [ $this, 'print_googlefonts_json' ] );
    }

    /**
     * Prints the googlefonts JSON file.
     *
     * @since 1.0.0
     * @param bool $die Whether the script should exit or not.
     * @return void
     */
    public function print_googlefonts_json( $die = true ) {
        include 'webfonts.json'; // phpcs:ignore WPThemeReview.CoreFunctionality.FileInclude
        if ( function_exists( 'wp_die' ) && $die ) {
            wp_die();
        }
    }

    /**
     * Returns the array of googlefonts from the JSON file.
     *
     * @since 1.0.0
     * @return array
     */
    public function get_array() {
        ob_start();
        include 'webfonts.json'; // phpcs:ignore WPThemeReview.CoreFunctionality.FileInclude
        return json_decode( ob_get_clean(), true );
    }

    /**
     * Return an array of all available Google Fonts.
     *
     * @access public
     * @since 1.0.0
     * @return array All Google Fonts.
     */
    public function get_google_fonts() {

        // Get fonts from cache.
        self::$google_fonts = get_site_transient( 'kirki_googlefonts_cache' );

        // If cache is populated, return cached fonts array.
        if ( self::$google_fonts ) {
            return self::$google_fonts;
        }

        // If we got this far, cache was empty so we need to get from JSON.
        $fonts = $this->get_array();

        self::$google_fonts = [];
        if ( is_array( $fonts ) ) {
            foreach ( $fonts['items'] as $font ) {
                self::$google_fonts[ $font['family'] ] = [
                    'label'    => $font['family'],
                    'variants' => $font['variants'],
                    'category' => $font['category'],
                ];
            }
        }

        // Apply the 'kirki_fonts_google_fonts' filter.
        self::$google_fonts = apply_filters( 'kirki_fonts_google_fonts', self::$google_fonts );

        // Save the array in cache.
        $cache_time = apply_filters( 'kirki_googlefonts_transient_time', HOUR_IN_SECONDS );
        set_site_transient( 'kirki_googlefonts_cache', self::$google_fonts, $cache_time );

        return self::$google_fonts;
    }

    /**
     * Returns an array of google-fonts matching our arguments.
     *
     * @access public
     * @since 1.0.0
     * @param array $args The arguments.
     * @return array
     */
    public function get_google_fonts_by_args( $args = [] ) {
        $cache_name = 'kirki_googlefonts_' . md5( wp_json_encode( $args ) );
        $cache      = get_site_transient( $cache_name );
        if ( $cache ) {
            return $cache;
        }

        $args['sort'] = isset( $args['sort'] ) ? $args['sort'] : 'alpha';

        $fonts         = $this->get_array();
        $ordered_fonts = $fonts['order'][ $args['sort'] ];
        if ( isset( $args['count'] ) ) {
            $ordered_fonts = array_slice( $ordered_fonts, 0, $args['count'] );
            set_site_transient( $cache_name, $ordered_fonts, HOUR_IN_SECONDS );
            return $ordered_fonts;
        }
        set_site_transient( $cache_name, $ordered_fonts, HOUR_IN_SECONDS );
        return $ordered_fonts;
    }
}