includes/core.php
<?php
/**
* Core setup, site hooks and filters.
*
* @package Go\Core
*/
namespace Go\Core;
use function Go\hex_to_hsl;
use function Go\load_inline_svg;
use function Go\AMP\is_amp;
/**
* Set up theme defaults and register supported WordPress features.
*
* @return void
*/
function setup() {
$n = function( $function ) {
return __NAMESPACE__ . "\\$function";
};
add_action( 'after_setup_theme', $n( 'development_environment' ) );
add_action( 'after_setup_theme', $n( 'i18n' ) );
add_action( 'after_setup_theme', $n( 'theme_setup' ) );
add_action( 'admin_init', $n( 'editor_styles' ) );
add_action( 'wp_enqueue_scripts', $n( 'styles' ) );
add_action( 'enqueue_block_editor_assets', $n( 'block_editor_assets' ) );
add_action( 'wp_enqueue_scripts', $n( 'scripts' ) );
add_action( 'wp_print_footer_scripts', $n( 'skip_link_focus_fix' ) );
add_filter( 'script_loader_tag', $n( 'script_loader_tag' ), 10, 2 );
add_filter( 'body_class', $n( 'body_classes' ) );
add_filter( 'nav_menu_item_title', $n( 'add_dropdown_icons' ), 10, 4 );
add_filter( 'go_page_title_args', $n( 'filter_page_titles' ) );
add_filter( 'comment_form_defaults', $n( 'comment_form_reply_title' ) );
add_filter( 'the_content_more_link', $n( 'read_more_tag' ) );
add_filter( 'get_custom_logo_image_attributes', $n( 'custom_logo_alt_text' ), PHP_INT_MAX, 2 );
}
/**
* Check if this is an install is a local development environment
*/
function development_environment() {
if ( is_readable( get_template_directory() . '/.dev/assets/development-environment.php' ) ) {
require_once get_template_directory() . '/.dev/assets/development-environment.php';
}
}
/**
* Makes Theme available for translation.
*
* Translations can be added to the /languages directory.
* If you're building a theme based on Go, change the
* filename of '/languages/go.pot' to the name of your project.
*
* @return void
*/
function i18n() {
load_theme_textdomain( 'go', get_template_directory() . '/languages' );
}
/**
* Sets up theme defaults and registers support for various WordPress features.
*
* @codeCoverageIgnore
*/
function theme_setup() {
// Filters the theme content width global; intended to be overruled from themes.
// phpcs:ignore WPThemeReview.CoreFunctionality.PrefixAllGlobals.NonPrefixedVariableFound
$GLOBALS['content_width'] = (int) apply_filters( 'go_content_width', 660 );
// Add default posts and comments RSS feed links to head.
add_theme_support( 'automatic-feed-links' );
/*
* Let WordPress manage the document title.
* By adding theme support, we declare that this theme does not use a
* hard-coded <title> tag in the document head, and expect WordPress to
* provide it for us.
*/
add_theme_support( 'title-tag' );
/*
* Enable support for Post Thumbnails on posts and pages.
*
* @link https://developer.wordpress.org/themes/functionality/featured-images-post-thumbnails/
*/
add_theme_support( 'post-thumbnails' );
// This theme uses wp_nav_menu() in up to four locations.
register_nav_menus(
array(
'primary' => esc_html__( 'Primary', 'go' ),
'footer-1' => esc_html__( 'Footer Menu #1', 'go' ),
'footer-2' => esc_html__( 'Footer Menu #2', 'go' ),
'footer-3' => esc_html__( 'Footer Menu #3', 'go' ),
)
);
/*
* Switch default core markup for search form, comment form, and comments
* to output valid HTML5.
*/
add_theme_support(
'html5',
array(
'search-form',
'comment-form',
'comment-list',
'gallery',
'caption',
'style',
'script',
)
);
/**
* Add support for core custom logo.
*
* @link https://codex.wordpress.org/Theme_Logo
*/
add_theme_support(
'custom-logo',
array(
'height' => 190,
'width' => 190,
'flex-width' => true,
'flex-height' => true,
)
);
// Add support for custom background color.
add_theme_support(
'custom-background',
array(
'default-color' => \Go\get_palette_color( 'background', 'HEX' ),
)
);
// Indicate that the theme works well in both Standard and Transitional template modes of the AMP plugin.
add_theme_support(
'amp',
array(
// The `paired` flag means that the theme retains logic to be fully functional when AMP is disabled.
'paired' => true,
)
);
// Add support for WooCommerce.
add_theme_support( 'woocommerce' );
add_theme_support( 'wc-product-gallery-slider' );
add_theme_support( 'wc-product-gallery-lightbox' );
add_theme_support( 'wc-product-gallery-zoom' );
// Add support for responsive embedded content.
add_theme_support( 'responsive-embeds' );
// Add support for full and wide align images.
add_theme_support( 'align-wide' );
// Add support for editor styles.
add_theme_support( 'editor-styles' );
// Add support for experimental link colors.
add_theme_support( 'experimental-link-color' );
// Add custom editor font sizes.
add_theme_support(
'editor-font-sizes',
array(
array(
'name' => esc_html_x( 'Small', 'font size option label', 'go' ),
'shortName' => esc_html_x( 'S', 'abbreviation of the font size option label', 'go' ),
'size' => 17,
'slug' => 'small',
),
array(
'name' => esc_html_x( 'Medium', 'font size option label', 'go' ),
'shortName' => esc_html_x( 'M', 'abbreviation of the font size option label', 'go' ),
'size' => 21,
'slug' => 'medium',
),
array(
'name' => esc_html_x( 'Large', 'font size option label', 'go' ),
'shortName' => esc_html_x( 'L', 'abbreviation of the font size option label', 'go' ),
'size' => 24,
'slug' => 'large',
),
array(
'name' => esc_html_x( 'Huge', 'font size option label', 'go' ),
'shortName' => esc_html_x( 'XL', 'abbreviation of the font size option label', 'go' ),
'size' => 30,
'slug' => 'huge',
),
)
);
$design_style = get_design_style();
if ( $design_style ) {
$color_palette = array(
array(
'name' => esc_html_x( 'Primary', 'name of the first color palette selection', 'go' ),
'slug' => 'primary',
'color' => \Go\get_palette_color( 'primary' ),
),
array(
'name' => esc_html_x( 'Secondary', 'name of the second color palette selection', 'go' ),
'slug' => 'secondary',
'color' => \Go\get_palette_color( 'secondary' ),
),
array(
'name' => esc_html_x( 'Tertiary', 'name of the third color palette selection', 'go' ),
'slug' => 'tertiary',
'color' => \Go\get_palette_color( 'tertiary' ),
),
array(
'name' => esc_html_x( 'Quaternary', 'name of the fourth color palette selection', 'go' ),
'slug' => 'quaternary',
'color' => '#ffffff',
),
);
add_theme_support( 'editor-color-palette', $color_palette );
$primary_color = \Go\get_palette_color( 'primary', 'RGB' );
$secondary_color = \Go\get_palette_color( 'secondary', 'RGB' );
$tertiary_color = \Go\get_palette_color( 'tertiary', 'RGB' );
$background_color = \Go\get_palette_color( 'background', 'RGB' );
add_theme_support(
'editor-gradient-presets',
array(
array(
'name' => __( 'Primary to Secondary', 'go' ),
'gradient' => 'linear-gradient(135deg, ' . esc_attr( $primary_color ) . ' 0%, ' . esc_attr( $secondary_color ) . ' 100%)',
'slug' => 'primary-to-secondary',
),
array(
'name' => __( 'Primary to Tertiary', 'go' ),
'gradient' => 'linear-gradient(135deg, ' . esc_attr( $primary_color ) . ' 0%, ' . esc_attr( $tertiary_color ) . ' 100%)',
'slug' => 'primary-to-tertiary',
),
array(
'name' => __( 'Primary to Background', 'go' ),
'gradient' => 'linear-gradient(135deg, ' . esc_attr( $primary_color ) . ' 0%, ' . esc_attr( $background_color ) . ' 100%)',
'slug' => 'primary-to-background',
),
array(
'name' => __( 'Secondary to Tertiary', 'go' ),
'gradient' => 'linear-gradient(135deg, ' . esc_attr( $secondary_color ) . ' 0%, ' . esc_attr( $background_color ) . ' 100%)',
'slug' => 'secondary-to-tertiary',
),
)
);
}
// Enable custom padding controls.
add_theme_support( 'custom-spacing' );
}
/**
* Enqueue the correct font(s) for the given design style.
*/
function fonts_url() {
/**
* Filter to disable Google fonts from loading on the site.
*
* @var bool
*/
$use_google_fonts = apply_filters( 'go_use_google_fonts', true );
$design_style = get_design_style();
if ( ! $use_google_fonts || ! isset( $design_style['fonts'] ) ) {
return;
}
$cur_fonts = get_theme_mod( 'fonts', $design_style['fonts'] );
$design_styles = get_available_design_styles();
$fonts = array();
foreach ( $cur_fonts as $font => $font_weights ) {
$fonts[] = sprintf( '%1$s:%2$s', str_replace( array( '_heading', '_body' ), '', $font ), implode( ',', $font_weights ) );
}
if ( is_customize_preview() ) {
$fonts = array();
foreach ( $design_styles as $design_style => $data ) {
if ( ! isset( $data['fonts'] ) ) {
continue;
}
foreach ( $data['fonts'] as $font => $font_weights ) {
$fonts[] = sprintf( '%1$s:%2$s', $font, implode( ',', $font_weights ) );
}
}
}
return esc_url_raw(
add_query_arg(
array(
'family' => rawurlencode( implode( '|', $fonts ) ),
'subset' => rawurlencode( 'latin,latin-ext' ),
'display' => 'swap',
),
'https://fonts.googleapis.com/css'
)
);
}
/**
* Enqueue block editor assets.
*
* @return void
*/
function block_editor_assets() {
// This file provides our Customizer setup, not template partials.
// phpcs:ignore WPThemeReview.CoreFunctionality.FileInclude.FileIncludeFound
require_once get_parent_theme_file_path( 'includes/customizer.php' );
wp_enqueue_script(
'go-block-filters',
wp_unslash( get_theme_file_uri( 'dist/js/admin/block-filters.js' ) ),
array( 'wp-blocks', 'wp-dom-ready', 'wp-edit-post', 'wp-components' ),
GO_VERSION,
true
);
ob_start();
\Go\Customizer\inline_css();
$styles = ob_get_clean();
wp_localize_script(
'go-block-filters',
'GoBlockFilters',
array(
'inlineStyles' => str_replace( ':root', '.editor-styles-wrapper', $styles ),
'showPageTitles' => (bool) get_theme_mod( 'page_titles', true ),
)
);
}
/**
* Enqueue scripts for front-end.
*
* @return void
*/
function scripts() {
// Short-circuit in AMP responses since custom scripts are not valid (unless refactored to use amp-script).
if ( is_amp() ) {
return;
}
$suffix = SCRIPT_DEBUG ? '' : '.min';
wp_enqueue_script(
'go-frontend',
get_theme_file_uri( "dist/js/frontend{$suffix}.js" ),
array(),
GO_VERSION,
true
);
wp_localize_script(
'go-frontend',
'goFrontend',
array(
'openMenuOnHover' => (bool) get_theme_mod( 'open_menu_on_hover', true ),
'isMobile' => (bool) wp_is_mobile(),
)
);
if ( is_singular() && comments_open() && get_option( 'thread_comments' ) ) {
wp_enqueue_script( 'comment-reply' );
}
}
/**
* Enqueues the editor styles.
*
* @return void
*/
function editor_styles() {
$suffix = SCRIPT_DEBUG ? '' : '.min';
$rtl = ! is_rtl() ? '' : '-rtl';
// Enqueue shared editor styles.
add_editor_style(
"dist/css/style-editor{$rtl}{$suffix}.css"
);
// Enqueue design style editor styles.
$design_style = get_design_style();
if ( $design_style && isset( $design_style['editor_style'] ) ) {
add_editor_style(
$design_style['editor_style']
);
}
$fonts_url = fonts_url();
if ( ! empty( $fonts_url ) ) {
// Enqueue fonts into the editor.
add_editor_style( $fonts_url );
}
}
/**
* Enqueue styles for front-end.
*
* @return void
*/
function styles() {
$suffix = SCRIPT_DEBUG ? '' : '.min';
$rtl = ! is_rtl() ? '' : '-rtl';
$fonts_url = fonts_url();
if ( ! empty( $fonts_url ) ) {
wp_enqueue_style(
'go-fonts',
$fonts_url,
array(),
GO_VERSION,
'all'
);
add_filter( 'wp_resource_hints', __NAMESPACE__ . '\google_fonts_resource_hints', 10, 2 );
add_filter( 'style_loader_tag', __NAMESPACE__ . '\google_fonts_style_loader_tag', 10, 4 );
}
wp_enqueue_style(
'go-style',
get_theme_file_uri( "dist/css/style-shared{$rtl}{$suffix}.css" ),
array(),
GO_VERSION
);
$design_style = get_design_style();
if ( $design_style ) {
wp_enqueue_style(
'go-design-style-' . $design_style['slug'],
$design_style['url'],
array( 'go-style' ),
GO_VERSION
);
}
}
/**
* Technique to prevent render blocking scripts.
*
* @param string $tag The link tag for the enqueued style.
* @param string $handle The style's registered handle.
* @param string $href The stylesheet's source URL.
* @param string $media The stylesheet's media attribute.
* @return string $tag
*/
function google_fonts_style_loader_tag( $tag, $handle, $href, $media ) {
if ( 'go-fonts' !== $handle ) {
return $tag;
}
// Remove once core supports preload natively.
$tag = "<link rel='preload' as='style' href='$href' />\n" . $tag;
$tag = str_replace( array( "media=\"$media\"", "media='$media'" ), 'media="print" onload="this.media=\'all\'"', $tag );
// phpcs:disable WordPress.WP.EnqueuedResources.NonEnqueuedStylesheet
$tag .= "\n<noscript><link rel=\"stylesheet\" href=\"$href\" /></noscript>";
return $tag;
}
/**
* Add preconnect to Google Fonts domain.
* Once preload is included in WordPress core let's add it here.
* Ref: https://core.trac.wordpress.org/ticket/42438.
*
* @param array $urls Array of resources and their attributes, or URLs to print for resource hints.
* @param string $relation_type The relation type the URLs are printed for, e.g. 'preconnect' or 'prerender'.
* @return array $urls
*/
function google_fonts_resource_hints( $urls, $relation_type ) {
if ( 'preconnect' === $relation_type ) {
$urls[] = array(
'href' => 'https://fonts.gstatic.com',
'crossorigin' => true,
);
}
return $urls;
}
/**
* Fix skip link focus in IE11.
*
* This does not enqueue the script because it is tiny and because it is only for IE11,
* thus it does not warrant having an entire dedicated blocking script being loaded.
*
* @link https://git.io/vWdr2
*/
function skip_link_focus_fix() {
if ( is_amp() ) {
// This is part of AMP. See <https://github.com/ampproject/amphtml/issues/18671>.
return;
}
// The following is minified via `terser --compress --mangle -- js/skip-link-focus-fix.js`.
?>
<script>
/(trident|msie)/i.test(navigator.userAgent)&&document.getElementById&&window.addEventListener&&window.addEventListener("hashchange",function(){var t,e=location.hash.substring(1);/^[A-z0-9_-]+$/.test(e)&&(t=document.getElementById(e))&&(/^(?:a|select|input|button|textarea)$/i.test(t.tagName)||(t.tabIndex=-1),t.focus())},!1);
</script>
<?php
}
/**
* Add async/defer attributes to enqueued scripts that have the specified script_execution flag.
*
* @link https://core.trac.wordpress.org/ticket/12009
* @param string $tag The script tag.
* @param string $handle The script handle.
* @return string
*/
function script_loader_tag( $tag, $handle ) {
$script_execution = wp_scripts()->get_data( $handle, 'script_execution' );
if ( ! $script_execution ) {
return $tag;
}
if ( 'async' !== $script_execution && 'defer' !== $script_execution ) {
return $tag;
}
// Abort adding async/defer for scripts that have this script as a dependency. _doing_it_wrong()?
foreach ( wp_scripts()->registered as $script ) {
if ( in_array( $handle, $script->deps, true ) ) {
return $tag;
}
}
// Add the attribute if it hasn't already been added.
if ( ! preg_match( ":\s$script_execution(=|>|\s):", $tag ) ) {
$tag = preg_replace( ':(?=></script>):', " $script_execution", $tag, 1 );
}
return $tag;
}
/**
* Add classes to body element.
*
* @param string|array $classes Classes to be added to body.
* @return array
*/
function body_classes( $classes ) {
$design_style = get_theme_mod( 'design_style', get_default_design_style() );
$footer_variation = get_theme_mod( 'footer_variation', get_default_footer_variation() );
$header_variation = get_theme_mod( 'header_variation', get_default_header_variation() );
// Add class for the current design style.
if ( $design_style ) {
$classes[] = sprintf( 'is-style-%s', esc_attr( $design_style ) );
}
// Add class for the current header variation.
if ( $header_variation ) {
$classes[] = sprintf( 'has-%s', esc_attr( $header_variation ) );
}
// Add class for the current footer variation.
if ( $footer_variation ) {
$classes[] = sprintf( 'has-%s', esc_attr( $footer_variation ) );
}
// Add class for the current footer variation.
if ( get_theme_mod( 'sticky_header', false ) ) {
$classes[] = 'has-sticky-header';
}
// Add class when no primary navigation is set.
if ( ! has_nav_menu( 'primary' ) ) {
$classes[] = 'has-no-primary-menu';
}
// Add class when there is not a footer menu.
if ( ! has_nav_menu( 'footer-1' ) ) {
$classes[] = 'has-no-footer-menu';
}
// Add class when a page or post has comments.
if ( is_singular() && comments_open() ) {
$classes[] = 'has-comments-open';
}
if ( get_theme_mod( 'header_background_color', false ) ) {
$classes[] = 'has-header-background';
}
if ( get_theme_mod( 'footer_background_color', false ) ) {
$classes[] = 'has-footer-background';
}
if ( get_theme_mod( 'page_titles', true ) ) {
$classes[] = 'has-page-titles';
}
if ( has_post_thumbnail() && ( is_singular( 'post' ) || is_singular( 'page' ) ) ) {
$classes[] = 'has-featured-image';
}
if ( is_singular() ) {
// Adds `singular` to singular pages.
$classes[] = 'singular';
} else {
// Adds `hfeed` to non singular pages.
$classes[] = 'hfeed';
}
$woocommerce_blocks = array(
'woocommerce/featured-product',
'woocommerce/handpicked-products',
'woocommerce/product-best-sellers',
'woocommerce/product-category',
'woocommerce/product-new',
'woocommerce/product-on-sale',
'woocommerce/product-top-rated',
'woocommerce/products-by-attribute',
);
// Add class if page contains any WooCommerce blocks.
if ( array_filter( array_map( 'has_block', $woocommerce_blocks ) ) ) {
$classes[] = 'woocommerce-page';
}
return $classes;
}
/**
* Returns the default design style
*
* @return string
*/
function get_default_design_style() {
/**
* Filters the default design style.
*
* @since 0.1.0
*
* @param array $default_design_style The slug of the default design style.
*/
return (string) apply_filters( 'go_default_design_style', 'traditional' );
}
/**
* Returns the available design styles.
*
* @return array
*/
function get_available_design_styles() {
$suffix = SCRIPT_DEBUG ? '' : '.min';
$rtl = ! is_rtl() ? '' : '-rtl';
$default_design_styles = array(
'traditional' => array(
'slug' => 'traditional',
'label' => _x( 'Traditional', 'design style name', 'go' ),
'url' => get_theme_file_uri( "dist/css/design-styles/style-traditional{$rtl}{$suffix}.css" ),
'editor_style' => "dist/css/design-styles/style-traditional-editor{$rtl}{$suffix}.css",
'color_schemes' => array(
'one' => array(
'label' => _x( 'Apricot', 'color palette name', 'go' ),
'primary' => '#c76919',
'secondary' => '#122538',
'tertiary' => '#f8f8f8',
'background' => '#ffffff',
),
'two' => array(
'label' => _x( 'Emerald', 'color palette name', 'go' ),
'primary' => '#165153',
'secondary' => '#212121',
'tertiary' => '#f3f1f0',
'background' => '#ffffff',
),
'three' => array(
'label' => _x( 'Brick', 'color palette name', 'go' ),
'primary' => '#87200e',
'secondary' => '#242611',
'tertiary' => '#f9f2ef',
'background' => '#ffffff',
),
'four' => array(
'label' => _x( 'Bronze', 'color palette name', 'go' ),
'primary' => '#a88548',
'secondary' => '#05212d',
'tertiary' => '#f9f4ef',
'background' => '#ffffff',
),
),
'fonts' => array(
'Crimson Text' => array(
'400',
'400i',
'700',
'700i',
),
'Nunito Sans' => array(
'400',
'400i',
'600',
'700',
),
),
'font_size' => '1.05rem',
'type_ratio' => '1.275',
'viewport_basis' => '900',
),
'modern' => array(
'slug' => 'modern',
'label' => _x( 'Modern', 'design style name', 'go' ),
'url' => get_theme_file_uri( "dist/css/design-styles/style-modern{$rtl}{$suffix}.css" ),
'editor_style' => "dist/css/design-styles/style-modern-editor{$rtl}{$suffix}.css",
'color_schemes' => array(
'one' => array(
'label' => _x( 'Shade', 'color palette name', 'go' ),
'primary' => '#000000',
'secondary' => '#455a64',
'tertiary' => '#eceff1',
'background' => '#ffffff',
),
'two' => array(
'label' => _x( 'Blush', 'color palette name', 'go' ),
'primary' => '#c2185b',
'secondary' => '#ec407a',
'tertiary' => '#fce4ec',
'background' => '#ffffff',
),
'three' => array(
'label' => _x( 'Indigo', 'color palette name', 'go' ),
'primary' => '#303f9f',
'secondary' => '#5c6bc0',
'tertiary' => '#e8eaf6',
'background' => '#ffffff',
),
'four' => array(
'label' => _x( 'Pacific', 'color palette name', 'go' ),
'primary' => '#00796b',
'secondary' => '#26a69a',
'tertiary' => '#e0f2f1',
'background' => '#ffffff',
),
),
'fonts' => array(
'Heebo' => array(
'800',
'400',
),
'Fira Code' => array(
'400',
'400i',
'700',
),
'Montserrat' => array(
'400',
'700',
),
),
'font_size' => '0.85rem',
'type_ratio' => '1.3',
'viewport_basis' => '950',
),
'trendy' => array(
'slug' => 'trendy',
'label' => _x( 'Trendy', 'design style name', 'go' ),
'url' => get_theme_file_uri( "dist/css/design-styles/style-trendy{$rtl}{$suffix}.css" ),
'editor_style' => "dist/css/design-styles/style-trendy-editor{$rtl}{$suffix}.css",
'color_schemes' => array(
'one' => array(
'label' => _x( 'Plum', 'color palette name', 'go' ),
'primary' => '#000000',
'secondary' => '#4d0859',
'tertiary' => '#ded9e2',
'background' => '#ffffff',
'footer_background' => '#000000',
),
'two' => array(
'label' => _x( 'Steel', 'color palette name', 'go' ),
'primary' => '#000000',
'secondary' => '#003c68',
'tertiary' => '#c0c9d0',
'background' => '#ffffff',
'footer_background' => '#000000',
),
'three' => array(
'label' => _x( 'Avocado', 'color palette name', 'go' ),
'primary' => '#000000',
'secondary' => '#02493b',
'tertiary' => '#b4c6af',
'background' => '#ffffff',
'footer_background' => '#000000',
),
'four' => array(
'label' => _x( 'Champagne', 'color palette name', 'go' ),
'primary' => '#000000',
'secondary' => '#cc224f',
'tertiary' => '#e5dede',
'background' => '#ffffff',
'footer_background' => '#000000',
),
),
'fonts' => array(
'Trocchi' => array(
'400',
'600',
),
'Noto Sans' => array(
'400',
'400i',
'700',
),
'Source Code Pro' => array(
'400',
'700',
),
),
'font_size' => '1.1rem',
'type_ratio' => '1.2',
'viewport_basis' => '850',
),
'welcoming' => array(
'slug' => 'welcoming',
'label' => _x( 'Welcoming', 'design style name', 'go' ),
'url' => get_theme_file_uri( "dist/css/design-styles/style-welcoming{$rtl}{$suffix}.css" ),
'editor_style' => "dist/css/design-styles/style-welcoming-editor{$rtl}{$suffix}.css",
'color_schemes' => array(
'one' => array(
'label' => _x( 'Forest', 'color palette name', 'go' ),
'primary' => '#165144',
'secondary' => '#01332e',
'tertiary' => '#c9c9c9',
'background' => '#eeeeee',
'header_background' => '#ffffff',
),
'two' => array(
'label' => _x( 'Spruce', 'color palette name', 'go' ),
'primary' => '#233a6b',
'secondary' => '#01133d',
'tertiary' => '#c9c9c9',
'background' => '#eeeeee',
'header_background' => '#ffffff',
),
'three' => array(
'label' => _x( 'Mocha', 'color palette name', 'go' ),
'primary' => '#5b3f20',
'secondary' => '#3f2404',
'tertiary' => '#c9c9c9',
'background' => '#eeeeee',
'header_background' => '#ffffff',
),
'four' => array(
'label' => _x( 'Lavender', 'color palette name', 'go' ),
'primary' => '#443a82',
'secondary' => '#2b226b',
'tertiary' => '#c9c9c9',
'background' => '#eeeeee',
'header_background' => '#ffffff',
),
),
'fonts' => array(
'Work Sans' => array(
'300',
'700',
),
'Karla' => array(
'400',
'400i',
'700',
),
),
'font_size' => '1rem',
'type_ratio' => '1.235',
'viewport_basis' => '750',
),
'playful' => array(
'slug' => 'playful',
'label' => _x( 'Playful', 'design style name', 'go' ),
'url' => get_theme_file_uri( "dist/css/design-styles/style-playful{$rtl}{$suffix}.css" ),
'editor_style' => "dist/css/design-styles/style-playful-editor{$rtl}{$suffix}.css",
'color_schemes' => array(
'one' => array(
'label' => _x( 'Frolic', 'color palette name', 'go' ),
'primary' => '#3f46ae',
'secondary' => '#ecb43d',
'tertiary' => '#f7fbff',
'background' => '#ffffff',
'header_background' => '#3f46ae',
'header_text' => '#fafafa',
'footer_background' => '#3f46ae',
),
'two' => array(
'label' => _x( 'Coral', 'color palette name', 'go' ),
'primary' => '#e06b6d',
'secondary' => '#40896e',
'tertiary' => '#fff7f7',
'background' => '#ffffff',
'header_background' => '#eb616a',
'header_text' => '#fafafa',
'footer_background' => '#eb616a',
),
'three' => array(
'label' => _x( 'Organic', 'color palette name', 'go' ),
'primary' => '#3c896d',
'secondary' => '#6b0369',
'tertiary' => '#f2f9f7',
'background' => '#ffffff',
'header_background' => '#3c896d',
'header_text' => '#fafafa',
'footer_background' => '#3c896d',
),
'four' => array(
'label' => _x( 'Berry', 'color palette name', 'go' ),
'primary' => '#117495',
'secondary' => '#d691c1',
'tertiary' => '#f7feff',
'background' => '#ffffff',
'header_background' => '#117495',
'header_text' => '#fafafa',
'footer_background' => '#117495',
),
),
'fonts' => array(
'Poppins' => array(
'600',
),
'Quicksand' => array(
'400',
'600',
),
),
'font_size' => '1.1rem',
'type_ratio' => '1.215',
'viewport_basis' => '950',
),
);
/**
* Filters the supported design styles.
*
* @since 0.1.0
*
* @param array $design_styles Array containing the supported design styles,
* where the index is the slug of design style and value an array of options that sets up the design styles.
*/
$supported_design_styles = (array) apply_filters( 'go_design_styles', $default_design_styles );
return $supported_design_styles;
}
/**
* Returns the current design style.
*
* @return array
*/
function get_design_style() {
$design_style = get_theme_mod( 'design_style', get_default_design_style() );
$supported_design_styles = get_available_design_styles();
if ( in_array( $design_style, array_keys( $supported_design_styles ), true ) ) {
return $supported_design_styles[ $design_style ];
}
return false;
}
/**
* Returns the default header variation.
*
* @return string
*/
function get_default_header_variation() {
/**
* Filters the default header variation.
*
* @since 0.1.0
*
* @param array $default_header_variation The slug of the default header variation.
*/
return (string) apply_filters( 'go_default_header', 'header-1' );
}
/**
* Returns the available header variations.
*
* @return array
*/
function get_available_header_variations() {
$default_header_variations = array(
'header-1' => array(
'label' => esc_html_x( 'Header 1', 'name of the first header variation option', 'go' ),
'preview_image' => get_theme_file_uri( 'dist/images/admin/header-1.svg' ),
),
'header-2' => array(
'label' => esc_html_x( 'Header 2', 'name of the second header variation option', 'go' ),
'preview_image' => get_theme_file_uri( 'dist/images/admin/header-2.svg' ),
),
'header-3' => array(
'label' => esc_html_x( 'Header 3', 'name of the third header variation option', 'go' ),
'preview_image' => get_theme_file_uri( 'dist/images/admin/header-3.svg' ),
),
'header-4' => array(
'label' => esc_html_x( 'Header 4', 'name of the fourth header variation option', 'go' ),
'preview_image' => get_theme_file_uri( 'dist/images/admin/header-4.svg' ),
),
'header-5' => array(
'label' => esc_html_x( 'Header 5', 'name of the fourth header variation option', 'go' ),
'preview_image' => get_theme_file_uri( 'dist/images/admin/header-5.svg' ),
),
'header-6' => array(
'label' => esc_html_x( 'Header 6', 'name of the fourth header variation option', 'go' ),
'preview_image' => get_theme_file_uri( 'dist/images/admin/header-6.svg' ),
),
'header-7' => array(
'label' => esc_html_x( 'Header 7', 'name of the fourth header variation option', 'go' ),
'preview_image' => get_theme_file_uri( 'dist/images/admin/header-7.svg' ),
),
);
/**
* Filters the supported header variations.
*
* @since 0.1.0
*
* @param array $header_variations Array containing the supported header variations,
* where the index is the slug of header variation and the value an array of options that sets up the header variation.
*/
$supported_header_variations = (array) apply_filters( 'go_header_variations', $default_header_variations );
return $supported_header_variations;
}
/**
* Returns the available footer variations.
*
* @return array
*/
function get_available_footer_variations() {
$default_footer_variations = array(
'footer-1' => array(
'label' => esc_html_x( 'Footer 1', 'name of the first footer variation option', 'go' ),
'preview_image' => get_theme_file_uri( 'dist/images/admin/footer-1.svg' ),
'partial' => function() {
return get_template_part( 'partials/footers/footer', '1' );
},
),
'footer-2' => array(
'label' => esc_html_x( 'Footer 2', 'name of the second footer variation option', 'go' ),
'preview_image' => get_theme_file_uri( 'dist/images/admin/footer-2.svg' ),
'partial' => function() {
return get_template_part( 'partials/footers/footer', '2' );
},
),
'footer-3' => array(
'label' => esc_html_x( 'Footer 3', 'name of the third footer variation option', 'go' ),
'preview_image' => get_theme_file_uri( 'dist/images/admin/footer-3.svg' ),
'partial' => function() {
return get_template_part( 'partials/footers/footer', '3' );
},
),
'footer-4' => array(
'label' => esc_html_x( 'Footer 4', 'name of the fourth footer variation option', 'go' ),
'preview_image' => get_theme_file_uri( 'dist/images/admin/footer-4.svg' ),
'partial' => function() {
return get_template_part( 'partials/footers/footer', '4' );
},
),
);
/**
* Filters the supported header variations.
*
* @since 0.1.0
*
* @param array $footer_variations Array containing the supported header variations,
* where the index is the slug of header variation and the value an array of options that sets up the header variation.
*/
$supported_footer_variations = (array) apply_filters( 'go_footer_variations', $default_footer_variations );
return $supported_footer_variations;
}
/**
* Returns the default design style
*
* @return string
*/
function get_default_footer_variation() {
/**
* Filters the default footer variation.
*
* @since 0.1.0
*
* @param array $default_footer_variation The slug of the default footer variation.
*/
return (string) apply_filters( 'go_default_footer_variation', 'footer-1' );
}
/**
* Returns the current footer variation.
*
* @return array
*/
function get_footer_variation() {
$selected_variation = get_theme_mod( 'footer_variation', get_default_footer_variation() );
$supported_header_variations = get_available_footer_variations();
if ( in_array( $selected_variation, array_keys( $supported_header_variations ), true ) ) {
return $supported_header_variations[ $selected_variation ];
}
return false;
}
/**
* Returns the default value for footer copyright text.
*
* @return string
*/
function get_default_copyright() {
/**
* Filters the default copyright text.
*
* @since 0.1.0
*
* @param string $copyright The default text for copyright.
*/
/* translators: the theme author */
return (string) apply_filters( 'go_default_copyright', get_bloginfo( 'name' ) );
}
/**
* Returns the supported social icons.
*
* @return array
*/
function get_available_social_icons() {
$social_icons = array(
'facebook' => array(
'label' => esc_html__( 'Facebook', 'go' ),
'icon' => get_theme_file_path( 'dist/images/social/facebook.svg' ),
'placeholder' => 'https://facebook.com/user',
),
'twitter' => array(
'label' => esc_html__( 'Twitter', 'go' ),
'icon' => get_theme_file_path( 'dist/images/social/twitter.svg' ),
'placeholder' => 'https://twitter.com/user',
),
'instagram' => array(
'label' => esc_html__( 'Instagram', 'go' ),
'icon' => get_theme_file_path( 'dist/images/social/instagram.svg' ),
'placeholder' => 'https://instagram.com/user',
),
'linkedin' => array(
'label' => esc_html__( 'LinkedIn', 'go' ),
'icon' => get_theme_file_path( 'dist/images/social/linkedin.svg' ),
'placeholder' => 'https://linkedin.com/in/user',
),
'xing' => array(
'label' => esc_html__( 'Xing', 'go' ),
'icon' => get_theme_file_path( 'dist/images/social/xing.svg' ),
'placeholder' => 'https://www.xing.com/profile/user',
),
'pinterest' => array(
'label' => esc_html__( 'Pinterest', 'go' ),
'icon' => get_theme_file_path( 'dist/images/social/pinterest.svg' ),
'placeholder' => 'https://pinterest.com/user',
),
'youtube' => array(
'label' => esc_html__( 'YouTube', 'go' ),
'icon' => get_theme_file_path( 'dist/images/social/youtube.svg' ),
'placeholder' => 'https://youtube.com/user',
),
'spotify' => array(
'label' => esc_html__( 'Spotify', 'go' ),
'icon' => get_theme_file_path( 'dist/images/social/spotify.svg' ),
'placeholder' => 'https://open.spotify.com/user/user',
),
'github' => array(
'label' => esc_html__( 'GitHub', 'go' ),
'icon' => get_theme_file_path( 'dist/images/social/github.svg' ),
'placeholder' => 'https://github.com/user',
),
'tiktok' => array(
'label' => esc_html__( 'TikTok', 'go' ),
'icon' => get_theme_file_path( 'dist/images/social/tiktok.svg' ),
'placeholder' => 'https://www.tiktok.com/@user',
),
'mastodon' => array(
'label' => esc_html__( 'Mastodon', 'go' ),
'icon' => get_theme_file_path( 'dist/images/social/mastodon.svg' ),
'placeholder' => 'https://mastodon.social/@user',
),
);
/**
* Filters the supported social icons.
*
* @since 0.1.0
*
* @param array $social_icons Array containing the supported social icons.
*
* Note: There is a double filter here to maintain backwards compatibility after fixing a typo in the name of the filter.
* @see https://github.com/godaddy-wordpress/go/pull/870/files#diff-21e944aca0f42ff6529bde979b0fd787d00e010406e6642f947e71bf5e6f5ad1L1272-R1272
*/
return (array) apply_filters( 'go_available_social_icons', apply_filters( 'go_avaliable_social_icons', $social_icons ) );
}
/**
* Returns the social icons data
*
* @return array
*/
function get_social_icons() {
$social_icons = get_available_social_icons();
foreach ( $social_icons as $key => &$social_icon ) {
$social_icon['url'] = get_theme_mod( sprintf( 'social_icon_%s', $key ), '' );
}
return $social_icons;
}
/**
* Returns the available color schemes
*
* @return array
*/
function get_available_color_schemes() {
$design_style = get_design_style();
/**
* Filters the available color schemes
*
* @since 0.1.0
*
* @param array $color_schemes The array containing the color schemes
* @param array $design_style The full design style object
*/
return (array) apply_filters( 'go_color_schemes', $design_style['color_schemes'], $design_style );
}
/**
* Returns the default color scheme
*
* @return string
*/
function get_default_color_scheme() {
/**
* Filters the default color scheme.
*
* @param array $default_color_scheme The slug of the default color scheme.
*/
return (string) apply_filters( 'go_default_color_scheme', 'one' );
}
/**
* Returns the default viewport basis.
*
* @return string
*/
function get_default_viewport_basis() {
$design_style = get_theme_mod( 'design_style', get_default_design_style() );
$supported_design_styles = get_available_design_styles();
if ( in_array( $design_style, array_keys( $supported_design_styles ), true ) ) {
return $supported_design_styles[ $design_style ]['viewport_basis'];
}
return false;
}
/**
* Add a dropdown icon to top-level menu items
*
* @param string $title The menu item's title.
* @param object $item The current menu item.
* @param object $args An object of wp_nav_menu() arguments.
* @param int $depth Depth of menu item (used for padding).
*
* Add a dropdown icon to top-level menu items.
*/
function add_dropdown_icons( $title, $item, $args, $depth ) {
ob_start();
load_inline_svg( 'arrow-down.svg' );
$icon = ob_get_clean();
// Only add class to 'top level' items on the 'primary' menu.
if ( 'primary' === $args->theme_location && 0 === $depth ) {
foreach ( $item->classes as $value ) {
if ( 'menu-item-has-children' === $value || 'page_item_has_children' === $value ) {
$title = $title . $icon;
}
}
}
return $title;
}
/**
* Alter the reply title to an <h2> element. a11y fix.
*
* @param array $args Default arguments and form fields to override.
*
* @return $args Comment form arguments.
*/
function comment_form_reply_title( $args ) {
$args['title_reply_before'] = '<h2 id="reply-title" class="comment-reply-title">';
$args['title_reply_after'] = '</h2>';
return $args;
}
/**
* Filter the page titles
*
* @param array $args Page title arguments.
*
* @return $args Filtered page title arguments.
*/
function filter_page_titles( $args ) {
if ( is_home() ) {
$args['title'] = get_the_title( get_option( 'page_for_posts', true ) );
}
if ( is_404() ) {
$args['title'] = esc_html__( "That page can't be found", 'go' );
}
if ( is_archive() ) {
$args['custom'] = true;
$args['title'] = sprintf(
'<h1 class="post__title m-0 text-center">%s</h1>',
get_the_archive_title()
);
}
if ( is_search() ) {
$args['title'] = sprintf(
/* translators: Search query term(s). */
esc_html__( 'Search for: %s', 'go' ),
esc_html( get_search_query() )
);
global $wp_query;
if ( 0 === $wp_query->found_posts ) {
$args['title'] = esc_html__( 'Nothing Found', 'go' );
}
}
return $args;
}
/**
* Overwrite default more tag with styling and screen reader markup.
*
* @param string $html The default output HTML for the more tag.
*
* @return string $html
*/
function read_more_tag( $html ) {
return preg_replace( '/<a(.*)>(.*)<\/a>/iU', sprintf( '<div class="read-more-button-wrap"><a$1><span class="button">$2</span> <span class="screen-reader-text">"%1$s"</span></a></div>', get_the_title( get_the_ID() ) ), $html );
}
/**
* Add the image alt text to the custom logo.
*
* @param array $custom_logo_attr Array of custom logo attributes.
* @param int $custom_logo_id The custom logo image ID.
*
* @return array Array of altered custom logo attributes.
*/
function custom_logo_alt_text( $custom_logo_attr, $custom_logo_id ) {
$alt_text = get_post_meta( $custom_logo_id, '_wp_attachment_image_alt', true );
$custom_logo_attr['alt'] = $alt_text ? $alt_text : get_bloginfo( 'name' );
return $custom_logo_attr;
}