458 lines
16 KiB
PHP
458 lines
16 KiB
PHP
<?php
|
|
/**
|
|
* Bootstrap functions and definitions
|
|
*
|
|
*
|
|
*/
|
|
|
|
/**
|
|
* Set the content width based on the theme's design and stylesheet.
|
|
*
|
|
*/
|
|
if ( ! isset( $content_width ) )
|
|
$content_width = 560;
|
|
|
|
/** Tell WordPress to run bootstrap_setup() when the 'after_setup_theme' hook is run. */
|
|
add_action( 'after_setup_theme', 'bootstrap_setup' );
|
|
|
|
if ( ! function_exists( 'bootstrap_setup' ) ):
|
|
|
|
function bootstrap_setup() {
|
|
|
|
// This theme styles the visual editor with editor-style.css to match the theme style.
|
|
add_editor_style();
|
|
|
|
// Post Format support. You can also use the legacy "gallery" or "asides" (note the plural) categories.
|
|
add_theme_support( 'post-formats', array( 'aside', 'gallery' ) );
|
|
|
|
// This theme uses post thumbnails
|
|
add_theme_support( 'post-thumbnails' );
|
|
|
|
// Add default posts and comments RSS feed links to head
|
|
add_theme_support( 'automatic-feed-links' );
|
|
|
|
// Make theme available for translation
|
|
// Translations can be filed in the /languages/ directory
|
|
load_theme_textdomain( 'bootstrap', TEMPLATEPATH . '/languages' );
|
|
|
|
$locale = get_locale();
|
|
$locale_file = TEMPLATEPATH . "/languages/$locale.php";
|
|
if ( is_readable( $locale_file ) )
|
|
require_once( $locale_file );
|
|
|
|
// This theme uses wp_nav_menu() in one location.
|
|
register_nav_menus( array(
|
|
'primary' => __( 'Primary Navigation', 'bootstrap' ),
|
|
) );
|
|
|
|
// This theme allows users to set a custom background
|
|
add_custom_background();
|
|
|
|
}
|
|
endif;
|
|
|
|
/**
|
|
* Function to add stylesheets to wp_head.
|
|
*
|
|
*
|
|
*/
|
|
function add_my_stylesheets() {
|
|
wp_register_style( 'bootstrap-style', get_template_directory_uri() . '/css/bootstrap.css' );
|
|
wp_enqueue_style( 'bootstrap-style' );
|
|
wp_register_style( 'extra-styles', get_template_directory_uri() . '/style.css' );
|
|
wp_enqueue_style( 'extra-styles' );
|
|
wp_register_style( 'bootstrap-responsive', get_template_directory_uri() . '/css/bootstrap-responsive.css' );
|
|
wp_enqueue_style( 'bootstrap-responsive' );
|
|
}
|
|
add_action('wp_enqueue_scripts', 'add_my_stylesheets');
|
|
/**
|
|
* Get our wp_nav_menu() fallback, wp_page_menu(), to show a home link.
|
|
*
|
|
*
|
|
*/
|
|
function bootstrap_page_menu_args( $args ) {
|
|
$args['show_home'] = true;
|
|
return $args;
|
|
}
|
|
add_filter( 'wp_page_menu_args', 'bootstrap_page_menu_args' );
|
|
|
|
/**
|
|
* Sets the post excerpt length to 40 characters.
|
|
*
|
|
*/
|
|
function bootstrap_excerpt_length( $length ) {
|
|
return 40;
|
|
}
|
|
add_filter( 'excerpt_length', 'bootstrap_excerpt_length' );
|
|
|
|
/**
|
|
* Returns a "Continue" link for excerpts
|
|
*
|
|
*/
|
|
function bootstrap_continue_reading_link() {
|
|
return ' <a href="'. get_permalink() . '">' . __( 'Continue <span class="meta-nav">→</span>', 'bootstrap' ) . '</a>';
|
|
}
|
|
|
|
/**
|
|
* Replaces "[...]" (appended to automatically generated excerpts) with an ellipsis and bootstrap_continue_reading_link().
|
|
*
|
|
*/
|
|
function bootstrap_auto_excerpt_more( $more ) {
|
|
return ' …' . bootstrap_continue_reading_link();
|
|
}
|
|
add_filter( 'excerpt_more', 'bootstrap_auto_excerpt_more' );
|
|
|
|
/**
|
|
* Adds a pretty "Continue" link to custom post excerpts.
|
|
*
|
|
*/
|
|
function bootstrap_custom_excerpt_more( $output ) {
|
|
if ( has_excerpt() && ! is_attachment() ) {
|
|
$output .= bootstrap_continue_reading_link();
|
|
}
|
|
return $output;
|
|
}
|
|
add_filter( 'get_the_excerpt', 'bootstrap_custom_excerpt_more' );
|
|
|
|
/**
|
|
* Remove inline styles printed when the gallery shortcode is used.
|
|
*
|
|
*/
|
|
add_filter( 'use_default_gallery_style', '__return_false' );
|
|
|
|
/**
|
|
* Deprecated way to remove inline styles printed when the gallery shortcode is used.
|
|
*
|
|
* This function is no longer needed or used. Use the use_default_gallery_style
|
|
* filter instead, as seen above.
|
|
*
|
|
*/
|
|
function bootstrap_remove_gallery_css( $css ) {
|
|
return preg_replace( "#<style type='text/css'>(.*?)</style>#s", '', $css );
|
|
}
|
|
// Backwards compatibility with WordPress 3.0.
|
|
if ( version_compare( $GLOBALS['wp_version'], '3.1', '<' ) )
|
|
add_filter( 'gallery_style', 'bootstrap_remove_gallery_css' );
|
|
|
|
if ( ! function_exists( 'bootstrap_comment' ) ) :
|
|
/**
|
|
* Template for comments and pingbacks.
|
|
*
|
|
*/
|
|
function bootstrap_comment( $comment, $args, $depth ) {
|
|
$GLOBALS['comment'] = $comment;
|
|
switch ( $comment->comment_type ) :
|
|
case '' :
|
|
?>
|
|
<li <?php comment_class(); ?> id="li-comment-<?php comment_ID(); ?>">
|
|
<div id="comment-<?php comment_ID(); ?>">
|
|
<div class="comment-author vcard">
|
|
<?php echo get_avatar( $comment, 40 ); ?>
|
|
<?php printf( __( '%s <span class="says">says:</span>', 'bootstrap' ), sprintf( '<cite class="fn">%s</cite>', get_comment_author_link() ) ); ?>
|
|
</div><!-- .comment-author .vcard -->
|
|
<?php if ( $comment->comment_approved == '0' ) : ?>
|
|
<em class="comment-awaiting-moderation"><?php _e( 'Your comment is awaiting moderation.', 'bootstrap' ); ?></em>
|
|
<br />
|
|
<?php endif; ?>
|
|
|
|
<div class="comment-meta commentmetadata"><a href="<?php echo esc_url( get_comment_link( $comment->comment_ID ) ); ?>">
|
|
<?php
|
|
/* translators: 1: date, 2: time */
|
|
printf( __( '%1$s at %2$s', 'bootstrap' ), get_comment_date(), get_comment_time() ); ?></a><?php edit_comment_link( __( '(Edit)', 'bootstrap' ), ' ' );
|
|
?>
|
|
</div><!-- .comment-meta .commentmetadata -->
|
|
|
|
<div class="comment-body"><?php comment_text(); ?></div>
|
|
|
|
<div class="reply">
|
|
<?php comment_reply_link( array_merge( $args, array( 'depth' => $depth, 'max_depth' => $args['max_depth'] ) ) ); ?>
|
|
</div><!-- .reply -->
|
|
</div><!-- #comment-## -->
|
|
|
|
<?php
|
|
break;
|
|
case 'pingback' :
|
|
case 'trackback' :
|
|
?>
|
|
<li class="post pingback">
|
|
<p><?php _e( 'Pingback:', 'bootstrap' ); ?> <?php comment_author_link(); ?><?php edit_comment_link( __( '(Edit)', 'bootstrap' ), ' ' ); ?></p>
|
|
<?php
|
|
break;
|
|
endswitch;
|
|
}
|
|
endif;
|
|
|
|
/**
|
|
* Register widgetized areas, including two sidebars and four widget-ready columns in the footer.
|
|
*
|
|
*/
|
|
function bootstrap_widgets_init() {
|
|
// The sidebar widget area.
|
|
register_sidebar( array(
|
|
'name' => __( 'Sidebar Widget Area', 'bootstrap' ),
|
|
'id' => 'sidebar-widget-area',
|
|
'description' => __( 'The Sidebar widget area', 'bootstrap' ),
|
|
'before_widget' => '<li id="%1$s" class="widget-container %2$s">',
|
|
'after_widget' => '</li>',
|
|
'before_title' => '<h3 class="widget-title">',
|
|
'after_title' => '</h3>',
|
|
) );
|
|
|
|
}
|
|
/** Register sidebars by running bootstrap_widgets_init() on the widgets_init hook. */
|
|
add_action( 'widgets_init', 'bootstrap_widgets_init' );
|
|
|
|
/**
|
|
* Removes the default styles that are packaged with the Recent Comments widget.
|
|
*
|
|
*/
|
|
function bootstrap_remove_recent_comments_style() {
|
|
add_filter( 'show_recent_comments_widget_style', '__return_false' );
|
|
}
|
|
add_action( 'widgets_init', 'bootstrap_remove_recent_comments_style' );
|
|
|
|
if ( ! function_exists( 'bootstrap_posted_on' ) ) :
|
|
/**
|
|
* Prints HTML with meta information for the current post-date/time and author.
|
|
*
|
|
*/
|
|
function bootstrap_posted_on() {
|
|
printf( __( '<span class="%1$s">Posted on</span> %2$s <span class="meta-sep">by</span> %3$s', 'bootstrap' ),
|
|
'meta-prep meta-prep-author',
|
|
sprintf( '<a href="%1$s" title="%2$s" rel="bookmark"><span class="entry-date">%3$s</span></a>',
|
|
get_permalink(),
|
|
esc_attr( get_the_time() ),
|
|
get_the_date()
|
|
),
|
|
sprintf( '<span class="author vcard"><a class="url fn n" href="%1$s" title="%2$s">%3$s</a></span>',
|
|
get_author_posts_url( get_the_author_meta( 'ID' ) ),
|
|
sprintf( esc_attr__( 'View all posts by %s', 'bootstrap' ), get_the_author() ),
|
|
get_the_author()
|
|
)
|
|
);
|
|
}
|
|
endif;
|
|
|
|
if ( ! function_exists( 'bootstrap_posted_in' ) ) :
|
|
/**
|
|
* Prints HTML with meta information for the current post (category, tags and permalink).
|
|
*
|
|
*/
|
|
function bootstrap_posted_in() {
|
|
// Retrieves tag list of current post, separated by commas.
|
|
$tag_list = get_the_tag_list( '', ', ' );
|
|
if ( $tag_list ) {
|
|
$posted_in = __( 'This entry was posted in %1$s and tagged %2$s. Bookmark the <a href="%3$s" title="Permalink to %4$s" rel="bookmark">permalink</a>.', 'bootstrap' );
|
|
} elseif ( is_object_in_taxonomy( get_post_type(), 'category' ) ) {
|
|
$posted_in = __( 'This entry was posted in %1$s. Bookmark the <a href="%3$s" title="Permalink to %4$s" rel="bookmark">permalink</a>.', 'bootstrap' );
|
|
} else {
|
|
$posted_in = __( 'Bookmark the <a href="%3$s" title="Permalink to %4$s" rel="bookmark">permalink</a>.', 'bootstrap' );
|
|
}
|
|
// Prints the string, replacing the placeholders.
|
|
printf(
|
|
$posted_in,
|
|
get_the_category_list( ', ' ),
|
|
$tag_list,
|
|
get_permalink(),
|
|
the_title_attribute( 'echo=0' )
|
|
);
|
|
}
|
|
endif;
|
|
|
|
/**
|
|
* Bootstrap custom meny settings for downdrop support
|
|
*
|
|
*/
|
|
class Bootstrap_Nav_Walker extends Walker_Nav_Menu {
|
|
function check_current($val) {
|
|
return preg_match('/(current-)/', $val);
|
|
}
|
|
|
|
function start_el(&$output, $item, $depth, $args) {
|
|
global $wp_query;
|
|
$indent = ($depth) ? str_repeat("\t", $depth) : '';
|
|
|
|
$slug = sanitize_title($item->title);
|
|
$id = apply_filters('nav_menu_item_id', 'menu-' . $slug, $item, $args);
|
|
$id = strlen($id) ? '' . esc_attr( $id ) . '' : '';
|
|
|
|
$class_names = $value = '';
|
|
$classes = empty($item->classes) ? array() : (array) $item->classes;
|
|
|
|
$classes = array_filter($classes, array(&$this, 'check_current'));
|
|
|
|
$class_names = join(' ', apply_filters('nav_menu_css_class', array_filter($classes), $item));
|
|
$class_names = $class_names ? ' class="' . $id . ' ' . esc_attr($class_names) . '"' : ' class="' . $id . '"';
|
|
|
|
$output .= $indent . '<li' . $class_names . '>';
|
|
|
|
$attributes = ! empty($item->attr_title) ? ' title="' . esc_attr($item->attr_title) .'"' : '';
|
|
$attributes .= ! empty($item->target) ? ' target="' . esc_attr($item->target ) .'"' : '';
|
|
$attributes .= ! empty($item->xfn) ? ' rel="' . esc_attr($item->xfn ) .'"' : '';
|
|
$attributes .= ! empty($item->url) ? ' href="' . esc_attr($item->url ) .'"' : '';
|
|
|
|
$item_output = $args->before;
|
|
$item_output .= '<a'. $attributes .'>';
|
|
$item_output .= $args->link_before . apply_filters('the_title', $item->title, $item->ID) . $args->link_after;
|
|
$item_output .= '</a>';
|
|
$item_output .= $args->after;
|
|
|
|
$output .= apply_filters('walker_nav_menu_start_el', $item_output, $item, $depth, $args);
|
|
}
|
|
}
|
|
|
|
class Bootstrap_Navbar_Nav_Walker extends Walker_Nav_Menu {
|
|
function check_current($val) {
|
|
return preg_match('/(current-)|active|dropdown/', $val);
|
|
}
|
|
|
|
function start_lvl(&$output, $depth) {
|
|
$output .= "\n<ul class=\"dropdown-menu\">\n";
|
|
}
|
|
|
|
function start_el(&$output, $item, $depth, $args) {
|
|
global $wp_query;
|
|
$indent = ($depth) ? str_repeat("\t", $depth) : '';
|
|
|
|
$slug = sanitize_title($item->title);
|
|
$id = apply_filters('nav_menu_item_id', 'menu-' . $slug, $item, $args);
|
|
$id = strlen($id) ? '' . esc_attr( $id ) . '' : '';
|
|
|
|
$li_attributes = '';
|
|
$class_names = $value = '';
|
|
|
|
$classes = empty($item->classes) ? array() : (array) $item->classes;
|
|
if ($args->has_children) {
|
|
$classes[] = 'dropdown';
|
|
$li_attributes .= ' data-dropdown="dropdown"';
|
|
}
|
|
$classes[] = ($item->current) ? 'active' : '';
|
|
$classes = array_filter($classes, array(&$this, 'check_current'));
|
|
|
|
$class_names = join(' ', apply_filters('nav_menu_css_class', array_filter($classes), $item));
|
|
$class_names = $class_names ? ' class="' . $id . ' ' . esc_attr($class_names) . '"' : ' class="' . $id . '"';
|
|
|
|
$output .= $indent . '<li' . $class_names . $li_attributes . '>';
|
|
|
|
$attributes = ! empty($item->attr_title) ? ' title="' . esc_attr($item->attr_title) .'"' : '';
|
|
$attributes .= ! empty($item->target) ? ' target="' . esc_attr($item->target ) .'"' : '';
|
|
$attributes .= ! empty($item->xfn) ? ' rel="' . esc_attr($item->xfn ) .'"' : '';
|
|
$attributes .= ! empty($item->url) ? ' href="' . esc_attr($item->url ) .'"' : '';
|
|
$attributes .= ($args->has_children) ? ' class="dropdown-toggle" data-toggle="dropdown"' : '';
|
|
|
|
$item_output = $args->before;
|
|
$item_output .= '<a'. $attributes .'>';
|
|
$item_output .= $args->link_before . apply_filters('the_title', $item->title, $item->ID) . $args->link_after;
|
|
$item_output .= ($args->has_children) ? ' <b class="caret"></b>' : '';
|
|
$item_output .= '</a>';
|
|
$item_output .= $args->after;
|
|
|
|
$output .= apply_filters('walker_nav_menu_start_el', $item_output, $item, $depth, $args);
|
|
}
|
|
function display_element($element, &$children_elements, $max_depth, $depth = 0, $args, &$output) {
|
|
if (!$element) { return; }
|
|
|
|
$id_field = $this->db_fields['id'];
|
|
|
|
// display this element
|
|
if (is_array($args[0])) {
|
|
$args[0]['has_children'] = !empty($children_elements[$element->$id_field]);
|
|
} elseif (is_object($args[0])) {
|
|
$args[0]->has_children = !empty($children_elements[$element->$id_field]);
|
|
}
|
|
$cb_args = array_merge(array(&$output, $element, $depth), $args);
|
|
call_user_func_array(array(&$this, 'start_el'), $cb_args);
|
|
|
|
$id = $element->$id_field;
|
|
|
|
// descend only when the depth is right and there are childrens for this element
|
|
if (($max_depth == 0 || $max_depth > $depth+1) && isset($children_elements[$id])) {
|
|
foreach ($children_elements[$id] as $child) {
|
|
if (!isset($newlevel)) {
|
|
$newlevel = true;
|
|
// start the child delimiter
|
|
$cb_args = array_merge(array(&$output, $depth), $args);
|
|
call_user_func_array(array(&$this, 'start_lvl'), $cb_args);
|
|
}
|
|
$this->display_element($child, $children_elements, $max_depth, $depth + 1, $args, $output);
|
|
}
|
|
unset($children_elements[$id]);
|
|
}
|
|
|
|
if (isset($newlevel) && $newlevel) {
|
|
// end the child delimiter
|
|
$cb_args = array_merge(array(&$output, $depth), $args);
|
|
call_user_func_array(array(&$this, 'end_lvl'), $cb_args);
|
|
}
|
|
|
|
// end this element
|
|
$cb_args = array_merge(array(&$output, $element, $depth), $args);
|
|
call_user_func_array(array(&$this, 'end_el'), $cb_args);
|
|
}
|
|
}
|
|
|
|
function bootstrap_nav_menu_args($args = '') {
|
|
$args['container'] = false;
|
|
$args['depth'] = 2;
|
|
$args['items_wrap'] = '<ul class="%2$s">%3$s</ul>';
|
|
if (!$args['walker']) {
|
|
$args['walker'] = new Bootstrap_Nav_Walker();
|
|
}
|
|
return $args;
|
|
}
|
|
|
|
add_filter('wp_nav_menu_args', 'bootstrap_nav_menu_args');
|
|
|
|
// we don't need to self-close these tags in html5:
|
|
// <img>, <input>
|
|
function bootstrap_remove_self_closing_tags($input) {
|
|
return str_replace(' />', '>', $input);
|
|
}
|
|
|
|
/**
|
|
* Customize the comments fields
|
|
*
|
|
* Adds support for placeholder
|
|
* required
|
|
* type="email"
|
|
* type="url"
|
|
*
|
|
*/
|
|
function bootstrap_comments() {
|
|
|
|
$req = get_option('require_name_email');
|
|
|
|
$fields = array(
|
|
'author' => '<p class="comment-form-author">' . '<label for="author">' . __( 'Name', 'bootstrap' ) . '</label> ' . ( $req ? '<span class="required">*</span>' : '' ) .
|
|
'<input id="author" name="author" type="text" value="' . esc_attr( $commenter['comment_author'] ) . '" size="30"' . $aria_req . ' placeholder = "Name"' . ( $req ? ' required' : '' ) . '/></p>',
|
|
|
|
'email' => '<p class="comment-form-email"><label for="email">' . __( 'Email', 'bootstrap' ) . '</label> ' . ( $req ? '<span class="required">*</span>' : '' ) .
|
|
'<input id="email" name="email" type="email" value="' . esc_attr( $commenter['comment_author_email'] ) . '" size="30"' . $aria_req . ' placeholder="Email"' . ( $req ? ' required' : '' ) . ' /></p>',
|
|
|
|
'url' => '<p class="comment-form-url"><label for="url">' . __( 'Website', 'bootstrap' ) . '</label>' .
|
|
'<input id="url" name="url" type="url" value="' . esc_attr( $commenter['comment_author_url'] ) . '" size="30" placeholder="URL" /></p>'
|
|
|
|
);
|
|
return $fields;
|
|
}
|
|
|
|
|
|
function bootstrap_commentfield() {
|
|
|
|
$commentArea = '<p class="comment-form-comment"><label for="comment">' . _x( 'Comment', 'noun' ) . '</label><textarea id="comment" name="comment" cols="45" rows="8" aria-required="true" required placeholder="Comment text" ></textarea></p>';
|
|
|
|
return $commentArea;
|
|
|
|
}
|
|
|
|
function bootstrap_commentsubmit() {
|
|
|
|
$commentSubmit = '<input name="submit" type="submit" id="submit" class="btn" value="Post Comment" />';
|
|
|
|
return $commentSubmit;
|
|
|
|
}
|
|
|
|
add_filter('comment_form_default_fields', 'bootstrap_comments');
|
|
add_filter('comment_form_field_comment', 'bootstrap_commentfield');
|