+ if ( is_multisite() && ms_is_switched() ) {
+ restore_current_blog();
+ }
+
+ /**
+ * Filter the site icon URL.
+ *
+ * @site 4.4.0
+ *
+ * @param string $url Site icon URL.
+ * @param int $size Size of the site icon.
+ * @param int $blog_id ID of the blog to get the site icon for.
+ */
+ return apply_filters( 'get_site_icon_url', $url, $size, $blog_id );
+}
+
+/**
+ * Displays the Site Icon URL.
+ *
+ * @since 4.3.0
+ *
+ * @param int $size Optional. Size of the site icon. Default 512 (pixels).
+ * @param string $url Optional. Fallback url if no site icon is found. Default empty.
+ * @param int $blog_id Optional. ID of the blog to get the site icon for. Default current blog.
+ */
+function site_icon_url( $size = 512, $url = '', $blog_id = 0 ) {
+ echo esc_url( get_site_icon_url( $size, $url, $blog_id ) );
+}
+
+/**
+ * Whether the site has a Site Icon.
+ *
+ * @since 4.3.0
+ *
+ * @param int $blog_id Optional. ID of the blog in question. Default current blog.
+ * @return bool Whether the site has a site icon or not.
+ */
+function has_site_icon( $blog_id = 0 ) {
+ return (bool) get_site_icon_url( 512, '', $blog_id );
+}
+
+/**
+ * Determines whether the site has a custom logo.
+ *
+ * @since 4.5.0
+ *
+ * @param int $blog_id Optional. ID of the blog in question. Default is the ID of the current blog.
+ * @return bool Whether the site has a custom logo or not.
+ */
+function has_custom_logo( $blog_id = 0 ) {
+ if ( is_multisite() && (int) $blog_id !== get_current_blog_id() ) {
+ switch_to_blog( $blog_id );
+ }
+
+ $custom_logo_id = get_theme_mod( 'custom_logo' );
+
+ if ( is_multisite() && ms_is_switched() ) {
+ restore_current_blog();
+ }
+
+ return (bool) $custom_logo_id;
+}
+
+/**
+ * Returns a custom logo, linked to home.
+ *
+ * @since 4.5.0
+ *
+ * @param int $blog_id Optional. ID of the blog in question. Default is the ID of the current blog.
+ * @return string Custom logo markup.
+ */
+function get_custom_logo( $blog_id = 0 ) {
+ $html = '';
+
+ if ( is_multisite() && (int) $blog_id !== get_current_blog_id() ) {
+ switch_to_blog( $blog_id );
+ }
+
+ $custom_logo_id = get_theme_mod( 'custom_logo' );
+
+ // We have a logo. Logo is go.
+ if ( $custom_logo_id ) {
+ $html = sprintf( '<a href="%1$s" class="custom-logo-link" rel="home" itemprop="url">%2$s</a>',
+ esc_url( home_url( '/' ) ),
+ wp_get_attachment_image( $custom_logo_id, 'full', false, array(
+ 'class' => 'custom-logo',
+ 'itemprop' => 'logo',
+ ) )
+ );
+ }
+
+ // If no logo is set but we're in the Customizer, leave a placeholder (needed for the live preview).
+ elseif ( is_customize_preview() ) {
+ $html = sprintf( '<a href="%1$s" class="custom-logo-link" style="display:none;"><img class="custom-logo"/></a>',
+ esc_url( home_url( '/' ) )
+ );
+ }
+
+ if ( is_multisite() && ms_is_switched() ) {
+ restore_current_blog();
+ }
+
+ /**
+ * Filter the custom logo output.
+ *
+ * @since 4.5.0
+ *
+ * @param string $html Custom logo HTML output.
+ */
+ return apply_filters( 'get_custom_logo', $html );
+}
+
+/**
+ * Displays a custom logo, linked to home.
+ *
+ * @since 4.5.0
+ *
+ * @param int $blog_id Optional. ID of the blog in question. Default is the ID of the current blog.
+ */
+function the_custom_logo( $blog_id = 0 ) {
+ echo get_custom_logo( $blog_id );
+}
+
+/**
+ * Returns document title for the current page.
+ *
+ * @since 4.4.0
+ *
+ * @global int $page Page number of a single post.
+ * @global int $paged Page number of a list of posts.
+ *
+ * @return string Tag with the document title.
+ */
+function wp_get_document_title() {
+
+ /**
+ * Filter the document title before it is generated.
+ *
+ * Passing a non-empty value will short-circuit wp_get_document_title(),
+ * returning that value instead.
+ *
+ * @since 4.4.0
+ *
+ * @param string $title The document title. Default empty string.
+ */
+ $title = apply_filters( 'pre_get_document_title', '' );
+ if ( ! empty( $title ) ) {
+ return $title;
+ }
+
+ global $page, $paged;
+
+ $title = array(
+ 'title' => '',
+ );
+
+ // If it's a 404 page, use a "Page not found" title.
+ if ( is_404() ) {
+ $title['title'] = __( 'Page not found' );
+
+ // If it's a search, use a dynamic search results title.
+ } elseif ( is_search() ) {
+ /* translators: %s: search phrase */
+ $title['title'] = sprintf( __( 'Search Results for “%s”' ), get_search_query() );
+
+ // If on the front page, use the site title.
+ } elseif ( is_front_page() ) {
+ $title['title'] = get_bloginfo( 'name', 'display' );
+
+ // If on a post type archive, use the post type archive title.
+ } elseif ( is_post_type_archive() ) {
+ $title['title'] = post_type_archive_title( '', false );
+
+ // If on a taxonomy archive, use the term title.
+ } elseif ( is_tax() ) {
+ $title['title'] = single_term_title( '', false );
+
+ /*
+ * If we're on the blog page that is not the homepage or
+ * a single post of any post type, use the post title.
+ */
+ } elseif ( is_home() || is_singular() ) {
+ $title['title'] = single_post_title( '', false );
+
+ // If on a category or tag archive, use the term title.
+ } elseif ( is_category() || is_tag() ) {
+ $title['title'] = single_term_title( '', false );
+
+ // If on an author archive, use the author's display name.
+ } elseif ( is_author() && $author = get_queried_object() ) {
+ $title['title'] = $author->display_name;
+
+ // If it's a date archive, use the date as the title.
+ } elseif ( is_year() ) {
+ $title['title'] = get_the_date( _x( 'Y', 'yearly archives date format' ) );
+
+ } elseif ( is_month() ) {
+ $title['title'] = get_the_date( _x( 'F Y', 'monthly archives date format' ) );
+
+ } elseif ( is_day() ) {
+ $title['title'] = get_the_date();
+ }
+
+ // Add a page number if necessary.
+ if ( ( $paged >= 2 || $page >= 2 ) && ! is_404() ) {
+ $title['page'] = sprintf( __( 'Page %s' ), max( $paged, $page ) );
+ }
+
+ // Append the description or site title to give context.
+ if ( is_front_page() ) {
+ $title['tagline'] = get_bloginfo( 'description', 'display' );
+ } else {
+ $title['site'] = get_bloginfo( 'name', 'display' );
+ }
+
+ /**
+ * Filter the separator for the document title.
+ *
+ * @since 4.4.0
+ *
+ * @param string $sep Document title separator. Default '-'.
+ */
+ $sep = apply_filters( 'document_title_separator', '-' );
+
+ /**
+ * Filter the parts of the document title.
+ *
+ * @since 4.4.0
+ *
+ * @param array $title {
+ * The document title parts.
+ *
+ * @type string $title Title of the viewed page.
+ * @type string $page Optional. Page number if paginated.
+ * @type string $tagline Optional. Site description when on home page.
+ * @type string $site Optional. Site title when not on home page.
+ * }
+ */
+ $title = apply_filters( 'document_title_parts', $title );
+
+ $title = implode( " $sep ", array_filter( $title ) );
+ $title = wptexturize( $title );
+ $title = convert_chars( $title );
+ $title = esc_html( $title );
+ $title = capital_P_dangit( $title );
+
+ return $title;
+}
+
+/**
+ * Displays title tag with content.
+ *
+ * @ignore
+ * @since 4.1.0
+ * @since 4.4.0 Improved title output replaced `wp_title()`.
+ * @access private
+ */
+function _wp_render_title_tag() {
+ if ( ! current_theme_supports( 'title-tag' ) ) {
+ return;
+ }
+
+ echo '<title>' . wp_get_document_title() . '</title>' . "\n";
+}
+
+/**
+ * Display or retrieve page title for all areas of blog.
+ *
+ * By default, the page title will display the separator before the page title,
+ * so that the blog title will be before the page title. This is not good for
+ * title display, since the blog title shows up on most tabs and not what is
+ * important, which is the page that the user is looking at.
+ *
+ * There are also SEO benefits to having the blog title after or to the 'right'
+ * or the page title. However, it is mostly common sense to have the blog title
+ * to the right with most browsers supporting tabs. You can achieve this by
+ * using the seplocation parameter and setting the value to 'right'. This change
+ * was introduced around 2.5.0, in case backwards compatibility of themes is
+ * important.
+ *
+ * @since 1.0.0
+ *
+ * @global WP_Locale $wp_locale
+ *
+ * @param string $sep Optional, default is '»'. How to separate the various items
+ * within the page title.
+ * @param bool $display Optional, default is true. Whether to display or retrieve title.
+ * @param string $seplocation Optional. Direction to display title, 'right'.
+ * @return string|null String on retrieve, null when displaying.
+ */
+function wp_title( $sep = '»', $display = true, $seplocation = '' ) {
+ global $wp_locale;
+
+ $m = get_query_var( 'm' );
+ $year = get_query_var( 'year' );
+ $monthnum = get_query_var( 'monthnum' );
+ $day = get_query_var( 'day' );
+ $search = get_query_var( 's' );
+ $title = '';
+
+ $t_sep = '%WP_TITLE_SEP%'; // Temporary separator, for accurate flipping, if necessary
+
+ // If there is a post
+ if ( is_single() || ( is_home() && ! is_front_page() ) || ( is_page() && ! is_front_page() ) ) {
+ $title = single_post_title( '', false );
+ }
+
+ // If there's a post type archive
+ if ( is_post_type_archive() ) {
+ $post_type = get_query_var( 'post_type' );
+ if ( is_array( $post_type ) ) {
+ $post_type = reset( $post_type );
+ }
+ $post_type_object = get_post_type_object( $post_type );
+ if ( ! $post_type_object->has_archive ) {
+ $title = post_type_archive_title( '', false );
+ }
+ }
+
+ // If there's a category or tag
+ if ( is_category() || is_tag() ) {
+ $title = single_term_title( '', false );
+ }
+
+ // If there's a taxonomy
+ if ( is_tax() ) {
+ $term = get_queried_object();
+ if ( $term ) {
+ $tax = get_taxonomy( $term->taxonomy );
+ $title = single_term_title( $tax->labels->name . $t_sep, false );
+ }