'FFFFFF' ) ); // Set content-width. global $content_width; if ( ! isset( $content_width ) ) { $content_width = 652; } // Post thumbnails. add_theme_support( 'post-thumbnails' ); // Set post thumbnail size. set_post_thumbnail_size( 2240, 9999 ); // Add image sizes. add_image_size( 'eksell_preview_image', 1080, 9999 ); // Custom logo. add_theme_support( 'custom-logo', array( 'height' => 144, 'width' => 192, 'flex-height' => true, 'flex-width' => true, 'header-text' => array( 'site-title', 'site-description' ), ) ); // Title tag. add_theme_support( 'title-tag' ); // HTML5 semantic markup. add_theme_support( 'html5', array( 'search-form', 'comment-form', 'comment-list', 'gallery', 'caption' ) ); // Make the theme translation ready. load_theme_textdomain( 'eksell', get_template_directory() . '/languages' ); // Alignwide and alignfull classes in the block editor. add_theme_support( 'align-wide' ); // Block Editor font sizes. add_theme_support( 'editor-font-sizes', array( array( 'name' => esc_html_x( 'Small', 'Name of the small font size in Gutenberg', 'eksell' ), 'shortName' => esc_html_x( 'S', 'Short name of the small font size in the Gutenberg editor.', 'eksell' ), 'size' => 16, 'slug' => 'small', ), array( 'name' => esc_html_x( 'Regular', 'Name of the regular font size in Gutenberg', 'eksell' ), 'shortName' => esc_html_x( 'M', 'Short name of the regular font size in the Gutenberg editor.', 'eksell' ), 'size' => 18, 'slug' => 'normal', ), array( 'name' => esc_html_x( 'Large', 'Name of the large font size in Gutenberg', 'eksell' ), 'shortName' => esc_html_x( 'L', 'Short name of the large font size in the Gutenberg editor.', 'eksell' ), 'size' => 24, 'slug' => 'large', ), array( 'name' => esc_html_x( 'Larger', 'Name of the larger font size in Gutenberg', 'eksell' ), 'shortName' => esc_html_x( 'XL', 'Short name of the larger font size in the Gutenberg editor.', 'eksell' ), 'size' => 32, 'slug' => 'larger', ) ) ); /* Block Editor Color Palette -------- */ $editor_color_palette = array(); $color_options = array(); // Get the color options. By default, this array contains two groups of colors: primary and dark-mode. $color_options_groups = Eksell_Customizer::get_color_options(); if ( $color_options_groups ) { // Merge the two groups into one array with all colors. foreach ( $color_options_groups as $group ) { $color_options = array_merge( $color_options, $group ); } // Loop over them and construct an array for the editor-color-palette. if ( $color_options ) { foreach ( $color_options as $color_option_name => $color_option ) { // Only add the colors set to be included in the color palette if ( ! isset( $color_option['palette'] ) || ! $color_option['palette'] ) continue; $editor_color_palette[] = array( 'name' => $color_option['label'], 'slug' => $color_option['slug'], 'color' => get_theme_mod( $color_option_name, $color_option['default'] ), ); } } // Add the background option. $background_color = '#' . get_theme_mod( 'background_color', 'ffffff' ); $editor_color_palette[] = array( 'name' => esc_html__( 'Background Color', 'eksell' ), 'slug' => 'body-background', 'color' => $background_color, ); } // If we have colors, add them to the block editor palette. if ( $editor_color_palette ) { add_theme_support( 'editor-color-palette', $editor_color_palette ); } } add_action( 'after_setup_theme', 'eksell_theme_support' ); endif; /* ----------------------------------------------------------------------------------------------- REQUIRED FILES Include required files --------------------------------------------------------------------------------------------------- */ // Include custom template tags. require get_template_directory() . '/inc/template-tags.php'; // Handle Block Patterns. require get_template_directory() . '/inc/classes/class-eksell-block-settings.php'; // Handle SVG icons. require get_template_directory() . '/inc/classes/class-eksell-svg-icons.php'; // Handle Customizer settings. require get_template_directory() . '/inc/classes/class-eksell-customizer.php'; // Custom CSS class. require get_template_directory() . '/inc/classes/class-eksell-custom-css.php'; /* ----------------------------------------------------------------------------------------------- REGISTER STYLES Register and enqueue CSS. --------------------------------------------------------------------------------------------------- */ if ( ! function_exists( 'eksell_register_styles' ) ) : function eksell_register_styles() { $theme_version = wp_get_theme( 'eksell' )->get( 'Version' ); $css_dependencies = array(); // Retrieve and enqueue the URL for Google Fonts. // You can remove the Google Fonts enqueue by filtering `eksell_google_fonts_url`. $google_fonts_url = apply_filters( 'eksell_google_fonts_url', '//fonts.googleapis.com/css2?family=Public+Sans:ital,wght@0,400;0,700;1,400;1,700&display=swap' ); if ( $google_fonts_url ) { wp_register_style( 'eksell-google-fonts', $google_fonts_url, false, 1.0, 'all' ); $css_dependencies[] = 'eksell-google-fonts'; } // Filter the list of dependencies used by the eksell-style CSS enqueue. $css_dependencies = apply_filters( 'eksell_css_dependencies', $css_dependencies ); wp_enqueue_style( 'eksell-style', get_template_directory_uri() . '/style.css', $css_dependencies, $theme_version, 'all' ); // Add output of Customizer settings as inline style. wp_add_inline_style( 'eksell-style', Eksell_Custom_CSS::get_customizer_css() ); // Enqueue the print styles stylesheet. wp_enqueue_style( 'eksell-print-styles', get_template_directory_uri() . '/assets/css/print.css', false, $theme_version, 'print' ); } add_action( 'wp_enqueue_scripts', 'eksell_register_styles' ); endif; /* ----------------------------------------------------------------------------------------------- REGISTER SCRIPTS Register and enqueue JavaScript. --------------------------------------------------------------------------------------------------- */ if ( ! function_exists( 'eksell_register_scripts' ) ) : function eksell_register_scripts() { $theme_version = wp_get_theme( 'eksell' )->get( 'Version' ); if ( is_singular() && comments_open() && get_option( 'thread_comments' ) ) { wp_enqueue_script( 'comment-reply' ); } // Built-in JS assets. $js_dependencies = array( 'jquery', 'imagesloaded', 'masonry' ); // CSS variables ponyfill. wp_register_script( 'eksell-css-vars-ponyfill', get_template_directory_uri() . '/assets/js/css-vars-ponyfill.min.js', array(), '3.6.0' ); $js_dependencies[] = 'eksell-css-vars-ponyfill'; // Filter the list of dependencies used by the eksell-construct JavaScript enqueue. $js_dependencies = apply_filters( 'eksell_js_dependencies', $js_dependencies ); wp_enqueue_script( 'eksell-construct', get_template_directory_uri() . '/assets/js/construct.js', $js_dependencies, $theme_version ); // Setup AJAX. $ajax_url = admin_url( 'admin-ajax.php' ); // AJAX Load More. wp_localize_script( 'eksell-construct', 'eksell_ajax_load_more', array( 'ajaxurl' => esc_url( $ajax_url ), ) ); // AJAX Filters. wp_localize_script( 'eksell-construct', 'eksell_ajax_filters', array( 'ajaxurl' => esc_url( $ajax_url ), ) ); } add_action( 'wp_enqueue_scripts', 'eksell_register_scripts' ); endif; /* ----------------------------------------------------------------------------------------------- MENUS Register navigation menus. --------------------------------------------------------------------------------------------------- */ if ( ! function_exists( 'eksell_register_nav_menus' ) ) : function eksell_register_nav_menus() { register_nav_menus( array( 'main' => esc_html__( 'Main Menu', 'eksell' ), 'social' => esc_html__( 'Social Menu', 'eksell' ), ) ); } add_action( 'init', 'eksell_register_nav_menus' ); endif; /* ----------------------------------------------------------------------------------------------- BODY CLASSES Conditional addition of classes to the body element. @param array $classes An array of body classes. --------------------------------------------------------------------------------------------------- */ if ( ! function_exists( 'eksell_body_classes' ) ) : function eksell_body_classes( $classes ) { global $post; $post_type = isset( $post ) ? $post->post_type : false; // Determine type of infinite scroll. $pagination_type = get_theme_mod( 'eksell_pagination_type', 'button' ); switch ( $pagination_type ) { case 'button': $classes[] = 'pagination-type-button'; break; case 'scroll': $classes[] = 'pagination-type-scroll'; break; case 'links': $classes[] = 'pagination-type-links'; break; } // Check whether the current page only has content. if ( is_page_template( array( 'page-templates/template-no-title.php', 'page-templates/template-blank-canvas.php' ) ) ) { $classes[] = 'has-only-content'; } // Check for disabled search. if ( ! get_theme_mod( 'eksell_enable_search', true ) ) { $classes[] = 'disable-search-modal'; } // Check for dark mode. if ( get_theme_mod( 'eksell_enable_dark_mode_palette', false ) ) $classes[] = 'has-dark-mode-palette'; // Check for disabled animations. $classes[] = get_theme_mod( 'eksell_disable_animations', false ) ? 'no-anim' : 'has-anim'; // Check for post thumbnail. if ( is_singular() && has_post_thumbnail() ) { $classes[] = 'has-post-thumbnail'; } elseif ( is_singular() ) { $classes[] = 'missing-post-thumbnail'; } // Check whether we're in the customizer preview. if ( is_customize_preview() ) { $classes[] = 'customizer-preview'; } // Check if we're showing comments. if ( is_singular() && ( ( comments_open() || get_comments_number() ) && ! post_password_required() ) ) { $classes[] = 'showing-comments'; } else if ( is_singular() ) { $classes[] = 'not-showing-comments'; } // Shared archive page class. if ( is_archive() || is_search() || is_home() ) { $classes[] = 'archive-page'; } // Slim page template class names (class = name - file suffix). if ( is_page_template() ) { $classes[] = basename( get_page_template_slug(), '.php' ); } return $classes; } add_action( 'body_class', 'eksell_body_classes' ); endif; /* ----------------------------------------------------------------------------------------------- NO-JS CLASS If we're missing JavaScript support, the HTML element will have a no-js class. --------------------------------------------------------------------------------------------------- */ if ( ! function_exists( 'eksell_no_js_class' ) ) : function eksell_no_js_class() { ?> taxonomy ); $prefix = sprintf( /* translators: %s: Taxonomy singular name. */ esc_html_x( '%s:', 'taxonomy term archive title prefix', 'eksell' ), $tax->labels->singular_name ); } } elseif ( is_home() && is_paged() ) { $prefix = esc_html_x( 'Archives', 'general archive title prefix', 'eksell' ); } // Make the prefix filterable before returning it. return apply_filters( 'eksell_archive_title_prefix', $prefix ); } endif; /* ----------------------------------------------------------------------------------------------- FILTER ARCHIVE TITLE Modify the title of archive pages. @param string $title The initial title. --------------------------------------------------------------------------------------------------- */ if ( ! function_exists( 'eksell_filter_archive_title' ) ) : function eksell_filter_archive_title( $title ) { // Home: Get the Customizer option for post archive text. if ( is_home() && ! is_paged() ) { $title = get_theme_mod( 'eksell_home_text', '' ); } // Home and paged: Output page number. elseif ( is_home() && is_paged() ) { global $wp_query; $paged = get_query_var( 'paged' ) ? get_query_var( 'paged' ) : 1; $max = isset( $wp_query->max_num_pages ) ? $wp_query->max_num_pages : 1; $title = sprintf( esc_html_x( 'Page %1$s of %2$s', '%1$s = Current page number, %2$s = Number of pages', 'eksell' ), $paged, $max ); } // On search, show the search query. elseif ( is_search() ) { $title = '“' . get_search_query() . '”'; } return $title; } add_filter( 'get_the_archive_title', 'eksell_filter_archive_title' ); endif; /* ----------------------------------------------------------------------------------------------- FILTER ARCHIVE DESCRIPTION Modify the description of archive pages. @param string $description The initial description. --------------------------------------------------------------------------------------------------- */ if ( ! function_exists( 'eksell_filter_archive_description' ) ) : function eksell_filter_archive_description( $description ) { // Home: Empty description. if ( is_home() ) { $description = ''; } // On search, show a string describing the results of the search. elseif ( is_search() ) { global $wp_query; if ( $wp_query->found_posts ) { /* Translators: %s = Number of results */ $description = esc_html( sprintf( _nx( 'We found %s result for your search.', 'We found %s results for your search.', $wp_query->found_posts, '%s = Number of results', 'eksell' ), $wp_query->found_posts ) ); } else { $description = esc_html__( 'We could not find any results for your search. You can give it another try through the search form below.', 'eksell' ); } } return $description; } add_filter( 'get_the_archive_description', 'eksell_filter_archive_description' ); endif; /* ----------------------------------------------------------------------------------------------- FILTER THE EXCERPT SUFFIX Replaces the default [...] with a … (three dots) --------------------------------------------------------------------------------------------------- */ if ( ! function_exists( 'eksell_excerpt_more' ) ) : function eksell_excerpt_more() { return '…'; } add_filter( 'excerpt_more', 'eksell_excerpt_more' ); endif; /* ----------------------------------------------------------------------------------------------- FILTER 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. --------------------------------------------------------------------------------------------------- */ if ( ! function_exists( 'eksell_filter_wp_list_pages_item_classes' ) ) : function eksell_filter_wp_list_pages_item_classes( $css_class, $item, $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 ) ) { $css_class[] = 'current-menu-item'; } // Add menu item has children class. if ( in_array( 'page_item_has_children', $css_class ) ) { $css_class[] = 'menu-item-has-children'; } return $css_class; } add_filter( 'page_css_class', 'eksell_filter_wp_list_pages_item_classes', 10, 5 ); endif; /* ----------------------------------------------------------------------------------------------- FILTER NAV MENU ITEM ARGUMENTS Add a sub navigation toggle to the main 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. --------------------------------------------------------------------------------------------------- */ if ( ! function_exists( 'eksell_filter_nav_menu_item_args' ) ) : function eksell_filter_nav_menu_item_args( $args, $item, $depth ) { // Add sub menu toggles to the main menu with toggles. if ( $args->theme_location == 'main' && isset( $args->show_toggles ) ) { // Wrap the menu item link contents in a div, used for positioning. $args->before = '