X-Git-Url: https://scripts.mit.edu/gitweb/autoinstallsdev/wordpress.git/blobdiff_plain/3e7fab96d7874067884348df10bbdcdefa4a89ad..HEAD:/wp-includes/general-template.php diff --git a/wp-includes/general-template.php b/wp-includes/general-template.php index 33263f34..ed91e5bd 100644 --- a/wp-includes/general-template.php +++ b/wp-includes/general-template.php @@ -1,84 +1,664 @@ + + + '; + } else { + $form = ''; + } + } + + /** + * Filters the HTML output of the search form. + * + * @since 2.7.0 + * + * @param string $form The search form HTML output. + */ + $result = apply_filters( 'get_search_form', $form ); + + if ( null === $result ) + $result = $form; + + if ( $echo ) + echo $result; + else + return $result; +} -function wp_loginout() { +/** + * Display the Log In/Out link. + * + * Displays a link, which allows users to navigate to the Log In page to log in + * or log out depending on whether they are currently logged in. + * + * @since 1.5.0 + * + * @param string $redirect Optional path to redirect to on login/logout. + * @param bool $echo Default to echo and not return the link. + * @return string|void String when retrieving. + */ +function wp_loginout($redirect = '', $echo = true) { if ( ! is_user_logged_in() ) - $link = '' . __('Login') . ''; + $link = '' . __('Log in') . ''; else - $link = '' . __('Logout') . ''; + $link = '' . __('Log out') . ''; + + if ( $echo ) { + /** + * Filters the HTML output for the Log In/Log Out link. + * + * @since 1.5.0 + * + * @param string $link The HTML link content. + */ + echo apply_filters( 'loginout', $link ); + } else { + /** This filter is documented in wp-includes/general-template.php */ + return apply_filters( 'loginout', $link ); + } +} + +/** + * Retrieves the logout URL. + * + * Returns the URL that allows the user to log out of the site. + * + * @since 2.7.0 + * + * @param string $redirect Path to redirect to on logout. + * @return string The logout URL. Note: HTML-encoded via esc_html() in wp_nonce_url(). + */ +function wp_logout_url($redirect = '') { + $args = array( 'action' => 'logout' ); + if ( !empty($redirect) ) { + $args['redirect_to'] = urlencode( $redirect ); + } + + $logout_url = add_query_arg($args, site_url('wp-login.php', 'login')); + $logout_url = wp_nonce_url( $logout_url, 'log-out' ); + + /** + * Filters the logout URL. + * + * @since 2.8.0 + * + * @param string $logout_url The HTML-encoded logout URL. + * @param string $redirect Path to redirect to on logout. + */ + return apply_filters( 'logout_url', $logout_url, $redirect ); +} + +/** + * Retrieves the login URL. + * + * @since 2.7.0 + * + * @param string $redirect Path to redirect to on log in. + * @param bool $force_reauth Whether to force reauthorization, even if a cookie is present. + * Default false. + * @return string The login URL. Not HTML-encoded. + */ +function wp_login_url($redirect = '', $force_reauth = false) { + $login_url = site_url('wp-login.php', 'login'); + + if ( !empty($redirect) ) + $login_url = add_query_arg('redirect_to', urlencode($redirect), $login_url); + + if ( $force_reauth ) + $login_url = add_query_arg('reauth', '1', $login_url); + + /** + * Filters the login URL. + * + * @since 2.8.0 + * @since 4.2.0 The `$force_reauth` parameter was added. + * + * @param string $login_url The login URL. Not HTML-encoded. + * @param string $redirect The path to redirect to on login, if supplied. + * @param bool $force_reauth Whether to force reauthorization, even if a cookie is present. + */ + return apply_filters( 'login_url', $login_url, $redirect, $force_reauth ); +} + +/** + * Returns the URL that allows the user to register on the site. + * + * @since 3.6.0 + * + * @return string User registration URL. + */ +function wp_registration_url() { + /** + * Filters the user registration URL. + * + * @since 3.6.0 + * + * @param string $register The user registration URL. + */ + return apply_filters( 'register_url', site_url( 'wp-login.php?action=register', 'login' ) ); +} + +/** + * Provides a simple login form for use anywhere within WordPress. + * + * The login format HTML is echoed by default. Pass a false value for `$echo` to return it instead. + * + * @since 3.0.0 + * + * @param array $args { + * Optional. Array of options to control the form output. Default empty array. + * + * @type bool $echo Whether to display the login form or return the form HTML code. + * Default true (echo). + * @type string $redirect URL to redirect to. Must be absolute, as in "https://example.com/mypage/". + * Default is to redirect back to the request URI. + * @type string $form_id ID attribute value for the form. Default 'loginform'. + * @type string $label_username Label for the username or email address field. Default 'Username or Email Address'. + * @type string $label_password Label for the password field. Default 'Password'. + * @type string $label_remember Label for the remember field. Default 'Remember Me'. + * @type string $label_log_in Label for the submit button. Default 'Log In'. + * @type string $id_username ID attribute value for the username field. Default 'user_login'. + * @type string $id_password ID attribute value for the password field. Default 'user_pass'. + * @type string $id_remember ID attribute value for the remember field. Default 'rememberme'. + * @type string $id_submit ID attribute value for the submit button. Default 'wp-submit'. + * @type bool $remember Whether to display the "rememberme" checkbox in the form. + * @type string $value_username Default value for the username field. Default empty. + * @type bool $value_remember Whether the "Remember Me" checkbox should be checked by default. + * Default false (unchecked). + * + * } + * @return string|void String when retrieving. + */ +function wp_login_form( $args = array() ) { + $defaults = array( + 'echo' => true, + // Default 'redirect' value takes the user back to the request URI. + 'redirect' => ( is_ssl() ? 'https://' : 'http://' ) . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'], + 'form_id' => 'loginform', + 'label_username' => __( 'Username or Email Address' ), + 'label_password' => __( 'Password' ), + 'label_remember' => __( 'Remember Me' ), + 'label_log_in' => __( 'Log In' ), + 'id_username' => 'user_login', + 'id_password' => 'user_pass', + 'id_remember' => 'rememberme', + 'id_submit' => 'wp-submit', + 'remember' => true, + 'value_username' => '', + // Set 'value_remember' to true to default the "Remember me" checkbox to checked. + 'value_remember' => false, + ); - echo apply_filters('loginout', $link); + /** + * Filters the default login form output arguments. + * + * @since 3.0.0 + * + * @see wp_login_form() + * + * @param array $defaults An array of default login form arguments. + */ + $args = wp_parse_args( $args, apply_filters( 'login_form_defaults', $defaults ) ); + + /** + * Filters content to display at the top of the login form. + * + * The filter evaluates just following the opening form tag element. + * + * @since 3.0.0 + * + * @param string $content Content to display. Default empty. + * @param array $args Array of login form arguments. + */ + $login_form_top = apply_filters( 'login_form_top', '', $args ); + + /** + * Filters content to display in the middle of the login form. + * + * The filter evaluates just following the location where the 'login-password' + * field is displayed. + * + * @since 3.0.0 + * + * @param string $content Content to display. Default empty. + * @param array $args Array of login form arguments. + */ + $login_form_middle = apply_filters( 'login_form_middle', '', $args ); + + /** + * Filters content to display at the bottom of the login form. + * + * The filter evaluates just preceding the closing form tag element. + * + * @since 3.0.0 + * + * @param string $content Content to display. Default empty. + * @param array $args Array of login form arguments. + */ + $login_form_bottom = apply_filters( 'login_form_bottom', '', $args ); + + $form = ' +
+ ' . $login_form_top . ' +

+ + +

+

+ + +

+ ' . $login_form_middle . ' + ' . ( $args['remember'] ? '

' : '' ) . ' +

+ + +

