5
|
1 |
<?php |
|
2 |
/** |
|
3 |
* Twenty Fifteen functions and definitions |
|
4 |
* |
|
5 |
* Set up the theme and provides some helper functions, which are used in the |
|
6 |
* theme as custom template tags. Others are attached to action and filter |
|
7 |
* hooks in WordPress to change core functionality. |
|
8 |
* |
|
9 |
* When using a child theme you can override certain functions (those wrapped |
|
10 |
* in a function_exists() call) by defining them first in your child theme's |
|
11 |
* functions.php file. The child theme's functions.php file is included before |
|
12 |
* the parent theme's file, so the child theme functions would be used. |
|
13 |
* |
|
14 |
* @link https://codex.wordpress.org/Theme_Development |
|
15 |
* @link https://codex.wordpress.org/Child_Themes |
|
16 |
* |
|
17 |
* Functions that are not pluggable (not wrapped in function_exists()) are |
|
18 |
* instead attached to a filter or action hook. |
|
19 |
* |
|
20 |
* For more information on hooks, actions, and filters, |
|
21 |
* {@link https://codex.wordpress.org/Plugin_API} |
|
22 |
* |
|
23 |
* @package WordPress |
|
24 |
* @subpackage Twenty_Fifteen |
|
25 |
* @since Twenty Fifteen 1.0 |
|
26 |
*/ |
|
27 |
|
|
28 |
/** |
|
29 |
* Set the content width based on the theme's design and stylesheet. |
|
30 |
* |
|
31 |
* @since Twenty Fifteen 1.0 |
|
32 |
*/ |
|
33 |
if ( ! isset( $content_width ) ) { |
|
34 |
$content_width = 660; |
|
35 |
} |
|
36 |
|
|
37 |
/** |
|
38 |
* Twenty Fifteen only works in WordPress 4.1 or later. |
|
39 |
*/ |
|
40 |
if ( version_compare( $GLOBALS['wp_version'], '4.1-alpha', '<' ) ) { |
|
41 |
require get_template_directory() . '/inc/back-compat.php'; |
|
42 |
} |
|
43 |
|
|
44 |
if ( ! function_exists( 'twentyfifteen_setup' ) ) : |
|
45 |
/** |
|
46 |
* Sets up theme defaults and registers support for various WordPress features. |
|
47 |
* |
|
48 |
* Note that this function is hooked into the after_setup_theme hook, which |
|
49 |
* runs before the init hook. The init hook is too late for some features, such |
|
50 |
* as indicating support for post thumbnails. |
|
51 |
* |
|
52 |
* @since Twenty Fifteen 1.0 |
|
53 |
*/ |
|
54 |
function twentyfifteen_setup() { |
|
55 |
|
|
56 |
/* |
|
57 |
* Make theme available for translation. |
|
58 |
* Translations can be filed in the /languages/ directory. |
|
59 |
* If you're building a theme based on twentyfifteen, use a find and replace |
|
60 |
* to change 'twentyfifteen' to the name of your theme in all the template files |
|
61 |
*/ |
|
62 |
load_theme_textdomain( 'twentyfifteen', get_template_directory() . '/languages' ); |
|
63 |
|
|
64 |
// Add default posts and comments RSS feed links to head. |
|
65 |
add_theme_support( 'automatic-feed-links' ); |
|
66 |
|
|
67 |
/* |
|
68 |
* Let WordPress manage the document title. |
|
69 |
* By adding theme support, we declare that this theme does not use a |
|
70 |
* hard-coded <title> tag in the document head, and expect WordPress to |
|
71 |
* provide it for us. |
|
72 |
*/ |
|
73 |
add_theme_support( 'title-tag' ); |
|
74 |
|
|
75 |
/* |
|
76 |
* Enable support for Post Thumbnails on posts and pages. |
|
77 |
* |
|
78 |
* See: https://codex.wordpress.org/Function_Reference/add_theme_support#Post_Thumbnails |
|
79 |
*/ |
|
80 |
add_theme_support( 'post-thumbnails' ); |
|
81 |
set_post_thumbnail_size( 825, 510, true ); |
|
82 |
|
|
83 |
// This theme uses wp_nav_menu() in two locations. |
|
84 |
register_nav_menus( array( |
|
85 |
'primary' => __( 'Primary Menu', 'twentyfifteen' ), |
|
86 |
'social' => __( 'Social Links Menu', 'twentyfifteen' ), |
|
87 |
) ); |
|
88 |
|
|
89 |
/* |
|
90 |
* Switch default core markup for search form, comment form, and comments |
|
91 |
* to output valid HTML5. |
|
92 |
*/ |
|
93 |
add_theme_support( 'html5', array( |
|
94 |
'search-form', 'comment-form', 'comment-list', 'gallery', 'caption' |
|
95 |
) ); |
|
96 |
|
|
97 |
/* |
|
98 |
* Enable support for Post Formats. |
|
99 |
* |
|
100 |
* See: https://codex.wordpress.org/Post_Formats |
|
101 |
*/ |
|
102 |
add_theme_support( 'post-formats', array( |
|
103 |
'aside', 'image', 'video', 'quote', 'link', 'gallery', 'status', 'audio', 'chat' |
|
104 |
) ); |
|
105 |
|
|
106 |
$color_scheme = twentyfifteen_get_color_scheme(); |
|
107 |
$default_color = trim( $color_scheme[0], '#' ); |
|
108 |
|
|
109 |
// Setup the WordPress core custom background feature. |
|
110 |
add_theme_support( 'custom-background', apply_filters( 'twentyfifteen_custom_background_args', array( |
|
111 |
'default-color' => $default_color, |
|
112 |
'default-attachment' => 'fixed', |
|
113 |
) ) ); |
|
114 |
|
|
115 |
/* |
|
116 |
* This theme styles the visual editor to resemble the theme style, |
|
117 |
* specifically font, colors, icons, and column width. |
|
118 |
*/ |
|
119 |
add_editor_style( array( 'css/editor-style.css', 'genericons/genericons.css', twentyfifteen_fonts_url() ) ); |
|
120 |
} |
|
121 |
endif; // twentyfifteen_setup |
|
122 |
add_action( 'after_setup_theme', 'twentyfifteen_setup' ); |
|
123 |
|
|
124 |
/** |
|
125 |
* Register widget area. |
|
126 |
* |
|
127 |
* @since Twenty Fifteen 1.0 |
|
128 |
* |
|
129 |
* @link https://codex.wordpress.org/Function_Reference/register_sidebar |
|
130 |
*/ |
|
131 |
function twentyfifteen_widgets_init() { |
|
132 |
register_sidebar( array( |
|
133 |
'name' => __( 'Widget Area', 'twentyfifteen' ), |
|
134 |
'id' => 'sidebar-1', |
|
135 |
'description' => __( 'Add widgets here to appear in your sidebar.', 'twentyfifteen' ), |
|
136 |
'before_widget' => '<aside id="%1$s" class="widget %2$s">', |
|
137 |
'after_widget' => '</aside>', |
|
138 |
'before_title' => '<h2 class="widget-title">', |
|
139 |
'after_title' => '</h2>', |
|
140 |
) ); |
|
141 |
} |
|
142 |
add_action( 'widgets_init', 'twentyfifteen_widgets_init' ); |
|
143 |
|
|
144 |
if ( ! function_exists( 'twentyfifteen_fonts_url' ) ) : |
|
145 |
/** |
|
146 |
* Register Google fonts for Twenty Fifteen. |
|
147 |
* |
|
148 |
* @since Twenty Fifteen 1.0 |
|
149 |
* |
|
150 |
* @return string Google fonts URL for the theme. |
|
151 |
*/ |
|
152 |
function twentyfifteen_fonts_url() { |
|
153 |
$fonts_url = ''; |
|
154 |
$fonts = array(); |
|
155 |
$subsets = 'latin,latin-ext'; |
|
156 |
|
|
157 |
/* |
|
158 |
* Translators: If there are characters in your language that are not supported |
|
159 |
* by Noto Sans, translate this to 'off'. Do not translate into your own language. |
|
160 |
*/ |
|
161 |
if ( 'off' !== _x( 'on', 'Noto Sans font: on or off', 'twentyfifteen' ) ) { |
|
162 |
$fonts[] = 'Noto Sans:400italic,700italic,400,700'; |
|
163 |
} |
|
164 |
|
|
165 |
/* |
|
166 |
* Translators: If there are characters in your language that are not supported |
|
167 |
* by Noto Serif, translate this to 'off'. Do not translate into your own language. |
|
168 |
*/ |
|
169 |
if ( 'off' !== _x( 'on', 'Noto Serif font: on or off', 'twentyfifteen' ) ) { |
|
170 |
$fonts[] = 'Noto Serif:400italic,700italic,400,700'; |
|
171 |
} |
|
172 |
|
|
173 |
/* |
|
174 |
* Translators: If there are characters in your language that are not supported |
|
175 |
* by Inconsolata, translate this to 'off'. Do not translate into your own language. |
|
176 |
*/ |
|
177 |
if ( 'off' !== _x( 'on', 'Inconsolata font: on or off', 'twentyfifteen' ) ) { |
|
178 |
$fonts[] = 'Inconsolata:400,700'; |
|
179 |
} |
|
180 |
|
|
181 |
/* |
|
182 |
* Translators: To add an additional character subset specific to your language, |
|
183 |
* translate this to 'greek', 'cyrillic', 'devanagari' or 'vietnamese'. Do not translate into your own language. |
|
184 |
*/ |
|
185 |
$subset = _x( 'no-subset', 'Add new subset (greek, cyrillic, devanagari, vietnamese)', 'twentyfifteen' ); |
|
186 |
|
|
187 |
if ( 'cyrillic' == $subset ) { |
|
188 |
$subsets .= ',cyrillic,cyrillic-ext'; |
|
189 |
} elseif ( 'greek' == $subset ) { |
|
190 |
$subsets .= ',greek,greek-ext'; |
|
191 |
} elseif ( 'devanagari' == $subset ) { |
|
192 |
$subsets .= ',devanagari'; |
|
193 |
} elseif ( 'vietnamese' == $subset ) { |
|
194 |
$subsets .= ',vietnamese'; |
|
195 |
} |
|
196 |
|
|
197 |
if ( $fonts ) { |
|
198 |
$fonts_url = add_query_arg( array( |
|
199 |
'family' => urlencode( implode( '|', $fonts ) ), |
|
200 |
'subset' => urlencode( $subsets ), |
|
201 |
), '//fonts.googleapis.com/css' ); |
|
202 |
} |
|
203 |
|
|
204 |
return $fonts_url; |
|
205 |
} |
|
206 |
endif; |
|
207 |
|
|
208 |
/** |
|
209 |
* JavaScript Detection. |
|
210 |
* |
|
211 |
* Adds a `js` class to the root `<html>` element when JavaScript is detected. |
|
212 |
* |
|
213 |
* @since Twenty Fifteen 1.1 |
|
214 |
*/ |
|
215 |
function twentyfifteen_javascript_detection() { |
|
216 |
echo "<script>(function(html){html.className = html.className.replace(/\bno-js\b/,'js')})(document.documentElement);</script>\n"; |
|
217 |
} |
|
218 |
add_action( 'wp_head', 'twentyfifteen_javascript_detection', 0 ); |
|
219 |
|
|
220 |
/** |
|
221 |
* Enqueue scripts and styles. |
|
222 |
* |
|
223 |
* @since Twenty Fifteen 1.0 |
|
224 |
*/ |
|
225 |
function twentyfifteen_scripts() { |
|
226 |
// Add custom fonts, used in the main stylesheet. |
|
227 |
wp_enqueue_style( 'twentyfifteen-fonts', twentyfifteen_fonts_url(), array(), null ); |
|
228 |
|
|
229 |
// Add Genericons, used in the main stylesheet. |
|
230 |
wp_enqueue_style( 'genericons', get_template_directory_uri() . '/genericons/genericons.css', array(), '3.2' ); |
|
231 |
|
|
232 |
// Load our main stylesheet. |
|
233 |
wp_enqueue_style( 'twentyfifteen-style', get_stylesheet_uri() ); |
|
234 |
|
|
235 |
// Load the Internet Explorer specific stylesheet. |
|
236 |
wp_enqueue_style( 'twentyfifteen-ie', get_template_directory_uri() . '/css/ie.css', array( 'twentyfifteen-style' ), '20141010' ); |
|
237 |
wp_style_add_data( 'twentyfifteen-ie', 'conditional', 'lt IE 9' ); |
|
238 |
|
|
239 |
// Load the Internet Explorer 7 specific stylesheet. |
|
240 |
wp_enqueue_style( 'twentyfifteen-ie7', get_template_directory_uri() . '/css/ie7.css', array( 'twentyfifteen-style' ), '20141010' ); |
|
241 |
wp_style_add_data( 'twentyfifteen-ie7', 'conditional', 'lt IE 8' ); |
|
242 |
|
|
243 |
wp_enqueue_script( 'twentyfifteen-skip-link-focus-fix', get_template_directory_uri() . '/js/skip-link-focus-fix.js', array(), '20141010', true ); |
|
244 |
|
|
245 |
if ( is_singular() && comments_open() && get_option( 'thread_comments' ) ) { |
|
246 |
wp_enqueue_script( 'comment-reply' ); |
|
247 |
} |
|
248 |
|
|
249 |
if ( is_singular() && wp_attachment_is_image() ) { |
|
250 |
wp_enqueue_script( 'twentyfifteen-keyboard-image-navigation', get_template_directory_uri() . '/js/keyboard-image-navigation.js', array( 'jquery' ), '20141010' ); |
|
251 |
} |
|
252 |
|
|
253 |
wp_enqueue_script( 'twentyfifteen-script', get_template_directory_uri() . '/js/functions.js', array( 'jquery' ), '20150330', true ); |
|
254 |
wp_localize_script( 'twentyfifteen-script', 'screenReaderText', array( |
|
255 |
'expand' => '<span class="screen-reader-text">' . __( 'expand child menu', 'twentyfifteen' ) . '</span>', |
|
256 |
'collapse' => '<span class="screen-reader-text">' . __( 'collapse child menu', 'twentyfifteen' ) . '</span>', |
|
257 |
) ); |
|
258 |
} |
|
259 |
add_action( 'wp_enqueue_scripts', 'twentyfifteen_scripts' ); |
|
260 |
|
|
261 |
/** |
|
262 |
* Add featured image as background image to post navigation elements. |
|
263 |
* |
|
264 |
* @since Twenty Fifteen 1.0 |
|
265 |
* |
|
266 |
* @see wp_add_inline_style() |
|
267 |
*/ |
|
268 |
function twentyfifteen_post_nav_background() { |
|
269 |
if ( ! is_single() ) { |
|
270 |
return; |
|
271 |
} |
|
272 |
|
|
273 |
$previous = ( is_attachment() ) ? get_post( get_post()->post_parent ) : get_adjacent_post( false, '', true ); |
|
274 |
$next = get_adjacent_post( false, '', false ); |
|
275 |
$css = ''; |
|
276 |
|
|
277 |
if ( is_attachment() && 'attachment' == $previous->post_type ) { |
|
278 |
return; |
|
279 |
} |
|
280 |
|
|
281 |
if ( $previous && has_post_thumbnail( $previous->ID ) ) { |
|
282 |
$prevthumb = wp_get_attachment_image_src( get_post_thumbnail_id( $previous->ID ), 'post-thumbnail' ); |
|
283 |
$css .= ' |
|
284 |
.post-navigation .nav-previous { background-image: url(' . esc_url( $prevthumb[0] ) . '); } |
|
285 |
.post-navigation .nav-previous .post-title, .post-navigation .nav-previous a:hover .post-title, .post-navigation .nav-previous .meta-nav { color: #fff; } |
|
286 |
.post-navigation .nav-previous a:before { background-color: rgba(0, 0, 0, 0.4); } |
|
287 |
'; |
|
288 |
} |
|
289 |
|
|
290 |
if ( $next && has_post_thumbnail( $next->ID ) ) { |
|
291 |
$nextthumb = wp_get_attachment_image_src( get_post_thumbnail_id( $next->ID ), 'post-thumbnail' ); |
|
292 |
$css .= ' |
|
293 |
.post-navigation .nav-next { background-image: url(' . esc_url( $nextthumb[0] ) . '); border-top: 0; } |
|
294 |
.post-navigation .nav-next .post-title, .post-navigation .nav-next a:hover .post-title, .post-navigation .nav-next .meta-nav { color: #fff; } |
|
295 |
.post-navigation .nav-next a:before { background-color: rgba(0, 0, 0, 0.4); } |
|
296 |
'; |
|
297 |
} |
|
298 |
|
|
299 |
wp_add_inline_style( 'twentyfifteen-style', $css ); |
|
300 |
} |
|
301 |
add_action( 'wp_enqueue_scripts', 'twentyfifteen_post_nav_background' ); |
|
302 |
|
|
303 |
/** |
|
304 |
* Display descriptions in main navigation. |
|
305 |
* |
|
306 |
* @since Twenty Fifteen 1.0 |
|
307 |
* |
|
308 |
* @param string $item_output The menu item output. |
|
309 |
* @param WP_Post $item Menu item object. |
|
310 |
* @param int $depth Depth of the menu. |
|
311 |
* @param array $args wp_nav_menu() arguments. |
|
312 |
* @return string Menu item with possible description. |
|
313 |
*/ |
|
314 |
function twentyfifteen_nav_description( $item_output, $item, $depth, $args ) { |
|
315 |
if ( 'primary' == $args->theme_location && $item->description ) { |
|
316 |
$item_output = str_replace( $args->link_after . '</a>', '<div class="menu-item-description">' . $item->description . '</div>' . $args->link_after . '</a>', $item_output ); |
|
317 |
} |
|
318 |
|
|
319 |
return $item_output; |
|
320 |
} |
|
321 |
add_filter( 'walker_nav_menu_start_el', 'twentyfifteen_nav_description', 10, 4 ); |
|
322 |
|
|
323 |
/** |
|
324 |
* Add a `screen-reader-text` class to the search form's submit button. |
|
325 |
* |
|
326 |
* @since Twenty Fifteen 1.0 |
|
327 |
* |
|
328 |
* @param string $html Search form HTML. |
|
329 |
* @return string Modified search form HTML. |
|
330 |
*/ |
|
331 |
function twentyfifteen_search_form_modify( $html ) { |
|
332 |
return str_replace( 'class="search-submit"', 'class="search-submit screen-reader-text"', $html ); |
|
333 |
} |
|
334 |
add_filter( 'get_search_form', 'twentyfifteen_search_form_modify' ); |
|
335 |
|
|
336 |
/** |
|
337 |
* Implement the Custom Header feature. |
|
338 |
* |
|
339 |
* @since Twenty Fifteen 1.0 |
|
340 |
*/ |
|
341 |
require get_template_directory() . '/inc/custom-header.php'; |
|
342 |
|
|
343 |
/** |
|
344 |
* Custom template tags for this theme. |
|
345 |
* |
|
346 |
* @since Twenty Fifteen 1.0 |
|
347 |
*/ |
|
348 |
require get_template_directory() . '/inc/template-tags.php'; |
|
349 |
|
|
350 |
/** |
|
351 |
* Customizer additions. |
|
352 |
* |
|
353 |
* @since Twenty Fifteen 1.0 |
|
354 |
*/ |
|
355 |
require get_template_directory() . '/inc/customizer.php'; |