<?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');