mirror of
https://github.com/WordPress/WordPress.git
synced 2025-02-09 09:01:34 +01:00
Some widgets that require more configuration are not included, such as RSS and Custom Menu. Tag Cloud is also not included because fresh sites do not have any tags to display. Also adds a search widget to a Twenty Seventeen footer widget area. see #38615. Built from https://develop.svn.wordpress.org/trunk@39261 git-svn-id: http://core.svn.wordpress.org/trunk@39201 1a063a9b-81f0-0310-95a4-ce76da25c4cd
487 lines
15 KiB
PHP
487 lines
15 KiB
PHP
<?php
|
|
/**
|
|
* Twenty Seventeen functions and definitions
|
|
*
|
|
* @link https://developer.wordpress.org/themes/basics/theme-functions/
|
|
*
|
|
* @package WordPress
|
|
* @subpackage Twenty_Seventeen
|
|
* @since 1.0
|
|
*/
|
|
|
|
/**
|
|
* Twenty Seventeen only works in WordPress 4.7 or later.
|
|
*/
|
|
if ( version_compare( $GLOBALS['wp_version'], '4.7-alpha', '<' ) ) {
|
|
require get_template_directory() . '/inc/back-compat.php';
|
|
return;
|
|
}
|
|
|
|
/**
|
|
* Sets up theme defaults and registers support for various WordPress features.
|
|
*
|
|
* Note that this function is hooked into the after_setup_theme hook, which
|
|
* runs before the init hook. The init hook is too late for some features, such
|
|
* as indicating support for post thumbnails.
|
|
*/
|
|
function twentyseventeen_setup() {
|
|
/*
|
|
* Make theme available for translation.
|
|
* Translations can be filed at WordPress.org. See: https://translate.wordpress.org/projects/wp-themes/twentyseventeen
|
|
* If you're building a theme based on Twenty Seventeen, use a find and replace
|
|
* to change 'twentyseventeen' to the name of your theme in all the template files.
|
|
*/
|
|
load_theme_textdomain( 'twentyseventeen' );
|
|
|
|
// 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' );
|
|
|
|
add_image_size( 'twentyseventeen-featured-image', 2000, 1200, true );
|
|
|
|
add_image_size( 'twentyseventeen-thumbnail-avatar', 100, 100, true );
|
|
|
|
// This theme uses wp_nav_menu() in two locations.
|
|
register_nav_menus( array(
|
|
'top' => __( 'Top Menu', 'twentyseventeen' ),
|
|
'social' => __( 'Social Links Menu', 'twentyseventeen' ),
|
|
) );
|
|
|
|
/*
|
|
* Switch default core markup for search form, comment form, and comments
|
|
* to output valid HTML5.
|
|
*/
|
|
add_theme_support( 'html5', array(
|
|
'comment-form',
|
|
'comment-list',
|
|
'gallery',
|
|
'caption',
|
|
) );
|
|
|
|
/*
|
|
* Enable support for Post Formats.
|
|
*
|
|
* See: https://codex.wordpress.org/Post_Formats
|
|
*/
|
|
add_theme_support( 'post-formats', array(
|
|
'aside',
|
|
'image',
|
|
'video',
|
|
'quote',
|
|
'link',
|
|
'gallery',
|
|
'audio',
|
|
) );
|
|
|
|
// Add theme support for Custom Logo.
|
|
add_theme_support( 'custom-logo', array(
|
|
'width' => 250,
|
|
'height' => 250,
|
|
'flex-width' => true,
|
|
) );
|
|
|
|
// Add theme support for selective refresh for widgets.
|
|
add_theme_support( 'customize-selective-refresh-widgets' );
|
|
|
|
/*
|
|
* This theme styles the visual editor to resemble the theme style,
|
|
* specifically font, colors, and column width.
|
|
*/
|
|
add_editor_style( array( 'assets/css/editor-style.css', twentyseventeen_fonts_url() ) );
|
|
|
|
add_theme_support( 'starter-content', array(
|
|
'widgets' => array(
|
|
'sidebar-1' => array(
|
|
'text_business_info',
|
|
'search',
|
|
'text_about',
|
|
),
|
|
|
|
'sidebar-2' => array(
|
|
'text_business_info',
|
|
),
|
|
|
|
'sidebar-3' => array(
|
|
'text_about',
|
|
'search',
|
|
),
|
|
),
|
|
|
|
'posts' => array(
|
|
'home',
|
|
'about',
|
|
'contact',
|
|
'blog',
|
|
'homepage-section',
|
|
),
|
|
|
|
'options' => array(
|
|
'show_on_front' => 'page',
|
|
'page_on_front' => '{{home}}',
|
|
'page_for_posts' => '{{blog}}',
|
|
),
|
|
|
|
'theme_mods' => array(
|
|
'panel_1' => '{{homepage-section}}',
|
|
'panel_2' => '{{about}}',
|
|
'panel_3' => '{{blog}}',
|
|
'panel_4' => '{{contact}}',
|
|
),
|
|
|
|
'nav_menus' => array(
|
|
'top' => array(
|
|
'name' => __( 'Top', 'twentyseventeen' ),
|
|
'items' => array(
|
|
'page_home',
|
|
'page_about',
|
|
'page_blog',
|
|
'page_contact',
|
|
),
|
|
),
|
|
'social' => array(
|
|
'name' => __( 'Social', 'twentyseventeen' ),
|
|
'items' => array(
|
|
'link_yelp',
|
|
'link_facebook',
|
|
'link_twitter',
|
|
'link_instagram',
|
|
'link_email',
|
|
),
|
|
),
|
|
),
|
|
) );
|
|
}
|
|
add_action( 'after_setup_theme', 'twentyseventeen_setup' );
|
|
|
|
/**
|
|
* Set the content width in pixels, based on the theme's design and stylesheet.
|
|
*
|
|
* Priority 0 to make it available to lower priority callbacks.
|
|
*
|
|
* @global int $content_width
|
|
*/
|
|
function twentyseventeen_content_width() {
|
|
|
|
$content_width = 700;
|
|
|
|
if ( twentyseventeen_is_frontpage() ) {
|
|
$content_width = 1120;
|
|
}
|
|
|
|
/**
|
|
* Filter Twenty Seventeen content width of the theme.
|
|
*
|
|
* @since Twenty Seventeen 1.0
|
|
*
|
|
* @param $content_width integer
|
|
*/
|
|
$GLOBALS['content_width'] = apply_filters( 'twentyseventeen_content_width', $content_width );
|
|
}
|
|
add_action( 'after_setup_theme', 'twentyseventeen_content_width', 0 );
|
|
|
|
/**
|
|
* Register custom fonts.
|
|
*/
|
|
function twentyseventeen_fonts_url() {
|
|
$fonts_url = '';
|
|
|
|
/**
|
|
* Translators: If there are characters in your language that are not
|
|
* supported by Libre Franklin, translate this to 'off'. Do not translate
|
|
* into your own language.
|
|
*/
|
|
$libre_franklin = _x( 'on', 'Libre Franklin font: on or off', 'twentyseventeen' );
|
|
|
|
if ( 'off' !== $libre_franklin ) {
|
|
$font_families = array();
|
|
|
|
$font_families[] = 'Libre Franklin:300,300i,400,400i,600,600i,800,800i';
|
|
|
|
$query_args = array(
|
|
'family' => urlencode( implode( '|', $font_families ) ),
|
|
'subset' => urlencode( 'latin,latin-ext' ),
|
|
);
|
|
|
|
$fonts_url = add_query_arg( $query_args, 'https://fonts.googleapis.com/css' );
|
|
}
|
|
|
|
return esc_url_raw( $fonts_url );
|
|
}
|
|
|
|
/**
|
|
* Add preconnect for Google Fonts.
|
|
*
|
|
* @since Twenty Seventeen 1.0
|
|
*
|
|
* @param array $urls URLs to print for resource hints.
|
|
* @param string $relation_type The relation type the URLs are printed.
|
|
* @return array $urls URLs to print for resource hints.
|
|
*/
|
|
function twentyseventeen_resource_hints( $urls, $relation_type ) {
|
|
if ( wp_style_is( 'twentyseventeen-fonts', 'queue' ) && 'preconnect' === $relation_type ) {
|
|
$urls[] = array(
|
|
'href' => 'https://fonts.gstatic.com',
|
|
'crossorigin',
|
|
);
|
|
}
|
|
|
|
return $urls;
|
|
}
|
|
add_filter( 'wp_resource_hints', 'twentyseventeen_resource_hints', 10, 2 );
|
|
|
|
/**
|
|
* Register widget area.
|
|
*
|
|
* @link https://developer.wordpress.org/themes/functionality/sidebars/#registering-a-sidebar
|
|
*/
|
|
function twentyseventeen_widgets_init() {
|
|
register_sidebar( array(
|
|
'name' => __( 'Sidebar', 'twentyseventeen' ),
|
|
'id' => 'sidebar-1',
|
|
'description' => __( 'Add widgets here to appear in your sidebar.', 'twentyseventeen' ),
|
|
'before_widget' => '<section id="%1$s" class="widget %2$s">',
|
|
'after_widget' => '</section>',
|
|
'before_title' => '<h2 class="widget-title">',
|
|
'after_title' => '</h2>',
|
|
) );
|
|
|
|
register_sidebar( array(
|
|
'name' => __( 'Footer 1', 'twentyseventeen' ),
|
|
'id' => 'sidebar-2',
|
|
'description' => __( 'Add widgets here to appear in your footer.', 'twentyseventeen' ),
|
|
'before_widget' => '<section id="%1$s" class="widget %2$s">',
|
|
'after_widget' => '</section>',
|
|
'before_title' => '<h2 class="widget-title">',
|
|
'after_title' => '</h2>',
|
|
) );
|
|
|
|
register_sidebar( array(
|
|
'name' => __( 'Footer 2', 'twentyseventeen' ),
|
|
'id' => 'sidebar-3',
|
|
'description' => __( 'Add widgets here to appear in your footer.', 'twentyseventeen' ),
|
|
'before_widget' => '<section id="%1$s" class="widget %2$s">',
|
|
'after_widget' => '</section>',
|
|
'before_title' => '<h2 class="widget-title">',
|
|
'after_title' => '</h2>',
|
|
) );
|
|
}
|
|
add_action( 'widgets_init', 'twentyseventeen_widgets_init' );
|
|
|
|
/**
|
|
* Replaces "[...]" (appended to automatically generated excerpts) with ... and
|
|
* a 'Continue reading' link.
|
|
*
|
|
* @since Twenty Seventeen 1.0
|
|
*
|
|
* @return string 'Continue reading' link prepended with an ellipsis.
|
|
*/
|
|
function twentyseventeen_excerpt_more( $link ) {
|
|
if ( is_admin() ) {
|
|
return $link;
|
|
}
|
|
|
|
$link = sprintf( '<p class="link-more"><a href="%1$s" class="more-link">%2$s</a></p>',
|
|
esc_url( get_permalink( get_the_ID() ) ),
|
|
/* translators: %s: Name of current post */
|
|
sprintf( __( 'Continue reading<span class="screen-reader-text"> "%s"</span>', 'twentyseventeen' ), get_the_title( get_the_ID() ) )
|
|
);
|
|
return ' … ' . $link;
|
|
}
|
|
add_filter( 'excerpt_more', 'twentyseventeen_excerpt_more' );
|
|
|
|
/**
|
|
* Handles JavaScript detection.
|
|
*
|
|
* Adds a `js` class to the root `<html>` element when JavaScript is detected.
|
|
*
|
|
* @since Twenty Seventeen 1.0
|
|
*/
|
|
function twentyseventeen_javascript_detection() {
|
|
echo "<script>(function(html){html.className = html.className.replace(/\bno-js\b/,'js')})(document.documentElement);</script>\n";
|
|
}
|
|
add_action( 'wp_head', 'twentyseventeen_javascript_detection', 0 );
|
|
|
|
/**
|
|
* Add a pingback url auto-discovery header for singularly identifiable articles.
|
|
*/
|
|
function twentyseventeen_pingback_header() {
|
|
if ( is_singular() && pings_open() ) {
|
|
printf( '<link rel="pingback" href="%s">' . "\n", get_bloginfo( 'pingback_url' ) );
|
|
}
|
|
}
|
|
add_action( 'wp_head', 'twentyseventeen_pingback_header' );
|
|
|
|
/**
|
|
* Display custom color CSS.
|
|
*/
|
|
function twentyseventeen_colors_css_wrap() {
|
|
if ( 'custom' !== get_theme_mod( 'colorscheme' ) && ! is_customize_preview() ) {
|
|
return;
|
|
}
|
|
|
|
require_once( get_parent_theme_file_path( '/inc/color-patterns.php' ) );
|
|
$hue = absint( get_theme_mod( 'colorscheme_hue', 250 ) );
|
|
?>
|
|
<style type="text/css" id="custom-theme-colors" <?php if ( is_customize_preview() ) { echo 'data-hue="' . $hue . '"'; } ?>>
|
|
<?php echo twentyseventeen_custom_colors_css(); ?>
|
|
</style>
|
|
<?php }
|
|
add_action( 'wp_head', 'twentyseventeen_colors_css_wrap' );
|
|
|
|
/**
|
|
* Enqueue scripts and styles.
|
|
*/
|
|
function twentyseventeen_scripts() {
|
|
// Add custom fonts, used in the main stylesheet.
|
|
wp_enqueue_style( 'twentyseventeen-fonts', twentyseventeen_fonts_url(), array(), null );
|
|
|
|
// Theme stylesheet.
|
|
wp_enqueue_style( 'twentyseventeen-style', get_stylesheet_uri() );
|
|
|
|
// Load the dark colorscheme.
|
|
if ( 'dark' === get_theme_mod( 'colorscheme', 'light' ) || is_customize_preview() ) {
|
|
wp_enqueue_style( 'twentyseventeen-colors-dark', get_theme_file_uri( '/assets/css/colors-dark.css' ), array( 'twentyseventeen-style' ), '1.0' );
|
|
}
|
|
|
|
// Load the Internet Explorer 9 specific stylesheet, to fix display issues in the Customizer.
|
|
if ( is_customize_preview() ) {
|
|
wp_enqueue_style( 'twentyseventeen-ie9', get_theme_file_uri( '/assets/css/ie9.css' ), array( 'twentyseventeen-style' ), '1.0' );
|
|
wp_style_add_data( 'twentyseventeen-ie9', 'conditional', 'IE 9' );
|
|
}
|
|
|
|
// Load the Internet Explorer 8 specific stylesheet.
|
|
wp_enqueue_style( 'twentyseventeen-ie8', get_theme_file_uri( '/assets/css/ie8.css' ), array( 'twentyseventeen-style' ), '1.0' );
|
|
wp_style_add_data( 'twentyseventeen-ie8', 'conditional', 'lt IE 9' );
|
|
|
|
// Load the html5 shiv.
|
|
wp_enqueue_script( 'html5', get_theme_file_uri( '/assets/js/html5.js' ), array(), '3.7.3' );
|
|
wp_script_add_data( 'html5', 'conditional', 'lt IE 9' );
|
|
|
|
wp_enqueue_script( 'twentyseventeen-skip-link-focus-fix', get_theme_file_uri( '/assets/js/skip-link-focus-fix.js' ), array(), '1.0', true );
|
|
|
|
$twentyseventeen_l10n = array(
|
|
'quote' => twentyseventeen_get_svg( array( 'icon' => 'quote-right' ) ),
|
|
);
|
|
|
|
if ( has_nav_menu( 'top' ) ) {
|
|
wp_enqueue_script( 'twentyseventeen-navigation', get_theme_file_uri( '/assets/js/navigation.js' ), array(), '1.0', true );
|
|
$twentyseventeen_l10n['expand'] = __( 'Expand child menu', 'twentyseventeen' );
|
|
$twentyseventeen_l10n['collapse'] = __( 'Collapse child menu', 'twentyseventeen' );
|
|
$twentyseventeen_l10n['icon'] = twentyseventeen_get_svg( array( 'icon' => 'angle-down', 'fallback' => true ) );
|
|
}
|
|
|
|
wp_enqueue_script( 'twentyseventeen-global', get_theme_file_uri( '/assets/js/global.js' ), array( 'jquery' ), '1.0', true );
|
|
|
|
wp_enqueue_script( 'jquery-scrollto', get_theme_file_uri( '/assets/js/jquery.scrollTo.js' ), array( 'jquery' ), '2.1.2', true );
|
|
|
|
wp_localize_script( 'twentyseventeen-skip-link-focus-fix', 'twentyseventeenScreenReaderText', $twentyseventeen_l10n );
|
|
|
|
if ( is_singular() && comments_open() && get_option( 'thread_comments' ) ) {
|
|
wp_enqueue_script( 'comment-reply' );
|
|
}
|
|
}
|
|
add_action( 'wp_enqueue_scripts', 'twentyseventeen_scripts' );
|
|
|
|
/**
|
|
* Add custom image sizes attribute to enhance responsive image functionality
|
|
* for content images.
|
|
*
|
|
* @since Twenty Seventeen 1.0
|
|
*
|
|
* @param string $sizes A source size value for use in a 'sizes' attribute.
|
|
* @param array $size Image size. Accepts an array of width and height
|
|
* values in pixels (in that order).
|
|
* @return string A source size value for use in a content image 'sizes' attribute.
|
|
*/
|
|
function twentyseventeen_content_image_sizes_attr( $sizes, $size ) {
|
|
$width = $size[0];
|
|
|
|
if ( 740 <= $width ) {
|
|
$sizes = '(max-width: 706px) 89vw, (max-width: 767px) 82vw, 740px';
|
|
}
|
|
|
|
if ( is_active_sidebar( 'sidebar-1' ) || is_archive() || is_search() || is_home() || is_page() ) {
|
|
if ( ! ( is_page() && 'one-column' === get_theme_mod( 'page_options' ) ) && 767 <= $width ) {
|
|
$sizes = '(max-width: 767px) 89vw, (max-width: 1000px) 54vw, (max-width: 1071px) 543px, 580px';
|
|
}
|
|
}
|
|
|
|
return $sizes;
|
|
}
|
|
add_filter( 'wp_calculate_image_sizes', 'twentyseventeen_content_image_sizes_attr', 10, 2 );
|
|
|
|
/**
|
|
* Add custom image sizes attribute to enhance responsive image functionality
|
|
* for post thumbnails.
|
|
*
|
|
* @since Twenty Seventeen 1.0
|
|
*
|
|
* @param array $attr Attributes for the image markup.
|
|
* @param int $attachment Image attachment ID.
|
|
* @param array $size Registered image size or flat array of height and width dimensions.
|
|
* @return string A source size value for use in a post thumbnail 'sizes' attribute.
|
|
*/
|
|
function twentyseventeen_post_thumbnail_sizes_attr( $attr, $attachment, $size ) {
|
|
if ( is_archive() || is_search() || is_home() ) {
|
|
$attr['sizes'] = '(max-width: 767px) 89vw, (max-width: 1000px) 54vw, (max-width: 1071px) 543px, 580px';
|
|
} else {
|
|
$attr['sizes'] = '100vw';
|
|
}
|
|
|
|
return $attr;
|
|
}
|
|
add_filter( 'wp_get_attachment_image_attributes', 'twentyseventeen_post_thumbnail_sizes_attr', 10, 3 );
|
|
|
|
/**
|
|
* Use front-page.php when Front page displays is set to a static page.
|
|
*
|
|
* @since Twenty Seventeen 1.0
|
|
*
|
|
* @param string $template front-page.php.
|
|
*
|
|
* @return string The template to be used: blank if is_home() is true (defaults to index.php), else $template.
|
|
*/
|
|
function twentyseventeen_front_page_template( $template ) {
|
|
return is_home() ? '' : $template;
|
|
}
|
|
add_filter( 'frontpage_template', 'twentyseventeen_front_page_template' );
|
|
|
|
/**
|
|
* Implement the Custom Header feature.
|
|
*/
|
|
require get_parent_theme_file_path( '/inc/custom-header.php' );
|
|
|
|
/**
|
|
* Custom template tags for this theme.
|
|
*/
|
|
require get_parent_theme_file_path( '/inc/template-tags.php' );
|
|
|
|
/**
|
|
* Additional features to allow styling of the templates.
|
|
*/
|
|
require get_parent_theme_file_path( '/inc/template-functions.php' );
|
|
|
|
/**
|
|
* Customizer additions.
|
|
*/
|
|
require get_parent_theme_file_path( '/inc/customizer.php' );
|
|
|
|
/**
|
|
* SVG icons functions and filters.
|
|
*/
|
|
require get_parent_theme_file_path( '/inc/icon-functions.php' );
|