$default_value) { $subfield = $args; // No need to process the opacity, it is factored in the color control. if ('opacity' == $key) { continue; } $key = esc_attr($key); $setting = $key; $output_property = 'background-' . $key; if ('attach' == $key) { $output_property = 'background-attachment'; } if (is_string($subfield['output'])) { $subfield['output'] = array(array( 'element' => $args['output'], 'property' => $output_property, )); } else { foreach ($subfield['output'] as $key => $output) { $subfield['output'][$key]['property'] = $output_property; } } $type = 'select'; if (in_array($key, array('color', 'image'))) { $type = $key; } $property_setting = esc_attr($args['settings']) . '_' . $setting; self::$fields[$property_setting] = $subfield; } } } self::$fields[$args['settings']] = $args; } } /** * Enqueues the stylesheet */ public function enqueue_styles() { // If Kirki exists there's no need to proceed any further if (class_exists('Kirki')) { return; } // Get our inline styles $styles = $this->get_styles(); // If we have some styles to add, add them now. if (!empty($styles)) { // enqueue the theme's style.css file $current_theme = (wp_get_theme()); wp_enqueue_style($current_theme->stylesheet . '_no-kirki', get_stylesheet_uri(), null, null); wp_add_inline_style($current_theme->stylesheet . '_no-kirki', $styles); } } /** * Gets all our styles and returns them as a string. */ public function get_styles() { // Get an array of all our fields $fields = self::$fields; // Check if we need to exit early if (empty(self::$fields) || !is_array($fields)) { return; } // initially we're going to format our styles as an array. // This is going to make processing them a lot easier // and make sure there are no duplicate styles etc. $css = array(); // start parsing our fields foreach ($fields as $field) { // No need to process fields without an output, or an improperly-formatted output if (!isset($field['output']) || empty($field['output']) || !is_array($field['output'])) { continue; } // Get the value of this field $value = self::get_option($field['kirki_config'], $field['settings']); // start parsing the output arguments of the field foreach ($field['output'] as $output) { // Make sure all output properties are properly set before proceeding $element = (isset($output['element'])) ? $output['element'] : ''; $property = (isset($output['property'])) ? $output['property'] : ''; $media_query = (isset($output['media_query'])) ? $output['media_query'] : 'global'; $prefix = (isset($output['prefix'])) ? $output['prefix'] : ''; $units = (isset($output['units'])) ? $output['units'] : ''; $suffix = (isset($output['suffix'])) ? $output['suffix'] : ''; // If element is an array, convert it to a string if (is_array($element)) { $element = array_unique($element); sort($element); $element = implode(',', $element); } // Simple fields if (!is_array($value)) { if (!empty($element) && !empty($property)) { $css[$media_query][$element][$property] = $prefix . $value . $units . $suffix; } } else { if ('typography' == $field['type']) { foreach ($value as $key => $subvalue) { if ('font-family' == $key) { // add double quotes if needed if (false !== strpos($subvalue, ' ') && false === strpos($subvalue, '"')) { $css[$media_query][$element][$key] = '"' . $subvalue . '"'; } } if ('variant' == $key) { $font_weight = str_replace('italic', '', $subvalue); $font_weight = (in_array($font_weight, array('', 'regular'))) ? '400' : $font_weight; // Is this italic? $is_italic = (false !== strpos($subvalue, 'italic')); $styles[$media_query][$element]['font-weight'] = $font_weight; if ($is_italic) { $styles[$media_query][$element]['font-style'] = 'italic'; } } else { $css[$media_query][$element][$key] = $subvalue; } } } elseif ('spacing' == $field['type']) { foreach ($value as $key => $subvalue) { if (empty($property)) { $property = $key; } elseif (false !== strpos($output['property'], '%%')) { $property = str_replace('%%', $key, $property); } else { $property = $property . '-' . $key; } $css[$media_query][$element][$property] = $subvalue; } } } } } // Process the array of CSS properties and produce the final CSS $final_css = ''; if (!is_array($css) || empty($css)) { return ''; } // Parse the generated CSS array and create the CSS string for the output. foreach ($css as $media_query => $styles) { // Handle the media queries $final_css .= ('global' != $media_query) ? $media_query . '{' : ''; foreach ($styles as $style => $style_array) { $final_css .= $style . '{'; foreach ($style_array as $property => $value) { $value = (is_string($value)) ? $value : ''; // Make sure background-images are properly formatted if ('background-image' == $property) { if (false === strrpos($this->value, 'url(')) { $this->value = 'url("' . esc_url_raw($value) . '")'; } } else { $value = esc_textarea($value); } $final_css .= $property . ':' . $value . ';'; } $final_css .= '}'; } $final_css .= ('global' != $media_query) ? '}' : ''; } return $final_css; } public function enqueue_fonts() { // Check if we need to exit early if (empty(self::$fields) || !is_array(self::$fields)) { return; } foreach (self::$fields as $field) { // Process typography fields if (isset($field['type']) && 'typography' == $field['type']) { // Check if we've got everything we need if (!isset($field['kirki_config']) || !isset($field['settings'])) { continue; } $value = self::get_option($field['kirki_config'], $field['settings']); if (isset($value['font-family'])) { $url = '//fonts.googleapis.com/css?family=' . str_replace(' ', '+', $value['font-family']); if (!isset($value['variant'])) { $value['variant'] = ''; } if (!empty($value['variant'])) { $url .= ':' . $value['variant']; } if (!isset($value['subset'])) { $value['subset'] = ''; } if (!empty($value['subset'])) { if (is_array($value['subset'])) { $value['subset'] = implode(',', $value['subsets']); } $url .= '&subset=' . $value['subset']; } $key = md5($value['font-family'] . $value['variant'] . $value['subset']); // check that the URL is valid. we're going to use transients to make this faster. $url_is_valid = get_transient($key); if (false === $url_is_valid) { // transient does not exist $response = wp_remote_get('https:' . $url); if (!is_array($response)) { // the url was not properly formatted, // cache for 12 hours and continue to the next field set_transient($key, null, 12 * HOUR_IN_SECONDS); continue; } // check the response headers. if (isset($response['response']) && isset($response['response']['code'])) { if (200 == $response['response']['code']) { // URL was ok // set transient to true and cache for a week set_transient($key, true, 7 * 24 * HOUR_IN_SECONDS); $url_is_valid = true; } } } // If the font-link is valid, enqueue it. if ($url_is_valid) { wp_enqueue_style($key, $url, null, null); } } } } } } new biogenic_Kirki();