+ ' . $login_form_bottom . ' +
'; + + if ( $args['echo'] ) + echo $form; + else + return $form; } +/** + * Returns the URL that allows the user to retrieve the lost password + * + * @since 2.8.0 + * + * @param string $redirect Path to redirect to on login. + * @return string Lost password URL. + */ +function wp_lostpassword_url( $redirect = '' ) { + $args = array( 'action' => 'lostpassword' ); + if ( !empty($redirect) ) { + $args['redirect_to'] = $redirect; + } -function wp_register( $before = '
  • ', $after = '
  • ' ) { + $lostpassword_url = add_query_arg( $args, network_site_url('wp-login.php', 'login') ); + + /** + * Filters the Lost Password URL. + * + * @since 2.8.0 + * + * @param string $lostpassword_url The lost password page URL. + * @param string $redirect The path to redirect to on login. + */ + return apply_filters( 'lostpassword_url', $lostpassword_url, $redirect ); +} +/** + * Display the Registration or Admin link. + * + * Display a link which allows the user to navigate to the registration page if + * not logged in and registration is enabled or to the dashboard if logged in. + * + * @since 1.5.0 + * + * @param string $before Text to output before the link. Default `
  • `. + * @param string $after Text to output after the link. Default `
  • `. + * @param bool $echo Default to echo and not return the link. + * @return string|void String when retrieving. + */ +function wp_register( $before = '
  • ', $after = '
  • ', $echo = true ) { if ( ! is_user_logged_in() ) { if ( get_option('users_can_register') ) - $link = $before . '' . __('Register') . '' . $after; + $link = $before . '' . __('Register') . '' . $after; else $link = ''; + } elseif ( current_user_can( 'read' ) ) { + $link = $before . '' . __('Site Admin') . '' . $after; } else { - $link = $before . '' . __('Site Admin') . '' . $after; + $link = ''; } - echo apply_filters('register', $link); + /** + * Filters the HTML link to the Registration or Admin page. + * + * Users are sent to the admin page if logged-in, or the registration page + * if enabled and logged-out. + * + * @since 1.5.0 + * + * @param string $link The HTML code for the link to the Registration or Admin page. + */ + $link = apply_filters( 'register', $link ); + + if ( $echo ) { + echo $link; + } else { + return $link; + } } - +/** + * Theme container function for the 'wp_meta' action. + * + * The {@see 'wp_meta'} action can have several purposes, depending on how you use it, + * but one purpose might have been to allow for theme switching. + * + * @since 1.5.0 + * + * @link https://core.trac.wordpress.org/ticket/1458 Explanation of 'wp_meta' action. + */ function wp_meta() { - do_action('wp_meta'); + /** + * Fires before displaying echoed content in the sidebar. + * + * @since 1.5.0 + */ + do_action( 'wp_meta' ); } - -function bloginfo($show='') { - echo get_bloginfo($show, 'display'); +/** + * Displays information about the current site. + * + * @since 0.71 + * + * @see get_bloginfo() For possible `$show` values + * + * @param string $show Optional. Site information to display. Default empty. + */ +function bloginfo( $show = '' ) { + echo get_bloginfo( $show, 'display' ); } /** - * Note: some of these values are DEPRECATED. Meaning they could be - * taken out at any time and shouldn't be relied upon. Options - * without "// DEPRECATED" are the preferred and recommended ways - * to get the information. + * Retrieves information about the current site. + * + * Possible values for `$show` include: + * + * - 'name' - Site title (set in Settings > General) + * - 'description' - Site tagline (set in Settings > General) + * - 'wpurl' - The WordPress address (URL) (set in Settings > General) + * - 'url' - The Site address (URL) (set in Settings > General) + * - 'admin_email' - Admin email (set in Settings > General) + * - 'charset' - The "Encoding for pages and feeds" (set in Settings > Reading) + * - 'version' - The current WordPress version + * - 'html_type' - The content-type (default: "text/html"). Themes and plugins + * can override the default value using the {@see 'pre_option_html_type'} filter + * - 'text_direction' - The text direction determined by the site's language. is_rtl() + * should be used instead + * - 'language' - Language code for the current site + * - 'stylesheet_url' - URL to the stylesheet for the active theme. An active child theme + * will take precedence over this value + * - 'stylesheet_directory' - Directory path for the active theme. An active child theme + * will take precedence over this value + * - 'template_url' / 'template_directory' - URL of the active theme's directory. An active + * child theme will NOT take precedence over this value + * - 'pingback_url' - The pingback XML-RPC file URL (xmlrpc.php) + * - 'atom_url' - The Atom feed URL (/feed/atom) + * - 'rdf_url' - The RDF/RSS 1.0 feed URL (/feed/rfd) + * - 'rss_url' - The RSS 0.92 feed URL (/feed/rss) + * - 'rss2_url' - The RSS 2.0 feed URL (/feed) + * - 'comments_atom_url' - The comments Atom feed URL (/comments/feed) + * - 'comments_rss2_url' - The comments RSS 2.0 feed URL (/comments/feed) + * + * Some `$show` values are deprecated and will be removed in future versions. + * These options will trigger the _deprecated_argument() function. + * + * Deprecated arguments include: + * + * - 'siteurl' - Use 'url' instead + * - 'home' - Use 'url' instead + * + * @since 0.71 + * + * @global string $wp_version + * + * @param string $show Optional. Site info to retrieve. Default empty (site name). + * @param string $filter Optional. How to filter what is retrieved. Default 'raw'. + * @return string Mostly string values, might be empty. */ -function get_bloginfo($show = '', $filter = 'raw') { - - switch($show) { - case 'url' : +function get_bloginfo( $show = '', $filter = 'raw' ) { + switch( $show ) { case 'home' : // DEPRECATED case 'siteurl' : // DEPRECATED - $output = get_option('home'); + _deprecated_argument( __FUNCTION__, '2.2.0', sprintf( + /* translators: 1: 'siteurl'/'home' argument, 2: bloginfo() function name, 3: 'url' argument */ + __( 'The %1$s option is deprecated for the family of %2$s functions. Use the %3$s option instead.' ), + '' . $show . '', + 'bloginfo()', + 'url' + ) ); + case 'url' : + $output = home_url(); break; case 'wpurl' : - $output = get_option('siteurl'); + $output = site_url(); break; case 'description': $output = get_option('blogdescription'); @@ -102,7 +682,7 @@ function get_bloginfo($show = '', $filter = 'raw') { $output = get_feed_link('comments_rss2'); break; case 'pingback_url': - $output = get_option('siteurl') .'/xmlrpc.php'; + $output = site_url( 'xmlrpc.php' ); break; case 'stylesheet_url': $output = get_stylesheet_uri(); @@ -129,12 +709,29 @@ function get_bloginfo($show = '', $filter = 'raw') { $output = $wp_version; break; case 'language': - $output = get_locale(); - $output = str_replace('_', '-', $output); + /* translators: Translate this to the correct language tag for your locale, + * see https://www.w3.org/International/articles/language-tags/ for reference. + * Do not translate into your own language. + */ + $output = __( 'html_lang_attribute' ); + if ( 'html_lang_attribute' === $output || preg_match( '/[^a-zA-Z0-9-]/', $output ) ) { + $output = get_locale(); + $output = str_replace( '_', '-', $output ); + } break; case 'text_direction': - global $wp_locale; - $output = $wp_locale->text_direction; + _deprecated_argument( __FUNCTION__, '2.2.0', sprintf( + /* translators: 1: 'text_direction' argument, 2: bloginfo() function name, 3: is_rtl() function name */ + __( 'The %1$s option is deprecated for the family of %2$s functions. Use the %3$s function instead.' ), + '' . $show . '', + 'bloginfo()', + 'is_rtl()' + ) ); + if ( function_exists( 'is_rtl' ) ) { + $output = is_rtl() ? 'rtl' : 'ltr'; + } else { + $output = 'ltr'; + } break; case 'name': default: @@ -149,544 +746,1386 @@ function get_bloginfo($show = '', $filter = 'raw') { $url = false; if ( 'display' == $filter ) { - if ( $url ) - $output = apply_filters('bloginfo_url', $output, $show); - else - $output = apply_filters('bloginfo', $output, $show); + if ( $url ) { + /** + * Filters the URL returned by get_bloginfo(). + * + * @since 2.0.5 + * + * @param mixed $output The URL returned by bloginfo(). + * @param mixed $show Type of information requested. + */ + $output = apply_filters( 'bloginfo_url', $output, $show ); + } else { + /** + * Filters the site information returned by get_bloginfo(). + * + * @since 0.71 + * + * @param mixed $output The requested non-URL site information. + * @param mixed $show Type of information requested. + */ + $output = apply_filters( 'bloginfo', $output, $show ); + } } return $output; } +/** + * Returns 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. + * @return string Site Icon URL. + */ +function get_site_icon_url( $size = 512, $url = '', $blog_id = 0 ) { + $switched_blog = false; -function wp_title($sep = '»', $display = true) { - global $wpdb, $wp_locale, $wp_query; - - $cat = get_query_var('cat'); - $tag = get_query_var('tag_id'); - $p = get_query_var('p'); - $name = get_query_var('name'); - $category_name = get_query_var('category_name'); - $author = get_query_var('author'); - $author_name = get_query_var('author_name'); - $m = get_query_var('m'); - $year = get_query_var('year'); - $monthnum = get_query_var('monthnum'); - $day = get_query_var('day'); - $title = ''; - - // If there's a category - if ( !empty($cat) ) { - // category exclusion - if ( !stristr($cat,'-') ) - $title = apply_filters('single_cat_title', get_the_category_by_ID($cat)); - } elseif ( !empty($category_name) ) { - if ( stristr($category_name,'/') ) { - $category_name = explode('/',$category_name); - if ( $category_name[count($category_name)-1] ) - $category_name = $category_name[count($category_name)-1]; // no trailing slash - else - $category_name = $category_name[count($category_name)-2]; // there was a trailling slash - } - $cat = get_term_by('slug', $category_name, 'category', OBJECT, 'display'); - if ( $cat ) - $title = apply_filters('single_cat_title', $cat->name); - } - - if ( !empty($tag) ) { - $tag = get_term($tag, 'post_tag', OBJECT, 'display'); - if ( is_wp_error( $tag ) ) - return $tag; - if ( ! empty($tag->name) ) - $title = apply_filters('single_tag_title', $tag->name); - } - - // If there's an author - if ( !empty($author) ) { - $title = get_userdata($author); - $title = $title->display_name; - } - if ( !empty($author_name) ) { - // We do a direct query here because we don't cache by nicename. - $title = $wpdb->get_var("SELECT display_name FROM $wpdb->users WHERE user_nicename = '$author_name'"); + if ( is_multisite() && ! empty( $blog_id ) && (int) $blog_id !== get_current_blog_id() ) { + switch_to_blog( $blog_id ); + $switched_blog = true; } - // If there's a month - if ( !empty($m) ) { - $my_year = substr($m, 0, 4); - $my_month = $wp_locale->get_month(substr($m, 4, 2)); - $my_day = intval(substr($m, 6, 2)); - $title = "$my_year" . ($my_month ? "$sep $my_month" : "") . ($my_day ? "$sep $my_day" : ""); - } + $site_icon_id = get_option( 'site_icon' ); - if ( !empty($year) ) { - $title = $year; - if ( !empty($monthnum) ) - $title .= " $sep " . $wp_locale->get_month($monthnum); - if ( !empty($day) ) - $title .= " $sep " . zeroise($day, 2); + if ( $site_icon_id ) { + if ( $size >= 512 ) { + $size_data = 'full'; + } else { + $size_data = array( $size, $size ); + } + $url = wp_get_attachment_image_url( $site_icon_id, $size_data ); } - // If there is a post - if ( is_single() || is_page() ) { - $post = $wp_query->get_queried_object(); - $title = strip_tags( apply_filters( 'single_post_title', $post->post_title ) ); + if ( $switched_blog ) { + restore_current_blog(); } - $prefix = ''; - if ( !empty($title) ) - $prefix = " $sep "; - - $title = $prefix . $title; - $title = apply_filters('wp_title', $title, $sep); - - // Send it out - if ( $display ) - echo $title; - else - return $title; + /** + * Filters 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 ) ); +} -function single_post_title($prefix = '', $display = true) { - global $wpdb; - $p = get_query_var('p'); - $name = get_query_var('name'); - - if ( intval($p) || '' != $name ) { - if ( !$p ) - $p = $wpdb->get_var("SELECT ID FROM $wpdb->posts WHERE post_name = '$name'"); - $post = & get_post($p); - $title = $post->post_title; - $title = apply_filters('single_post_title', $title); - if ( $display ) - echo $prefix.strip_tags($title); - else - return strip_tags($title); - } +/** + * 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 ) { + $switched_blog = false; -function single_cat_title($prefix = '', $display = true ) { - $cat = intval( get_query_var('cat') ); - if ( !empty($cat) && !(strtoupper($cat) == 'ALL') ) { - $my_cat_name = apply_filters('single_cat_title', get_the_category_by_ID($cat)); - if ( !empty($my_cat_name) ) { - if ( $display ) - echo $prefix.strip_tags($my_cat_name); - else - return strip_tags($my_cat_name); - } - } else if ( is_tag() ) { - return single_tag_title($prefix, $display); + if ( is_multisite() && ! empty( $blog_id ) && (int) $blog_id !== get_current_blog_id() ) { + switch_to_blog( $blog_id ); + $switched_blog = true; } -} + $custom_logo_id = get_theme_mod( 'custom_logo' ); -function single_tag_title($prefix = '', $display = true ) { - if ( !is_tag() ) - return; - - $tag_id = intval( get_query_var('tag_id') ); - - if ( !empty($tag_id) ) { - $my_tag = &get_term($tag_id, 'post_tag', OBJECT, 'display'); - if ( is_wp_error( $my_tag ) ) - return false; - $my_tag_name = apply_filters('single_tag_title', $my_tag->name); - if ( !empty($my_tag_name) ) { - if ( $display ) - echo $prefix . $my_tag_name; - else - return $my_tag_name; - } + if ( $switched_blog ) { + 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 = ''; + $switched_blog = false; -function single_month_title($prefix = '', $display = true ) { - global $wp_locale; + if ( is_multisite() && ! empty( $blog_id ) && (int) $blog_id !== get_current_blog_id() ) { + switch_to_blog( $blog_id ); + $switched_blog = true; + } - $m = get_query_var('m'); - $year = get_query_var('year'); - $monthnum = get_query_var('monthnum'); + $custom_logo_id = get_theme_mod( 'custom_logo' ); + + // We have a logo. Logo is go. + if ( $custom_logo_id ) { + $html = sprintf( '', + esc_url( home_url( '/' ) ), + wp_get_attachment_image( $custom_logo_id, 'full', false, array( + 'class' => 'custom-logo', + 'itemprop' => 'logo', + ) ) + ); + } - if ( !empty($monthnum) && !empty($year) ) { - $my_year = $year; - $my_month = $wp_locale->get_month($monthnum); - } elseif ( !empty($m) ) { - $my_year = substr($m, 0, 4); - $my_month = $wp_locale->get_month(substr($m, 4, 2)); + // 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( '', + esc_url( home_url( '/' ) ) + ); } - if ( empty($my_month) ) - return false; + if ( $switched_blog ) { + restore_current_blog(); + } - $result = $prefix . $my_month . $prefix . $my_year; + /** + * Filters the custom logo output. + * + * @since 4.5.0 + * @since 4.6.0 Added the `$blog_id` parameter. + * + * @param string $html Custom logo HTML output. + * @param int $blog_id ID of the blog to get the custom logo for. + */ + return apply_filters( 'get_custom_logo', $html, $blog_id ); +} - if ( !$display ) - return $result; - echo $result; +/** + * 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() { + + /** + * Filters 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; + } -/* link navigation hack by Orien http://icecode.com/ */ -function get_archives_link($url, $text, $format = 'html', $before = '', $after = '') { - $text = wptexturize($text); - $title_text = attribute_escape($text); - $url = clean_url($url); + global $page, $paged; - if ('link' == $format) - return "\t\n"; - elseif ('option' == $format) - return "\t\n"; - elseif ('html' == $format) - return "\t
  • $before$text$after
  • \n"; - else // custom - return "\t$before$text$after\n"; -} + $title = array( + 'title' => '', + ); + // If it's a 404 page, use a "Page not found" title. + if ( is_404() ) { + $title['title'] = __( 'Page not found' ); -function wp_get_archives($args = '') { - global $wpdb, $wp_locale; + // 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() ); - $defaults = array( - 'type' => 'monthly', 'limit' => '', - 'format' => 'html', 'before' => '', - 'after' => '', 'show_post_count' => false - ); + // If on the front page, use the site title. + } elseif ( is_front_page() ) { + $title['title'] = get_bloginfo( 'name', 'display' ); - $r = wp_parse_args( $args, $defaults ); - extract( $r, EXTR_SKIP ); + // 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 ( '' == $type ) - $type = 'monthly'; + // If on a taxonomy archive, use the term title. + } elseif ( is_tax() ) { + $title['title'] = single_term_title( '', false ); - if ( '' != $limit ) { - $limit = (int) $limit; - $limit = ' LIMIT '.$limit; - } + /* + * 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 ); - // this is what will separate dates on weekly archive links - $archive_week_separator = '–'; + // If on a category or tag archive, use the term title. + } elseif ( is_category() || is_tag() ) { + $title['title'] = single_term_title( '', false ); - // over-ride general date format ? 0 = no: use the date format set in Options, 1 = yes: over-ride - $archive_date_format_over_ride = 0; + // If on an author archive, use the author's display name. + } elseif ( is_author() && $author = get_queried_object() ) { + $title['title'] = $author->display_name; - // options for daily archive (only if you over-ride the general date format) - $archive_day_date_format = 'Y/m/d'; + // 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' ) ); - // options for weekly archive (only if you over-ride the general date format) - $archive_week_start_date_format = 'Y/m/d'; - $archive_week_end_date_format = 'Y/m/d'; + } elseif ( is_month() ) { + $title['title'] = get_the_date( _x( 'F Y', 'monthly archives date format' ) ); - if ( !$archive_date_format_over_ride ) { - $archive_day_date_format = get_option('date_format'); - $archive_week_start_date_format = get_option('date_format'); - $archive_week_end_date_format = get_option('date_format'); + } elseif ( is_day() ) { + $title['title'] = get_the_date(); } - $add_hours = intval(get_option('gmt_offset')); - $add_minutes = intval(60 * (get_option('gmt_offset') - $add_hours)); - - //filters - $where = apply_filters('getarchives_where', "WHERE post_type = 'post' AND post_status = 'publish'", $r ); - $join = apply_filters('getarchives_join', "", $r); + // Add a page number if necessary. + if ( ( $paged >= 2 || $page >= 2 ) && ! is_404() ) { + $title['page'] = sprintf( __( 'Page %s' ), max( $paged, $page ) ); + } - if ( 'monthly' == $type ) { - $arcresults = $wpdb->get_results("SELECT DISTINCT YEAR(post_date) AS `year`, MONTH(post_date) AS `month`, count(ID) as posts FROM $wpdb->posts $join $where GROUP BY YEAR(post_date), MONTH(post_date) ORDER BY post_date DESC" . $limit); - if ( $arcresults ) { - $afterafter = $after; - foreach ( $arcresults as $arcresult ) { - $url = get_month_link($arcresult->year, $arcresult->month); - $text = sprintf(__('%1$s %2$d'), $wp_locale->get_month($arcresult->month), $arcresult->year); - if ( $show_post_count ) - $after = ' ('.$arcresult->posts.')' . $afterafter; - echo get_archives_link($url, $text, $format, $before, $after); - } - } - } elseif ('yearly' == $type) { - $arcresults = $wpdb->get_results("SELECT DISTINCT YEAR(post_date) AS `year`, count(ID) as posts FROM $wpdb->posts $join $where GROUP BY YEAR(post_date) ORDER BY post_date DESC" . $limit); - if ($arcresults) { - $afterafter = $after; - foreach ($arcresults as $arcresult) { - $url = get_year_link($arcresult->year); - $text = sprintf('%d', $arcresult->year); - if ($show_post_count) - $after = ' ('.$arcresult->posts.')' . $afterafter; - echo get_archives_link($url, $text, $format, $before, $after); - } - } - } elseif ( 'daily' == $type ) { - $arcresults = $wpdb->get_results("SELECT DISTINCT YEAR(post_date) AS `year`, MONTH(post_date) AS `month`, DAYOFMONTH(post_date) AS `dayofmonth`, count(ID) as posts FROM $wpdb->posts $join $where GROUP BY YEAR(post_date), MONTH(post_date), DAYOFMONTH(post_date) ORDER BY post_date DESC" . $limit); - if ( $arcresults ) { - $afterafter = $after; - foreach ( $arcresults as $arcresult ) { - $url = get_day_link($arcresult->year, $arcresult->month, $arcresult->dayofmonth); - $date = sprintf('%1$d-%2$02d-%3$02d 00:00:00', $arcresult->year, $arcresult->month, $arcresult->dayofmonth); - $text = mysql2date($archive_day_date_format, $date); - if ($show_post_count) - $after = ' ('.$arcresult->posts.')'.$afterafter; - echo get_archives_link($url, $text, $format, $before, $after); - } - } - } elseif ( 'weekly' == $type ) { - $start_of_week = get_option('start_of_week'); - $arcresults = $wpdb->get_results("SELECT DISTINCT WEEK(post_date, $start_of_week) AS `week`, YEAR(post_date) AS yr, DATE_FORMAT(post_date, '%Y-%m-%d') AS yyyymmdd, count(ID) as posts FROM $wpdb->posts $join $where GROUP BY WEEK(post_date, $start_of_week), YEAR(post_date) ORDER BY post_date DESC" . $limit); - $arc_w_last = ''; - $afterafter = $after; - if ( $arcresults ) { - foreach ( $arcresults as $arcresult ) { - if ( $arcresult->week != $arc_w_last ) { - $arc_year = $arcresult->yr; - $arc_w_last = $arcresult->week; - $arc_week = get_weekstartend($arcresult->yyyymmdd, get_option('start_of_week')); - $arc_week_start = date_i18n($archive_week_start_date_format, $arc_week['start']); - $arc_week_end = date_i18n($archive_week_end_date_format, $arc_week['end']); - $url = sprintf('%1$s/%2$s%3$sm%4$s%5$s%6$sw%7$s%8$d', get_option('home'), '', '?', '=', $arc_year, '&', '=', $arcresult->week); - $text = $arc_week_start . $archive_week_separator . $arc_week_end; - if ($show_post_count) - $after = ' ('.$arcresult->posts.')'.$afterafter; - echo get_archives_link($url, $text, $format, $before, $after); - } - } - } - } elseif ( ( 'postbypost' == $type ) || ('alpha' == $type) ) { - ('alpha' == $type) ? $orderby = "post_title ASC " : $orderby = "post_date DESC "; - $arcresults = $wpdb->get_results("SELECT * FROM $wpdb->posts $join $where ORDER BY $orderby $limit"); - if ( $arcresults ) { - foreach ( $arcresults as $arcresult ) { - if ( $arcresult->post_date != '0000-00-00 00:00:00' ) { - $url = get_permalink($arcresult); - $arc_title = $arcresult->post_title; - if ( $arc_title ) - $text = strip_tags(apply_filters('the_title', $arc_title)); - else - $text = $arcresult->ID; - echo get_archives_link($url, $text, $format, $before, $after); - } - } - } + // 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' ); } + + /** + * Filters the separator for the document title. + * + * @since 4.4.0 + * + * @param string $sep Document title separator. Default '-'. + */ + $sep = apply_filters( 'document_title_separator', '-' ); + + /** + * Filters 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; + } -// Used in get_calendar -function calendar_week_mod($num) { - $base = 7; - return ($num - $base*floor($num/$base)); + echo '' . wp_get_document_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' + * of 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 backward 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; -function get_calendar($initial = true) { - global $wpdb, $m, $monthnum, $year, $timedifference, $wp_locale, $posts; + $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 = ''; - $key = md5( $m . $monthnum . $year ); - if ( $cache = wp_cache_get( 'get_calendar', 'calendar' ) ) { - if ( isset( $cache[ $key ] ) ) { - echo $cache[ $key ]; - return; - } - } + $t_sep = '%WP_TITLE_SEP%'; // Temporary separator, for accurate flipping, if necessary - ob_start(); - // Quick check. If we have no posts at all, abort! - if ( !$posts ) { - $gotsome = $wpdb->get_var("SELECT ID from $wpdb->posts WHERE post_type = 'post' AND post_status = 'publish' ORDER BY post_date DESC LIMIT 1"); - if ( !$gotsome ) - return; + // If there is a post + if ( is_single() || ( is_home() && ! is_front_page() ) || ( is_page() && ! is_front_page() ) ) { + $title = single_post_title( '', false ); } - if ( isset($_GET['w']) ) - $w = ''.intval($_GET['w']); - - // week_begins = 0 stands for Sunday - $week_begins = intval(get_option('start_of_week')); - $add_hours = intval(get_option('gmt_offset')); - $add_minutes = intval(60 * (get_option('gmt_offset') - $add_hours)); + // 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 ); + } + } - // Let's figure out when we are - if ( !empty($monthnum) && !empty($year) ) { - $thismonth = ''.zeroise(intval($monthnum), 2); - $thisyear = ''.intval($year); - } elseif ( !empty($w) ) { - // We need to get the month from MySQL - $thisyear = ''.intval(substr($m, 0, 4)); - $d = (($w - 1) * 7) + 6; //it seems MySQL's weeks disagree with PHP's - $thismonth = $wpdb->get_var("SELECT DATE_FORMAT((DATE_ADD('${thisyear}0101', INTERVAL $d DAY) ), '%m')"); - } elseif ( !empty($m) ) { - $calendar = substr($m, 0, 6); - $thisyear = ''.intval(substr($m, 0, 4)); - if ( strlen($m) < 6 ) - $thismonth = '01'; - else - $thismonth = ''.zeroise(intval(substr($m, 4, 2)), 2); - } else { - $thisyear = gmdate('Y', current_time('timestamp')); - $thismonth = gmdate('m', current_time('timestamp')); + // If there's a category or tag + if ( is_category() || is_tag() ) { + $title = single_term_title( '', false ); } - $unixmonth = mktime(0, 0 , 0, $thismonth, 1, $thisyear); + // 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 ); + } + } - // Get the next and previous month and year with at least one post - $previous = $wpdb->get_row("SELECT DISTINCT MONTH(post_date) AS month, YEAR(post_date) AS year - FROM $wpdb->posts - WHERE post_date < '$thisyear-$thismonth-01' - AND post_type = 'post' AND post_status = 'publish' - ORDER BY post_date DESC - LIMIT 1"); - $next = $wpdb->get_row("SELECT DISTINCT MONTH(post_date) AS month, YEAR(post_date) AS year - FROM $wpdb->posts - WHERE post_date > '$thisyear-$thismonth-01' - AND MONTH( post_date ) != MONTH( '$thisyear-$thismonth-01' ) - AND post_type = 'post' AND post_status = 'publish' - ORDER BY post_date ASC - LIMIT 1"); + // If there's an author + if ( is_author() && ! is_post_type_archive() ) { + $author = get_queried_object(); + if ( $author ) { + $title = $author->display_name; + } + } - echo ' - - - '; + // Post type archives with has_archive should override terms. + if ( is_post_type_archive() && $post_type_object->has_archive ) { + $title = post_type_archive_title( '', false ); + } - $myweek = array(); + // If there's a month + if ( is_archive() && ! empty( $m ) ) { + $my_year = substr( $m, 0, 4 ); + $my_month = $wp_locale->get_month( substr( $m, 4, 2 ) ); + $my_day = intval( substr( $m, 6, 2 ) ); + $title = $my_year . ( $my_month ? $t_sep . $my_month : '' ) . ( $my_day ? $t_sep . $my_day : '' ); + } - for ( $wdcount=0; $wdcount<=6; $wdcount++ ) { - $myweek[] = $wp_locale->get_weekday(($wdcount+$week_begins)%7); + // If there's a year + if ( is_archive() && ! empty( $year ) ) { + $title = $year; + if ( ! empty( $monthnum ) ) { + $title .= $t_sep . $wp_locale->get_month( $monthnum ); + } + if ( ! empty( $day ) ) { + $title .= $t_sep . zeroise( $day, 2 ); + } } - foreach ( $myweek as $wd ) { - $day_name = (true == $initial) ? $wp_locale->get_weekday_initial($wd) : $wp_locale->get_weekday_abbrev($wd); - echo "\n\t\t"; + // If it's a search + if ( is_search() ) { + /* translators: 1: separator, 2: search phrase */ + $title = sprintf( __( 'Search Results %1$s %2$s' ), $t_sep, strip_tags( $search ) ); } - echo ' - - + // If it's a 404 page + if ( is_404() ) { + $title = __( 'Page not found' ); + } - - '; + $prefix = ''; + if ( ! empty( $title ) ) { + $prefix = " $sep "; + } - if ( $previous ) { - echo "\n\t\t".''; + /** + * Filters the parts of the page title. + * + * @since 4.0.0 + * + * @param array $title_array Parts of the page title. + */ + $title_array = apply_filters( 'wp_title_parts', explode( $t_sep, $title ) ); + + // Determines position of the separator and direction of the breadcrumb + if ( 'right' == $seplocation ) { // sep on right, so reverse the order + $title_array = array_reverse( $title_array ); + $title = implode( " $sep ", $title_array ) . $prefix; } else { - echo "\n\t\t".''; + $title = $prefix . implode( " $sep ", $title_array ); } - echo "\n\t\t".''; + /** + * Filters the text of the page title. + * + * @since 2.0.0 + * + * @param string $title Page title. + * @param string $sep Title separator. + * @param string $seplocation Location of the separator (left or right). + */ + $title = apply_filters( 'wp_title', $title, $sep, $seplocation ); - if ( $next ) { - echo "\n\t\t".''; + // Send it out + if ( $display ) { + echo $title; } else { - echo "\n\t\t".''; + return $title; } +} + +/** + * Display or retrieve page title for post. + * + * This is optimized for single.php template file for displaying the post title. + * + * It does not support placing the separator after the title, but by leaving the + * prefix parameter empty, you can set the title separator manually. The prefix + * does not automatically place a space between the prefix, so if there should + * be a space, the parameter value will need to have it at the end. + * + * @since 0.71 + * + * @param string $prefix Optional. What to display before the title. + * @param bool $display Optional, default is true. Whether to display or retrieve title. + * @return string|void Title when retrieving. + */ +function single_post_title( $prefix = '', $display = true ) { + $_post = get_queried_object(); + + if ( !isset($_post->post_title) ) + return; + + /** + * Filters the page title for a single post. + * + * @since 0.71 + * + * @param string $_post_title The single post page title. + * @param object $_post The current queried object as returned by get_queried_object(). + */ + $title = apply_filters( 'single_post_title', $_post->post_title, $_post ); + if ( $display ) + echo $prefix . $title; + else + return $prefix . $title; +} + +/** + * Display or retrieve title for a post type archive. + * + * This is optimized for archive.php and archive-{$post_type}.php template files + * for displaying the title of the post type. + * + * @since 3.1.0 + * + * @param string $prefix Optional. What to display before the title. + * @param bool $display Optional, default is true. Whether to display or retrieve title. + * @return string|void Title when retrieving, null when displaying or failure. + */ +function post_type_archive_title( $prefix = '', $display = true ) { + if ( ! is_post_type_archive() ) + return; + + $post_type = get_query_var( 'post_type' ); + if ( is_array( $post_type ) ) + $post_type = reset( $post_type ); + + $post_type_obj = get_post_type_object( $post_type ); + + /** + * Filters the post type archive title. + * + * @since 3.1.0 + * + * @param string $post_type_name Post type 'name' label. + * @param string $post_type Post type. + */ + $title = apply_filters( 'post_type_archive_title', $post_type_obj->labels->name, $post_type ); + + if ( $display ) + echo $prefix . $title; + else + return $prefix . $title; +} + +/** + * Display or retrieve page title for category archive. + * + * Useful for category template files for displaying the category page title. + * The prefix does not automatically place a space between the prefix, so if + * there should be a space, the parameter value will need to have it at the end. + * + * @since 0.71 + * + * @param string $prefix Optional. What to display before the title. + * @param bool $display Optional, default is true. Whether to display or retrieve title. + * @return string|void Title when retrieving. + */ +function single_cat_title( $prefix = '', $display = true ) { + return single_term_title( $prefix, $display ); +} + +/** + * Display or retrieve page title for tag post archive. + * + * Useful for tag template files for displaying the tag page title. The prefix + * does not automatically place a space between the prefix, so if there should + * be a space, the parameter value will need to have it at the end. + * + * @since 2.3.0 + * + * @param string $prefix Optional. What to display before the title. + * @param bool $display Optional, default is true. Whether to display or retrieve title. + * @return string|void Title when retrieving. + */ +function single_tag_title( $prefix = '', $display = true ) { + return single_term_title( $prefix, $display ); +} + +/** + * Display or retrieve page title for taxonomy term archive. + * + * Useful for taxonomy term template files for displaying the taxonomy term page title. + * The prefix does not automatically place a space between the prefix, so if there should + * be a space, the parameter value will need to have it at the end. + * + * @since 3.1.0 + * + * @param string $prefix Optional. What to display before the title. + * @param bool $display Optional, default is true. Whether to display or retrieve title. + * @return string|void Title when retrieving. + */ +function single_term_title( $prefix = '', $display = true ) { + $term = get_queried_object(); + + if ( !$term ) + return; + + if ( is_category() ) { + /** + * Filters the category archive page title. + * + * @since 2.0.10 + * + * @param string $term_name Category name for archive being displayed. + */ + $term_name = apply_filters( 'single_cat_title', $term->name ); + } elseif ( is_tag() ) { + /** + * Filters the tag archive page title. + * + * @since 2.3.0 + * + * @param string $term_name Tag name for archive being displayed. + */ + $term_name = apply_filters( 'single_tag_title', $term->name ); + } elseif ( is_tax() ) { + /** + * Filters the custom taxonomy archive page title. + * + * @since 3.1.0 + * + * @param string $term_name Term name for archive being displayed. + */ + $term_name = apply_filters( 'single_term_title', $term->name ); + } else { + return; + } + + if ( empty( $term_name ) ) + return; + + if ( $display ) + echo $prefix . $term_name; + else + return $prefix . $term_name; +} + +/** + * Display or retrieve page title for post archive based on date. + * + * Useful for when the template only needs to display the month and year, + * if either are available. The prefix does not automatically place a space + * between the prefix, so if there should be a space, the parameter value + * will need to have it at the end. + * + * @since 0.71 + * + * @global WP_Locale $wp_locale + * + * @param string $prefix Optional. What to display before the title. + * @param bool $display Optional, default is true. Whether to display or retrieve title. + * @return string|void Title when retrieving. + */ +function single_month_title($prefix = '', $display = true ) { + global $wp_locale; + + $m = get_query_var('m'); + $year = get_query_var('year'); + $monthnum = get_query_var('monthnum'); + + if ( !empty($monthnum) && !empty($year) ) { + $my_year = $year; + $my_month = $wp_locale->get_month($monthnum); + } elseif ( !empty($m) ) { + $my_year = substr($m, 0, 4); + $my_month = $wp_locale->get_month(substr($m, 4, 2)); + } + + if ( empty($my_month) ) + return false; + + $result = $prefix . $my_month . $prefix . $my_year; + + if ( !$display ) + return $result; + echo $result; +} + +/** + * Display the archive title based on the queried object. + * + * @since 4.1.0 + * + * @see get_the_archive_title() + * + * @param string $before Optional. Content to prepend to the title. Default empty. + * @param string $after Optional. Content to append to the title. Default empty. + */ +function the_archive_title( $before = '', $after = '' ) { + $title = get_the_archive_title(); + + if ( ! empty( $title ) ) { + echo $before . $title . $after; + } +} + +/** + * Retrieve the archive title based on the queried object. + * + * @since 4.1.0 + * + * @return string Archive title. + */ +function get_the_archive_title() { + if ( is_category() ) { + /* translators: Category archive title. 1: Category name */ + $title = sprintf( __( 'Category: %s' ), single_cat_title( '', false ) ); + } elseif ( is_tag() ) { + /* translators: Tag archive title. 1: Tag name */ + $title = sprintf( __( 'Tag: %s' ), single_tag_title( '', false ) ); + } elseif ( is_author() ) { + /* translators: Author archive title. 1: Author name */ + $title = sprintf( __( 'Author: %s' ), '' . get_the_author() . '' ); + } elseif ( is_year() ) { + /* translators: Yearly archive title. 1: Year */ + $title = sprintf( __( 'Year: %s' ), get_the_date( _x( 'Y', 'yearly archives date format' ) ) ); + } elseif ( is_month() ) { + /* translators: Monthly archive title. 1: Month name and year */ + $title = sprintf( __( 'Month: %s' ), get_the_date( _x( 'F Y', 'monthly archives date format' ) ) ); + } elseif ( is_day() ) { + /* translators: Daily archive title. 1: Date */ + $title = sprintf( __( 'Day: %s' ), get_the_date( _x( 'F j, Y', 'daily archives date format' ) ) ); + } elseif ( is_tax( 'post_format' ) ) { + if ( is_tax( 'post_format', 'post-format-aside' ) ) { + $title = _x( 'Asides', 'post format archive title' ); + } elseif ( is_tax( 'post_format', 'post-format-gallery' ) ) { + $title = _x( 'Galleries', 'post format archive title' ); + } elseif ( is_tax( 'post_format', 'post-format-image' ) ) { + $title = _x( 'Images', 'post format archive title' ); + } elseif ( is_tax( 'post_format', 'post-format-video' ) ) { + $title = _x( 'Videos', 'post format archive title' ); + } elseif ( is_tax( 'post_format', 'post-format-quote' ) ) { + $title = _x( 'Quotes', 'post format archive title' ); + } elseif ( is_tax( 'post_format', 'post-format-link' ) ) { + $title = _x( 'Links', 'post format archive title' ); + } elseif ( is_tax( 'post_format', 'post-format-status' ) ) { + $title = _x( 'Statuses', 'post format archive title' ); + } elseif ( is_tax( 'post_format', 'post-format-audio' ) ) { + $title = _x( 'Audio', 'post format archive title' ); + } elseif ( is_tax( 'post_format', 'post-format-chat' ) ) { + $title = _x( 'Chats', 'post format archive title' ); + } + } elseif ( is_post_type_archive() ) { + /* translators: Post type archive title. 1: Post type name */ + $title = sprintf( __( 'Archives: %s' ), post_type_archive_title( '', false ) ); + } elseif ( is_tax() ) { + $tax = get_taxonomy( get_queried_object()->taxonomy ); + /* translators: Taxonomy term archive title. 1: Taxonomy singular name, 2: Current taxonomy term */ + $title = sprintf( __( '%1$s: %2$s' ), $tax->labels->singular_name, single_term_title( '', false ) ); + } else { + $title = __( 'Archives' ); + } + + /** + * Filters the archive title. + * + * @since 4.1.0 + * + * @param string $title Archive title to be displayed. + */ + return apply_filters( 'get_the_archive_title', $title ); +} + +/** + * Display category, tag, term, or author description. + * + * @since 4.1.0 + * + * @see get_the_archive_description() + * + * @param string $before Optional. Content to prepend to the description. Default empty. + * @param string $after Optional. Content to append to the description. Default empty. + */ +function the_archive_description( $before = '', $after = '' ) { + $description = get_the_archive_description(); + if ( $description ) { + echo $before . $description . $after; + } +} + +/** + * Retrieve category, tag, term, or author description. + * + * @since 4.1.0 + * @since 4.7.0 Added support for author archives. + * + * @see term_description() + * + * @return string Archive description. + */ +function get_the_archive_description() { + if ( is_author() ) { + $description = get_the_author_meta( 'description' ); + } else { + $description = term_description(); + } + + /** + * Filters the archive description. + * + * @since 4.1.0 + * + * @param string $description Archive description to be displayed. + */ + return apply_filters( 'get_the_archive_description', $description ); +} + +/** + * Retrieve archive link content based on predefined or custom code. + * + * The format can be one of four styles. The 'link' for head element, 'option' + * for use in the select element, 'html' for use in list (either ol or ul HTML + * elements). Custom content is also supported using the before and after + * parameters. + * + * The 'link' format uses the `` HTML element with the **archives** + * relationship. The before and after parameters are not used. The text + * parameter is used to describe the link. + * + * The 'option' format uses the option HTML element for use in select element. + * The value is the url parameter and the before and after parameters are used + * between the text description. + * + * The 'html' format, which is the default, uses the li HTML element for use in + * the list HTML elements. The before parameter is before the link and the after + * parameter is after the closing link. + * + * The custom format uses the before parameter before the link ('a' HTML + * element) and the after parameter after the closing link tag. If the above + * three values for the format are not used, then custom format is assumed. + * + * @since 1.0.0 + * + * @param string $url URL to archive. + * @param string $text Archive text description. + * @param string $format Optional, default is 'html'. Can be 'link', 'option', 'html', or custom. + * @param string $before Optional. Content to prepend to the description. Default empty. + * @param string $after Optional. Content to append to the description. Default empty. + * @return string HTML link content for archive. + */ +function get_archives_link($url, $text, $format = 'html', $before = '', $after = '') { + $text = wptexturize($text); + $url = esc_url($url); + + if ('link' == $format) + $link_html = "\t\n"; + elseif ('option' == $format) + $link_html = "\t\n"; + elseif ('html' == $format) + $link_html = "\t
  • $before$text$after
  • \n"; + else // custom + $link_html = "\t$before$text$after\n"; + + /** + * Filters the archive link content. + * + * @since 2.6.0 + * @since 4.5.0 Added the `$url`, `$text`, `$format`, `$before`, and `$after` parameters. + * + * @param string $link_html The archive HTML link content. + * @param string $url URL to archive. + * @param string $text Archive text description. + * @param string $format Link format. Can be 'link', 'option', 'html', or custom. + * @param string $before Content to prepend to the description. + * @param string $after Content to append to the description. + */ + return apply_filters( 'get_archives_link', $link_html, $url, $text, $format, $before, $after ); +} + +/** + * Display archive links based on type and format. + * + * @since 1.2.0 + * @since 4.4.0 $post_type arg was added. + * + * @see get_archives_link() + * + * @global wpdb $wpdb + * @global WP_Locale $wp_locale + * + * @param string|array $args { + * Default archive links arguments. Optional. + * + * @type string $type Type of archive to retrieve. Accepts 'daily', 'weekly', 'monthly', + * 'yearly', 'postbypost', or 'alpha'. Both 'postbypost' and 'alpha' + * display the same archive link list as well as post titles instead + * of displaying dates. The difference between the two is that 'alpha' + * will order by post title and 'postbypost' will order by post date. + * Default 'monthly'. + * @type string|int $limit Number of links to limit the query to. Default empty (no limit). + * @type string $format Format each link should take using the $before and $after args. + * Accepts 'link' (`` tag), 'option' (`
    ' . $wp_locale->get_month($thismonth) . ' ' . date('Y', $unixmonth) . '
    $day_name
    « ' . $wp_locale->get_month_abbrev($wp_locale->get_month($previous->month)) . '  ' . $wp_locale->get_month_abbrev($wp_locale->get_month($next->month)) . ' » 
    + + + '; + + $myweek = array(); + + for ( $wdcount = 0; $wdcount <= 6; $wdcount++ ) { + $myweek[] = $wp_locale->get_weekday( ( $wdcount + $week_begins ) % 7 ); + } + + foreach ( $myweek as $wd ) { + $day_name = $initial ? $wp_locale->get_weekday_initial( $wd ) : $wp_locale->get_weekday_abbrev( $wd ); + $wd = esc_attr( $wd ); + $calendar_output .= "\n\t\t"; + } + + $calendar_output .= ' + + + + + '; + + if ( $previous ) { + $calendar_output .= "\n\t\t".''; + } else { + $calendar_output .= "\n\t\t".''; + } + + $calendar_output .= "\n\t\t".''; + + if ( $next ) { + $calendar_output .= "\n\t\t".''; + } else { + $calendar_output .= "\n\t\t".''; + } + + $calendar_output .= ' + + - echo ' - - - '; + $daywithpost = array(); + // Get days with posts $dayswithposts = $wpdb->get_results("SELECT DISTINCT DAYOFMONTH(post_date) - FROM $wpdb->posts WHERE MONTH(post_date) = '$thismonth' - AND YEAR(post_date) = '$thisyear' + FROM $wpdb->posts WHERE post_date >= '{$thisyear}-{$thismonth}-01 00:00:00' AND post_type = 'post' AND post_status = 'publish' - AND post_date < '" . current_time('mysql') . '\'', ARRAY_N); + AND post_date <= '{$thisyear}-{$thismonth}-{$last_day} 23:59:59'", ARRAY_N); if ( $dayswithposts ) { - foreach ( $dayswithposts as $daywith ) { + foreach ( (array) $dayswithposts as $daywith ) { $daywithpost[] = $daywith[0]; } - } else { - $daywithpost = array(); } - if (strpos($_SERVER['HTTP_USER_AGENT'], 'MSIE') !== false || strpos(strtolower($_SERVER['HTTP_USER_AGENT']), 'camino') !== false || strpos(strtolower($_SERVER['HTTP_USER_AGENT']), 'safari') !== false) - $ak_title_separator = "\n"; - else - $ak_title_separator = ', '; - - $ak_titles_for_day = array(); - $ak_post_titles = $wpdb->get_results("SELECT post_title, DAYOFMONTH(post_date) as dom " - ."FROM $wpdb->posts " - ."WHERE YEAR(post_date) = '$thisyear' " - ."AND MONTH(post_date) = '$thismonth' " - ."AND post_date < '".current_time('mysql')."' " - ."AND post_type = 'post' AND post_status = 'publish'" - ); - if ( $ak_post_titles ) { - foreach ( $ak_post_titles as $ak_post_title ) { - - $post_title = apply_filters( "the_title", $ak_post_title->post_title ); - $post_title = str_replace('"', '"', wptexturize( $post_title )); - - if ( empty($ak_titles_for_day['day_'.$ak_post_title->dom]) ) - $ak_titles_for_day['day_'.$ak_post_title->dom] = ''; - if ( empty($ak_titles_for_day["$ak_post_title->dom"]) ) // first one - $ak_titles_for_day["$ak_post_title->dom"] = $post_title; - else - $ak_titles_for_day["$ak_post_title->dom"] .= $ak_title_separator . $post_title; - } + // See how much we should pad in the beginning + $pad = calendar_week_mod( date( 'w', $unixmonth ) - $week_begins ); + if ( 0 != $pad ) { + $calendar_output .= "\n\t\t".''; } + $newrow = false; + $daysinmonth = (int) date( 't', $unixmonth ); - // See how much we should pad in the beginning - $pad = calendar_week_mod(date('w', $unixmonth)-$week_begins); - if ( 0 != $pad ) - echo "\n\t\t".''; - - $daysinmonth = intval(date('t', $unixmonth)); for ( $day = 1; $day <= $daysinmonth; ++$day ) { - if ( isset($newrow) && $newrow ) - echo "\n\t\n\t\n\t\t"; + if ( isset($newrow) && $newrow ) { + $calendar_output .= "\n\t\n\t\n\t\t"; + } $newrow = false; - if ( $day == gmdate('j', (time() + (get_option('gmt_offset') * 3600))) && $thismonth == gmdate('m', time()+(get_option('gmt_offset') * 3600)) && $thisyear == gmdate('Y', time()+(get_option('gmt_offset') * 3600)) ) - echo ''; + if ( in_array( $day, $daywithpost ) ) { + // any posts today? + $date_format = date( _x( 'F j, Y', 'daily archives date format' ), strtotime( "{$thisyear}-{$thismonth}-{$day}" ) ); + /* translators: Post calendar label. 1: Date */ + $label = sprintf( __( 'Posts published on %s' ), $date_format ); + $calendar_output .= sprintf( + '%s', + get_day_link( $thisyear, $thismonth, $day ), + esc_attr( $label ), + $day + ); + } else { + $calendar_output .= $day; + } + $calendar_output .= ''; - if ( 6 == calendar_week_mod(date('w', mktime(0, 0 , 0, $thismonth, $day, $thisyear))-$week_begins) ) + if ( 6 == calendar_week_mod( date( 'w', mktime(0, 0 , 0, $thismonth, $day, $thisyear ) ) - $week_begins ) ) { $newrow = true; + } } - $pad = 7 - calendar_week_mod(date('w', mktime(0, 0 , 0, $thismonth, $day, $thisyear))-$week_begins); - if ( $pad != 0 && $pad != 7 ) - echo "\n\t\t".''; - - echo "\n\t\n\t\n\t
    ' . sprintf( + $calendar_caption, + $wp_locale->get_month( $thismonth ), + date( 'Y', $unixmonth ) + ) . '
    $day_name
    « ' . + $wp_locale->get_month_abbrev( $wp_locale->get_month( $previous->month ) ) . + '  ' . + $wp_locale->get_month_abbrev( $wp_locale->get_month( $next->month ) ) . + ' » 
      
    '; - else - echo ''; + if ( $day == gmdate( 'j', $ts ) && + $thismonth == gmdate( 'm', $ts ) && + $thisyear == gmdate( 'Y', $ts ) ) { + $calendar_output .= ''; + } else { + $calendar_output .= ''; + } - if ( in_array($day, $daywithpost) ) // any posts today? - echo '$day"; - else - echo $day; - echo ' 
    "; + $pad = 7 - calendar_week_mod( date( 'w', mktime( 0, 0 , 0, $thismonth, $day, $thisyear ) ) - $week_begins ); + if ( $pad != 0 && $pad != 7 ) { + $calendar_output .= "\n\t\t".' '; + } + $calendar_output .= "\n\t\n\t\n\t"; - $output = ob_get_contents(); - ob_end_clean(); - echo $output; - $cache[ $key ] = $output; + $cache[ $key ] = $calendar_output; wp_cache_set( 'get_calendar', $cache, 'calendar' ); + + if ( $echo ) { + /** + * Filters the HTML calendar output. + * + * @since 3.0.0 + * + * @param string $calendar_output HTML output of the calendar. + */ + echo apply_filters( 'get_calendar', $calendar_output ); + return; + } + /** This filter is documented in wp-includes/general-template.php */ + return apply_filters( 'get_calendar', $calendar_output ); } +/** + * Purge the cached results of get_calendar. + * + * @see get_calendar + * @since 2.1.0 + */ function delete_get_calendar_cache() { wp_cache_delete( 'get_calendar', 'calendar' ); } -add_action( 'save_post', 'delete_get_calendar_cache' ); -add_action( 'delete_post', 'delete_get_calendar_cache' ); -add_action( 'update_option_start_of_week', 'delete_get_calendar_cache' ); -add_action( 'update_option_gmt_offset', 'delete_get_calendar_cache' ); -add_action( 'update_option_start_of_week', 'delete_get_calendar_cache' ); - +/** + * Display all of the allowed tags in HTML format with attributes. + * + * This is useful for displaying in the comment area, which elements and + * attributes are supported. As well as any plugins which want to display it. + * + * @since 1.0.1 + * + * @global array $allowedtags + * + * @return string HTML allowed tags entity encoded. + */ function allowed_tags() { global $allowedtags; $allowed = ''; - foreach ( $allowedtags as $tag => $attributes ) { + foreach ( (array) $allowedtags as $tag => $attributes ) { $allowed .= '<'.$tag; if ( 0 < count($attributes) ) { foreach ( $attributes as $attribute => $limits ) { @@ -695,384 +2134,1654 @@ function allowed_tags() { } $allowed .= '> '; } - return htmlentities($allowed); + return htmlentities( $allowed ); } - /***** Date/Time tags *****/ +/** + * Outputs the date in iso8601 format for xml files. + * + * @since 1.0.0 + */ +function the_date_xml() { + echo mysql2date( 'Y-m-d', get_post()->post_date, false ); +} + +/** + * Display or Retrieve the date the current post was written (once per date) + * + * Will only output the date if the current post's date is different from the + * previous one output. + * + * i.e. Only one date listing will show per day worth of posts shown in the loop, even if the + * function is called several times for each post. + * + * HTML output can be filtered with 'the_date'. + * Date string output can be filtered with 'get_the_date'. + * + * @since 0.71 + * + * @global string|int|bool $currentday + * @global string|int|bool $previousday + * + * @param string $d Optional. PHP date format defaults to the date_format option if not specified. + * @param string $before Optional. Output before the date. + * @param string $after Optional. Output after the date. + * @param bool $echo Optional, default is display. Whether to echo the date or return it. + * @return string|void String if retrieving. + */ +function the_date( $d = '', $before = '', $after = '', $echo = true ) { + global $currentday, $previousday; + + if ( is_new_day() ) { + $the_date = $before . get_the_date( $d ) . $after; + $previousday = $currentday; + + /** + * Filters the date a post was published for display. + * + * @since 0.71 + * + * @param string $the_date The formatted date string. + * @param string $d PHP date format. Defaults to 'date_format' option + * if not specified. + * @param string $before HTML output before the date. + * @param string $after HTML output after the date. + */ + $the_date = apply_filters( 'the_date', $the_date, $d, $before, $after ); + + if ( $echo ) + echo $the_date; + else + return $the_date; + } +} + +/** + * Retrieve the date on which the post was written. + * + * Unlike the_date() this function will always return the date. + * Modify output with the {@see 'get_the_date'} filter. + * + * @since 3.0.0 + * + * @param string $d Optional. PHP date format defaults to the date_format option if not specified. + * @param int|WP_Post $post Optional. Post ID or WP_Post object. Default current post. + * @return false|string Date the current post was written. False on failure. + */ +function get_the_date( $d = '', $post = null ) { + $post = get_post( $post ); + + if ( ! $post ) { + return false; + } + + if ( '' == $d ) { + $the_date = mysql2date( get_option( 'date_format' ), $post->post_date ); + } else { + $the_date = mysql2date( $d, $post->post_date ); + } + + /** + * Filters the date a post was published. + * + * @since 3.0.0 + * + * @param string $the_date The formatted date. + * @param string $d PHP date format. Defaults to 'date_format' option + * if not specified. + * @param int|WP_Post $post The post object or ID. + */ + return apply_filters( 'get_the_date', $the_date, $d, $post ); +} + +/** + * Display the date on which the post was last modified. + * + * @since 2.1.0 + * + * @param string $d Optional. PHP date format defaults to the date_format option if not specified. + * @param string $before Optional. Output before the date. + * @param string $after Optional. Output after the date. + * @param bool $echo Optional, default is display. Whether to echo the date or return it. + * @return string|void String if retrieving. + */ +function the_modified_date( $d = '', $before = '', $after = '', $echo = true ) { + $the_modified_date = $before . get_the_modified_date($d) . $after; + + /** + * Filters the date a post was last modified for display. + * + * @since 2.1.0 + * + * @param string $the_modified_date The last modified date. + * @param string $d PHP date format. Defaults to 'date_format' option + * if not specified. + * @param string $before HTML output before the date. + * @param string $after HTML output after the date. + */ + $the_modified_date = apply_filters( 'the_modified_date', $the_modified_date, $d, $before, $after ); + + if ( $echo ) + echo $the_modified_date; + else + return $the_modified_date; + +} + +/** + * Retrieve the date on which the post was last modified. + * + * @since 2.1.0 + * @since 4.6.0 Added the `$post` parameter. + * + * @param string $d Optional. PHP date format defaults to the date_format option if not specified. + * @param int|WP_Post $post Optional. Post ID or WP_Post object. Default current post. + * @return false|string Date the current post was modified. False on failure. + */ +function get_the_modified_date( $d = '', $post = null ) { + $post = get_post( $post ); + + if ( ! $post ) { + // For backward compatibility, failures go through the filter below. + $the_time = false; + } elseif ( empty( $d ) ) { + $the_time = get_post_modified_time( get_option( 'date_format' ), false, $post, true ); + } else { + $the_time = get_post_modified_time( $d, false, $post, true ); + } + + /** + * Filters the date a post was last modified. + * + * @since 2.1.0 + * @since 4.6.0 Added the `$post` parameter. + * + * @param string $the_time The formatted date. + * @param string $d PHP date format. Defaults to value specified in + * 'date_format' option. + * @param WP_Post $post WP_Post object. + */ + return apply_filters( 'get_the_modified_date', $the_time, $d, $post ); +} + +/** + * Display the time at which the post was written. + * + * @since 0.71 + * + * @param string $d Either 'G', 'U', or php date format. + */ +function the_time( $d = '' ) { + /** + * Filters the time a post was written for display. + * + * @since 0.71 + * + * @param string $get_the_time The formatted time. + * @param string $d The time format. Accepts 'G', 'U', + * or php date format. + */ + echo apply_filters( 'the_time', get_the_time( $d ), $d ); +} + +/** + * Retrieve the time at which the post was written. + * + * @since 1.5.0 + * + * @param string $d Optional. Format to use for retrieving the time the post + * was written. Either 'G', 'U', or php date format defaults + * to the value specified in the time_format option. Default empty. + * @param int|WP_Post $post WP_Post object or ID. Default is global $post object. + * @return string|int|false Formatted date string or Unix timestamp if `$id` is 'U' or 'G'. False on failure. + */ +function get_the_time( $d = '', $post = null ) { + $post = get_post($post); + + if ( ! $post ) { + return false; + } + + if ( '' == $d ) + $the_time = get_post_time(get_option('time_format'), false, $post, true); + else + $the_time = get_post_time($d, false, $post, true); + + /** + * Filters the time a post was written. + * + * @since 1.5.0 + * + * @param string $the_time The formatted time. + * @param string $d Format to use for retrieving the time the post was written. + * Accepts 'G', 'U', or php date format value specified + * in 'time_format' option. Default empty. + * @param int|WP_Post $post WP_Post object or ID. + */ + return apply_filters( 'get_the_time', $the_time, $d, $post ); +} + +/** + * Retrieve the time at which the post was written. + * + * @since 2.0.0 + * + * @param string $d Optional. Format to use for retrieving the time the post + * was written. Either 'G', 'U', or php date format. Default 'U'. + * @param bool $gmt Optional. Whether to retrieve the GMT time. Default false. + * @param int|WP_Post $post WP_Post object or ID. Default is global $post object. + * @param bool $translate Whether to translate the time string. Default false. + * @return string|int|false Formatted date string or Unix timestamp if `$id` is 'U' or 'G'. False on failure. + */ +function get_post_time( $d = 'U', $gmt = false, $post = null, $translate = false ) { + $post = get_post($post); + + if ( ! $post ) { + return false; + } + + if ( $gmt ) + $time = $post->post_date_gmt; + else + $time = $post->post_date; + + $time = mysql2date($d, $time, $translate); + + /** + * Filters the localized time a post was written. + * + * @since 2.6.0 + * + * @param string $time The formatted time. + * @param string $d Format to use for retrieving the time the post was written. + * Accepts 'G', 'U', or php date format. Default 'U'. + * @param bool $gmt Whether to retrieve the GMT time. Default false. + */ + return apply_filters( 'get_post_time', $time, $d, $gmt ); +} + +/** + * Display the time at which the post was last modified. + * + * @since 2.0.0 + * + * @param string $d Optional Either 'G', 'U', or php date format defaults to the value specified in the time_format option. + */ +function the_modified_time($d = '') { + /** + * Filters the localized time a post was last modified, for display. + * + * @since 2.0.0 + * + * @param string $get_the_modified_time The formatted time. + * @param string $d The time format. Accepts 'G', 'U', + * or php date format. Defaults to value + * specified in 'time_format' option. + */ + echo apply_filters( 'the_modified_time', get_the_modified_time($d), $d ); +} + +/** + * Retrieve the time at which the post was last modified. + * + * @since 2.0.0 + * @since 4.6.0 Added the `$post` parameter. + * + * @param string $d Optional. Format to use for retrieving the time the post + * was modified. Either 'G', 'U', or php date format defaults + * to the value specified in the time_format option. Default empty. + * @param int|WP_Post $post Optional. Post ID or WP_Post object. Default current post. + * @return false|string Formatted date string or Unix timestamp. False on failure. + */ +function get_the_modified_time( $d = '', $post = null ) { + $post = get_post( $post ); + + if ( ! $post ) { + // For backward compatibility, failures go through the filter below. + $the_time = false; + } elseif ( empty( $d ) ) { + $the_time = get_post_modified_time( get_option( 'time_format' ), false, $post, true ); + } else { + $the_time = get_post_modified_time( $d, false, $post, true ); + } + + /** + * Filters the localized time a post was last modified. + * + * @since 2.0.0 + * @since 4.6.0 Added the `$post` parameter. + * + * @param string $the_time The formatted time. + * @param string $d Format to use for retrieving the time the post was + * written. Accepts 'G', 'U', or php date format. Defaults + * to value specified in 'time_format' option. + * @param WP_Post $post WP_Post object. + */ + return apply_filters( 'get_the_modified_time', $the_time, $d, $post ); +} + +/** + * Retrieve the time at which the post was last modified. + * + * @since 2.0.0 + * + * @param string $d Optional. Format to use for retrieving the time the post + * was modified. Either 'G', 'U', or php date format. Default 'U'. + * @param bool $gmt Optional. Whether to retrieve the GMT time. Default false. + * @param int|WP_Post $post WP_Post object or ID. Default is global $post object. + * @param bool $translate Whether to translate the time string. Default false. + * @return string|int|false Formatted date string or Unix timestamp if `$id` is 'U' or 'G'. False on failure. + */ +function get_post_modified_time( $d = 'U', $gmt = false, $post = null, $translate = false ) { + $post = get_post($post); + + if ( ! $post ) { + return false; + } + + if ( $gmt ) + $time = $post->post_modified_gmt; + else + $time = $post->post_modified; + $time = mysql2date($d, $time, $translate); + + /** + * Filters the localized time a post was last modified. + * + * @since 2.8.0 + * + * @param string $time The formatted time. + * @param string $d The date format. Accepts 'G', 'U', or php date format. Default 'U'. + * @param bool $gmt Whether to return the GMT time. Default false. + */ + return apply_filters( 'get_post_modified_time', $time, $d, $gmt ); +} + +/** + * Display the weekday on which the post was written. + * + * @since 0.71 + * + * @global WP_Locale $wp_locale + */ +function the_weekday() { + global $wp_locale; + $the_weekday = $wp_locale->get_weekday( mysql2date( 'w', get_post()->post_date, false ) ); + + /** + * Filters the weekday on which the post was written, for display. + * + * @since 0.71 + * + * @param string $the_weekday + */ + echo apply_filters( 'the_weekday', $the_weekday ); +} + +/** + * Display the weekday on which the post was written. + * + * Will only output the weekday if the current post's weekday is different from + * the previous one output. + * + * @since 0.71 + * + * @global WP_Locale $wp_locale + * @global string|int|bool $currentday + * @global string|int|bool $previousweekday + * + * @param string $before Optional Output before the date. + * @param string $after Optional Output after the date. + */ +function the_weekday_date($before='',$after='') { + global $wp_locale, $currentday, $previousweekday; + $the_weekday_date = ''; + if ( $currentday != $previousweekday ) { + $the_weekday_date .= $before; + $the_weekday_date .= $wp_locale->get_weekday( mysql2date( 'w', get_post()->post_date, false ) ); + $the_weekday_date .= $after; + $previousweekday = $currentday; + } + + /** + * Filters the localized date on which the post was written, for display. + * + * @since 0.71 + * + * @param string $the_weekday_date + * @param string $before The HTML to output before the date. + * @param string $after The HTML to output after the date. + */ + $the_weekday_date = apply_filters( 'the_weekday_date', $the_weekday_date, $before, $after ); + echo $the_weekday_date; +} + +/** + * Fire the wp_head action. + * + * See {@see 'wp_head'}. + * + * @since 1.2.0 + */ +function wp_head() { + /** + * Prints scripts or data in the head tag on the front end. + * + * @since 1.5.0 + */ + do_action( 'wp_head' ); +} + +/** + * Fire the wp_footer action. + * + * See {@see 'wp_footer'}. + * + * @since 1.5.1 + */ +function wp_footer() { + /** + * Prints scripts or data before the closing body tag on the front end. + * + * @since 1.5.1 + */ + do_action( 'wp_footer' ); +} + +/** + * Display the links to the general feeds. + * + * @since 2.8.0 + * + * @param array $args Optional arguments. + */ +function feed_links( $args = array() ) { + if ( !current_theme_supports('automatic-feed-links') ) + return; + + $defaults = array( + /* translators: Separator between blog name and feed type in feed links */ + 'separator' => _x('»', 'feed link'), + /* translators: 1: blog title, 2: separator (raquo) */ + 'feedtitle' => __('%1$s %2$s Feed'), + /* translators: 1: blog title, 2: separator (raquo) */ + 'comstitle' => __('%1$s %2$s Comments Feed'), + ); + + $args = wp_parse_args( $args, $defaults ); + + /** + * Filters whether to display the posts feed link. + * + * @since 4.4.0 + * + * @param bool $show Whether to display the posts feed link. Default true. + */ + if ( apply_filters( 'feed_links_show_posts_feed', true ) ) { + echo '\n"; + } + + /** + * Filters whether to display the comments feed link. + * + * @since 4.4.0 + * + * @param bool $show Whether to display the comments feed link. Default true. + */ + if ( apply_filters( 'feed_links_show_comments_feed', true ) ) { + echo '\n"; + } +} + +/** + * Display the links to the extra feeds such as category feeds. + * + * @since 2.8.0 + * + * @param array $args Optional arguments. + */ +function feed_links_extra( $args = array() ) { + $defaults = array( + /* translators: Separator between blog name and feed type in feed links */ + 'separator' => _x('»', 'feed link'), + /* translators: 1: blog name, 2: separator(raquo), 3: post title */ + 'singletitle' => __('%1$s %2$s %3$s Comments Feed'), + /* translators: 1: blog name, 2: separator(raquo), 3: category name */ + 'cattitle' => __('%1$s %2$s %3$s Category Feed'), + /* translators: 1: blog name, 2: separator(raquo), 3: tag name */ + 'tagtitle' => __('%1$s %2$s %3$s Tag Feed'), + /* translators: 1: blog name, 2: separator(raquo), 3: term name, 4: taxonomy singular name */ + 'taxtitle' => __('%1$s %2$s %3$s %4$s Feed'), + /* translators: 1: blog name, 2: separator(raquo), 3: author name */ + 'authortitle' => __('%1$s %2$s Posts by %3$s Feed'), + /* translators: 1: blog name, 2: separator(raquo), 3: search phrase */ + 'searchtitle' => __('%1$s %2$s Search Results for “%3$s” Feed'), + /* translators: 1: blog name, 2: separator(raquo), 3: post type name */ + 'posttypetitle' => __('%1$s %2$s %3$s Feed'), + ); + + $args = wp_parse_args( $args, $defaults ); -function the_date_xml() { - global $post; - echo mysql2date('Y-m-d', $post->post_date); - //echo ""+$post->post_date; -} + if ( is_singular() ) { + $id = 0; + $post = get_post( $id ); + if ( comments_open() || pings_open() || $post->comment_count > 0 ) { + $title = sprintf( $args['singletitle'], get_bloginfo('name'), $args['separator'], the_title_attribute( array( 'echo' => false ) ) ); + $href = get_post_comments_feed_link( $post->ID ); + } + } elseif ( is_post_type_archive() ) { + $post_type = get_query_var( 'post_type' ); + if ( is_array( $post_type ) ) + $post_type = reset( $post_type ); + + $post_type_obj = get_post_type_object( $post_type ); + $title = sprintf( $args['posttypetitle'], get_bloginfo( 'name' ), $args['separator'], $post_type_obj->labels->name ); + $href = get_post_type_archive_feed_link( $post_type_obj->name ); + } elseif ( is_category() ) { + $term = get_queried_object(); + + if ( $term ) { + $title = sprintf( $args['cattitle'], get_bloginfo('name'), $args['separator'], $term->name ); + $href = get_category_feed_link( $term->term_id ); + } + } elseif ( is_tag() ) { + $term = get_queried_object(); -function the_date($d='', $before='', $after='', $echo = true) { - global $id, $post, $day, $previousday; - $the_date = ''; - if ( $day != $previousday ) { - $the_date .= $before; - if ( $d=='' ) - $the_date .= mysql2date(get_option('date_format'), $post->post_date); - else - $the_date .= mysql2date($d, $post->post_date); - $the_date .= $after; - $previousday = $day; + if ( $term ) { + $title = sprintf( $args['tagtitle'], get_bloginfo('name'), $args['separator'], $term->name ); + $href = get_tag_feed_link( $term->term_id ); + } + } elseif ( is_tax() ) { + $term = get_queried_object(); + $tax = get_taxonomy( $term->taxonomy ); + $title = sprintf( $args['taxtitle'], get_bloginfo('name'), $args['separator'], $term->name, $tax->labels->singular_name ); + $href = get_term_feed_link( $term->term_id, $term->taxonomy ); + } elseif ( is_author() ) { + $author_id = intval( get_query_var('author') ); + + $title = sprintf( $args['authortitle'], get_bloginfo('name'), $args['separator'], get_the_author_meta( 'display_name', $author_id ) ); + $href = get_author_feed_link( $author_id ); + } elseif ( is_search() ) { + $title = sprintf( $args['searchtitle'], get_bloginfo('name'), $args['separator'], get_search_query( false ) ); + $href = get_search_feed_link(); + } elseif ( is_post_type_archive() ) { + $title = sprintf( $args['posttypetitle'], get_bloginfo('name'), $args['separator'], post_type_archive_title( '', false ) ); + $post_type_obj = get_queried_object(); + if ( $post_type_obj ) + $href = get_post_type_archive_feed_link( $post_type_obj->name ); } - $the_date = apply_filters('the_date', $the_date, $d, $before, $after); - if ( $echo ) - echo $the_date; - else - return $the_date; -} - -function the_modified_date($d = '') { - echo apply_filters('the_modified_date', get_the_modified_date($d), $d); + if ( isset($title) && isset($href) ) + echo '' . "\n"; } +/** + * Display the link to the Really Simple Discovery service endpoint. + * + * @link http://archipelago.phrasewise.com/rsd + * @since 2.0.0 + */ +function rsd_link() { + echo '' . "\n"; +} -function get_the_modified_date($d = '') { - if ( '' == $d ) - $the_time = get_post_modified_time(get_option('date_format')); - else - $the_time = get_post_modified_time($d); - return apply_filters('get_the_modified_date', $the_time, $d); +/** + * Display the link to the Windows Live Writer manifest file. + * + * @link https://msdn.microsoft.com/en-us/library/bb463265.aspx + * @since 2.3.1 + */ +function wlwmanifest_link() { + echo ' ', "\n"; } +/** + * Displays a noindex meta tag if required by the blog configuration. + * + * If a blog is marked as not being public then the noindex meta tag will be + * output to tell web robots not to index the page content. Add this to the + * {@see 'wp_head'} action. + * + * Typical usage is as a {@see 'wp_head'} callback: + * + * add_action( 'wp_head', 'noindex' ); + * + * @see wp_no_robots + * + * @since 2.1.0 + */ +function noindex() { + // If the blog is not public, tell robots to go away. + if ( '0' == get_option('blog_public') ) + wp_no_robots(); +} -function the_time( $d = '' ) { - echo apply_filters('the_time', get_the_time( $d ), $d); +/** + * Display a noindex meta tag. + * + * Outputs a noindex meta tag that tells web robots not to index the page content. + * Typical usage is as a wp_head callback. add_action( 'wp_head', 'wp_no_robots' ); + * + * @since 3.3.0 + */ +function wp_no_robots() { + echo "\n"; } +/** + * Display site icon meta tags. + * + * @since 4.3.0 + * + * @link https://www.whatwg.org/specs/web-apps/current-work/multipage/links.html#rel-icon HTML5 specification link icon. + */ +function wp_site_icon() { + if ( ! has_site_icon() && ! is_customize_preview() ) { + return; + } -function get_the_time( $d = '' ) { - if ( '' == $d ) - $the_time = get_post_time(get_option('time_format')); - else - $the_time = get_post_time($d); - return apply_filters('get_the_time', $the_time, $d); + $meta_tags = array(); + $icon_32 = get_site_icon_url( 32 ); + if ( empty( $icon_32 ) && is_customize_preview() ) { + $icon_32 = '/favicon.ico'; // Serve default favicon URL in customizer so element can be updated for preview. + } + if ( $icon_32 ) { + $meta_tags[] = sprintf( '', esc_url( $icon_32 ) ); + } + $icon_192 = get_site_icon_url( 192 ); + if ( $icon_192 ) { + $meta_tags[] = sprintf( '', esc_url( $icon_192 ) ); + } + $icon_180 = get_site_icon_url( 180 ); + if ( $icon_180 ) { + $meta_tags[] = sprintf( '', esc_url( $icon_180 ) ); + } + $icon_270 = get_site_icon_url( 270 ); + if ( $icon_270 ) { + $meta_tags[] = sprintf( '', esc_url( $icon_270 ) ); + } + + /** + * Filters the site icon meta tags, so Plugins can add their own. + * + * @since 4.3.0 + * + * @param array $meta_tags Site Icon meta elements. + */ + $meta_tags = apply_filters( 'site_icon_meta_tags', $meta_tags ); + $meta_tags = array_filter( $meta_tags ); + + foreach ( $meta_tags as $meta_tag ) { + echo "$meta_tag\n"; + } } +/** + * Prints resource hints to browsers for pre-fetching, pre-rendering + * and pre-connecting to web sites. + * + * Gives hints to browsers to prefetch specific pages or render them + * in the background, to perform DNS lookups or to begin the connection + * handshake (DNS, TCP, TLS) in the background. + * + * These performance improving indicators work by using ``. + * + * @since 4.6.0 + */ +function wp_resource_hints() { + $hints = array( + 'dns-prefetch' => wp_dependencies_unique_hosts(), + 'preconnect' => array(), + 'prefetch' => array(), + 'prerender' => array(), + ); -function get_post_time( $d = 'U', $gmt = false ) { // returns timestamp - global $post; - if ( $gmt ) - $time = $post->post_date_gmt; - else - $time = $post->post_date; + /* + * Add DNS prefetch for the Emoji CDN. + * The path is removed in the foreach loop below. + */ + /** This filter is documented in wp-includes/formatting.php */ + $hints['dns-prefetch'][] = apply_filters( 'emoji_svg_url', 'https://s.w.org/images/core/emoji/2.2.1/svg/' ); + + foreach ( $hints as $relation_type => $urls ) { + $unique_urls = array(); + + /** + * Filters domains and URLs for resource hints of relation type. + * + * @since 4.6.0 + * + * @param array $urls URLs to print for resource hints. + * @param string $relation_type The relation type the URLs are printed for, e.g. 'preconnect' or 'prerender'. + */ + $urls = apply_filters( 'wp_resource_hints', $urls, $relation_type ); + + foreach ( $urls as $key => $url ) { + $atts = array(); + + if ( is_array( $url ) ) { + if ( isset( $url['href'] ) ) { + $atts = $url; + $url = $url['href']; + } else { + continue; + } + } - $time = mysql2date($d, $time); - return apply_filters('get_the_time', $time, $d, $gmt); -} + $url = esc_url( $url, array( 'http', 'https' ) ); + if ( ! $url ) { + continue; + } -function the_modified_time($d = '') { - echo apply_filters('the_modified_time', get_the_modified_time($d), $d); -} + if ( isset( $unique_urls[ $url ] ) ) { + continue; + } + if ( in_array( $relation_type, array( 'preconnect', 'dns-prefetch' ) ) ) { + $parsed = wp_parse_url( $url ); -function get_the_modified_time($d = '') { - if ( '' == $d ) - $the_time = get_post_modified_time(get_option('time_format')); - else - $the_time = get_post_modified_time($d); - return apply_filters('get_the_modified_time', $the_time, $d); -} + if ( empty( $parsed['host'] ) ) { + continue; + } + if ( 'preconnect' === $relation_type && ! empty( $parsed['scheme'] ) ) { + $url = $parsed['scheme'] . '://' . $parsed['host']; + } else { + // Use protocol-relative URLs for dns-prefetch or if scheme is missing. + $url = '//' . $parsed['host']; + } + } -function get_post_modified_time( $d = 'U', $gmt = false ) { // returns timestamp - global $post; + $atts['rel'] = $relation_type; + $atts['href'] = $url; - if ( $gmt ) - $time = $post->post_modified_gmt; - else - $time = $post->post_modified; - $time = mysql2date($d, $time); + $unique_urls[ $url ] = $atts; + } - return apply_filters('get_the_modified_time', $time, $d, $gmt); -} + foreach ( $unique_urls as $atts ) { + $html = ''; + foreach ( $atts as $attr => $value ) { + if ( ! is_scalar( $value ) || + ( ! in_array( $attr, array( 'as', 'crossorigin', 'href', 'pr', 'rel', 'type' ), true ) && ! is_numeric( $attr )) + ) { + continue; + } -function the_weekday() { - global $wp_locale, $id, $post; - $the_weekday = $wp_locale->get_weekday(mysql2date('w', $post->post_date)); - $the_weekday = apply_filters('the_weekday', $the_weekday); - echo $the_weekday; -} + $value = ( 'href' === $attr ) ? esc_url( $value ) : esc_attr( $value ); + if ( ! is_string( $attr ) ) { + $html .= " $value"; + } else { + $html .= " $attr='$value'"; + } + } -function the_weekday_date($before='',$after='') { - global $wp_locale, $id, $post, $day, $previousweekday; - $the_weekday_date = ''; - if ( $day != $previousweekday ) { - $the_weekday_date .= $before; - $the_weekday_date .= $wp_locale->get_weekday(mysql2date('w', $post->post_date)); - $the_weekday_date .= $after; - $previousweekday = $day; + $html = trim( $html ); + + echo "\n"; + } } - $the_weekday_date = apply_filters('the_weekday_date', $the_weekday_date, $before, $after); - echo $the_weekday_date; } -function wp_head() { - do_action('wp_head'); -} +/** + * Retrieves a list of unique hosts of all enqueued scripts and styles. + * + * @since 4.6.0 + * + * @return array A list of unique hosts of enqueued scripts and styles. + */ +function wp_dependencies_unique_hosts() { + global $wp_scripts, $wp_styles; -function wp_footer() { - do_action('wp_footer'); -} + $unique_hosts = array(); -function rsd_link() { - echo ' \n"; -} + foreach ( array( $wp_scripts, $wp_styles ) as $dependencies ) { + if ( $dependencies instanceof WP_Dependencies && ! empty( $dependencies->queue ) ) { + foreach ( $dependencies->queue as $handle ) { + if ( ! isset( $dependencies->registered[ $handle ] ) ) { + continue; + } -function wlwmanifest_link() { - echo ' '; -} + /* @var _WP_Dependency $dependency */ + $dependency = $dependencies->registered[ $handle ]; + $parsed = wp_parse_url( $dependency->src ); -function noindex() { - // If the blog is not public, tell robots to go away. - if ( '0' == get_option('blog_public') ) - echo "\n"; -} + if ( ! empty( $parsed['host'] ) && ! in_array( $parsed['host'], $unique_hosts ) && $parsed['host'] !== $_SERVER['SERVER_NAME'] ) { + $unique_hosts[] = $parsed['host']; + } + } + } + } -function rich_edit_exists() { - global $wp_rich_edit_exists; - if ( !isset($wp_rich_edit_exists) ) - $wp_rich_edit_exists = file_exists(ABSPATH . WPINC . '/js/tinymce/tiny_mce.js'); - return $wp_rich_edit_exists; + return $unique_hosts; } +/** + * Whether the user can access the visual editor. + * + * Checks if the user can access the visual editor and that it's supported by the user's browser. + * + * @since 2.0.0 + * + * @global bool $wp_rich_edit Whether the user can access the visual editor. + * @global bool $is_gecko Whether the browser is Gecko-based. + * @global bool $is_opera Whether the browser is Opera. + * @global bool $is_safari Whether the browser is Safari. + * @global bool $is_chrome Whether the browser is Chrome. + * @global bool $is_IE Whether the browser is Internet Explorer. + * @global bool $is_edge Whether the browser is Microsoft Edge. + * + * @return bool True if the user can access the visual editor, false otherwise. + */ function user_can_richedit() { - global $wp_rich_edit, $pagenow; - - if ( !isset( $wp_rich_edit) ) { - if ( get_user_option( 'rich_editing' ) == 'true' && - ( ( preg_match( '!AppleWebKit/(\d+)!', $_SERVER['HTTP_USER_AGENT'], $match ) && intval($match[1]) >= 420 ) || - !preg_match( '!opera[ /][2-8]|konqueror|safari!i', $_SERVER['HTTP_USER_AGENT'] ) ) - && 'comment.php' != $pagenow ) { - $wp_rich_edit = true; - } else { - $wp_rich_edit = false; - } - } + global $wp_rich_edit, $is_gecko, $is_opera, $is_safari, $is_chrome, $is_IE, $is_edge; - return apply_filters('user_can_richedit', $wp_rich_edit); -} - -function the_editor($content, $id = 'content', $prev_id = 'title') { - $rows = get_option('default_post_edit_rows'); - if (($rows < 3) || ($rows > 100)) - $rows = 12; - - $rows = "rows='$rows'"; - - if ( user_can_richedit() ) : - add_filter('the_editor_content', 'wp_richedit_pre'); - - // The following line moves the border so that the active button "attaches" to the toolbar. Only IE needs it. - ?> - - - - - -
    - - -
    - - \n"); - $the_editor_content = apply_filters('the_editor_content', $content); - - printf($the_editor, $the_editor_content); - - ?> - - max_num_pages ) ? $wp_query->max_num_pages : 1; + $current = get_query_var( 'paged' ) ? intval( get_query_var( 'paged' ) ) : 1; + + // Append the format placeholder to the base URL. + $pagenum_link = trailingslashit( $url_parts[0] ) . '%_%'; + + // URL base depends on permalink settings. + $format = $wp_rewrite->using_index_permalinks() && ! strpos( $pagenum_link, 'index.php' ) ? 'index.php/' : ''; + $format .= $wp_rewrite->using_permalinks() ? user_trailingslashit( $wp_rewrite->pagination_base . '/%#%', 'paged' ) : '?paged=%#%'; + $defaults = array( - 'base' => '%_%', // http://example.com/all_posts.php%_% : %_% is replaced by format (below) - 'format' => '?page=%#%', // ?page=%#% : %#% is replaced by the page number - 'total' => 1, - 'current' => 0, + 'base' => $pagenum_link, // http://example.com/all_posts.php%_% : %_% is replaced by format (below) + 'format' => $format, // ?page=%#% : %#% is replaced by the page number + 'total' => $total, + 'current' => $current, 'show_all' => false, 'prev_next' => true, 'prev_text' => __('« Previous'), 'next_text' => __('Next »'), - 'end_size' => 1, // How many numbers on either end including the end - 'mid_size' => 2, // How many numbers to either side of current not including current + 'end_size' => 1, + 'mid_size' => 2, 'type' => 'plain', - 'add_args' => false // array of query args to aadd + 'add_args' => array(), // array of query args to add + 'add_fragment' => '', + 'before_page_number' => '', + 'after_page_number' => '' ); $args = wp_parse_args( $args, $defaults ); - extract($args, EXTR_SKIP); + + if ( ! is_array( $args['add_args'] ) ) { + $args['add_args'] = array(); + } + + // Merge additional query vars found in the original URL into 'add_args' array. + if ( isset( $url_parts[1] ) ) { + // Find the format argument. + $format = explode( '?', str_replace( '%_%', $args['format'], $args['base'] ) ); + $format_query = isset( $format[1] ) ? $format[1] : ''; + wp_parse_str( $format_query, $format_args ); + + // Find the query args of the requested URL. + wp_parse_str( $url_parts[1], $url_query_args ); + + // Remove the format argument from the array of query arguments, to avoid overwriting custom format. + foreach ( $format_args as $format_arg => $format_arg_value ) { + unset( $url_query_args[ $format_arg ] ); + } + + $args['add_args'] = array_merge( $args['add_args'], urlencode_deep( $url_query_args ) ); + } // Who knows what else people pass in $args - $total = (int) $total; - if ( $total < 2 ) + $total = (int) $args['total']; + if ( $total < 2 ) { return; - $current = (int) $current; - $end_size = 0 < (int) $end_size ? (int) $end_size : 1; // Out of bounds? Make it the default. - $mid_size = 0 <= (int) $mid_size ? (int) $mid_size : 2; - $add_args = is_array($add_args) ? $add_args : false; + } + $current = (int) $args['current']; + $end_size = (int) $args['end_size']; // Out of bounds? Make it the default. + if ( $end_size < 1 ) { + $end_size = 1; + } + $mid_size = (int) $args['mid_size']; + if ( $mid_size < 0 ) { + $mid_size = 2; + } + $add_args = $args['add_args']; $r = ''; $page_links = array(); - $n = 0; $dots = false; - if ( $prev_next && $current && 1 < $current ) : - $link = str_replace('%_%', 2 == $current ? '' : $format, $base); - $link = str_replace('%#%', $current - 1, $link); + if ( $args['prev_next'] && $current && 1 < $current ) : + $link = str_replace( '%_%', 2 == $current ? '' : $args['format'], $args['base'] ); + $link = str_replace( '%#%', $current - 1, $link ); if ( $add_args ) $link = add_query_arg( $add_args, $link ); - $page_links[] = ""; + $link .= $args['add_fragment']; + + /** + * Filters the paginated links for the given archive pages. + * + * @since 3.0.0 + * + * @param string $link The paginated link URL. + */ + $page_links[] = ''; endif; for ( $n = 1; $n <= $total; $n++ ) : if ( $n == $current ) : - $page_links[] = "$n"; + $page_links[] = "" . $args['before_page_number'] . number_format_i18n( $n ) . $args['after_page_number'] . ""; $dots = true; else : - if ( $show_all || ( $n <= $end_size || ( $current && $n >= $current - $mid_size && $n <= $current + $mid_size ) || $n > $total - $end_size ) ) : - $link = str_replace('%_%', 1 == $n ? '' : $format, $base); - $link = str_replace('%#%', $n, $link); + if ( $args['show_all'] || ( $n <= $end_size || ( $current && $n >= $current - $mid_size && $n <= $current + $mid_size ) || $n > $total - $end_size ) ) : + $link = str_replace( '%_%', 1 == $n ? '' : $args['format'], $args['base'] ); + $link = str_replace( '%#%', $n, $link ); if ( $add_args ) $link = add_query_arg( $add_args, $link ); - $page_links[] = "$n"; + $link .= $args['add_fragment']; + + /** This filter is documented in wp-includes/general-template.php */ + $page_links[] = "" . $args['before_page_number'] . number_format_i18n( $n ) . $args['after_page_number'] . ""; $dots = true; - elseif ( $dots && !$show_all ) : - $page_links[] = "..."; + elseif ( $dots && ! $args['show_all'] ) : + $page_links[] = '' . __( '…' ) . ''; $dots = false; endif; endif; endfor; - if ( $prev_next && $current && ( $current < $total || -1 == $total ) ) : - $link = str_replace('%_%', $format, $base); - $link = str_replace('%#%', $current + 1, $link); + if ( $args['prev_next'] && $current && $current < $total ) : + $link = str_replace( '%_%', $args['format'], $args['base'] ); + $link = str_replace( '%#%', $current + 1, $link ); if ( $add_args ) $link = add_query_arg( $add_args, $link ); - $page_links[] = ""; + $link .= $args['add_fragment']; + + /** This filter is documented in wp-includes/general-template.php */ + $page_links[] = ''; endif; - switch ( $type ) : + switch ( $args['type'] ) { case 'array' : return $page_links; - break; + case 'list' : $r .= "\n"; break; + default : $r = join("\n", $page_links); break; - endswitch; + } return $r; } +/** + * Registers an admin colour scheme css file. + * + * Allows a plugin to register a new admin colour scheme. For example: + * + * wp_admin_css_color( 'classic', __( 'Classic' ), admin_url( "css/colors-classic.css" ), array( + * '#07273E', '#14568A', '#D54E21', '#2683AE' + * ) ); + * + * @since 2.5.0 + * + * @global array $_wp_admin_css_colors + * + * @param string $key The unique key for this theme. + * @param string $name The name of the theme. + * @param string $url The URL of the CSS file containing the color scheme. + * @param array $colors Optional. An array of CSS color definition strings which are used + * to give the user a feel for the theme. + * @param array $icons { + * Optional. CSS color definitions used to color any SVG icons. + * + * @type string $base SVG icon base color. + * @type string $focus SVG icon color on focus. + * @type string $current SVG icon color of current admin menu link. + * } + */ +function wp_admin_css_color( $key, $name, $url, $colors = array(), $icons = array() ) { + global $_wp_admin_css_colors; + + if ( !isset($_wp_admin_css_colors) ) + $_wp_admin_css_colors = array(); + + $_wp_admin_css_colors[$key] = (object) array( + 'name' => $name, + 'url' => $url, + 'colors' => $colors, + 'icon_colors' => $icons, + ); +} + +/** + * Registers the default Admin color schemes + * + * @since 3.0.0 + */ +function register_admin_color_schemes() { + $suffix = is_rtl() ? '-rtl' : ''; + $suffix .= SCRIPT_DEBUG ? '' : '.min'; + + wp_admin_css_color( 'fresh', _x( 'Default', 'admin color scheme' ), + false, + array( '#222', '#333', '#0073aa', '#00a0d2' ), + array( 'base' => '#82878c', 'focus' => '#00a0d2', 'current' => '#fff' ) + ); + + // Other color schemes are not available when running out of src + if ( false !== strpos( get_bloginfo( 'version' ), '-src' ) ) { + return; + } + + wp_admin_css_color( 'light', _x( 'Light', 'admin color scheme' ), + admin_url( "css/colors/light/colors$suffix.css" ), + array( '#e5e5e5', '#999', '#d64e07', '#04a4cc' ), + array( 'base' => '#999', 'focus' => '#ccc', 'current' => '#ccc' ) + ); + + wp_admin_css_color( 'blue', _x( 'Blue', 'admin color scheme' ), + admin_url( "css/colors/blue/colors$suffix.css" ), + array( '#096484', '#4796b3', '#52accc', '#74B6CE' ), + array( 'base' => '#e5f8ff', 'focus' => '#fff', 'current' => '#fff' ) + ); + + wp_admin_css_color( 'midnight', _x( 'Midnight', 'admin color scheme' ), + admin_url( "css/colors/midnight/colors$suffix.css" ), + array( '#25282b', '#363b3f', '#69a8bb', '#e14d43' ), + array( 'base' => '#f1f2f3', 'focus' => '#fff', 'current' => '#fff' ) + ); + + wp_admin_css_color( 'sunrise', _x( 'Sunrise', 'admin color scheme' ), + admin_url( "css/colors/sunrise/colors$suffix.css" ), + array( '#b43c38', '#cf4944', '#dd823b', '#ccaf0b' ), + array( 'base' => '#f3f1f1', 'focus' => '#fff', 'current' => '#fff' ) + ); + + wp_admin_css_color( 'ectoplasm', _x( 'Ectoplasm', 'admin color scheme' ), + admin_url( "css/colors/ectoplasm/colors$suffix.css" ), + array( '#413256', '#523f6d', '#a3b745', '#d46f15' ), + array( 'base' => '#ece6f6', 'focus' => '#fff', 'current' => '#fff' ) + ); + + wp_admin_css_color( 'ocean', _x( 'Ocean', 'admin color scheme' ), + admin_url( "css/colors/ocean/colors$suffix.css" ), + array( '#627c83', '#738e96', '#9ebaa0', '#aa9d88' ), + array( 'base' => '#f2fcff', 'focus' => '#fff', 'current' => '#fff' ) + ); + + wp_admin_css_color( 'coffee', _x( 'Coffee', 'admin color scheme' ), + admin_url( "css/colors/coffee/colors$suffix.css" ), + array( '#46403c', '#59524c', '#c7a589', '#9ea476' ), + array( 'base' => '#f3f2f1', 'focus' => '#fff', 'current' => '#fff' ) + ); + +} + +/** + * Displays the URL of a WordPress admin CSS file. + * + * @see WP_Styles::_css_href and its {@see 'style_loader_src'} filter. + * + * @since 2.3.0 + * + * @param string $file file relative to wp-admin/ without its ".css" extension. + * @return string + */ function wp_admin_css_uri( $file = 'wp-admin' ) { - if ( defined('WP_INSTALLING') ) - { - $_file = add_query_arg( 'version', get_bloginfo( 'version' ), "./$file.css" ); + if ( defined('WP_INSTALLING') ) { + $_file = "./$file.css"; } else { - $_file = add_query_arg( 'version', get_bloginfo( 'version' ), get_option( 'siteurl' ) . "/wp-admin/$file.css" ); + $_file = admin_url("$file.css"); } + $_file = add_query_arg( 'version', get_bloginfo( 'version' ), $_file ); + + /** + * Filters the URI of a WordPress admin CSS file. + * + * @since 2.3.0 + * + * @param string $_file Relative path to the file with query arguments attached. + * @param string $file Relative path to the file, minus its ".css" extension. + */ return apply_filters( 'wp_admin_css_uri', $_file, $file ); } -function wp_admin_css( $file = 'wp-admin' ) { - echo apply_filters( 'wp_admin_css', "\n", $file ); - if ( 'rtl' == get_bloginfo( 'text_direction' ) ) { - $rtl = ( 'wp-admin' == $file ) ? 'rtl' : "$file-rtl"; - echo apply_filters( 'wp_admin_css', "\n", $rtl ); +/** + * Enqueues or directly prints a stylesheet link to the specified CSS file. + * + * "Intelligently" decides to enqueue or to print the CSS file. If the + * {@see 'wp_print_styles'} action has *not* yet been called, the CSS file will be + * enqueued. If the {@see 'wp_print_styles'} action has been called, the CSS link will + * be printed. Printing may be forced by passing true as the $force_echo + * (second) parameter. + * + * For backward compatibility with WordPress 2.3 calling method: If the $file + * (first) parameter does not correspond to a registered CSS file, we assume + * $file is a file relative to wp-admin/ without its ".css" extension. A + * stylesheet link to that generated URL is printed. + * + * @since 2.3.0 + * + * @param string $file Optional. Style handle name or file name (without ".css" extension) relative + * to wp-admin/. Defaults to 'wp-admin'. + * @param bool $force_echo Optional. Force the stylesheet link to be printed rather than enqueued. + */ +function wp_admin_css( $file = 'wp-admin', $force_echo = false ) { + // For backward compatibility + $handle = 0 === strpos( $file, 'css/' ) ? substr( $file, 4 ) : $file; + + if ( wp_styles()->query( $handle ) ) { + if ( $force_echo || did_action( 'wp_print_styles' ) ) // we already printed the style queue. Print this one immediately + wp_print_styles( $handle ); + else // Add to style queue + wp_enqueue_style( $handle ); + return; + } + + /** + * Filters the stylesheet link to the specified CSS file. + * + * If the site is set to display right-to-left, the RTL stylesheet link + * will be used instead. + * + * @since 2.3.0 + * + * @param string $file Style handle name or filename (without ".css" extension) + * relative to wp-admin/. Defaults to 'wp-admin'. + */ + echo apply_filters( 'wp_admin_css', "\n", $file ); + + if ( function_exists( 'is_rtl' ) && is_rtl() ) { + /** This filter is documented in wp-includes/general-template.php */ + echo apply_filters( 'wp_admin_css', "\n", "$file-rtl" ); + } +} + +/** + * Enqueues the default ThickBox js and css. + * + * If any of the settings need to be changed, this can be done with another js + * file similar to media-upload.js. That file should + * require array('thickbox') to ensure it is loaded after. + * + * @since 2.5.0 + */ +function add_thickbox() { + wp_enqueue_script( 'thickbox' ); + wp_enqueue_style( 'thickbox' ); + + if ( is_network_admin() ) + add_action( 'admin_head', '_thickbox_path_admin_subfolder' ); +} + +/** + * Displays the XHTML generator that is generated on the wp_head hook. + * + * See {@see 'wp_head'}. + * + * @since 2.5.0 + */ +function wp_generator() { + /** + * Filters the output of the XHTML generator tag. + * + * @since 2.5.0 + * + * @param string $generator_type The XHTML generator. + */ + the_generator( apply_filters( 'wp_generator_type', 'xhtml' ) ); +} + +/** + * Display the generator XML or Comment for RSS, ATOM, etc. + * + * Returns the correct generator type for the requested output format. Allows + * for a plugin to filter generators overall the {@see 'the_generator'} filter. + * + * @since 2.5.0 + * + * @param string $type The type of generator to output - (html|xhtml|atom|rss2|rdf|comment|export). + */ +function the_generator( $type ) { + /** + * Filters the output of the XHTML generator tag for display. + * + * @since 2.5.0 + * + * @param string $generator_type The generator output. + * @param string $type The type of generator to output. Accepts 'html', + * 'xhtml', 'atom', 'rss2', 'rdf', 'comment', 'export'. + */ + echo apply_filters( 'the_generator', get_the_generator($type), $type ) . "\n"; +} + +/** + * Creates the generator XML or Comment for RSS, ATOM, etc. + * + * Returns the correct generator type for the requested output format. Allows + * for a plugin to filter generators on an individual basis using the + * {@see 'get_the_generator_$type'} filter. + * + * @since 2.5.0 + * + * @param string $type The type of generator to return - (html|xhtml|atom|rss2|rdf|comment|export). + * @return string|void The HTML content for the generator. + */ +function get_the_generator( $type = '' ) { + if ( empty( $type ) ) { + + $current_filter = current_filter(); + if ( empty( $current_filter ) ) + return; + + switch ( $current_filter ) { + case 'rss2_head' : + case 'commentsrss2_head' : + $type = 'rss2'; + break; + case 'rss_head' : + case 'opml_head' : + $type = 'comment'; + break; + case 'rdf_header' : + $type = 'rdf'; + break; + case 'atom_head' : + case 'comments_atom_head' : + case 'app_head' : + $type = 'atom'; + break; + } + } + + switch ( $type ) { + case 'html': + $gen = ''; + break; + case 'xhtml': + $gen = ''; + break; + case 'atom': + $gen = 'WordPress'; + break; + case 'rss2': + $gen = 'https://wordpress.org/?v=' . get_bloginfo_rss( 'version' ) . ''; + break; + case 'rdf': + $gen = ''; + break; + case 'comment': + $gen = ''; + break; + case 'export': + $gen = ''; + break; } + + /** + * Filters the HTML for the retrieved generator type. + * + * The dynamic portion of the hook name, `$type`, refers to the generator type. + * + * @since 2.5.0 + * + * @param string $gen The HTML markup output to wp_head(). + * @param string $type The type of generator. Accepts 'html', 'xhtml', 'atom', + * 'rss2', 'rdf', 'comment', 'export'. + */ + return apply_filters( "get_the_generator_{$type}", $gen, $type ); +} + +/** + * Outputs the html checked attribute. + * + * Compares the first two arguments and if identical marks as checked + * + * @since 1.0.0 + * + * @param mixed $checked One of the values to compare + * @param mixed $current (true) The other value to compare if not just true + * @param bool $echo Whether to echo or just return the string + * @return string html attribute or empty string + */ +function checked( $checked, $current = true, $echo = true ) { + return __checked_selected_helper( $checked, $current, $echo, 'checked' ); +} + +/** + * Outputs the html selected attribute. + * + * Compares the first two arguments and if identical marks as selected + * + * @since 1.0.0 + * + * @param mixed $selected One of the values to compare + * @param mixed $current (true) The other value to compare if not just true + * @param bool $echo Whether to echo or just return the string + * @return string html attribute or empty string + */ +function selected( $selected, $current = true, $echo = true ) { + return __checked_selected_helper( $selected, $current, $echo, 'selected' ); +} + +/** + * Outputs the html disabled attribute. + * + * Compares the first two arguments and if identical marks as disabled + * + * @since 3.0.0 + * + * @param mixed $disabled One of the values to compare + * @param mixed $current (true) The other value to compare if not just true + * @param bool $echo Whether to echo or just return the string + * @return string html attribute or empty string + */ +function disabled( $disabled, $current = true, $echo = true ) { + return __checked_selected_helper( $disabled, $current, $echo, 'disabled' ); +} + +/** + * Private helper function for checked, selected, and disabled. + * + * Compares the first two arguments and if identical marks as $type + * + * @since 2.8.0 + * @access private + * + * @param mixed $helper One of the values to compare + * @param mixed $current (true) The other value to compare if not just true + * @param bool $echo Whether to echo or just return the string + * @param string $type The type of checked|selected|disabled we are doing + * @return string html attribute or empty string + */ +function __checked_selected_helper( $helper, $current, $echo, $type ) { + if ( (string) $helper === (string) $current ) + $result = " $type='$type'"; + else + $result = ''; + + if ( $echo ) + echo $result; + + return $result; } -?> +/** + * Default settings for heartbeat + * + * Outputs the nonce used in the heartbeat XHR + * + * @since 3.6.0 + * + * @param array $settings + * @return array $settings + */ +function wp_heartbeat_settings( $settings ) { + if ( ! is_admin() ) + $settings['ajaxurl'] = admin_url( 'admin-ajax.php', 'relative' ); + + if ( is_user_logged_in() ) + $settings['nonce'] = wp_create_nonce( 'heartbeat-nonce' ); + + return $settings; +}