|
1 <?php |
|
2 /** |
|
3 * Twenty Twelve functions and definitions |
|
4 * |
|
5 * Sets up the theme and provides some helper functions, which are used |
|
6 * in the theme as custom template tags. Others are attached to action and |
|
7 * filter hooks in WordPress to change core functionality. |
|
8 * |
|
9 * When using a child theme (see http://codex.wordpress.org/Theme_Development and |
|
10 * http://codex.wordpress.org/Child_Themes), you can override certain functions |
|
11 * (those wrapped in a function_exists() call) by defining them first in your child theme's |
|
12 * functions.php file. The child theme's functions.php file is included before the parent |
|
13 * theme's file, so the child theme functions would be used. |
|
14 * |
|
15 * Functions that are not pluggable (not wrapped in function_exists()) are instead attached |
|
16 * to a filter or action hook. |
|
17 * |
|
18 * For more information on hooks, actions, and filters, @link http://codex.wordpress.org/Plugin_API |
|
19 * |
|
20 * @package WordPress |
|
21 * @subpackage Twenty_Twelve |
|
22 * @since Twenty Twelve 1.0 |
|
23 */ |
|
24 |
|
25 // Set up the content width value based on the theme's design and stylesheet. |
|
26 if ( ! isset( $content_width ) ) |
|
27 $content_width = 625; |
|
28 |
|
29 /** |
|
30 * Twenty Twelve setup. |
|
31 * |
|
32 * Sets up theme defaults and registers the various WordPress features that |
|
33 * Twenty Twelve supports. |
|
34 * |
|
35 * @uses load_theme_textdomain() For translation/localization support. |
|
36 * @uses add_editor_style() To add a Visual Editor stylesheet. |
|
37 * @uses add_theme_support() To add support for post thumbnails, automatic feed links, |
|
38 * custom background, and post formats. |
|
39 * @uses register_nav_menu() To add support for navigation menus. |
|
40 * @uses set_post_thumbnail_size() To set a custom post thumbnail size. |
|
41 * |
|
42 * @since Twenty Twelve 1.0 |
|
43 */ |
|
44 function twentytwelve_setup() { |
|
45 /* |
|
46 * Makes Twenty Twelve available for translation. |
|
47 * |
|
48 * Translations can be added to the /languages/ directory. |
|
49 * If you're building a theme based on Twenty Twelve, use a find and replace |
|
50 * to change 'twentytwelve' to the name of your theme in all the template files. |
|
51 */ |
|
52 load_theme_textdomain( 'twentytwelve', get_template_directory() . '/languages' ); |
|
53 |
|
54 // This theme styles the visual editor with editor-style.css to match the theme style. |
|
55 add_editor_style(); |
|
56 |
|
57 // Adds RSS feed links to <head> for posts and comments. |
|
58 add_theme_support( 'automatic-feed-links' ); |
|
59 |
|
60 // This theme supports a variety of post formats. |
|
61 add_theme_support( 'post-formats', array( 'aside', 'image', 'link', 'quote', 'status' ) ); |
|
62 |
|
63 // This theme uses wp_nav_menu() in one location. |
|
64 register_nav_menu( 'primary', __( 'Primary Menu', 'twentytwelve' ) ); |
|
65 |
|
66 /* |
|
67 * This theme supports custom background color and image, |
|
68 * and here we also set up the default background color. |
|
69 */ |
|
70 add_theme_support( 'custom-background', array( |
|
71 'default-color' => 'e6e6e6', |
|
72 ) ); |
|
73 |
|
74 // This theme uses a custom image size for featured images, displayed on "standard" posts. |
|
75 add_theme_support( 'post-thumbnails' ); |
|
76 set_post_thumbnail_size( 624, 9999 ); // Unlimited height, soft crop |
|
77 } |
|
78 add_action( 'after_setup_theme', 'twentytwelve_setup' ); |
|
79 |
|
80 /** |
|
81 * Add support for a custom header image. |
|
82 */ |
|
83 require( get_template_directory() . '/inc/custom-header.php' ); |
|
84 |
|
85 /** |
|
86 * Return the Google font stylesheet URL if available. |
|
87 * |
|
88 * The use of Open Sans by default is localized. For languages that use |
|
89 * characters not supported by the font, the font can be disabled. |
|
90 * |
|
91 * @since Twenty Twelve 1.2 |
|
92 * |
|
93 * @return string Font stylesheet or empty string if disabled. |
|
94 */ |
|
95 function twentytwelve_get_font_url() { |
|
96 $font_url = ''; |
|
97 |
|
98 /* translators: If there are characters in your language that are not supported |
|
99 * by Open Sans, translate this to 'off'. Do not translate into your own language. |
|
100 */ |
|
101 if ( 'off' !== _x( 'on', 'Open Sans font: on or off', 'twentytwelve' ) ) { |
|
102 $subsets = 'latin,latin-ext'; |
|
103 |
|
104 /* translators: To add an additional Open Sans character subset specific to your language, |
|
105 * translate this to 'greek', 'cyrillic' or 'vietnamese'. Do not translate into your own language. |
|
106 */ |
|
107 $subset = _x( 'no-subset', 'Open Sans font: add new subset (greek, cyrillic, vietnamese)', 'twentytwelve' ); |
|
108 |
|
109 if ( 'cyrillic' == $subset ) |
|
110 $subsets .= ',cyrillic,cyrillic-ext'; |
|
111 elseif ( 'greek' == $subset ) |
|
112 $subsets .= ',greek,greek-ext'; |
|
113 elseif ( 'vietnamese' == $subset ) |
|
114 $subsets .= ',vietnamese'; |
|
115 |
|
116 $protocol = is_ssl() ? 'https' : 'http'; |
|
117 $query_args = array( |
|
118 'family' => 'Open+Sans:400italic,700italic,400,700', |
|
119 'subset' => $subsets, |
|
120 ); |
|
121 $font_url = add_query_arg( $query_args, "$protocol://fonts.googleapis.com/css" ); |
|
122 } |
|
123 |
|
124 return $font_url; |
|
125 } |
|
126 |
|
127 /** |
|
128 * Enqueue scripts and styles for front-end. |
|
129 * |
|
130 * @since Twenty Twelve 1.0 |
|
131 * |
|
132 * @return void |
|
133 */ |
|
134 function twentytwelve_scripts_styles() { |
|
135 global $wp_styles; |
|
136 |
|
137 /* |
|
138 * Adds JavaScript to pages with the comment form to support |
|
139 * sites with threaded comments (when in use). |
|
140 */ |
|
141 if ( is_singular() && comments_open() && get_option( 'thread_comments' ) ) |
|
142 wp_enqueue_script( 'comment-reply' ); |
|
143 |
|
144 // Adds JavaScript for handling the navigation menu hide-and-show behavior. |
|
145 wp_enqueue_script( 'twentytwelve-navigation', get_template_directory_uri() . '/js/navigation.js', array(), '1.0', true ); |
|
146 |
|
147 $font_url = twentytwelve_get_font_url(); |
|
148 if ( ! empty( $font_url ) ) |
|
149 wp_enqueue_style( 'twentytwelve-fonts', esc_url_raw( $font_url ), array(), null ); |
|
150 |
|
151 // Loads our main stylesheet. |
|
152 wp_enqueue_style( 'twentytwelve-style', get_stylesheet_uri() ); |
|
153 |
|
154 // Loads the Internet Explorer specific stylesheet. |
|
155 wp_enqueue_style( 'twentytwelve-ie', get_template_directory_uri() . '/css/ie.css', array( 'twentytwelve-style' ), '20121010' ); |
|
156 $wp_styles->add_data( 'twentytwelve-ie', 'conditional', 'lt IE 9' ); |
|
157 } |
|
158 add_action( 'wp_enqueue_scripts', 'twentytwelve_scripts_styles' ); |
|
159 |
|
160 /** |
|
161 * Filter TinyMCE CSS path to include Google Fonts. |
|
162 * |
|
163 * Adds additional stylesheets to the TinyMCE editor if needed. |
|
164 * |
|
165 * @uses twentytwelve_get_font_url() To get the Google Font stylesheet URL. |
|
166 * |
|
167 * @since Twenty Twelve 1.2 |
|
168 * |
|
169 * @param string $mce_css CSS path to load in TinyMCE. |
|
170 * @return string Filtered CSS path. |
|
171 */ |
|
172 function twentytwelve_mce_css( $mce_css ) { |
|
173 $font_url = twentytwelve_get_font_url(); |
|
174 |
|
175 if ( empty( $font_url ) ) |
|
176 return $mce_css; |
|
177 |
|
178 if ( ! empty( $mce_css ) ) |
|
179 $mce_css .= ','; |
|
180 |
|
181 $mce_css .= esc_url_raw( str_replace( ',', '%2C', $font_url ) ); |
|
182 |
|
183 return $mce_css; |
|
184 } |
|
185 add_filter( 'mce_css', 'twentytwelve_mce_css' ); |
|
186 |
|
187 /** |
|
188 * Filter the page title. |
|
189 * |
|
190 * Creates a nicely formatted and more specific title element text |
|
191 * for output in head of document, based on current view. |
|
192 * |
|
193 * @since Twenty Twelve 1.0 |
|
194 * |
|
195 * @param string $title Default title text for current view. |
|
196 * @param string $sep Optional separator. |
|
197 * @return string Filtered title. |
|
198 */ |
|
199 function twentytwelve_wp_title( $title, $sep ) { |
|
200 global $paged, $page; |
|
201 |
|
202 if ( is_feed() ) |
|
203 return $title; |
|
204 |
|
205 // Add the site name. |
|
206 $title .= get_bloginfo( 'name' ); |
|
207 |
|
208 // Add the site description for the home/front page. |
|
209 $site_description = get_bloginfo( 'description', 'display' ); |
|
210 if ( $site_description && ( is_home() || is_front_page() ) ) |
|
211 $title = "$title $sep $site_description"; |
|
212 |
|
213 // Add a page number if necessary. |
|
214 if ( $paged >= 2 || $page >= 2 ) |
|
215 $title = "$title $sep " . sprintf( __( 'Page %s', 'twentytwelve' ), max( $paged, $page ) ); |
|
216 |
|
217 return $title; |
|
218 } |
|
219 add_filter( 'wp_title', 'twentytwelve_wp_title', 10, 2 ); |
|
220 |
|
221 /** |
|
222 * Filter the page menu arguments. |
|
223 * |
|
224 * Makes our wp_nav_menu() fallback -- wp_page_menu() -- show a home link. |
|
225 * |
|
226 * @since Twenty Twelve 1.0 |
|
227 */ |
|
228 function twentytwelve_page_menu_args( $args ) { |
|
229 if ( ! isset( $args['show_home'] ) ) |
|
230 $args['show_home'] = true; |
|
231 return $args; |
|
232 } |
|
233 add_filter( 'wp_page_menu_args', 'twentytwelve_page_menu_args' ); |
|
234 |
|
235 /** |
|
236 * Register sidebars. |
|
237 * |
|
238 * Registers our main widget area and the front page widget areas. |
|
239 * |
|
240 * @since Twenty Twelve 1.0 |
|
241 */ |
|
242 function twentytwelve_widgets_init() { |
|
243 register_sidebar( array( |
|
244 'name' => __( 'Main Sidebar', 'twentytwelve' ), |
|
245 'id' => 'sidebar-1', |
|
246 'description' => __( 'Appears on posts and pages except the optional Front Page template, which has its own widgets', 'twentytwelve' ), |
|
247 'before_widget' => '<aside id="%1$s" class="widget %2$s">', |
|
248 'after_widget' => '</aside>', |
|
249 'before_title' => '<h3 class="widget-title">', |
|
250 'after_title' => '</h3>', |
|
251 ) ); |
|
252 |
|
253 register_sidebar( array( |
|
254 'name' => __( 'First Front Page Widget Area', 'twentytwelve' ), |
|
255 'id' => 'sidebar-2', |
|
256 'description' => __( 'Appears when using the optional Front Page template with a page set as Static Front Page', 'twentytwelve' ), |
|
257 'before_widget' => '<aside id="%1$s" class="widget %2$s">', |
|
258 'after_widget' => '</aside>', |
|
259 'before_title' => '<h3 class="widget-title">', |
|
260 'after_title' => '</h3>', |
|
261 ) ); |
|
262 |
|
263 register_sidebar( array( |
|
264 'name' => __( 'Second Front Page Widget Area', 'twentytwelve' ), |
|
265 'id' => 'sidebar-3', |
|
266 'description' => __( 'Appears when using the optional Front Page template with a page set as Static Front Page', 'twentytwelve' ), |
|
267 'before_widget' => '<aside id="%1$s" class="widget %2$s">', |
|
268 'after_widget' => '</aside>', |
|
269 'before_title' => '<h3 class="widget-title">', |
|
270 'after_title' => '</h3>', |
|
271 ) ); |
|
272 } |
|
273 add_action( 'widgets_init', 'twentytwelve_widgets_init' ); |
|
274 |
|
275 if ( ! function_exists( 'twentytwelve_content_nav' ) ) : |
|
276 /** |
|
277 * Displays navigation to next/previous pages when applicable. |
|
278 * |
|
279 * @since Twenty Twelve 1.0 |
|
280 */ |
|
281 function twentytwelve_content_nav( $html_id ) { |
|
282 global $wp_query; |
|
283 |
|
284 $html_id = esc_attr( $html_id ); |
|
285 |
|
286 if ( $wp_query->max_num_pages > 1 ) : ?> |
|
287 <nav id="<?php echo $html_id; ?>" class="navigation" role="navigation"> |
|
288 <h3 class="assistive-text"><?php _e( 'Post navigation', 'twentytwelve' ); ?></h3> |
|
289 <div class="nav-previous"><?php next_posts_link( __( '<span class="meta-nav">←</span> Older posts', 'twentytwelve' ) ); ?></div> |
|
290 <div class="nav-next"><?php previous_posts_link( __( 'Newer posts <span class="meta-nav">→</span>', 'twentytwelve' ) ); ?></div> |
|
291 </nav><!-- #<?php echo $html_id; ?> .navigation --> |
|
292 <?php endif; |
|
293 } |
|
294 endif; |
|
295 |
|
296 if ( ! function_exists( 'twentytwelve_comment' ) ) : |
|
297 /** |
|
298 * Template for comments and pingbacks. |
|
299 * |
|
300 * To override this walker in a child theme without modifying the comments template |
|
301 * simply create your own twentytwelve_comment(), and that function will be used instead. |
|
302 * |
|
303 * Used as a callback by wp_list_comments() for displaying the comments. |
|
304 * |
|
305 * @since Twenty Twelve 1.0 |
|
306 * |
|
307 * @return void |
|
308 */ |
|
309 function twentytwelve_comment( $comment, $args, $depth ) { |
|
310 $GLOBALS['comment'] = $comment; |
|
311 switch ( $comment->comment_type ) : |
|
312 case 'pingback' : |
|
313 case 'trackback' : |
|
314 // Display trackbacks differently than normal comments. |
|
315 ?> |
|
316 <li <?php comment_class(); ?> id="comment-<?php comment_ID(); ?>"> |
|
317 <p><?php _e( 'Pingback:', 'twentytwelve' ); ?> <?php comment_author_link(); ?> <?php edit_comment_link( __( '(Edit)', 'twentytwelve' ), '<span class="edit-link">', '</span>' ); ?></p> |
|
318 <?php |
|
319 break; |
|
320 default : |
|
321 // Proceed with normal comments. |
|
322 global $post; |
|
323 ?> |
|
324 <li <?php comment_class(); ?> id="li-comment-<?php comment_ID(); ?>"> |
|
325 <article id="comment-<?php comment_ID(); ?>" class="comment"> |
|
326 <header class="comment-meta comment-author vcard"> |
|
327 <?php |
|
328 echo get_avatar( $comment, 44 ); |
|
329 printf( '<cite><b class="fn">%1$s</b> %2$s</cite>', |
|
330 get_comment_author_link(), |
|
331 // If current post author is also comment author, make it known visually. |
|
332 ( $comment->user_id === $post->post_author ) ? '<span>' . __( 'Post author', 'twentytwelve' ) . '</span>' : '' |
|
333 ); |
|
334 printf( '<a href="%1$s"><time datetime="%2$s">%3$s</time></a>', |
|
335 esc_url( get_comment_link( $comment->comment_ID ) ), |
|
336 get_comment_time( 'c' ), |
|
337 /* translators: 1: date, 2: time */ |
|
338 sprintf( __( '%1$s at %2$s', 'twentytwelve' ), get_comment_date(), get_comment_time() ) |
|
339 ); |
|
340 ?> |
|
341 </header><!-- .comment-meta --> |
|
342 |
|
343 <?php if ( '0' == $comment->comment_approved ) : ?> |
|
344 <p class="comment-awaiting-moderation"><?php _e( 'Your comment is awaiting moderation.', 'twentytwelve' ); ?></p> |
|
345 <?php endif; ?> |
|
346 |
|
347 <section class="comment-content comment"> |
|
348 <?php comment_text(); ?> |
|
349 <?php edit_comment_link( __( 'Edit', 'twentytwelve' ), '<p class="edit-link">', '</p>' ); ?> |
|
350 </section><!-- .comment-content --> |
|
351 |
|
352 <div class="reply"> |
|
353 <?php comment_reply_link( array_merge( $args, array( 'reply_text' => __( 'Reply', 'twentytwelve' ), 'after' => ' <span>↓</span>', 'depth' => $depth, 'max_depth' => $args['max_depth'] ) ) ); ?> |
|
354 </div><!-- .reply --> |
|
355 </article><!-- #comment-## --> |
|
356 <?php |
|
357 break; |
|
358 endswitch; // end comment_type check |
|
359 } |
|
360 endif; |
|
361 |
|
362 if ( ! function_exists( 'twentytwelve_entry_meta' ) ) : |
|
363 /** |
|
364 * Set up post entry meta. |
|
365 * |
|
366 * Prints HTML with meta information for current post: categories, tags, permalink, author, and date. |
|
367 * |
|
368 * Create your own twentytwelve_entry_meta() to override in a child theme. |
|
369 * |
|
370 * @since Twenty Twelve 1.0 |
|
371 * |
|
372 * @return void |
|
373 */ |
|
374 function twentytwelve_entry_meta() { |
|
375 // Translators: used between list items, there is a space after the comma. |
|
376 $categories_list = get_the_category_list( __( ', ', 'twentytwelve' ) ); |
|
377 |
|
378 // Translators: used between list items, there is a space after the comma. |
|
379 $tag_list = get_the_tag_list( '', __( ', ', 'twentytwelve' ) ); |
|
380 |
|
381 $date = sprintf( '<a href="%1$s" title="%2$s" rel="bookmark"><time class="entry-date" datetime="%3$s">%4$s</time></a>', |
|
382 esc_url( get_permalink() ), |
|
383 esc_attr( get_the_time() ), |
|
384 esc_attr( get_the_date( 'c' ) ), |
|
385 esc_html( get_the_date() ) |
|
386 ); |
|
387 |
|
388 $author = sprintf( '<span class="author vcard"><a class="url fn n" href="%1$s" title="%2$s" rel="author">%3$s</a></span>', |
|
389 esc_url( get_author_posts_url( get_the_author_meta( 'ID' ) ) ), |
|
390 esc_attr( sprintf( __( 'View all posts by %s', 'twentytwelve' ), get_the_author() ) ), |
|
391 get_the_author() |
|
392 ); |
|
393 |
|
394 // Translators: 1 is category, 2 is tag, 3 is the date and 4 is the author's name. |
|
395 if ( $tag_list ) { |
|
396 $utility_text = __( 'This entry was posted in %1$s and tagged %2$s on %3$s<span class="by-author"> by %4$s</span>.', 'twentytwelve' ); |
|
397 } elseif ( $categories_list ) { |
|
398 $utility_text = __( 'This entry was posted in %1$s on %3$s<span class="by-author"> by %4$s</span>.', 'twentytwelve' ); |
|
399 } else { |
|
400 $utility_text = __( 'This entry was posted on %3$s<span class="by-author"> by %4$s</span>.', 'twentytwelve' ); |
|
401 } |
|
402 |
|
403 printf( |
|
404 $utility_text, |
|
405 $categories_list, |
|
406 $tag_list, |
|
407 $date, |
|
408 $author |
|
409 ); |
|
410 } |
|
411 endif; |
|
412 |
|
413 /** |
|
414 * Extend the default WordPress body classes. |
|
415 * |
|
416 * Extends the default WordPress body class to denote: |
|
417 * 1. Using a full-width layout, when no active widgets in the sidebar |
|
418 * or full-width template. |
|
419 * 2. Front Page template: thumbnail in use and number of sidebars for |
|
420 * widget areas. |
|
421 * 3. White or empty background color to change the layout and spacing. |
|
422 * 4. Custom fonts enabled. |
|
423 * 5. Single or multiple authors. |
|
424 * |
|
425 * @since Twenty Twelve 1.0 |
|
426 * |
|
427 * @param array $classes Existing class values. |
|
428 * @return array Filtered class values. |
|
429 */ |
|
430 function twentytwelve_body_class( $classes ) { |
|
431 $background_color = get_background_color(); |
|
432 $background_image = get_background_image(); |
|
433 |
|
434 if ( ! is_active_sidebar( 'sidebar-1' ) || is_page_template( 'page-templates/full-width.php' ) ) |
|
435 $classes[] = 'full-width'; |
|
436 |
|
437 if ( is_page_template( 'page-templates/front-page.php' ) ) { |
|
438 $classes[] = 'template-front-page'; |
|
439 if ( has_post_thumbnail() ) |
|
440 $classes[] = 'has-post-thumbnail'; |
|
441 if ( is_active_sidebar( 'sidebar-2' ) && is_active_sidebar( 'sidebar-3' ) ) |
|
442 $classes[] = 'two-sidebars'; |
|
443 } |
|
444 |
|
445 if ( empty( $background_image ) ) { |
|
446 if ( empty( $background_color ) ) |
|
447 $classes[] = 'custom-background-empty'; |
|
448 elseif ( in_array( $background_color, array( 'fff', 'ffffff' ) ) ) |
|
449 $classes[] = 'custom-background-white'; |
|
450 } |
|
451 |
|
452 // Enable custom font class only if the font CSS is queued to load. |
|
453 if ( wp_style_is( 'twentytwelve-fonts', 'queue' ) ) |
|
454 $classes[] = 'custom-font-enabled'; |
|
455 |
|
456 if ( ! is_multi_author() ) |
|
457 $classes[] = 'single-author'; |
|
458 |
|
459 return $classes; |
|
460 } |
|
461 add_filter( 'body_class', 'twentytwelve_body_class' ); |
|
462 |
|
463 /** |
|
464 * Adjust content width in certain contexts. |
|
465 * |
|
466 * Adjusts content_width value for full-width and single image attachment |
|
467 * templates, and when there are no active widgets in the sidebar. |
|
468 * |
|
469 * @since Twenty Twelve 1.0 |
|
470 * |
|
471 * @return void |
|
472 */ |
|
473 function twentytwelve_content_width() { |
|
474 if ( is_page_template( 'page-templates/full-width.php' ) || is_attachment() || ! is_active_sidebar( 'sidebar-1' ) ) { |
|
475 global $content_width; |
|
476 $content_width = 960; |
|
477 } |
|
478 } |
|
479 add_action( 'template_redirect', 'twentytwelve_content_width' ); |
|
480 |
|
481 /** |
|
482 * Register postMessage support. |
|
483 * |
|
484 * Add postMessage support for site title and description for the Customizer. |
|
485 * |
|
486 * @since Twenty Twelve 1.0 |
|
487 * |
|
488 * @param WP_Customize_Manager $wp_customize Customizer object. |
|
489 * @return void |
|
490 */ |
|
491 function twentytwelve_customize_register( $wp_customize ) { |
|
492 $wp_customize->get_setting( 'blogname' )->transport = 'postMessage'; |
|
493 $wp_customize->get_setting( 'blogdescription' )->transport = 'postMessage'; |
|
494 $wp_customize->get_setting( 'header_textcolor' )->transport = 'postMessage'; |
|
495 } |
|
496 add_action( 'customize_register', 'twentytwelve_customize_register' ); |
|
497 |
|
498 /** |
|
499 * Enqueue Javascript postMessage handlers for the Customizer. |
|
500 * |
|
501 * Binds JS handlers to make the Customizer preview reload changes asynchronously. |
|
502 * |
|
503 * @since Twenty Twelve 1.0 |
|
504 * |
|
505 * @return void |
|
506 */ |
|
507 function twentytwelve_customize_preview_js() { |
|
508 wp_enqueue_script( 'twentytwelve-customizer', get_template_directory_uri() . '/js/theme-customizer.js', array( 'customize-preview' ), '20130301', true ); |
|
509 } |
|
510 add_action( 'customize_preview_init', 'twentytwelve_customize_preview_js' ); |