is_search) {
$query->set('post_type', 'post');
}
return $query;
}
add_filter('pre_get_posts','firstsite_search_filter');
endif;
/**
* Filter the except length to 40 characters.
*
* @param int $length Excerpt length.
* @return int (Maybe) modified excerpt length.
*/
if ( ! function_exists( 'firstsite_custom_excerpt_length' ) ) :
function firstsite_custom_excerpt_length( $length ) {
if ( is_admin() ) {
return $length;
} else {
return '33';
}
}
add_filter( 'excerpt_length', 'firstsite_custom_excerpt_length', 999 );
endif;
/**
* Customize excerpt more.
*/
if ( ! function_exists( 'firstsite_excerpt_more' ) ) :
function firstsite_excerpt_more( $more ) {
if ( is_admin() ) {
return $more;
} else {
return '... ';
}
}
add_filter( 'excerpt_more', 'firstsite_excerpt_more' );
endif;
/**
* Display the first (single) category of post.
*/
if ( ! function_exists( 'firstsite_first_category' ) ) :
function firstsite_first_category() {
$category = get_the_category();
if ($category) {
echo '' . esc_html( $category[0]->name ) .' ';
}
}
endif;
/**
* Returns true if a blog has more than 1 category.
*
* @return bool
*/
if ( ! function_exists( 'firstsite_categorized_blog' ) ) :
function firstsite_categorized_blog() {
if ( false === ( $all_the_cool_cats = get_transient( 'firstsite_categories' ) ) ) {
// Create an array of all the categories that are attached to posts.
$all_the_cool_cats = get_categories( array(
'fields' => 'ids',
'hide_empty' => 1,
// We only need to know if there is more than one category.
'number' => 2,
) );
// Count the number of categories that are attached to the posts.
$all_the_cool_cats = count( $all_the_cool_cats );
set_transient( 'firstsite_categories', $all_the_cool_cats );
}
if ( $all_the_cool_cats > 1 ) {
// This blog has more than 1 category so firstsite_categorized_blog should return true.
return true;
} else {
// This blog has only 1 category so firstsite_categorized_blog should return false.
return false;
}
}
endif;
/**
* Flush out the transients used in firstsite_categorized_blog.
*/
if ( ! function_exists( 'firstsite_category_transient_flusher' ) ) :
function firstsite_category_transient_flusher() {
if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) {
return;
}
// Like, beat it. Dig?
delete_transient( 'firstsite_categories' );
}
add_action( 'edit_category', 'firstsite_category_transient_flusher' );
add_action( 'save_post', 'firstsite_category_transient_flusher' );
endif;
/**
* Fix skip link focus in IE11.
*
* This does not enqueue the script because it is tiny and because it is only for IE11,
* thus it does not warrant having an entire dedicated blocking script being loaded.
*
* @link https://git.io/vWdr2
*/
function firstsite_skip_link_focus_fix() {
// The following is minified via `terser --compress --mangle -- js/skip-link-focus-fix.js`.
?>
array(
'class' => true,
'xmlns' => true,
'width' => true,
'height' => true,
'viewbox' => true,
'aria-hidden' => true,
'role' => true,
'focusable' => true,
),
'path' => array(
'fill' => true,
'fill-rule' => true,
'd' => true,
'transform' => true,
),
'polygon' => array(
'fill' => true,
'fill-rule' => true,
'points' => true,
'transform' => true,
'focusable' => true,
),
)
);
if ( ! $svg ) {
return false;
}
return $svg;
}
}
/**
* Miscellaneous
*/
/**
* Toggles animation duration in milliseconds.
*
* @return int Duration in milliseconds
*/
function firstsite_toggle_duration() {
/**
* Filters the animation duration/speed used usually for submenu toggles.
*
* @since FirstSite 1.0
*
* @param int $duration Duration in milliseconds.
*/
$duration = apply_filters( 'firstsite_toggle_duration', 250 );
return $duration;
}
/**
* Menus
*/
/**
* Filters classes of wp_list_pages items to match menu items.
*
* Filter the class applied to wp_list_pages() items with children to match the menu class, to simplify.
* styling of sub levels in the fallback. Only applied if the match_menu_classes argument is set.
*
* @param string[] $css_class An array of CSS classes to be applied to each list item.
* @param WP_Post $page Page data object.
* @param int $depth Depth of page, used for padding.
* @param array $args An array of arguments.
* @param int $current_page ID of the current page.
* @return array CSS class names.
*/
function firstsite_filter_wp_list_pages_item_classes( $css_class, $page, $depth, $args, $current_page ) {
// Only apply to wp_list_pages() calls with match_menu_classes set to true.
$match_menu_classes = isset( $args['match_menu_classes'] );
if ( ! $match_menu_classes ) {
return $css_class;
}
// Add current menu item class.
if ( in_array( 'current_page_item', $css_class, true ) ) {
$css_class[] = 'current-menu-item';
}
// Add menu item has children class.
if ( in_array( 'page_item_has_children', $css_class, true ) ) {
$css_class[] = 'menu-item-has-children';
}
return $css_class;
}
add_filter( 'firstsite_page_css_class', 'firstsite_filter_wp_list_pages_item_classes', 10, 5 );
/**
* Adds a Sub Nav Toggle to the Expanded Menu and Mobile Menu.
*
* @param stdClass $args An object of wp_nav_menu() arguments.
* @param WP_Post $item Menu item data object.
* @param int $depth Depth of menu item. Used for padding.
* @return stdClass An object of wp_nav_menu() arguments.
*/
function firstsite_add_sub_toggles_to_main_menu( $args, $item, $depth ) {
// Add sub menu toggles to the Expanded Menu with toggles.
if ( isset( $args->show_toggles ) && $args->show_toggles ) {
// Wrap the menu item link contents in a div, used for positioning.
$args->before = '
';
$args->after = '';
// Add a toggle to items with children.
if ( in_array( 'menu-item-has-children', $item->classes, true ) ) {
$toggle_target_string = '.menu-modal .menu-item-' . $item->ID . ' > .sub-menu';
$toggle_duration = firstsite_toggle_duration();
// Add the sub menu toggle.
$args->after .= '';
}
// Close the wrapper.
$args->after .= '