X-Git-Url: https://scripts.mit.edu/gitweb/autoinstalls/wordpress.git/blobdiff_plain/9e77185fafaf4e60e2b73821e0e4b9b1a11fb85f..refs/tags/wordpress-4.4.1:/wp-includes/functions.php diff --git a/wp-includes/functions.php b/wp-includes/functions.php index 0a8e1a0c..b3781639 100644 --- a/wp-includes/functions.php +++ b/wp-includes/functions.php @@ -78,6 +78,8 @@ function current_time( $type, $gmt = 0 ) { * * @since 0.71 * + * @global WP_Locale $wp_locale + * * @param string $dateformatstring Format to display the date. * @param bool|int $unixtimestamp Optional. Unix timestamp. Default false. * @param bool $gmt Optional. Whether to use GMT timezone. Default false. @@ -100,7 +102,7 @@ function date_i18n( $dateformatstring, $unixtimestamp = false, $gmt = false ) { /* * Store original value for language with untypical grammars. - * See http://core.trac.wordpress.org/ticket/9396 + * See https://core.trac.wordpress.org/ticket/9396 */ $req_format = $dateformatstring; @@ -130,7 +132,7 @@ function date_i18n( $dateformatstring, $unixtimestamp = false, $gmt = false ) { if ( $timezone_string ) { $timezone_object = timezone_open( $timezone_string ); $date_object = date_create( null, $timezone_object ); - foreach( $timezone_formats as $timezone_format ) { + foreach ( $timezone_formats as $timezone_format ) { if ( false !== strpos( $dateformatstring, $timezone_format ) ) { $formatted = date_format( $date_object, $timezone_format ); $dateformatstring = ' '.$dateformatstring; @@ -156,18 +158,71 @@ function date_i18n( $dateformatstring, $unixtimestamp = false, $gmt = false ) { return $j; } +/** + * Determines if the date should be declined. + * + * If the locale specifies that month names require a genitive case in certain + * formats (like 'j F Y'), the month name will be replaced with a correct form. + * + * @since 4.4.0 + * + * @param string $date Formatted date string. + * @return string The date, declined if locale specifies it. + */ +function wp_maybe_decline_date( $date ) { + global $wp_locale; + + // i18n functions are not available in SHORTINIT mode + if ( ! function_exists( '_x' ) ) { + return $date; + } + + /* translators: If months in your language require a genitive case, + * translate this to 'on'. Do not translate into your own language. + */ + if ( 'on' === _x( 'off', 'decline months names: on or off' ) ) { + // Match a format like 'j F Y' or 'j. F' + if ( @preg_match( '#^\d{1,2}\.? \w+#u', $date ) ) { + $months = $wp_locale->month; + + foreach ( $months as $key => $month ) { + $months[ $key ] = '#' . $month . '#'; + } + + $date = preg_replace( $months, $wp_locale->month_genitive, $date ); + } + } + + // Used for locale-specific rules + $locale = get_locale(); + + if ( 'ca' === $locale ) { + // " de abril| de agost| de octubre..." -> " d'abril| d'agost| d'octubre..." + $date = preg_replace( '# de ([ao])#i', " d'\\1", $date ); + } + + return $date; +} + /** * Convert integer number to format based on the locale. * * @since 2.3.0 * + * @global WP_Locale $wp_locale + * * @param int $number The number to convert based on locale. * @param int $decimals Optional. Precision of the number of decimal places. Default 0. * @return string Converted number in string format. */ function number_format_i18n( $number, $decimals = 0 ) { global $wp_locale; - $formatted = number_format( $number, absint( $decimals ), $wp_locale->number_format['decimal_point'], $wp_locale->number_format['thousands_sep'] ); + + if ( isset( $wp_locale ) ) { + $formatted = number_format( $number, absint( $decimals ), $wp_locale->number_format['decimal_point'], $wp_locale->number_format['thousands_sep'] ); + } else { + $formatted = number_format( $number, absint( $decimals ) ); + } /** * Filter the number formatted based on the locale. @@ -182,7 +237,7 @@ function number_format_i18n( $number, $decimals = 0 ) { /** * Convert number of bytes largest unit bytes will fit into. * - * It is easier to read 1kB than 1024 bytes and 1MB than 1048576 bytes. Converts + * It is easier to read 1 kB than 1024 bytes and 1 MB than 1048576 bytes. Converts * number of bytes to human readable number by taking the number of that unit * that the bytes will go into it. Supports TB value. * @@ -197,20 +252,22 @@ function number_format_i18n( $number, $decimals = 0 ) { * * @param int|string $bytes Number of bytes. Note max integer size for integers. * @param int $decimals Optional. Precision of number of decimal places. Default 0. - * @return bool|string False on failure. Number string on success. + * @return string|false False on failure. Number string on success. */ function size_format( $bytes, $decimals = 0 ) { $quant = array( - // ========================= Origin ==== - 'TB' => 1099511627776, // pow( 1024, 4) - 'GB' => 1073741824, // pow( 1024, 3) - 'MB' => 1048576, // pow( 1024, 2) - 'kB' => 1024, // pow( 1024, 1) - 'B ' => 1, // pow( 1024, 0) + 'TB' => TB_IN_BYTES, + 'GB' => GB_IN_BYTES, + 'MB' => MB_IN_BYTES, + 'kB' => KB_IN_BYTES, + 'B' => 1, ); - foreach ( $quant as $unit => $mag ) - if ( doubleval($bytes) >= $mag ) + + foreach ( $quant as $unit => $mag ) { + if ( doubleval( $bytes ) >= $mag ) { return number_format_i18n( $bytes / $mag, $decimals ) . ' ' . $unit; + } + } return false; } @@ -249,8 +306,8 @@ function get_weekstartend( $mysqlstring, $start_of_week = '' ) { // The most recent week start day on or before $day. $start = $day - DAY_IN_SECONDS * ( $weekday - $start_of_week ); - // $start + 7 days - 1 second. - $end = $start + 7 * DAY_IN_SECONDS - 1; + // $start + 1 week - 1 second. + $end = $start + WEEK_IN_SECONDS - 1; return compact( 'start', 'end' ); } @@ -377,7 +434,8 @@ function maybe_serialize( $data ) { return serialize( $data ); // Double serialization is required for backward compatibility. - // See http://core.trac.wordpress.org/ticket/12930 + // See https://core.trac.wordpress.org/ticket/12930 + // Also the world will end. See WP 3.6.1. if ( is_serialized( $data, false ) ) return serialize( $data ); @@ -457,23 +515,23 @@ function xmlrpc_removepostdata( $content ) { */ function wp_extract_urls( $content ) { preg_match_all( - "#(" + "#([\"']?)(" . "(?:([\w-]+:)?//?)" . "[^\s()<>]+" . "[.]" . "(?:" . "\([\w\d]+\)|" . "(?:" - . "[^`!()\[\]{};:'\".,<>?«»ââââ\s]|" + . "[^`!()\[\]{};:'\".,<>«»ââââ\s]|" . "(?:[:]\d+)?/?" . ")+" . ")" - . ")#", + . ")\\1#", $content, $post_links ); - $post_links = array_unique( array_map( 'html_entity_decode', $post_links[0] ) ); + $post_links = array_unique( array_map( 'html_entity_decode', $post_links[2] ) ); return array_values( $post_links ); } @@ -487,10 +545,10 @@ function wp_extract_urls( $content ) { * * @since 1.5.0 * - * @see $wpdb + * @global wpdb $wpdb WordPress database abstraction object. * * @param string $content Post Content. - * @param int $post_ID Post ID. + * @param int $post_ID Post ID. */ function do_enclose( $content, $post_ID ) { global $wpdb; @@ -524,6 +582,19 @@ function do_enclose( $content, $post_ID ) { } } + /** + * Filter the list of enclosure links before querying the database. + * + * Allows for the addition and/or removal of potential enclosures to save + * to postmeta before checking the database for existing enclosures. + * + * @since 4.4.0 + * + * @param array $post_links An array of enclosure links. + * @param int $post_ID Post ID. + */ + $post_links = apply_filters( 'enclosure_links', $post_links, $post_ID ); + foreach ( (array) $post_links as $url ) { if ( $url != '' && !$wpdb->get_var( $wpdb->prepare( "SELECT post_id FROM $wpdb->postmeta WHERE post_id = %d AND meta_key = 'enclosure' AND meta_value LIKE %s", $post_ID, $wpdb->esc_like( $url ) . '%' ) ) ) { @@ -555,62 +626,6 @@ function do_enclose( $content, $post_ID ) { } } -/** - * Perform a HTTP HEAD or GET request. - * - * If $file_path is a writable filename, this will do a GET request and write - * the file to that path. - * - * @since 2.5.0 - * - * @param string $url URL to fetch. - * @param string|bool $file_path Optional. File path to write request to. Default false. - * @param int $red Optional. The number of Redirects followed, Upon 5 being hit, - * returns false. Default 1. - * @return bool|string False on failure and string of headers if HEAD request. - */ -function wp_get_http( $url, $file_path = false, $red = 1 ) { - @set_time_limit( 60 ); - - if ( $red > 5 ) - return false; - - $options = array(); - $options['redirection'] = 5; - - if ( false == $file_path ) - $options['method'] = 'HEAD'; - else - $options['method'] = 'GET'; - - $response = wp_safe_remote_request( $url, $options ); - - if ( is_wp_error( $response ) ) - return false; - - $headers = wp_remote_retrieve_headers( $response ); - $headers['response'] = wp_remote_retrieve_response_code( $response ); - - // WP_HTTP no longer follows redirects for HEAD requests. - if ( 'HEAD' == $options['method'] && in_array($headers['response'], array(301, 302)) && isset( $headers['location'] ) ) { - return wp_get_http( $headers['location'], $file_path, ++$red ); - } - - if ( false == $file_path ) - return $headers; - - // GET request - write it to the supplied filename - $out_fp = fopen($file_path, 'w'); - if ( !$out_fp ) - return $headers; - - fwrite( $out_fp, wp_remote_retrieve_body( $response ) ); - fclose($out_fp); - clearstatcache(); - - return $headers; -} - /** * Retrieve HTTP Headers from URL. * @@ -641,7 +656,7 @@ function wp_get_http_headers( $url, $deprecated = false ) { * @global string $currentday The day of the current post in the loop. * @global string $previousday The day of the previous post in the loop. * - * @return int|bool 1|true when new day, 0|false if not a new day. + * @return int 1 when new day, 0 if not a new day. */ function is_new_day() { global $currentday, $previousday; @@ -700,7 +715,7 @@ function _http_build_query( $data, $prefix = null, $sep = null, $key = '', $urle $k = $key . '%5B' . $k . '%5D'; if ( $v === null ) continue; - elseif ( $v === FALSE ) + elseif ( $v === false ) $v = '0'; if ( is_array($v) || is_object($v) ) @@ -718,22 +733,39 @@ function _http_build_query( $data, $prefix = null, $sep = null, $key = '', $urle } /** - * Retrieve a modified URL query string. + * Retrieves a modified URL query string. + * + * You can rebuild the URL and append query variables to the URL query by using this function. + * There are two ways to use this function; either a single key and value, or an associative array. + * + * Using a single key and value: + * + * add_query_arg( 'key', 'value', 'http://example.com' ); + * + * Using an associative array: * - * You can rebuild the URL and append a new query variable to the URL query by - * using this function. You can also retrieve the full URL with query data. + * add_query_arg( array( + * 'key1' => 'value1', + * 'key2' => 'value2', + * ), 'http://example.com' ); * - * Adding a single key & value or an associative array. Setting a key value to - * an empty string removes the key. Omitting oldquery_or_uri uses the $_SERVER - * value. Additional values provided are expected to be encoded appropriately - * with urlencode() or rawurlencode(). + * Omitting the URL from either use results in the current URL being used + * (the value of `$_SERVER['REQUEST_URI']`). + * + * Values are expected to be encoded appropriately with urlencode() or rawurlencode(). + * + * Setting any query variable's value to boolean false removes the key (see remove_query_arg()). + * + * Important: The return value of add_query_arg() is not escaped by default. Output should be + * late-escaped with esc_url() or similar to help prevent vulnerability to cross-site scripting + * (XSS) attacks. * * @since 1.5.0 * - * @param string|array $param1 Either newkey or an associative_array. - * @param string $param2 Either newvalue or oldquery or URI. - * @param string $param3 Optional. Old query or URI. - * @return string New URL query string. + * @param string|array $key Either a query variable key, or an associative array of query variables. + * @param string $value Optional. Either a query variable value, or a URL to act upon. + * @param string $url Optional. A URL to act upon. + * @return string New URL query string (unescaped). */ function add_query_arg() { $args = func_get_args(); @@ -778,8 +810,9 @@ function add_query_arg() { wp_parse_str( $query, $qs ); $qs = urlencode_deep( $qs ); // this re-URL-encodes things that were already in the query string if ( is_array( $args[0] ) ) { - $kayvees = $args[0]; - $qs = array_merge( $qs, $kayvees ); + foreach ( $args[0] as $k => $v ) { + $qs[ $k ] = $v; + } } else { $qs[ $args[0] ] = $args[1]; } @@ -798,12 +831,12 @@ function add_query_arg() { } /** - * Removes an item or list from the query string. + * Removes an item or items from a query string. * * @since 1.5.0 * * @param string|array $key Query key or keys to remove. - * @param bool $query Optional. When false uses the $_SERVER value. Default false. + * @param bool|string $query Optional. When false uses the current URL. Default false. * @return string New URL query string. */ function remove_query_arg( $key, $query = false ) { @@ -815,6 +848,48 @@ function remove_query_arg( $key, $query = false ) { return add_query_arg( $key, false, $query ); } +/** + * Returns an array of single-use query variable names that can be removed from a URL. + * + * @since 4.4.0 + * + * @return array An array of parameters to remove from the URL. + */ +function wp_removable_query_args() { + $removable_query_args = array( + 'activate', + 'activated', + 'approved', + 'deactivate', + 'deleted', + 'disabled', + 'enabled', + 'error', + 'locked', + 'message', + 'same', + 'saved', + 'settings-updated', + 'skipped', + 'spammed', + 'trashed', + 'unspammed', + 'untrashed', + 'update', + 'updated', + 'wp-post-new-reload', + ); + + /** + * Filter the list of query variables to remove. + * + * @since 4.2.0 + * + * @param array $removable_query_args An array of query variables to remove from a URL. + */ + return apply_filters( 'removable_query_args', $removable_query_args ); +} + /** * Walks the array while sanitizing the contents. * @@ -842,7 +917,7 @@ function add_magic_quotes( $array ) { * @see wp_safe_remote_get() * * @param string $uri URI/URL of web page to retrieve. - * @return bool|string HTTP content. False on failure. + * @return false|string HTTP content. False on failure. */ function wp_remote_fopen( $uri ) { $parsed_url = @parse_url( $uri ); @@ -866,7 +941,11 @@ function wp_remote_fopen( $uri ) { * * @since 2.0.0 * - * @param string $query_vars Default WP_Query arguments. + * @global WP $wp_locale + * @global WP_Query $wp_query + * @global WP_Query $wp_the_query + * + * @param string|array $query_vars Default WP_Query arguments. */ function wp( $query_vars = '' ) { global $wp, $wp_query, $wp_the_query; @@ -881,6 +960,8 @@ function wp( $query_vars = '' ) { * * @since 2.3.0 * + * @global array $wp_header_to_desc + * * @param int $code HTTP status code. * @return string Empty string if not found, or description if found. */ @@ -964,20 +1045,23 @@ function get_status_header_desc( $code ) { * Set HTTP status header. * * @since 2.0.0 + * @since 4.4.0 Added the `$description` parameter. * * @see get_status_header_desc() * - * @param int $code HTTP status code. + * @param int $code HTTP status code. + * @param string $description Optional. A custom description for the HTTP status. */ -function status_header( $code ) { - $description = get_status_header_desc( $code ); +function status_header( $code, $description = '' ) { + if ( ! $description ) { + $description = get_status_header_desc( $code ); + } - if ( empty( $description ) ) + if ( empty( $description ) ) { return; + } - $protocol = $_SERVER['SERVER_PROTOCOL']; - if ( 'HTTP/1.1' != $protocol && 'HTTP/1.0' != $protocol ) - $protocol = 'HTTP/1.0'; + $protocol = wp_get_server_protocol(); $status_header = "$protocol $code $description"; if ( function_exists( 'apply_filters' ) ) @@ -1065,7 +1149,7 @@ function nocache_headers() { } } - foreach( $headers as $name => $field_value ) + foreach ( $headers as $name => $field_value ) @header("{$name}: {$field_value}"); } @@ -1087,7 +1171,7 @@ function cache_javascript_headers() { * * @since 2.0.0 * - * @global wpdb $wpdb WordPress database access abstraction object. + * @global wpdb $wpdb WordPress database abstraction object. * * @return int Number of database queries. */ @@ -1120,7 +1204,7 @@ function bool_from_yn( $yn ) { * * @since 2.1.0 * - * @uses $wp_query Used to tell if the use a comment feed. + * @global WP_Query $wp_query Used to tell if the use a comment feed. */ function do_feed() { global $wp_query; @@ -1133,20 +1217,23 @@ function do_feed() { if ( $feed == '' || $feed == 'feed' ) $feed = get_default_feed(); - $hook = 'do_feed_' . $feed; - if ( ! has_action( $hook ) ) + if ( ! has_action( "do_feed_{$feed}" ) ) { wp_die( __( 'ERROR: This is not a valid feed template.' ), '', array( 'response' => 404 ) ); + } /** * Fires once the given feed is loaded. * - * The dynamic hook name, $hook, refers to the feed name. + * The dynamic portion of the hook name, `$feed`, refers to the feed template name. + * Possible values include: 'rdf', 'rss', 'rss2', and 'atom'. * * @since 2.1.0 + * @since 4.4.0 The `$feed` parameter was added. * - * @param bool $is_comment_feed Whether the feed is a comment feed. + * @param bool $is_comment_feed Whether the feed is a comment feed. + * @param string $feed The feed name. */ - do_action( $hook, $wp_query->is_comment_feed ); + do_action( "do_feed_{$feed}", $wp_query->is_comment_feed, $feed ); } /** @@ -1229,6 +1316,7 @@ function do_robots() { $site_url = parse_url( site_url() ); $path = ( !empty( $site_url['path'] ) ) ? $site_url['path'] : ''; $output .= "Disallow: $path/wp-admin/\n"; + $output .= "Allow: $path/wp-admin/admin-ajax.php\n"; } /** @@ -1253,7 +1341,7 @@ function do_robots() { * * @since 2.1.0 * - * @global wpdb $wpdb WordPress database access abstraction object. + * @global wpdb $wpdb WordPress database abstraction object. * * @return bool Whether the blog is already installed. */ @@ -1268,7 +1356,7 @@ function is_blog_installed() { return true; $suppress = $wpdb->suppress_errors(); - if ( ! defined( 'WP_INSTALLING' ) ) { + if ( ! wp_installing() ) { $alloptions = wp_load_alloptions(); } // If siteurl is not set to autoload, check it specifically @@ -1327,9 +1415,9 @@ function is_blog_installed() { * * @since 2.0.4 * - * @param string $actionurl URL to add nonce action. - * @param string $action Optional. Nonce action name. Default -1. - * @param string $name Optional. Nonce name. Default '_wpnonce'. + * @param string $actionurl URL to add nonce action. + * @param int|string $action Optional. Nonce action name. Default -1. + * @param string $name Optional. Nonce name. Default '_wpnonce'. * @return string Escaped URL with nonce action added. */ function wp_nonce_url( $actionurl, $action = -1, $name = '_wpnonce' ) { @@ -1357,10 +1445,10 @@ function wp_nonce_url( $actionurl, $action = -1, $name = '_wpnonce' ) { * * @since 2.0.4 * - * @param string $action Optional. Action name. Default -1. - * @param string $name Optional. Nonce name. Default '_wpnonce'. - * @param bool $referer Optional. Whether to set the referer field for validation. Default true. - * @param bool $echo Optional. Whether to display or return hidden form field. Default true. + * @param int|string $action Optional. Action name. Default -1. + * @param string $name Optional. Nonce name. Default '_wpnonce'. + * @param bool $referer Optional. Whether to set the referer field for validation. Default true. + * @param bool $echo Optional. Whether to display or return hidden form field. Default true. * @return string Nonce field HTML markup. */ function wp_nonce_field( $action = -1, $name = "_wpnonce", $referer = true , $echo = true ) { @@ -1426,7 +1514,7 @@ function wp_original_referer_field( $echo = true, $jump_back_to = 'current' ) { * * @since 2.0.4 * - * @return string|bool False on failure. Referer URL on success. + * @return false|string False on failure. Referer URL on success. */ function wp_get_referer() { if ( ! function_exists( 'wp_validate_redirect' ) ) @@ -1434,7 +1522,7 @@ function wp_get_referer() { $ref = false; if ( ! empty( $_REQUEST['_wp_http_referer'] ) ) $ref = wp_unslash( $_REQUEST['_wp_http_referer'] ); - else if ( ! empty( $_SERVER['HTTP_REFERER'] ) ) + elseif ( ! empty( $_SERVER['HTTP_REFERER'] ) ) $ref = wp_unslash( $_SERVER['HTTP_REFERER'] ); if ( $ref && $ref !== wp_unslash( $_SERVER['REQUEST_URI'] ) ) @@ -1447,7 +1535,7 @@ function wp_get_referer() { * * @since 2.0.4 * - * @return string|bool False if no original referer or original referer if set. + * @return string|false False if no original referer or original referer if set. */ function wp_get_original_referer() { if ( ! empty( $_REQUEST['_wp_original_http_referer'] ) && function_exists( 'wp_validate_redirect' ) ) @@ -1469,7 +1557,7 @@ function wp_mkdir_p( $target ) { $wrapper = null; // Strip the protocol. - if( wp_is_stream( $target ) ) { + if ( wp_is_stream( $target ) ) { list( $wrapper, $target ) = explode( '://', $target, 2 ); } @@ -1477,7 +1565,7 @@ function wp_mkdir_p( $target ) { $target = str_replace( '//', '/', $target ); // Put the wrapper back on the target. - if( $wrapper !== null ) { + if ( $wrapper !== null ) { $target = $wrapper . '://' . $target; } @@ -1513,7 +1601,7 @@ function wp_mkdir_p( $target ) { */ if ( $dir_perms != ( $dir_perms & ~umask() ) ) { $folder_parts = explode( '/', substr( $target, strlen( $target_parent ) + 1 ) ); - for ( $i = 1; $i <= count( $folder_parts ); $i++ ) { + for ( $i = 1, $c = count( $folder_parts ); $i <= $c; $i++ ) { @chmod( $target_parent . '/' . implode( '/', array_slice( $folder_parts, 0, $i ) ), $dir_perms ); } } @@ -1575,10 +1663,12 @@ function path_join( $base, $path ) { /** * Normalize a filesystem path. * - * Replaces backslashes with forward slashes for Windows systems, and ensures - * no duplicate slashes exist. + * On windows systems, replaces backslashes with forward slashes + * and forces upper-case drive letters. + * Ensures that no duplicate slashes exist. * * @since 3.9.0 + * @since 4.4.0 Ensures upper-case drive letters on Windows systems. * * @param string $path Path to normalize. * @return string Normalized path. @@ -1586,6 +1676,9 @@ function path_join( $base, $path ) { function wp_normalize_path( $path ) { $path = str_replace( '\\', '/', $path ); $path = preg_replace( '|/+|','/', $path ); + if ( ':' === substr( $path, 1, 1 ) ) { + $path = ucfirst( $path ); + } return $path; } @@ -1601,10 +1694,12 @@ function wp_normalize_path( $path ) { * * @since 2.5.0 * + * @staticvar string $temp + * * @return string Writable temporary directory. */ function get_temp_dir() { - static $temp; + static $temp = ''; if ( defined('WP_TEMP_DIR') ) return trailingslashit(WP_TEMP_DIR); @@ -1625,8 +1720,7 @@ function get_temp_dir() { if ( is_dir( $temp ) && wp_is_writable( $temp ) ) return $temp; - $temp = '/tmp/'; - return $temp; + return '/tmp/'; } /** @@ -1667,11 +1761,11 @@ function wp_is_writable( $path ) { */ function win_is_writable( $path ) { - if ( $path[strlen( $path ) - 1] == '/' ) // if it looks like a directory, check a random file within the directory + if ( $path[strlen( $path ) - 1] == '/' ) { // if it looks like a directory, check a random file within the directory return win_is_writable( $path . uniqid( mt_rand() ) . '.tmp'); - else if ( is_dir( $path ) ) // If it's a directory (and not a file) check a random file within the directory + } elseif ( is_dir( $path ) ) { // If it's a directory (and not a file) check a random file within the directory return win_is_writable( $path . '/' . uniqid( mt_rand() ) . '.tmp' ); - + } // check tmp file for read/write capabilities $should_delete_tmp_file = !file_exists( $path ); $f = @fopen( $path, 'a' ); @@ -1850,7 +1944,7 @@ function wp_upload_dir( $time = null ) { * * @param string $dir Directory. * @param string $filename File name. - * @param callback $unique_filename_callback Callback. Default null. + * @param callable $unique_filename_callback Callback. Default null. * @return string New filename, if given wasn't unique. */ function wp_unique_filename( $dir, $filename, $unique_filename_callback = null ) { @@ -1883,18 +1977,19 @@ function wp_unique_filename( $dir, $filename, $unique_filename_callback = null ) // Check for both lower and upper case extension or image sub-sizes may be overwritten. while ( file_exists($dir . "/$filename") || file_exists($dir . "/$filename2") ) { $new_number = $number + 1; - $filename = str_replace( "$number$ext", "$new_number$ext", $filename ); - $filename2 = str_replace( "$number$ext2", "$new_number$ext2", $filename2 ); + $filename = str_replace( array( "-$number$ext", "$number$ext" ), "-$new_number$ext", $filename ); + $filename2 = str_replace( array( "-$number$ext2", "$number$ext2" ), "-$new_number$ext2", $filename2 ); $number = $new_number; } return $filename2; } while ( file_exists( $dir . "/$filename" ) ) { - if ( '' == "$number$ext" ) - $filename = $filename . ++$number . $ext; - else - $filename = str_replace( "$number$ext", ++$number . $ext, $filename ); + if ( '' == "$number$ext" ) { + $filename = "$filename-" . ++$number; + } else { + $filename = str_replace( array( "-$number$ext", "$number$ext" ), "-" . ++$number . $ext, $filename ); + } } } @@ -1918,10 +2013,10 @@ function wp_unique_filename( $dir, $filename, $unique_filename_callback = null ) * * @since 2.0.0 * - * @param string $name Filename. - * @param null $deprecated Never used. Set to null. - * @param mixed $bits File content - * @param string $time Optional. Time formatted in 'yyyy/mm'. Default null. + * @param string $name Filename. + * @param null|string $deprecated Never used. Set to null. + * @param mixed $bits File content + * @param string $time Optional. Time formatted in 'yyyy/mm'. Default null. * @return array */ function wp_upload_bits( $name, $deprecated, $bits, $time = null ) { @@ -1987,7 +2082,8 @@ function wp_upload_bits( $name, $deprecated, $bits, $time = null ) { // Compute the URL $url = $upload['url'] . "/$filename"; - return array( 'file' => $new_file, 'url' => $url, 'error' => false ); + /** This filter is documented in wp-admin/includes/file.php */ + return apply_filters( 'wp_handle_upload', array( 'file' => $new_file, 'url' => $url, 'type' => $wp_filetype['type'], 'error' => false ), 'sideload' ); } /** @@ -1996,8 +2092,7 @@ function wp_upload_bits( $name, $deprecated, $bits, $time = null ) { * @since 2.5.0 * * @param string $ext The extension to search. - * @return string|null The file type, example: audio, video, document, spreadsheet, etc. - * Null if not found. + * @return string|void The file type, example: audio, video, document, spreadsheet, etc. */ function wp_ext2type( $ext ) { $ext = strtolower( $ext ); @@ -2016,7 +2111,7 @@ function wp_ext2type( $ext ) { 'image' => array( 'jpg', 'jpeg', 'jpe', 'gif', 'png', 'bmp', 'tif', 'tiff', 'ico' ), 'audio' => array( 'aac', 'ac3', 'aif', 'aiff', 'm3a', 'm4a', 'm4b', 'mka', 'mp1', 'mp2', 'mp3', 'ogg', 'oga', 'ram', 'wav', 'wma' ), 'video' => array( '3g2', '3gp', '3gpp', 'asf', 'avi', 'divx', 'dv', 'flv', 'm4v', 'mkv', 'mov', 'mp4', 'mpeg', 'mpg', 'mpv', 'ogm', 'ogv', 'qt', 'rm', 'vob', 'wmv' ), - 'document' => array( 'doc', 'docx', 'docm', 'dotm', 'odt', 'pages', 'pdf', 'xps', 'oxps', 'rtf', 'wp', 'wpd' ), + 'document' => array( 'doc', 'docx', 'docm', 'dotm', 'odt', 'pages', 'pdf', 'xps', 'oxps', 'rtf', 'wp', 'wpd', 'psd', 'xcf' ), 'spreadsheet' => array( 'numbers', 'ods', 'xls', 'xlsx', 'xlsm', 'xlsb' ), 'interactive' => array( 'swf', 'key', 'ppt', 'pptx', 'pptm', 'pps', 'ppsx', 'ppsm', 'sldx', 'sldm', 'odp' ), 'text' => array( 'asc', 'csv', 'tsv', 'txt' ), @@ -2027,8 +2122,6 @@ function wp_ext2type( $ext ) { foreach ( $ext2type as $type => $exts ) if ( in_array( $ext, $exts ) ) return $type; - - return null; } /** @@ -2080,7 +2173,6 @@ function wp_check_filetype( $filename, $mimes = null ) { * if original $filename is valid. */ function wp_check_filetype_and_ext( $file, $filename, $mimes = null ) { - $proper_filename = false; // Do basic extension validation and MIME mapping @@ -2153,6 +2245,7 @@ function wp_check_filetype_and_ext( $file, $filename, $mimes = null ) { * Retrieve list of mime types and file extensions. * * @since 3.5.0 + * @since 4.2.0 Support was added for GIMP (xcf) files. * * @return array Array of mime types keyed by the file extension regex corresponding to those types. */ @@ -2174,7 +2267,7 @@ function wp_get_mime_types() { 'gif' => 'image/gif', 'png' => 'image/png', 'bmp' => 'image/bmp', - 'tif|tiff' => 'image/tiff', + 'tiff|tif' => 'image/tiff', 'ico' => 'image/x-icon', // Video formats. 'asf|asx' => 'video/x-ms-asf', @@ -2223,6 +2316,8 @@ function wp_get_mime_types() { 'rar' => 'application/rar', '7z' => 'application/x-7z-compressed', 'exe' => 'application/x-msdownload', + 'psd' => 'application/octet-stream', + 'xcf' => 'application/octet-stream', // MS Office formats. 'doc' => 'application/msword', 'pot|pps|ppt' => 'application/vnd.ms-powerpoint', @@ -2273,8 +2368,6 @@ function wp_get_mime_types() { * * @since 2.8.6 * - * @uses wp_get_upload_mime_types() to fetch the list of mime types - * * @param int|WP_User $user Optional. User to check. Defaults to current user. * @return array Array of mime types keyed by the file extension regex corresponding * to those types. @@ -2313,7 +2406,6 @@ function get_allowed_mime_types( $user = null ) { * @param string $action The nonce action. */ function wp_nonce_ays( $action ) { - $title = __( 'WordPress Failure Notice' ); if ( 'log-out' == $action ) { $html = sprintf( __( 'You are attempting to log out of %s' ), get_bloginfo( 'name' ) ) . '
'; $redirect_to = isset( $_REQUEST['redirect_to'] ) ? $_REQUEST['redirect_to'] : ''; @@ -2324,32 +2416,58 @@ function wp_nonce_ays( $action ) { $html .= "
" . __( 'Please try again.' ) . ""; } - wp_die( $html, $title, array('response' => 403) ); + wp_die( $html, __( 'WordPress Failure Notice' ), 403 ); } /** * Kill WordPress execution and display HTML message with error message. * - * This function complements the die() PHP function. The difference is that + * This function complements the `die()` PHP function. The difference is that * HTML will be displayed to the user. It is recommended to use this function - * only, when the execution should not continue any further. It is not - * recommended to call this function very often and try to handle as many errors - * as possible silently. + * only when the execution should not continue any further. It is not recommended + * to call this function very often, and try to handle as many errors as possible + * silently or more gracefully. * - * @since 2.0.4 + * As a shorthand, the desired HTTP response code may be passed as an integer to + * the `$title` parameter (the default title would apply) or the `$args` parameter. * - * @param string $message Optional. Error message. Default empty. - * @param string $title Optional. Error title. Default empty. - * @param string|array $args Optional. Arguments to control behavior. Default empty array. + * @since 2.0.4 + * @since 4.1.0 The `$title` and `$args` parameters were changed to optionally accept + * an integer to be used as the response code. + * + * @param string|WP_Error $message Optional. Error message. If this is a {@see WP_Error} object, + * the error's messages are used. Default empty. + * @param string|int $title Optional. Error title. If `$message` is a `WP_Error` object, + * error data with the key 'title' may be used to specify the title. + * If `$title` is an integer, then it is treated as the response + * code. Default empty. + * @param string|array|int $args { + * Optional. Arguments to control behavior. If `$args` is an integer, then it is treated + * as the response code. Default empty array. + * + * @type int $response The HTTP response code. Default 500. + * @type bool $back_link Whether to include a link to go back. Default false. + * @type string $text_direction The text direction. This is only useful internally, when WordPress + * is still loading and the site's locale is not set up yet. Accepts 'rtl'. + * Default is the value of {@see is_rtl()}. + * } */ function wp_die( $message = '', $title = '', $args = array() ) { + + if ( is_int( $args ) ) { + $args = array( 'response' => $args ); + } elseif ( is_int( $title ) ) { + $args = array( 'response' => $title ); + $title = ''; + } + if ( defined( 'DOING_AJAX' ) && DOING_AJAX ) { /** * Filter callback for killing WordPress execution for AJAX requests. * * @since 3.4.0 * - * @param callback $function Callback function name. + * @param callable $function Callback function name. */ $function = apply_filters( 'wp_die_ajax_handler', '_ajax_wp_die_handler' ); } elseif ( defined( 'XMLRPC_REQUEST' ) && XMLRPC_REQUEST ) { @@ -2358,7 +2476,7 @@ function wp_die( $message = '', $title = '', $args = array() ) { * * @since 3.4.0 * - * @param callback $function Callback function name. + * @param callable $function Callback function name. */ $function = apply_filters( 'wp_die_xmlrpc_handler', '_xmlrpc_wp_die_handler' ); } else { @@ -2367,7 +2485,7 @@ function wp_die( $message = '', $title = '', $args = array() ) { * * @since 3.0.0 * - * @param callback $function Callback function name. + * @param callable $function Callback function name. */ $function = apply_filters( 'wp_die_handler', '_default_wp_die_handler' ); } @@ -2443,6 +2561,7 @@ function _default_wp_die_handler( $message, $title = '', $args = array() ) { >
+__construct()' ) ); + } else { + trigger_error( sprintf( 'The called constructor method for %1$s is deprecated since version %2$s! Use %3$s instead.', $class, $version, '
__construct()' ) ); + } + } + +} + /** * Mark a file as deprecated and inform when it has been used. * @@ -3273,11 +3692,11 @@ function _deprecated_file( $file, $version, $replacement = null, $message = '' ) * Before this function is called, the argument must be checked for whether it was * used by comparing it to its default value or evaluating whether it is empty. * For example: - *
- * if ( ! empty( $deprecated ) ) {
- * _deprecated_argument( __FUNCTION__, '3.0' );
- * }
- *
+ *
+ * if ( ! empty( $deprecated ) ) {
+ * _deprecated_argument( __FUNCTION__, '3.0' );
+ * }
+ *
*
* There is a hook deprecated_argument_run that will be called that can be used
* to get the backtrace up to what file and function used the deprecated
@@ -3366,11 +3785,16 @@ function _doing_it_wrong( $function, $message, $version ) {
if ( WP_DEBUG && apply_filters( 'doing_it_wrong_trigger_error', true ) ) {
if ( function_exists( '__' ) ) {
$version = is_null( $version ) ? '' : sprintf( __( '(This message was added in version %s.)' ), $version );
- $message .= ' ' . __( 'Please see Debugging in WordPress for more information.' );
+ /* translators: %s: Codex URL */
+ $message .= ' ' . sprintf( __( 'Please see Debugging in WordPress for more information.' ),
+ __( 'https://codex.wordpress.org/Debugging_in_WordPress' )
+ );
trigger_error( sprintf( __( '%1$s was called incorrectly. %2$s %3$s' ), $function, $message, $version ) );
} else {
$version = is_null( $version ) ? '' : sprintf( '(This message was added in version %s.)', $version );
- $message .= ' Please see Debugging in WordPress for more information.';
+ $message .= sprintf( ' Please see Debugging in WordPress for more information.',
+ 'https://codex.wordpress.org/Debugging_in_WordPress'
+ );
trigger_error( sprintf( '%1$s was called incorrectly. %2$s %3$s', $function, $message, $version ) );
}
}
@@ -3394,6 +3818,8 @@ function is_lighttpd_before_150() {
*
* @since 2.5.0
*
+ * @global bool $is_apache
+ *
* @param string $mod The module, e.g. mod_rewrite.
* @param bool $default Optional. The default return value if the module is not found. Default false.
* @return bool Whether the specified module is loaded.
@@ -3423,6 +3849,8 @@ function apache_mod_loaded($mod, $default = false) {
*
* @since 2.8.0
*
+ * @global bool $is_iis7
+ *
* @return bool Whether IIS7 supports permalinks.
*/
function iis7_supports_permalinks() {
@@ -3439,7 +3867,7 @@ function iis7_supports_permalinks() {
* Lastly we make sure that PHP is running via FastCGI. This is important because if it runs
* via ISAPI then pretty permalinks will not work.
*/
- $supports_permalinks = class_exists('DOMDocument') && isset($_SERVER['IIS_UrlRewriteModule']) && ( php_sapi_name() == 'cgi-fcgi' );
+ $supports_permalinks = class_exists( 'DOMDocument', false ) && isset($_SERVER['IIS_UrlRewriteModule']) && ( PHP_SAPI == 'cgi-fcgi' );
}
/**
@@ -3463,7 +3891,7 @@ function iis7_supports_permalinks() {
* @since 1.2.0
*
* @param string $file File path.
- * @param array $allowed_files List of allowed files.
+ * @param array $allowed_files List of allowed files.
* @return int 0 means nothing is wrong, greater than 0 means something was wrong.
*/
function validate_file( $file, $allowed_files = '' ) {
@@ -3501,25 +3929,13 @@ function is_ssl() {
return false;
}
-/**
- * Whether SSL login should be forced.
- *
- * @since 2.6.0
- *
- * @see force_ssl_admin()
- *
- * @param string|bool $force Optional Whether to force SSL login. Default null.
- * @return bool True if forced, false if not forced.
- */
-function force_ssl_login( $force = null ) {
- return force_ssl_admin( $force );
-}
-
/**
* Whether to force SSL used for the Administration Screens.
*
* @since 2.6.0
*
+ * @staticvar bool $forced
+ *
* @param string|bool $force Optional. Whether to force SSL in admin screens. Default null.
* @return bool True if forced, false if not forced.
*/
@@ -3565,7 +3981,7 @@ function wp_guess_url() {
if ( false !== strpos( $_SERVER['SCRIPT_FILENAME'], $abspath_fix ) ) {
// Request is hitting a file inside ABSPATH
$directory = str_replace( ABSPATH, '', $script_filename_dir );
- // Strip off the sub directory, and any file/query paramss
+ // Strip off the sub directory, and any file/query params
$path = preg_replace( '#/' . preg_quote( $directory, '#' ) . '/[^/]*$#i', '' , $_SERVER['REQUEST_URI'] );
} elseif ( false !== strpos( $abspath_fix, $script_filename_dir ) ) {
// Request is hitting a file above ABSPATH
@@ -3596,6 +4012,8 @@ function wp_guess_url() {
*
* @since 3.3.0
*
+ * @staticvar bool $_suspend
+ *
* @param bool $suspend Optional. Suspends additions if true, re-enables them if false.
* @return bool The current suspend setting
*/
@@ -3617,6 +4035,8 @@ function wp_suspend_cache_addition( $suspend = null ) {
*
* @since 2.7.0
*
+ * @global bool $_wp_suspend_cache_invalidation
+ *
* @param bool $suspend Optional. Whether to suspend or enable cache invalidation. Default true.
* @return bool The current suspend setting.
*/
@@ -3633,6 +4053,8 @@ function wp_suspend_cache_invalidation( $suspend = true ) {
*
* @since 3.0.0
*
+ * @global object $current_site
+ *
* @param int $site_id Optional. Site ID to test. Defaults to current site.
* Defaults to current site.
* @return bool True if $site_id is the main site of the network, or if not
@@ -3660,32 +4082,59 @@ function is_main_site( $site_id = null ) {
* @return bool True if $network_id is the main network, or if not running Multisite.
*/
function is_main_network( $network_id = null ) {
- global $wpdb;
-
- if ( ! is_multisite() )
+ if ( ! is_multisite() ) {
return true;
+ }
$current_network_id = (int) get_current_site()->id;
- if ( ! $network_id )
+ if ( null === $network_id ) {
$network_id = $current_network_id;
+ }
+
$network_id = (int) $network_id;
- if ( defined( 'PRIMARY_NETWORK_ID' ) )
- return $network_id === (int) PRIMARY_NETWORK_ID;
+ return ( $network_id === get_main_network_id() );
+}
- if ( 1 === $current_network_id )
- return $network_id === $current_network_id;
+/**
+ * Get the main network ID.
+ *
+ * @since 4.3.0
+ *
+ * @global wpdb $wpdb WordPress database abstraction object.
+ *
+ * @return int The ID of the main network.
+ */
+function get_main_network_id() {
+ global $wpdb;
- $primary_network_id = (int) wp_cache_get( 'primary_network_id', 'site-options' );
+ if ( ! is_multisite() ) {
+ return 1;
+ }
- if ( $primary_network_id )
- return $network_id === $primary_network_id;
+ if ( defined( 'PRIMARY_NETWORK_ID' ) ) {
+ $main_network_id = PRIMARY_NETWORK_ID;
+ } elseif ( 1 === (int) get_current_site()->id ) {
+ // If the current network has an ID of 1, assume it is the main network.
+ $main_network_id = 1;
+ } else {
+ $main_network_id = wp_cache_get( 'primary_network_id', 'site-options' );
- $primary_network_id = (int) $wpdb->get_var( "SELECT id FROM $wpdb->site ORDER BY id LIMIT 1" );
- wp_cache_add( 'primary_network_id', $primary_network_id, 'site-options' );
+ if ( false === $main_network_id ) {
+ $main_network_id = (int) $wpdb->get_var( "SELECT id FROM {$wpdb->site} ORDER BY id LIMIT 1" );
+ wp_cache_add( 'primary_network_id', $main_network_id, 'site-options' );
+ }
+ }
- return $network_id === $primary_network_id;
+ /**
+ * Filter the main network ID.
+ *
+ * @since 4.3.0
+ *
+ * @param int $main_network_id The ID of the main network.
+ */
+ return (int) apply_filters( 'get_main_network_id', $main_network_id );
}
/**
@@ -3693,6 +4142,8 @@ function is_main_network( $network_id = null ) {
*
* @since 3.0.0
*
+ * @staticvar bool $global_terms
+ *
* @return bool True if multisite and global terms enabled.
*/
function global_terms_enabled() {
@@ -3710,7 +4161,7 @@ function global_terms_enabled() {
*
* @since 3.0.0
*
- * @param null $anbled Whether global terms are enabled.
+ * @param null $enabled Whether global terms are enabled.
*/
$filter = apply_filters( 'global_terms_enabled', null );
if ( ! is_null( $filter ) )
@@ -3728,7 +4179,7 @@ function global_terms_enabled() {
*
* @since 2.8.0
*
- * @return float|bool Timezone GMT offset, false otherwise.
+ * @return float|false Timezone GMT offset, false otherwise.
*/
function wp_timezone_override_offset() {
if ( !$timezone_string = get_option( 'timezone_string' ) ) {
@@ -3796,6 +4247,8 @@ function _wp_timezone_choice_usort_callback( $a, $b ) {
*
* @since 2.9.0
*
+ * @staticvar bool $mo_loaded
+ *
* @param string $selected_zone Selected timezone.
* @return string
*/
@@ -3926,7 +4379,7 @@ function wp_timezone_choice( $selected_zone ) {
* @since 2.8.0
* @access private
*
- * @see http://core.trac.wordpress.org/ticket/8497
+ * @see https://core.trac.wordpress.org/ticket/8497
*
* @param string $str Header comment to clean up.
* @return string
@@ -3936,10 +4389,14 @@ function _cleanup_header_comment( $str ) {
}
/**
- * Permanently delete posts, pages, attachments, and comments which have been
- * in the trash for EMPTY_TRASH_DAYS.
+ * Permanently delete comments or posts of any type that have held a status
+ * of 'trash' for the number of days defined in EMPTY_TRASH_DAYS.
+ *
+ * The default value of `EMPTY_TRASH_DAYS` is 30 (days).
*
* @since 2.9.0
+ *
+ * @global wpdb $wpdb WordPress database abstraction object.
*/
function wp_scheduled_delete() {
global $wpdb;
@@ -3976,7 +4433,7 @@ function wp_scheduled_delete() {
delete_comment_meta($comment_id, '_wp_trash_meta_time');
delete_comment_meta($comment_id, '_wp_trash_meta_status');
} else {
- wp_delete_comment($comment_id);
+ wp_delete_comment( $del_comment );
}
}
}
@@ -3991,13 +4448,15 @@ function wp_scheduled_delete() {
* If the file data is not within that first 8kiB, then the author should correct
* their plugin file and move the data headers to the top.
*
- * @see http://codex.wordpress.org/File_Header
+ * @link https://codex.wordpress.org/File_Header
*
* @since 2.9.0
+ *
* @param string $file Path to the file.
* @param array $default_headers List of headers, in the format array('HeaderKey' => 'Header Name').
* @param string $context Optional. If specified adds filter hook "extra_{$context}_headers".
* Default empty.
+ * @return array Array of file headers in `HeaderKey => Header Value` format.
*/
function get_file_data( $file, $default_headers, $context = '' ) {
// We don't need to write to the file, so just open for reading.
@@ -4015,8 +4474,8 @@ function get_file_data( $file, $default_headers, $context = '' ) {
/**
* Filter extra file headers by context.
*
- * The dynamic portion of the hook name, $context, refers to the context
- * where extra headers might be loaded.
+ * The dynamic portion of the hook name, `$context`, refers to
+ * the context where extra headers might be loaded.
*
* @since 2.9.0
*
@@ -4048,7 +4507,7 @@ function get_file_data( $file, $default_headers, $context = '' ) {
*
* @see __return_false()
*
- * @return bool True.
+ * @return true True.
*/
function __return_true() {
return true;
@@ -4063,7 +4522,7 @@ function __return_true() {
*
* @see __return_true()
*
- * @return bool False.
+ * @return false False.
*/
function __return_false() {
return false;
@@ -4138,7 +4597,7 @@ function send_nosniff_header() {
/**
* Return a MySQL expression for selecting the week number based on the start_of_week option.
*
- * @internal
+ * @ignore
* @since 3.0.0
*
* @param string $column Database column.
@@ -4166,7 +4625,7 @@ function _wp_mysql_week( $column ) {
* @since 3.1.0
* @access private
*
- * @param callback $callback Function that accepts ( ID, $callback_args ) and outputs parent_ID.
+ * @param callable $callback Function that accepts ( ID, $callback_args ) and outputs parent_ID.
* @param int $start The ID to start the loop check at.
* @param int $start_parent The parent_ID of $start to use instead of calling $callback( $start ).
* Use null to always use $callback
@@ -4191,7 +4650,7 @@ function wp_find_hierarchy_loop( $callback, $start, $start_parent, $callback_arg
* @since 3.1.0
* @access private
*
- * @param callback $callback Function that accepts ( ID, callback_arg, ... ) and outputs parent_ID.
+ * @param callable $callback Function that accepts ( ID, callback_arg, ... ) and outputs parent_ID.
* @param int $start The ID to start the loop check at.
* @param array $override Optional. An array of ( ID => parent_ID, ... ) to use instead of $callback.
* Default empty array.
@@ -4244,17 +4703,22 @@ function send_frame_options_header() {
* Retrieve a list of protocols to allow in HTML attributes.
*
* @since 3.3.0
+ * @since 4.3.0 Added 'webcal' to the protocols array.
*
* @see wp_kses()
* @see esc_url()
*
- * @return array Array of allowed protocols.
+ * @staticvar array $protocols
+ *
+ * @return array Array of allowed protocols. Defaults to an array containing 'http', 'https',
+ * 'ftp', 'ftps', 'mailto', 'news', 'irc', 'gopher', 'nntp', 'feed', 'telnet',
+ * 'mms', 'rtsp', 'svn', 'tel', 'fax', 'xmpp', and 'webcal'.
*/
function wp_allowed_protocols() {
- static $protocols;
+ static $protocols = array();
if ( empty( $protocols ) ) {
- $protocols = array( 'http', 'https', 'ftp', 'ftps', 'mailto', 'news', 'irc', 'gopher', 'nntp', 'feed', 'telnet', 'mms', 'rtsp', 'svn', 'tel', 'fax', 'xmpp' );
+ $protocols = array( 'http', 'https', 'ftp', 'ftps', 'mailto', 'news', 'irc', 'gopher', 'nntp', 'feed', 'telnet', 'mms', 'rtsp', 'svn', 'tel', 'fax', 'xmpp', 'webcal' );
/**
* Filter the list of protocols allowed in HTML attributes.
@@ -4275,7 +4739,7 @@ function wp_allowed_protocols() {
*
* @since 3.4.0
*
- * @see http://core.trac.wordpress.org/ticket/19589
+ * @see https://core.trac.wordpress.org/ticket/19589
*
* @param string $ignore_class Optional. A class to ignore all function calls within - useful
* when you want to just give info about the callee. Default null.
@@ -4349,7 +4813,7 @@ function _get_non_cached_ids( $object_ids, $cache_key ) {
* @since 3.4.0
* @access private
*
- * @return bool true|false Whether the device is able to upload files.
+ * @return bool Whether the device is able to upload files.
*/
function _device_can_upload() {
if ( ! wp_is_mobile() )
@@ -4498,9 +4962,10 @@ function wp_auth_check_html() {
*
* @since 3.6.0
*
- * @param array|object $response The Heartbeat response object or array.
- * @return array|object $response The Heartbeat response object or array with 'wp-auth-check'
- * value set.
+ * @global int $login_grace_period
+ *
+ * @param array $response The Heartbeat response.
+ * @return array $response The Heartbeat response with 'wp-auth-check' value set.
*/
function wp_auth_check( $response ) {
$response['wp-auth-check'] = is_user_logged_in() && empty( $GLOBALS['login_grace_period'] );
@@ -4536,7 +5001,7 @@ function get_tag_regex( $tag ) {
* @since 3.6.0
* @access private
*
- * @see http://core.trac.wordpress.org/ticket/23688
+ * @see https://core.trac.wordpress.org/ticket/23688
*
* @param string $charset A charset name.
* @return string The canonical form of the charset.
@@ -4573,6 +5038,9 @@ function _canonical_charset( $charset ) {
*
* @see reset_mbstring_encoding()
*
+ * @staticvar array $encodings
+ * @staticvar bool $overloaded
+ *
* @param bool $reset Optional. Whether to reset the encoding back to a previously-set encoding.
* Default false.
*/
@@ -4610,7 +5078,9 @@ function reset_mbstring_encoding() {
}
/**
- * Alternative to filter_var( $var, FILTER_VALIDATE_BOOLEAN ).
+ * Filter/validate a variable as a boolean.
+ *
+ * Alternative to `filter_var( $var, FILTER_VALIDATE_BOOLEAN )`.
*
* @since 4.0.0
*
@@ -4622,9 +5092,82 @@ function wp_validate_boolean( $var ) {
return $var;
}
- if ( 'false' === $var ) {
+ if ( is_string( $var ) && 'false' === strtolower( $var ) ) {
return false;
}
return (bool) $var;
}
+
+/**
+ * Delete a file
+ *
+ * @since 4.2.0
+ *
+ * @param string $file The path to the file to delete.
+ */
+function wp_delete_file( $file ) {
+ /**
+ * Filter the path of the file to delete.
+ *
+ * @since 2.1.0
+ *
+ * @param string $medium Path to the file to delete.
+ */
+ $delete = apply_filters( 'wp_delete_file', $file );
+ if ( ! empty( $delete ) ) {
+ @unlink( $delete );
+ }
+}
+
+/**
+ * Outputs a small JS snippet on preview tabs/windows to remove `window.name` on unload.
+ *
+ * This prevents reusing the same tab for a preview when the user has navigated away.
+ *
+ * @since 4.3.0
+ */
+function wp_post_preview_js() {
+ global $post;
+
+ if ( ! is_preview() || empty( $post ) ) {
+ return;
+ }
+
+ // Has to match the window name used in post_submit_meta_box()
+ $name = 'wp-preview-' . (int) $post->ID;
+
+ ?>
+
+