/wp-includes/functions.php
PHP | 8373 lines | 4871 code | 714 blank | 2788 comment | 653 complexity | f866d284c4d9204f45a98bdff8f35f6e MD5 | raw file
Possible License(s): GPL-2.0, AGPL-1.0, LGPL-2.1
Large files files are truncated, but you can click here to view the full file
- <?php
- /**
- * Main WordPress API
- *
- * @package WordPress
- */
- require ABSPATH . WPINC . '/option.php';
- /**
- * Convert given MySQL date string into a different format.
- *
- * - `$format` should be a PHP date format string.
- * - 'U' and 'G' formats will return an integer sum of timestamp with timezone offset.
- * - `$date` is expected to be local time in MySQL format (`Y-m-d H:i:s`).
- *
- * Historically UTC time could be passed to the function to produce Unix timestamp.
- *
- * If `$translate` is true then the given date and format string will
- * be passed to `wp_date()` for translation.
- *
- * @since 0.71
- *
- * @param string $format Format of the date to return.
- * @param string $date Date string to convert.
- * @param bool $translate Whether the return date should be translated. Default true.
- * @return string|int|false Integer if `$format` is 'U' or 'G', string otherwise.
- * False on failure.
- */
- function mysql2date( $format, $date, $translate = true ) {
- if ( empty( $date ) ) {
- return false;
- }
- $datetime = date_create( $date, wp_timezone() );
- if ( false === $datetime ) {
- return false;
- }
- // Returns a sum of timestamp with timezone offset. Ideally should never be used.
- if ( 'G' === $format || 'U' === $format ) {
- return $datetime->getTimestamp() + $datetime->getOffset();
- }
- if ( $translate ) {
- return wp_date( $format, $datetime->getTimestamp() );
- }
- return $datetime->format( $format );
- }
- /**
- * Retrieves the current time based on specified type.
- *
- * - The 'mysql' type will return the time in the format for MySQL DATETIME field.
- * - The 'timestamp' or 'U' types will return the current timestamp or a sum of timestamp
- * and timezone offset, depending on `$gmt`.
- * - Other strings will be interpreted as PHP date formats (e.g. 'Y-m-d').
- *
- * If `$gmt` is a truthy value then both types will use GMT time, otherwise the
- * output is adjusted with the GMT offset for the site.
- *
- * @since 1.0.0
- * @since 5.3.0 Now returns an integer if `$type` is 'U'. Previously a string was returned.
- *
- * @param string $type Type of time to retrieve. Accepts 'mysql', 'timestamp', 'U',
- * or PHP date format string (e.g. 'Y-m-d').
- * @param int|bool $gmt Optional. Whether to use GMT timezone. Default false.
- * @return int|string Integer if `$type` is 'timestamp' or 'U', string otherwise.
- */
- function current_time( $type, $gmt = 0 ) {
- // Don't use non-GMT timestamp, unless you know the difference and really need to.
- if ( 'timestamp' === $type || 'U' === $type ) {
- return $gmt ? time() : time() + (int) ( get_option( 'gmt_offset' ) * HOUR_IN_SECONDS );
- }
- if ( 'mysql' === $type ) {
- $type = 'Y-m-d H:i:s';
- }
- $timezone = $gmt ? new DateTimeZone( 'UTC' ) : wp_timezone();
- $datetime = new DateTime( 'now', $timezone );
- return $datetime->format( $type );
- }
- /**
- * Retrieves the current time as an object using the site's timezone.
- *
- * @since 5.3.0
- *
- * @return DateTimeImmutable Date and time object.
- */
- function current_datetime() {
- return new DateTimeImmutable( 'now', wp_timezone() );
- }
- /**
- * Retrieves the timezone of the site as a string.
- *
- * Uses the `timezone_string` option to get a proper timezone name if available,
- * otherwise falls back to a manual UTC ± offset.
- *
- * Example return values:
- *
- * - 'Europe/Rome'
- * - 'America/North_Dakota/New_Salem'
- * - 'UTC'
- * - '-06:30'
- * - '+00:00'
- * - '+08:45'
- *
- * @since 5.3.0
- *
- * @return string PHP timezone name or a ±HH:MM offset.
- */
- function wp_timezone_string() {
- $timezone_string = get_option( 'timezone_string' );
- if ( $timezone_string ) {
- return $timezone_string;
- }
- $offset = (float) get_option( 'gmt_offset' );
- $hours = (int) $offset;
- $minutes = ( $offset - $hours );
- $sign = ( $offset < 0 ) ? '-' : '+';
- $abs_hour = abs( $hours );
- $abs_mins = abs( $minutes * 60 );
- $tz_offset = sprintf( '%s%02d:%02d', $sign, $abs_hour, $abs_mins );
- return $tz_offset;
- }
- /**
- * Retrieves the timezone of the site as a `DateTimeZone` object.
- *
- * Timezone can be based on a PHP timezone string or a ±HH:MM offset.
- *
- * @since 5.3.0
- *
- * @return DateTimeZone Timezone object.
- */
- function wp_timezone() {
- return new DateTimeZone( wp_timezone_string() );
- }
- /**
- * Retrieves the date in localized format, based on a sum of Unix timestamp and
- * timezone offset in seconds.
- *
- * If the locale specifies the locale month and weekday, then the locale will
- * take over the format for the date. If it isn't, then the date format string
- * will be used instead.
- *
- * Note that due to the way WP typically generates a sum of timestamp and offset
- * with `strtotime()`, it implies offset added at a _current_ time, not at the time
- * the timestamp represents. Storing such timestamps or calculating them differently
- * will lead to invalid output.
- *
- * @since 0.71
- * @since 5.3.0 Converted into a wrapper for wp_date().
- *
- * @global WP_Locale $wp_locale WordPress date and time locale object.
- *
- * @param string $format Format to display the date.
- * @param int|bool $timestamp_with_offset Optional. A sum of Unix timestamp and timezone offset
- * in seconds. Default false.
- * @param bool $gmt Optional. Whether to use GMT timezone. Only applies
- * if timestamp is not provided. Default false.
- * @return string The date, translated if locale specifies it.
- */
- function date_i18n( $format, $timestamp_with_offset = false, $gmt = false ) {
- $timestamp = $timestamp_with_offset;
- // If timestamp is omitted it should be current time (summed with offset, unless `$gmt` is true).
- if ( ! is_numeric( $timestamp ) ) {
- // phpcs:ignore WordPress.DateTime.CurrentTimeTimestamp.Requested
- $timestamp = current_time( 'timestamp', $gmt );
- }
- /*
- * This is a legacy implementation quirk that the returned timestamp is also with offset.
- * Ideally this function should never be used to produce a timestamp.
- */
- if ( 'U' === $format ) {
- $date = $timestamp;
- } elseif ( $gmt && false === $timestamp_with_offset ) { // Current time in UTC.
- $date = wp_date( $format, null, new DateTimeZone( 'UTC' ) );
- } elseif ( false === $timestamp_with_offset ) { // Current time in site's timezone.
- $date = wp_date( $format );
- } else {
- /*
- * Timestamp with offset is typically produced by a UTC `strtotime()` call on an input without timezone.
- * This is the best attempt to reverse that operation into a local time to use.
- */
- $local_time = gmdate( 'Y-m-d H:i:s', $timestamp );
- $timezone = wp_timezone();
- $datetime = date_create( $local_time, $timezone );
- $date = wp_date( $format, $datetime->getTimestamp(), $timezone );
- }
- /**
- * Filters the date formatted based on the locale.
- *
- * @since 2.8.0
- *
- * @param string $date Formatted date string.
- * @param string $format Format to display the date.
- * @param int $timestamp A sum of Unix timestamp and timezone offset in seconds.
- * Might be without offset if input omitted timestamp but requested GMT.
- * @param bool $gmt Whether to use GMT timezone. Only applies if timestamp was not provided.
- * Default false.
- */
- $date = apply_filters( 'date_i18n', $date, $format, $timestamp, $gmt );
- return $date;
- }
- /**
- * Retrieves the date, in localized format.
- *
- * This is a newer function, intended to replace `date_i18n()` without legacy quirks in it.
- *
- * Note that, unlike `date_i18n()`, this function accepts a true Unix timestamp, not summed
- * with timezone offset.
- *
- * @since 5.3.0
- *
- * @global WP_Locale $wp_locale WordPress date and time locale object.
- *
- * @param string $format PHP date format.
- * @param int $timestamp Optional. Unix timestamp. Defaults to current time.
- * @param DateTimeZone $timezone Optional. Timezone to output result in. Defaults to timezone
- * from site settings.
- * @return string|false The date, translated if locale specifies it. False on invalid timestamp input.
- */
- function wp_date( $format, $timestamp = null, $timezone = null ) {
- global $wp_locale;
- if ( null === $timestamp ) {
- $timestamp = time();
- } elseif ( ! is_numeric( $timestamp ) ) {
- return false;
- }
- if ( ! $timezone ) {
- $timezone = wp_timezone();
- }
- $datetime = date_create( '@' . $timestamp );
- $datetime->setTimezone( $timezone );
- if ( empty( $wp_locale->month ) || empty( $wp_locale->weekday ) ) {
- $date = $datetime->format( $format );
- } else {
- // We need to unpack shorthand `r` format because it has parts that might be localized.
- $format = preg_replace( '/(?<!\\\\)r/', DATE_RFC2822, $format );
- $new_format = '';
- $format_length = strlen( $format );
- $month = $wp_locale->get_month( $datetime->format( 'm' ) );
- $weekday = $wp_locale->get_weekday( $datetime->format( 'w' ) );
- for ( $i = 0; $i < $format_length; $i ++ ) {
- switch ( $format[ $i ] ) {
- case 'D':
- $new_format .= addcslashes( $wp_locale->get_weekday_abbrev( $weekday ), '\\A..Za..z' );
- break;
- case 'F':
- $new_format .= addcslashes( $month, '\\A..Za..z' );
- break;
- case 'l':
- $new_format .= addcslashes( $weekday, '\\A..Za..z' );
- break;
- case 'M':
- $new_format .= addcslashes( $wp_locale->get_month_abbrev( $month ), '\\A..Za..z' );
- break;
- case 'a':
- $new_format .= addcslashes( $wp_locale->get_meridiem( $datetime->format( 'a' ) ), '\\A..Za..z' );
- break;
- case 'A':
- $new_format .= addcslashes( $wp_locale->get_meridiem( $datetime->format( 'A' ) ), '\\A..Za..z' );
- break;
- case '\\':
- $new_format .= $format[ $i ];
- // If character follows a slash, we add it without translating.
- if ( $i < $format_length ) {
- $new_format .= $format[ ++$i ];
- }
- break;
- default:
- $new_format .= $format[ $i ];
- break;
- }
- }
- $date = $datetime->format( $new_format );
- $date = wp_maybe_decline_date( $date, $format );
- }
- /**
- * Filters the date formatted based on the locale.
- *
- * @since 5.3.0
- *
- * @param string $date Formatted date string.
- * @param string $format Format to display the date.
- * @param int $timestamp Unix timestamp.
- * @param DateTimeZone $timezone Timezone.
- */
- $date = apply_filters( 'wp_date', $date, $format, $timestamp, $timezone );
- return $date;
- }
- /**
- * 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
- * @since 5.4.0 The `$format` parameter was added.
- *
- * @global WP_Locale $wp_locale WordPress date and time locale object.
- *
- * @param string $date Formatted date string.
- * @param string $format Optional. Date format to check. Default empty string.
- * @return string The date, declined if locale specifies it.
- */
- function wp_maybe_decline_date( $date, $format = '' ) {
- 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' ) ) {
- $months = $wp_locale->month;
- $months_genitive = $wp_locale->month_genitive;
- /*
- * Match a format like 'j F Y' or 'j. F' (day of the month, followed by month name)
- * and decline the month.
- */
- if ( $format ) {
- $decline = preg_match( '#[dj]\.? F#', $format );
- } else {
- // If the format is not passed, try to guess it from the date string.
- $decline = preg_match( '#\b\d{1,2}\.? [^\d ]+\b#u', $date );
- }
- if ( $decline ) {
- foreach ( $months as $key => $month ) {
- $months[ $key ] = '# ' . preg_quote( $month, '#' ) . '\b#u';
- }
- foreach ( $months_genitive as $key => $month ) {
- $months_genitive[ $key ] = ' ' . $month;
- }
- $date = preg_replace( $months, $months_genitive, $date );
- }
- /*
- * Match a format like 'F jS' or 'F j' (month name, followed by day with an optional ordinal suffix)
- * and change it to declined 'j F'.
- */
- if ( $format ) {
- $decline = preg_match( '#F [dj]#', $format );
- } else {
- // If the format is not passed, try to guess it from the date string.
- $decline = preg_match( '#\b[^\d ]+ \d{1,2}(st|nd|rd|th)?\b#u', trim( $date ) );
- }
- if ( $decline ) {
- foreach ( $months as $key => $month ) {
- $months[ $key ] = '#\b' . preg_quote( $month, '#' ) . ' (\d{1,2})(st|nd|rd|th)?([-–]\d{1,2})?(st|nd|rd|th)?\b#u';
- }
- foreach ( $months_genitive as $key => $month ) {
- $months_genitive[ $key ] = '$1$3 ' . $month;
- }
- $date = preg_replace( $months, $months_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 float number to format based on the locale.
- *
- * @since 2.3.0
- *
- * @global WP_Locale $wp_locale WordPress date and time locale object.
- *
- * @param float $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;
- 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 ) );
- }
- /**
- * Filters the number formatted based on the locale.
- *
- * @since 2.8.0
- * @since 4.9.0 The `$number` and `$decimals` parameters were added.
- *
- * @param string $formatted Converted number in string format.
- * @param float $number The number to convert based on locale.
- * @param int $decimals Precision of the number of decimal places.
- */
- return apply_filters( 'number_format_i18n', $formatted, $number, $decimals );
- }
- /**
- * Convert number of bytes largest unit bytes will fit into.
- *
- * 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.
- *
- * Please note that integers in PHP are limited to 32 bits, unless they are on
- * 64 bit architecture, then they have 64 bit size. If you need to place the
- * larger size then what PHP integer type will hold, then use a string. It will
- * be converted to a double, which should always have 64 bit length.
- *
- * Technically the correct unit names for powers of 1024 are KiB, MiB etc.
- *
- * @since 2.3.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 string|false Number string on success, false on failure.
- */
- function size_format( $bytes, $decimals = 0 ) {
- $quant = array(
- /* translators: Unit symbol for terabyte. */
- _x( 'TB', 'unit symbol' ) => TB_IN_BYTES,
- /* translators: Unit symbol for gigabyte. */
- _x( 'GB', 'unit symbol' ) => GB_IN_BYTES,
- /* translators: Unit symbol for megabyte. */
- _x( 'MB', 'unit symbol' ) => MB_IN_BYTES,
- /* translators: Unit symbol for kilobyte. */
- _x( 'KB', 'unit symbol' ) => KB_IN_BYTES,
- /* translators: Unit symbol for byte. */
- _x( 'B', 'unit symbol' ) => 1,
- );
- if ( 0 === $bytes ) {
- /* translators: Unit symbol for byte. */
- return number_format_i18n( 0, $decimals ) . ' ' . _x( 'B', 'unit symbol' );
- }
- foreach ( $quant as $unit => $mag ) {
- if ( (float) $bytes >= $mag ) {
- return number_format_i18n( $bytes / $mag, $decimals ) . ' ' . $unit;
- }
- }
- return false;
- }
- /**
- * Convert a duration to human readable format.
- *
- * @since 5.1.0
- *
- * @param string $duration Duration will be in string format (HH:ii:ss) OR (ii:ss),
- * with a possible prepended negative sign (-).
- * @return string|false A human readable duration string, false on failure.
- */
- function human_readable_duration( $duration = '' ) {
- if ( ( empty( $duration ) || ! is_string( $duration ) ) ) {
- return false;
- }
- $duration = trim( $duration );
- // Remove prepended negative sign.
- if ( '-' === substr( $duration, 0, 1 ) ) {
- $duration = substr( $duration, 1 );
- }
- // Extract duration parts.
- $duration_parts = array_reverse( explode( ':', $duration ) );
- $duration_count = count( $duration_parts );
- $hour = null;
- $minute = null;
- $second = null;
- if ( 3 === $duration_count ) {
- // Validate HH:ii:ss duration format.
- if ( ! ( (bool) preg_match( '/^([0-9]+):([0-5]?[0-9]):([0-5]?[0-9])$/', $duration ) ) ) {
- return false;
- }
- // Three parts: hours, minutes & seconds.
- list( $second, $minute, $hour ) = $duration_parts;
- } elseif ( 2 === $duration_count ) {
- // Validate ii:ss duration format.
- if ( ! ( (bool) preg_match( '/^([0-5]?[0-9]):([0-5]?[0-9])$/', $duration ) ) ) {
- return false;
- }
- // Two parts: minutes & seconds.
- list( $second, $minute ) = $duration_parts;
- } else {
- return false;
- }
- $human_readable_duration = array();
- // Add the hour part to the string.
- if ( is_numeric( $hour ) ) {
- /* translators: %s: Time duration in hour or hours. */
- $human_readable_duration[] = sprintf( _n( '%s hour', '%s hours', $hour ), (int) $hour );
- }
- // Add the minute part to the string.
- if ( is_numeric( $minute ) ) {
- /* translators: %s: Time duration in minute or minutes. */
- $human_readable_duration[] = sprintf( _n( '%s minute', '%s minutes', $minute ), (int) $minute );
- }
- // Add the second part to the string.
- if ( is_numeric( $second ) ) {
- /* translators: %s: Time duration in second or seconds. */
- $human_readable_duration[] = sprintf( _n( '%s second', '%s seconds', $second ), (int) $second );
- }
- return implode( ', ', $human_readable_duration );
- }
- /**
- * Get the week start and end from the datetime or date string from MySQL.
- *
- * @since 0.71
- *
- * @param string $mysqlstring Date or datetime field type from MySQL.
- * @param int|string $start_of_week Optional. Start of the week as an integer. Default empty string.
- * @return int[] {
- * Week start and end dates as Unix timestamps.
- *
- * @type int $start The week start date as a Unix timestamp.
- * @type int $end The week end date as a Unix timestamp.
- * }
- */
- function get_weekstartend( $mysqlstring, $start_of_week = '' ) {
- // MySQL string year.
- $my = substr( $mysqlstring, 0, 4 );
- // MySQL string month.
- $mm = substr( $mysqlstring, 8, 2 );
- // MySQL string day.
- $md = substr( $mysqlstring, 5, 2 );
- // The timestamp for MySQL string day.
- $day = mktime( 0, 0, 0, $md, $mm, $my );
- // The day of the week from the timestamp.
- $weekday = gmdate( 'w', $day );
- if ( ! is_numeric( $start_of_week ) ) {
- $start_of_week = get_option( 'start_of_week' );
- }
- if ( $weekday < $start_of_week ) {
- $weekday += 7;
- }
- // The most recent week start day on or before $day.
- $start = $day - DAY_IN_SECONDS * ( $weekday - $start_of_week );
- // $start + 1 week - 1 second.
- $end = $start + WEEK_IN_SECONDS - 1;
- return compact( 'start', 'end' );
- }
- /**
- * Serialize data, if needed.
- *
- * @since 2.0.5
- *
- * @param string|array|object $data Data that might be serialized.
- * @return mixed A scalar data.
- */
- function maybe_serialize( $data ) {
- if ( is_array( $data ) || is_object( $data ) ) {
- return serialize( $data );
- }
- /*
- * Double serialization is required for backward compatibility.
- * 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 );
- }
- return $data;
- }
- /**
- * Unserialize data only if it was serialized.
- *
- * @since 2.0.0
- *
- * @param string $data Data that might be unserialized.
- * @return mixed Unserialized data can be any type.
- */
- function maybe_unserialize( $data ) {
- if ( is_serialized( $data ) ) { // Don't attempt to unserialize data that wasn't serialized going in.
- return @unserialize( trim( $data ) );
- }
- return $data;
- }
- /**
- * Check value to find if it was serialized.
- *
- * If $data is not an string, then returned value will always be false.
- * Serialized data is always a string.
- *
- * @since 2.0.5
- *
- * @param string $data Value to check to see if was serialized.
- * @param bool $strict Optional. Whether to be strict about the end of the string. Default true.
- * @return bool False if not serialized and true if it was.
- */
- function is_serialized( $data, $strict = true ) {
- // If it isn't a string, it isn't serialized.
- if ( ! is_string( $data ) ) {
- return false;
- }
- $data = trim( $data );
- if ( 'N;' === $data ) {
- return true;
- }
- if ( strlen( $data ) < 4 ) {
- return false;
- }
- if ( ':' !== $data[1] ) {
- return false;
- }
- if ( $strict ) {
- $lastc = substr( $data, -1 );
- if ( ';' !== $lastc && '}' !== $lastc ) {
- return false;
- }
- } else {
- $semicolon = strpos( $data, ';' );
- $brace = strpos( $data, '}' );
- // Either ; or } must exist.
- if ( false === $semicolon && false === $brace ) {
- return false;
- }
- // But neither must be in the first X characters.
- if ( false !== $semicolon && $semicolon < 3 ) {
- return false;
- }
- if ( false !== $brace && $brace < 4 ) {
- return false;
- }
- }
- $token = $data[0];
- switch ( $token ) {
- case 's':
- if ( $strict ) {
- if ( '"' !== substr( $data, -2, 1 ) ) {
- return false;
- }
- } elseif ( false === strpos( $data, '"' ) ) {
- return false;
- }
- // Or else fall through.
- case 'a':
- case 'O':
- return (bool) preg_match( "/^{$token}:[0-9]+:/s", $data );
- case 'b':
- case 'i':
- case 'd':
- $end = $strict ? '$' : '';
- return (bool) preg_match( "/^{$token}:[0-9.E+-]+;$end/", $data );
- }
- return false;
- }
- /**
- * Check whether serialized data is of string type.
- *
- * @since 2.0.5
- *
- * @param string $data Serialized data.
- * @return bool False if not a serialized string, true if it is.
- */
- function is_serialized_string( $data ) {
- // if it isn't a string, it isn't a serialized string.
- if ( ! is_string( $data ) ) {
- return false;
- }
- $data = trim( $data );
- if ( strlen( $data ) < 4 ) {
- return false;
- } elseif ( ':' !== $data[1] ) {
- return false;
- } elseif ( ';' !== substr( $data, -1 ) ) {
- return false;
- } elseif ( 's' !== $data[0] ) {
- return false;
- } elseif ( '"' !== substr( $data, -2, 1 ) ) {
- return false;
- } else {
- return true;
- }
- }
- /**
- * Retrieve post title from XMLRPC XML.
- *
- * If the title element is not part of the XML, then the default post title from
- * the $post_default_title will be used instead.
- *
- * @since 0.71
- *
- * @global string $post_default_title Default XML-RPC post title.
- *
- * @param string $content XMLRPC XML Request content
- * @return string Post title
- */
- function xmlrpc_getposttitle( $content ) {
- global $post_default_title;
- if ( preg_match( '/<title>(.+?)<\/title>/is', $content, $matchtitle ) ) {
- $post_title = $matchtitle[1];
- } else {
- $post_title = $post_default_title;
- }
- return $post_title;
- }
- /**
- * Retrieve the post category or categories from XMLRPC XML.
- *
- * If the category element is not found, then the default post category will be
- * used. The return type then would be what $post_default_category. If the
- * category is found, then it will always be an array.
- *
- * @since 0.71
- *
- * @global string $post_default_category Default XML-RPC post category.
- *
- * @param string $content XMLRPC XML Request content
- * @return string|array List of categories or category name.
- */
- function xmlrpc_getpostcategory( $content ) {
- global $post_default_category;
- if ( preg_match( '/<category>(.+?)<\/category>/is', $content, $matchcat ) ) {
- $post_category = trim( $matchcat[1], ',' );
- $post_category = explode( ',', $post_category );
- } else {
- $post_category = $post_default_category;
- }
- return $post_category;
- }
- /**
- * XMLRPC XML content without title and category elements.
- *
- * @since 0.71
- *
- * @param string $content XML-RPC XML Request content.
- * @return string XMLRPC XML Request content without title and category elements.
- */
- function xmlrpc_removepostdata( $content ) {
- $content = preg_replace( '/<title>(.+?)<\/title>/si', '', $content );
- $content = preg_replace( '/<category>(.+?)<\/category>/si', '', $content );
- $content = trim( $content );
- return $content;
- }
- /**
- * Use RegEx to extract URLs from arbitrary content.
- *
- * @since 3.7.0
- *
- * @param string $content Content to extract URLs from.
- * @return string[] Array of URLs found in passed string.
- */
- function wp_extract_urls( $content ) {
- preg_match_all(
- "#([\"']?)("
- . '(?:([\w-]+:)?//?)'
- . '[^\s()<>]+'
- . '[.]'
- . '(?:'
- . '\([\w\d]+\)|'
- . '(?:'
- . "[^`!()\[\]{};:'\".,<>«»“”‘’\s]|"
- . '(?:[:]\d+)?/?'
- . ')+'
- . ')'
- . ")\\1#",
- $content,
- $post_links
- );
- $post_links = array_unique( array_map( 'html_entity_decode', $post_links[2] ) );
- return array_values( $post_links );
- }
- /**
- * Check content for video and audio links to add as enclosures.
- *
- * Will not add enclosures that have already been added and will
- * remove enclosures that are no longer in the post. This is called as
- * pingbacks and trackbacks.
- *
- * @since 1.5.0
- * @since 5.3.0 The `$content` parameter was made optional, and the `$post` parameter was
- * updated to accept a post ID or a WP_Post object.
- * @since 5.6.0 The `$content` parameter is no longer optional, but passing `null` to skip it
- * is still supported.
- *
- * @global wpdb $wpdb WordPress database abstraction object.
- *
- * @param string|null $content Post content. If `null`, the `post_content` field from `$post` is used.
- * @param int|WP_Post $post Post ID or post object.
- * @return void|false Void on success, false if the post is not found.
- */
- function do_enclose( $content, $post ) {
- global $wpdb;
- // @todo Tidy this code and make the debug code optional.
- include_once ABSPATH . WPINC . '/class-IXR.php';
- $post = get_post( $post );
- if ( ! $post ) {
- return false;
- }
- if ( null === $content ) {
- $content = $post->post_content;
- }
- $post_links = array();
- $pung = get_enclosed( $post->ID );
- $post_links_temp = wp_extract_urls( $content );
- foreach ( $pung as $link_test ) {
- // Link is no longer in post.
- if ( ! in_array( $link_test, $post_links_temp, true ) ) {
- $mids = $wpdb->get_col( $wpdb->prepare( "SELECT meta_id FROM $wpdb->postmeta WHERE post_id = %d AND meta_key = 'enclosure' AND meta_value LIKE %s", $post->ID, $wpdb->esc_like( $link_test ) . '%' ) );
- foreach ( $mids as $mid ) {
- delete_metadata_by_mid( 'post', $mid );
- }
- }
- }
- foreach ( (array) $post_links_temp as $link_test ) {
- // If we haven't pung it already.
- if ( ! in_array( $link_test, $pung, true ) ) {
- $test = parse_url( $link_test );
- if ( false === $test ) {
- continue;
- }
- if ( isset( $test['query'] ) ) {
- $post_links[] = $link_test;
- } elseif ( isset( $test['path'] ) && ( '/' !== $test['path'] ) && ( '' !== $test['path'] ) ) {
- $post_links[] = $link_test;
- }
- }
- }
- /**
- * Filters 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 string[] $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 ) {
- $url = strip_fragment_from_url( $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 ) . '%' ) ) ) {
- $headers = wp_get_http_headers( $url );
- if ( $headers ) {
- $len = isset( $headers['content-length'] ) ? (int) $headers['content-length'] : 0;
- $type = isset( $headers['content-type'] ) ? $headers['content-type'] : '';
- $allowed_types = array( 'video', 'audio' );
- // Check to see if we can figure out the mime type from the extension.
- $url_parts = parse_url( $url );
- if ( false !== $url_parts && ! empty( $url_parts['path'] ) ) {
- $extension = pathinfo( $url_parts['path'], PATHINFO_EXTENSION );
- if ( ! empty( $extension ) ) {
- foreach ( wp_get_mime_types() as $exts => $mime ) {
- if ( preg_match( '!^(' . $exts . ')$!i', $extension ) ) {
- $type = $mime;
- break;
- }
- }
- }
- }
- if ( in_array( substr( $type, 0, strpos( $type, '/' ) ), $allowed_types, true ) ) {
- add_post_meta( $post->ID, 'enclosure', "$url\n$len\n$mime\n" );
- }
- }
- }
- }
- }
- /**
- * Retrieve HTTP Headers from URL.
- *
- * @since 1.5.1
- *
- * @param string $url URL to retrieve HTTP headers from.
- * @param bool $deprecated Not Used.
- * @return string|false Headers on success, false on failure.
- */
- function wp_get_http_headers( $url, $deprecated = false ) {
- if ( ! empty( $deprecated ) ) {
- _deprecated_argument( __FUNCTION__, '2.7.0' );
- }
- $response = wp_safe_remote_head( $url );
- if ( is_wp_error( $response ) ) {
- return false;
- }
- return wp_remote_retrieve_headers( $response );
- }
- /**
- * Determines whether the publish date of the current post in the loop is different
- * from the publish date of the previous post in the loop.
- *
- * For more information on this and similar theme functions, check out
- * the {@link https://developer.wordpress.org/themes/basics/conditional-tags/
- * Conditional Tags} article in the Theme Developer Handbook.
- *
- * @since 0.71
- *
- * @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 1 when new day, 0 if not a new day.
- */
- function is_new_day() {
- global $currentday, $previousday;
- if ( $currentday !== $previousday ) {
- return 1;
- } else {
- return 0;
- }
- }
- /**
- * Build URL query based on an associative and, or indexed array.
- *
- * This is a convenient function for easily building url queries. It sets the
- * separator to '&' and uses _http_build_query() function.
- *
- * @since 2.3.0
- *
- * @see _http_build_query() Used to build the query
- * @link https://www.php.net/manual/en/function.http-build-query.php for more on what
- * http_build_query() does.
- *
- * @param array $data URL-encode key/value pairs.
- * @return string URL-encoded string.
- */
- function build_query( $data ) {
- return _http_build_query( $data, null, '&', '', false );
- }
- /**
- * From php.net (modified by Mark Jaquith to behave like the native PHP5 function).
- *
- * @since 3.2.0
- * @access private
- *
- * @see https://www.php.net/manual/en/function.http-build-query.php
- *
- * @param array|object $data An array or object of data. Converted to array.
- * @param string $prefix Optional. Numeric index. If set, start parameter numbering with it.
- * Default null.
- * @param string $sep Optional. Argument separator; defaults to 'arg_separator.output'.
- * Default null.
- * @param string $key Optional. Used to prefix key name. Default empty.
- * @param bool $urlencode Optional. Whether to use urlencode() in the result. Default true.
- * @return string The query string.
- */
- function _http_build_query( $data, $prefix = null, $sep = null, $key = '', $urlencode = true ) {
- $ret = array();
- foreach ( (array) $data as $k => $v ) {
- if ( $urlencode ) {
- $k = urlencode( $k );
- }
- if ( is_int( $k ) && null != $prefix ) {
- $k = $prefix . $k;
- }
- if ( ! empty( $key ) ) {
- $k = $key . '%5B' . $k . '%5D';
- }
- if ( null === $v ) {
- continue;
- } elseif ( false === $v ) {
- $v = '0';
- }
- if ( is_array( $v ) || is_object( $v ) ) {
- array_push( $ret, _http_build_query( $v, '', $sep, $k, $urlencode ) );
- } elseif ( $urlencode ) {
- array_push( $ret, $k . '=' . urlencode( $v ) );
- } else {
- array_push( $ret, $k . '=' . $v );
- }
- }
- if ( null === $sep ) {
- $sep = ini_get( 'arg_separator.output' );
- }
- return implode( $sep, $ret );
- }
- /**
- * 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:
- *
- * add_query_arg( array(
- * 'key1' => 'value1',
- * 'key2' => 'value2',
- * ), 'http://example.com' );
- *
- * 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
- * @since 5.3.0 Formalized the existing and already documented parameters
- * by adding `...$args` to the function signature.
- *
- * @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 ) {
- if ( is_array( $args[0] ) ) {
- if ( count( $args ) < 2 || false === $args[1] ) {
- $uri = $_SERVER['REQUEST_URI'];
- } else {
- $uri = $args[1];
- }
- } else {
- if ( count( $args ) < 3 || false === $args[2] ) {
- $uri = $_SERVER['REQUEST_URI'];
- } else {
- $uri = $args[2];
- }
- }
- $frag = strstr( $uri, '#' );
- if ( $frag ) {
- $uri = substr( $uri, 0, -strlen( $frag ) );
- } else {
- $frag = '';
- }
- if ( 0 === stripos( $uri, 'http://' ) ) {
- $protocol = 'http://';
- $uri = substr( $uri, 7 );
- } elseif ( 0 === stripos( $uri, 'https://' ) ) {
- $protocol = 'https://';
- $uri = substr( $uri, 8 );
- } else {
- $protocol = '';
- }
- if ( strpos( $uri, '?' ) !== false ) {
- list( $base, $query ) = explode( '?', $uri, 2 );
- $base .= '?';
- } elseif ( $protocol || strpos( $uri, '=' ) === false ) {
- $base = $uri . '?';
- $query = '';
- } else {
- $base = '';
- $query = $uri;
- }
- 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] ) ) {
- foreach ( $args[0] as $k => $v ) {
- $qs[ $k ] = $v;
- }
- } else {
- $qs[ $args[0] ] = $args[1];
- }
- foreach ( $qs as $k => $v ) {
- if ( false === $v ) {
- unset( $qs[ $k ] );
- }
- }
- $ret = build_query( $qs );
- $ret = trim( $ret, '?' );
- $ret = preg_replace( '#=(&|$)#', '$1', $ret );
- $ret = $protocol . $base . $ret . $frag;
- $ret = rtrim( $ret, '?' );
- $ret = str_replace( '?#', '#', $ret );
- return $ret;
- }
- /**
- * Removes an item or items from a query string.
- *
- * @since 1.5.0
- *
- * @param string|string[] $key Query key or keys to remove.
- * @param false|string $query Optional. When false uses the current URL. Default false.
- * @return string New URL query string.
- */
- function remove_query_arg( $key, $query = false ) {
- if ( is_array( $key ) ) { // Removing multiple keys.
- foreach ( $key as $k ) {
- $query = add_query_arg( $k, false, $query );
- }
- return $query;
- }
- 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 string[] An array of query variable names to remove from the URL.
- */
- function wp_removable_query_args() {
- $removable_query_args = array(
- 'activate',
- 'activated',
- 'admin_email_remind_later',
- 'approved',
- 'core-major-auto-updates-saved',
- 'deactivate',
- 'delete_count',
- 'deleted',
- 'disabled',
- 'doing_wp_cron',
- 'enabled',
- 'error',
- 'hotkeys_highlight_first',
- 'hotkeys_highlight_last',
- 'ids',
- 'locked',
- 'message',
- 'same',
- 'saved',
- 'settings-updated',
- 'skipped',
- 'spammed',
- 'trashed',
- 'unspammed',
- 'untrashed',
- 'update',
- 'updated',
- 'wp-post-new-reload',
- );
- /**
- * Filters the list of query variable names to remove.
- *
- * @since 4.2.0
- *
- * @param string[] $removable_query_args An array of query variable names to remove from a URL.
- */
- return apply_filters( 'removable_query_args', $removable_query_args );
- }
- /**
- * Walks the array while sanitizing the contents.
- *
- * @since 0.71
- * @since 5.5.0 Non-string values are left untouched.
- *
- * @param array $array Array to walk while sanitizing contents.
- * @return array Sanitized $array.
- */
- function add_magic_quotes( $array ) {
- foreach ( (array) $array as $k => $v ) {
- if ( is_array( $v ) ) {
- $array[ $k ] = add_magic_quotes( $v );
- } elseif ( is_string( $v ) ) {
- $array[ $k ] = addslashes( $v );
- } else {
- continue;
- }
- }
- return $array;
- }
- /**
- * HTTP request for URI to retrieve content.
- *
- * @since 1.5.1
- *
- * @see wp_safe_remote_get()
- *
- * @param string $uri URI/URL of web page to retrieve.
- * @return string|false HTTP content. False on failure.
- */
- function wp_remote_fopen( $uri ) {
- $parsed_url = parse_url( $uri );
- if ( ! $parsed_url || ! is_array( $parsed_url ) ) {
- return false;
- }
- $options = array();
- $options['timeout'] = 10;
- $response = wp_safe_remote_get( $uri, $options );
- if ( is_wp_error( $response ) ) {
- return false;
- }
- return wp_remote_retrieve_body( $response );
- }
- /**
- * Set up the WordPress query.
- *
- * @since 2.0.0
- *
- * @global WP $wp Current WordPress environment instance.
- * @global WP_Query $wp_query WordPress Query object.
- * @global WP_Query $wp_the_query Copy of the WordPress Query object.
- *
- * @param string|array $query_vars Default WP_Query arguments.
- */
- function wp( $query_vars = '' ) {
- global $wp, $wp_query, $wp_the_query;
- $wp->main( $query_vars );
- if ( ! isset( $wp_the_query ) ) {
- $wp_the_query = $wp_query;
- }
- }
- /**
- * Retrieve the description for the HTTP status.
- *
- * @since 2.3.0
- * @since 3.9.0 Added status codes 418, 428, 429, 431, and 511.
- * @since 4.5.0 Added status codes 308, 421, and 451.
- * @since 5.1.0 Added status code 103.
- *
- * @global array $wp_header_to_desc
- *
- * @param int $code HTTP status code.
- * @return string Status description if found, an empty string otherwise.
- */
- function get_status_header_desc( $code ) {
- global $wp_header_to_desc;
- $code = absint( $code );
- if ( ! isset( $wp_header_to_desc ) ) {
- $wp_header_to_desc = array(
- 100 => 'Continue',
- 101 => 'Switching Protocols',
- 102 => 'Processing',
- 103 => 'Early Hints',
- 200 => 'OK',
- 201 => 'Created',
- 202 => 'Accepted',
- 203 => 'Non-Authoritative Information',
- 204 => 'No Content',
- 205 => 'Reset Content',
- 206 => 'Partial Content',
- 207 => 'Multi-Status',
- 226 => 'IM Used',
- 300 => 'Multiple Choices',
- 301 => 'Moved Permanently',
- 302 => 'Found',
- 303 => 'See Other',
- 304 => 'Not Modified',
- 305 => 'Use Proxy',
- 306 => 'Reserved',
- 307 => 'Temporary Redirect',
- 308 => 'Permanent Redirect',
- 400 => 'Bad Request',
- 401 => 'Unauthorized',
- 402 => 'Payment Required',
- 403 => 'Forbidden',
- 404 => 'Not Found',
- 405 => 'Method Not Allowed',
- 406 => 'Not Acceptable',
- 407 => 'Proxy Authentication Required',
- 408 => 'Request Timeout',
- 409 => 'Conflict',
- 410 => 'Gone',
- 411 => 'Length Required',
- 412 => 'Precondition Failed',
- 413 => 'Request Entity Too Large',
- 414 => 'Request-URI Too Long',
- 415 => 'Unsupported Media Type',
- 416 => 'Requested Range Not Satisfiable',
- 417 => 'Expectation Failed',
- 418 => 'I\'m a teapot',
- 421 => 'Misdirected Request',
- 422 => 'Unprocessable Entity',
- 423 => 'Locked',
- 424 => 'Failed Dependency',
- 426 => 'Upgrade Required',
- 428 => 'Precondition Required',
- 429 => 'Too Many Requests',
- 431 => 'Request Header Fields Too Large',
- 451 => 'Unavailable For Legal Reasons',
- 500 => 'Internal Server Error',
- 501 => 'Not Implemented',
- 502 => 'Bad Gateway',
- 503 => 'Service Unavailable',
- 504 => 'Gateway Timeout',
- 505 => 'HTTP Version Not Supported',
- 506 => 'Variant Also Negotiates',
- 507 => 'Insufficient Storage',
- 510 => 'Not Extended',
- 511 => 'Network Authentication Required',
- );
- }
- if ( isset( $wp_header_to_desc[ $code ] ) ) {
- return $wp_header_to_desc[ $code ];
- } else {
- return '';
- }
- }
- /**
- * 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 string $description Optional. A custom description for the HTTP status.
- */
- function status_header( $code, $description = '' ) {
- if ( ! $description ) {
- $description = get_status_header_desc( $code );
- }
- if ( empty( $description ) ) {
- return;
- }
- $protocol = wp_get_server_protocol();
- $status_header = "$protocol $code $description";
- if ( function_exists( 'apply_filters' ) ) {
- /**
- * Filters an HTTP status header.
- *
- * @since 2.2.0
- *
- * @param string $status_header HTTP status header.
- * @param int $code HTTP status code.
- * @param string $description Description for the status code.
- * @param string $protocol Server protocol.
- */
- $status_header = apply_filters( 'status_header', $status_header, $code, $description, $protocol );
- }
- if ( ! headers_sent() ) {
- header( $status_header, true, $code );
- }
- }
- /**
- * Get the header information to prevent caching.
- *
- * The several different headers cover the different ways cache prevention
- * is handled by different browsers
- *
- * @since 2.8.0
- *
- * @return array The associative array of header names and field values.
- */
- function wp_get_nocache_headers() {
- $headers = array(
- 'Expires' => 'Wed, 11 Jan 1984 05:00:00 GMT',
- 'Cache-Control' => 'no-cache, must-revalidate, max-age=0',
- );
- if ( function_exists( 'apply_filters' ) ) {
- /**
- * Filters the cache-controlling headers.
- *
- * @since 2.8.0
- *
- * @see wp_get_nocache_headers()
- *
- * @param array $headers {
- * Header names and field values.
- *
- * @type string $Expires Expires header.
- * @type string $Cache-Control Cache-Control header.
- * }
- */
- $headers = (array) apply_filters( 'nocache_headers', $headers );
- }
- $headers['Last-Modified'] = false;
- return $headers;
- }
- /**
- * Set the headers to prevent caching for the different browsers.
- *
- * Different browsers support different nocache headers, so several
- * headers must be sent so that all of them get the point that no
- * caching should occur.
- *
- * @since 2.0.0
- *
- * @see wp_get_nocache_headers()
- */
- function nocache_headers() {
- if ( headers_sent() ) {
- return;
- }
- $headers = wp_get_nocache_headers();
- unset( $headers['Last-Modified'] );
- header_remove( 'Last-Modified' );
- foreach ( $headers as $name => $field_value ) {
- header( "{$name}: {$field_value}" );
- }
- }
- /**
- * Set the headers for caching for 10 days with JavaScript content type.
- *
- * @since 2.1.0
- */
- function cache_javascript_headers() {
- $expiresOffset = 10 * DAY_IN_SECONDS;
- header( 'Content-Type: text/javascript; charset=' . get_bloginfo( 'charset' ) );
- header( 'Vary: Accept-Encoding' ); // Handle proxies.
- header( 'Expires: ' . gmdate( 'D, d M Y H:i:s', time() + $expiresOffset ) . ' GMT' );
- }
- /**
- * Retrieve the number of database queries during the WordPress execution.
- *
- * @since 2.0.0
- *
- * @global wpdb $wpdb WordPress database abstraction object.
- *
- * @return int Number of database queries.
- */
- function get_num_queries() {
- global $wpdb;
- return $wpdb->num_queries;
- }
- /**
- * Whether input is yes or no.
- *
- * Must be 'y' to be true.
- *
- * @since 1.0.0
- *
- * @param string $yn Character string containing either 'y' (yes) or 'n' (no).
- * @return bool True if 'y', false on anything else.
- */
- function bool_from_yn( $yn ) {
- return ( 'y' === strtolower( $yn ) );
- }
- /**
- * Load the feed template from the use of an action hook.
- *
- * If the feed action does not have a hook, then the function will die with a
- * message telling the visitor that the feed is not valid.
- *
- * It is better to only have one hook for each feed.
- *
- * @since 2.1.0
- *
- * @global WP_Query $wp_query WordPress Query object.
- */
- function do_feed() {
- global $wp_query;
- $feed = get_query_var( 'feed' );
- // Remove the pad, if present.
- $feed = preg_replace( '/^_+/', '', $feed );
- if ( '' === $feed || 'feed' === $feed ) {
- $feed = get_default_feed();
- }
- 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 portion of the hook name, `$feed`, refers to the feed template name.
- *
- * Possible hook names include:
- *
- * - `do_feed_atom`
- * - `do_feed_rdf`
- * - `do_feed_rss`
- * - `do_feed_rss2`
- *
- * @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 string $feed The feed name.
- */
- do_action( "do_feed_{$feed}", $wp_query->is_comment_feed, $feed );
- }
- /**
- * Load the RDF RSS 0.91 Feed template.
- *
- * @since 2.1.0
- *
- * @see load_template()
- */
- function do_feed_rdf() {
- load_template( ABSPATH . WPINC . '/feed-rdf.php' );
- }
- /**
- * Load the RSS 1.0 Feed Template.
- *
- * @since 2.1.0
- *
- * @see load_template()
- */
- function do_feed_rss() {
- load_template( ABSPATH . WPINC . '/feed-rss.php' );
- }
- /**
- * Load either the RSS2 comment feed or the RSS2 posts feed.
- *
- * @since 2.1.0
- *
- * @see load_template()
- *
- * @param bool $for_comments True for the comment feed, false for normal feed.
- */
- function do_feed_rss2( $for_comments ) {
- if ( $for_comments ) {
- load_template( ABSPATH . WPINC . '/feed-rss2-comments.php' );
- } else {
- load_template( ABSPATH . WPINC . '/feed-rss2.php' );
- }
- }
- /**
- * Load either Atom comment feed or Atom posts feed.
- *
- * @since 2.1.0
- *
- * @see load_template()
- *
- * @param bool $for_comments True for the comment feed, false for normal feed.
- */
- function do_feed_atom( $for_comments ) {
- if ( $for_comments ) {
- load_template( ABSPATH . WPINC . '/feed-atom-comments.php' );
- } else {
- load_template( ABSPATH . WPINC . '/feed-atom.php' );
- }
- }
- /**
- * Displays the default robots.txt file content.
- *
- * @since 2.1.0
- * @since 5.3.0 Remove the "Disallow: /" output if search engine visiblity is
- * discouraged in favor of robots meta HTML tag via wp_robots_no_robots()
- * filter callback.
- */
- function do_robots() {
- header( 'Content-Type: text/plain; charset=utf-8' );
- /**
- * Fires when displaying the robots.txt file.
- *
- * @since 2.1.0
- */
- do_action( 'do_robotstxt' );
- $output = "User-agent: *\n";
- $public = get_option( 'blog_public' );
- $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";
- /**
- * Filters the robots.txt output.
- *
- * @since 3.0.0
- *
- * @param string $output The robots.txt output.
- * @param bool $public Whether the site is considered "public".
- */
- echo apply_filters( 'robots_txt', $output, $public );
- }
- /**
- * Display the favicon.ico file content.
- *
- * @since 5.4.0
- */
- function do_favicon() {
- /**
- * Fires when serving the favicon.ico file.
- *
- * @since 5.4.0
- */
- do_action( 'do_faviconico' );
- wp_redirect( get_site_icon_url( 32, includes_url( 'images/w-logo-blue-white-bg.png' ) ) );
- exit;
- }
- /**
- * Determines whether WordPress is already installed.
- *
- * The cache will be checked first. If you have a cache plugin, which saves
- * the cache values, then this will work. If you use the default WordPress
- * cache, and the database goes away, then you might have problems.
- *
- * Checks for the 'siteurl' option for whether WordPress is installed.
- *
- * For more information on this and similar theme functions, check out
- * the {@link https://developer.wordpress.org/themes/basics/conditional-tags/
- * Conditional Tags} article in the Theme Developer Handbook.
- *
- * @since 2.1.0
- *
- * @global wpdb $wpdb WordPress database abstraction object.
- *
- * @return bool Whether the site is already installed.
- */
- function is_blog_installed() {
- global $wpdb;
- /*
- * Check cache first. If options table goes away and we have true
- * cached, oh well.
- */
- if ( wp_cache_get( 'is_blog_installed' ) ) {
- return true;
- }
- $suppress = $wpdb->suppress_errors();
- if ( ! wp_installing() ) {
- $alloptions = wp_load_alloptions();
- }
- // If siteurl is not set to autoload, check it specifically.
- if ( ! isset( $alloptions['siteurl'] ) ) {
- $installed = $wpdb->get_var( "SELECT option_value FROM $wpdb->options WHERE option_name = 'siteurl'" );
- } else {
- $installed = $alloptions['siteurl'];
- }
- $wpdb->suppress_errors( $suppress );
- $installed = ! empty( $installed );
- wp_cache_set( 'is_blog_installed', $installed );
- if ( $installed ) {
- return true;
- }
- // If visiting repair.php, return true and let it take over.
- if ( defined( 'WP_REPAIRING' ) ) {
- return true;
- }
- $suppress = $wpdb->suppress_errors();
- /*
- * Loop…
Large files files are truncated, but you can click here to view the full file