X-Git-Url: https://scripts.mit.edu/gitweb/autoinstalls/wordpress.git/blobdiff_plain/38ca813a0e312e2768e5b9519f0415cd0aa84781..596d585e1dc1eb25bccd3781e37210a4e2504179:/wp-includes/functions.php diff --git a/wp-includes/functions.php b/wp-includes/functions.php index 7a682ef3..a5a6a2d4 100644 --- a/wp-includes/functions.php +++ b/wp-includes/functions.php @@ -5,40 +5,40 @@ * @package WordPress */ +require( ABSPATH . WPINC . '/option.php' ); + /** - * Converts MySQL DATETIME field to user specified date format. + * Converts given date string into a different format. * - * If $dateformatstring has 'G' value, then gmmktime() function will be used to - * make the time. If $dateformatstring is set to 'U', then mktime() function - * will be used to make the time. + * $format should be either a PHP date format string, e.g. 'U' for a Unix + * timestamp, or 'G' for a Unix timestamp assuming that $date is GMT. * - * The $translate will only be used, if it is set to true and it is by default - * and if the $wp_locale object has the month and weekday set. + * If $translate is true then the given date and format string will + * be passed to date_i18n() for translation. * * @since 0.71 * - * @param string $dateformatstring Either 'G', 'U', or php date format. - * @param string $mysqlstring Time from mysql DATETIME field. - * @param bool $translate Optional. Default is true. Will switch format to locale. - * @return string Date formated by $dateformatstring or locale (if available). + * @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 is true. + * @return string|int Formatted date string, or Unix timestamp. */ -function mysql2date( $dateformatstring, $mysqlstring, $translate = true ) { - $m = $mysqlstring; - if ( empty( $m ) ) +function mysql2date( $format, $date, $translate = true ) { + if ( empty( $date ) ) return false; - if ( 'G' == $dateformatstring ) - return strtotime( $m . ' +0000' ); + if ( 'G' == $format ) + return strtotime( $date . ' +0000' ); - $i = strtotime( $m ); + $i = strtotime( $date ); - if ( 'U' == $dateformatstring ) + if ( 'U' == $format ) return $i; if ( $translate ) - return date_i18n( $dateformatstring, $i ); + return date_i18n( $format, $i ); else - return date( $dateformatstring, $i ); + return date( $format, $i ); } /** @@ -303,728 +303,6 @@ function is_serialized_string( $data ) { return true; } -/** - * Retrieve option value based on name of option. - * - * If the option does not exist or does not have a value, then the return value - * will be false. This is useful to check whether you need to install an option - * and is commonly used during installation of plugin options and to test - * whether upgrading is required. - * - * If the option was serialized then it will be unserialized when it is returned. - * - * @since 1.5.0 - * @package WordPress - * @subpackage Option - * @uses apply_filters() Calls 'pre_option_$option' before checking the option. - * Any value other than false will "short-circuit" the retrieval of the option - * and return the returned value. You should not try to override special options, - * but you will not be prevented from doing so. - * @uses apply_filters() Calls 'option_$option', after checking the option, with - * the option value. - * - * @param string $option Name of option to retrieve. Expected to not be SQL-escaped. - * @return mixed Value set for the option. - */ -function get_option( $option, $default = false ) { - global $wpdb; - - // Allow plugins to short-circuit options. - $pre = apply_filters( 'pre_option_' . $option, false ); - if ( false !== $pre ) - return $pre; - - $option = trim($option); - if ( empty($option) ) - return false; - - if ( defined( 'WP_SETUP_CONFIG' ) ) - return false; - - if ( ! defined( 'WP_INSTALLING' ) ) { - // prevent non-existent options from triggering multiple queries - $notoptions = wp_cache_get( 'notoptions', 'options' ); - if ( isset( $notoptions[$option] ) ) - return $default; - - $alloptions = wp_load_alloptions(); - - if ( isset( $alloptions[$option] ) ) { - $value = $alloptions[$option]; - } else { - $value = wp_cache_get( $option, 'options' ); - - if ( false === $value ) { - $row = $wpdb->get_row( $wpdb->prepare( "SELECT option_value FROM $wpdb->options WHERE option_name = %s LIMIT 1", $option ) ); - - // Has to be get_row instead of get_var because of funkiness with 0, false, null values - if ( is_object( $row ) ) { - $value = $row->option_value; - wp_cache_add( $option, $value, 'options' ); - } else { // option does not exist, so we must cache its non-existence - $notoptions[$option] = true; - wp_cache_set( 'notoptions', $notoptions, 'options' ); - return $default; - } - } - } - } else { - $suppress = $wpdb->suppress_errors(); - $row = $wpdb->get_row( $wpdb->prepare( "SELECT option_value FROM $wpdb->options WHERE option_name = %s LIMIT 1", $option ) ); - $wpdb->suppress_errors( $suppress ); - if ( is_object( $row ) ) - $value = $row->option_value; - else - return $default; - } - - // If home is not set use siteurl. - if ( 'home' == $option && '' == $value ) - return get_option( 'siteurl' ); - - if ( in_array( $option, array('siteurl', 'home', 'category_base', 'tag_base') ) ) - $value = untrailingslashit( $value ); - - return apply_filters( 'option_' . $option, maybe_unserialize( $value ) ); -} - -/** - * Protect WordPress special option from being modified. - * - * Will die if $option is in protected list. Protected options are 'alloptions' - * and 'notoptions' options. - * - * @since 2.2.0 - * @package WordPress - * @subpackage Option - * - * @param string $option Option name. - */ -function wp_protect_special_option( $option ) { - $protected = array( 'alloptions', 'notoptions' ); - if ( in_array( $option, $protected ) ) - wp_die( sprintf( __( '%s is a protected WP option and may not be modified' ), esc_html( $option ) ) ); -} - -/** - * Print option value after sanitizing for forms. - * - * @uses attr Sanitizes value. - * @since 1.5.0 - * @package WordPress - * @subpackage Option - * - * @param string $option Option name. - */ -function form_option( $option ) { - echo esc_attr( get_option( $option ) ); -} - -/** - * Loads and caches all autoloaded options, if available or all options. - * - * @since 2.2.0 - * @package WordPress - * @subpackage Option - * - * @return array List of all options. - */ -function wp_load_alloptions() { - global $wpdb; - - if ( !defined( 'WP_INSTALLING' ) || !is_multisite() ) - $alloptions = wp_cache_get( 'alloptions', 'options' ); - else - $alloptions = false; - - if ( !$alloptions ) { - $suppress = $wpdb->suppress_errors(); - if ( !$alloptions_db = $wpdb->get_results( "SELECT option_name, option_value FROM $wpdb->options WHERE autoload = 'yes'" ) ) - $alloptions_db = $wpdb->get_results( "SELECT option_name, option_value FROM $wpdb->options" ); - $wpdb->suppress_errors($suppress); - $alloptions = array(); - foreach ( (array) $alloptions_db as $o ) { - $alloptions[$o->option_name] = $o->option_value; - } - if ( !defined( 'WP_INSTALLING' ) || !is_multisite() ) - wp_cache_add( 'alloptions', $alloptions, 'options' ); - } - - return $alloptions; -} - -/** - * Loads and caches certain often requested site options if is_multisite() and a peristent cache is not being used. - * - * @since 3.0.0 - * @package WordPress - * @subpackage Option - * - * @param int $site_id Optional site ID for which to query the options. Defaults to the current site. - */ -function wp_load_core_site_options( $site_id = null ) { - global $wpdb, $_wp_using_ext_object_cache; - - if ( !is_multisite() || $_wp_using_ext_object_cache || defined( 'WP_INSTALLING' ) ) - return; - - if ( empty($site_id) ) - $site_id = $wpdb->siteid; - - $core_options = array('site_name', 'siteurl', 'active_sitewide_plugins', '_site_transient_timeout_theme_roots', '_site_transient_theme_roots', 'site_admins', 'can_compress_scripts', 'global_terms_enabled' ); - - $core_options_in = "'" . implode("', '", $core_options) . "'"; - $options = $wpdb->get_results( $wpdb->prepare("SELECT meta_key, meta_value FROM $wpdb->sitemeta WHERE meta_key IN ($core_options_in) AND site_id = %d", $site_id) ); - - foreach ( $options as $option ) { - $key = $option->meta_key; - $cache_key = "{$site_id}:$key"; - $option->meta_value = maybe_unserialize( $option->meta_value ); - - wp_cache_set( $cache_key, $option->meta_value, 'site-options' ); - } -} - -/** - * Update the value of an option that was already added. - * - * You do not need to serialize values. If the value needs to be serialized, then - * it will be serialized before it is inserted into the database. Remember, - * resources can not be serialized or added as an option. - * - * If the option does not exist, then the option will be added with the option - * value, but you will not be able to set whether it is autoloaded. If you want - * to set whether an option is autoloaded, then you need to use the add_option(). - * - * @since 1.0.0 - * @package WordPress - * @subpackage Option - * - * @uses apply_filters() Calls 'pre_update_option_$option' hook to allow overwriting the - * option value to be stored. - * @uses do_action() Calls 'update_option' hook before updating the option. - * @uses do_action() Calls 'update_option_$option' and 'updated_option' hooks on success. - * - * @param string $option Option name. Expected to not be SQL-escaped. - * @param mixed $newvalue Option value. Expected to not be SQL-escaped. - * @return bool False if value was not updated and true if value was updated. - */ -function update_option( $option, $newvalue ) { - global $wpdb; - - $option = trim($option); - if ( empty($option) ) - return false; - - wp_protect_special_option( $option ); - - if ( is_object($newvalue) ) - $newvalue = clone $newvalue; - - $newvalue = sanitize_option( $option, $newvalue ); - $oldvalue = get_option( $option ); - $newvalue = apply_filters( 'pre_update_option_' . $option, $newvalue, $oldvalue ); - - // If the new and old values are the same, no need to update. - if ( $newvalue === $oldvalue ) - return false; - - if ( false === $oldvalue ) - return add_option( $option, $newvalue ); - - $notoptions = wp_cache_get( 'notoptions', 'options' ); - if ( is_array( $notoptions ) && isset( $notoptions[$option] ) ) { - unset( $notoptions[$option] ); - wp_cache_set( 'notoptions', $notoptions, 'options' ); - } - - $_newvalue = $newvalue; - $newvalue = maybe_serialize( $newvalue ); - - do_action( 'update_option', $option, $oldvalue, $_newvalue ); - if ( ! defined( 'WP_INSTALLING' ) ) { - $alloptions = wp_load_alloptions(); - if ( isset( $alloptions[$option] ) ) { - $alloptions[$option] = $_newvalue; - wp_cache_set( 'alloptions', $alloptions, 'options' ); - } else { - wp_cache_set( $option, $_newvalue, 'options' ); - } - } - - $result = $wpdb->update( $wpdb->options, array( 'option_value' => $newvalue ), array( 'option_name' => $option ) ); - - if ( $result ) { - do_action( "update_option_{$option}", $oldvalue, $_newvalue ); - do_action( 'updated_option', $option, $oldvalue, $_newvalue ); - return true; - } - return false; -} - -/** - * Add a new option. - * - * You do not need to serialize values. If the value needs to be serialized, then - * it will be serialized before it is inserted into the database. Remember, - * resources can not be serialized or added as an option. - * - * You can create options without values and then add values later. Does not - * check whether the option has already been added, but does check that you - * aren't adding a protected WordPress option. Care should be taken to not name - * options the same as the ones which are protected and to not add options - * that were already added. - * - * @package WordPress - * @subpackage Option - * @since 1.0.0 - * - * @uses do_action() Calls 'add_option' hook before adding the option. - * @uses do_action() Calls 'add_option_$option' and 'added_option' hooks on success. - * - * @param string $option Name of option to add. Expected to not be SQL-escaped. - * @param mixed $value Optional. Option value, can be anything. Expected to not be SQL-escaped. - * @param mixed $deprecated Optional. Description. Not used anymore. - * @param bool $autoload Optional. Default is enabled. Whether to load the option when WordPress starts up. - * @return null returns when finished. - */ -function add_option( $option, $value = '', $deprecated = '', $autoload = 'yes' ) { - global $wpdb; - - if ( !empty( $deprecated ) ) - _deprecated_argument( __FUNCTION__, '2.3' ); - - $option = trim($option); - if ( empty($option) ) - return false; - - wp_protect_special_option( $option ); - - if ( is_object($value) ) - $value = clone $value; - - $value = sanitize_option( $option, $value ); - - // Make sure the option doesn't already exist. We can check the 'notoptions' cache before we ask for a db query - $notoptions = wp_cache_get( 'notoptions', 'options' ); - if ( !is_array( $notoptions ) || !isset( $notoptions[$option] ) ) - if ( false !== get_option( $option ) ) - return; - - $_value = $value; - $value = maybe_serialize( $value ); - $autoload = ( 'no' === $autoload ) ? 'no' : 'yes'; - do_action( 'add_option', $option, $_value ); - if ( ! defined( 'WP_INSTALLING' ) ) { - if ( 'yes' == $autoload ) { - $alloptions = wp_load_alloptions(); - $alloptions[$option] = $value; - wp_cache_set( 'alloptions', $alloptions, 'options' ); - } else { - wp_cache_set( $option, $value, 'options' ); - } - } - - // This option exists now - $notoptions = wp_cache_get( 'notoptions', 'options' ); // yes, again... we need it to be fresh - if ( is_array( $notoptions ) && isset( $notoptions[$option] ) ) { - unset( $notoptions[$option] ); - wp_cache_set( 'notoptions', $notoptions, 'options' ); - } - - $result = $wpdb->query( $wpdb->prepare( "INSERT INTO `$wpdb->options` (`option_name`, `option_value`, `autoload`) VALUES (%s, %s, %s) ON DUPLICATE KEY UPDATE `option_name` = VALUES(`option_name`), `option_value` = VALUES(`option_value`), `autoload` = VALUES(`autoload`)", $option, $value, $autoload ) ); - - if ( $result ) { - do_action( "add_option_{$option}", $option, $_value ); - do_action( 'added_option', $option, $_value ); - return true; - } - return false; -} - -/** - * Removes option by name. Prevents removal of protected WordPress options. - * - * @package WordPress - * @subpackage Option - * @since 1.2.0 - * - * @uses do_action() Calls 'delete_option' hook before option is deleted. - * @uses do_action() Calls 'deleted_option' and 'delete_option_$option' hooks on success. - * - * @param string $option Name of option to remove. Expected to not be SQL-escaped. - * @return bool True, if option is successfully deleted. False on failure. - */ -function delete_option( $option ) { - global $wpdb; - - wp_protect_special_option( $option ); - - // Get the ID, if no ID then return - $row = $wpdb->get_row( $wpdb->prepare( "SELECT autoload FROM $wpdb->options WHERE option_name = %s", $option ) ); - if ( is_null( $row ) ) - return false; - do_action( 'delete_option', $option ); - $result = $wpdb->query( $wpdb->prepare( "DELETE FROM $wpdb->options WHERE option_name = %s", $option) ); - if ( ! defined( 'WP_INSTALLING' ) ) { - if ( 'yes' == $row->autoload ) { - $alloptions = wp_load_alloptions(); - if ( is_array( $alloptions ) && isset( $alloptions[$option] ) ) { - unset( $alloptions[$option] ); - wp_cache_set( 'alloptions', $alloptions, 'options' ); - } - } else { - wp_cache_delete( $option, 'options' ); - } - } - if ( $result ) { - do_action( "delete_option_$option", $option ); - do_action( 'deleted_option', $option ); - return true; - } - return false; -} - -/** - * Delete a transient - * - * @since 2.8.0 - * @package WordPress - * @subpackage Transient - * - * @uses do_action() Calls 'delete_transient_$transient' hook before transient is deleted. - * @uses do_action() Calls 'deleted_transient' hook on success. - * - * @param string $transient Transient name. Expected to not be SQL-escaped. - * @return bool true if successful, false otherwise - */ -function delete_transient( $transient ) { - global $_wp_using_ext_object_cache; - - do_action( 'delete_transient_' . $transient, $transient ); - - if ( $_wp_using_ext_object_cache ) { - $result = wp_cache_delete( $transient, 'transient' ); - } else { - $option_timeout = '_transient_timeout_' . $transient; - $option = '_transient_' . $transient; - $result = delete_option( $option ); - if ( $result ) - delete_option( $option_timeout ); - } - - if ( $result ) - do_action( 'deleted_transient', $transient ); - return $result; -} - -/** - * Get the value of a transient - * - * If the transient does not exist or does not have a value, then the return value - * will be false. - * - * @uses apply_filters() Calls 'pre_transient_$transient' hook before checking the transient. - * Any value other than false will "short-circuit" the retrieval of the transient - * and return the returned value. - * @uses apply_filters() Calls 'transient_$option' hook, after checking the transient, with - * the transient value. - * - * @since 2.8.0 - * @package WordPress - * @subpackage Transient - * - * @param string $transient Transient name. Expected to not be SQL-escaped - * @return mixed Value of transient - */ -function get_transient( $transient ) { - global $_wp_using_ext_object_cache; - - $pre = apply_filters( 'pre_transient_' . $transient, false ); - if ( false !== $pre ) - return $pre; - - if ( $_wp_using_ext_object_cache ) { - $value = wp_cache_get( $transient, 'transient' ); - } else { - $transient_option = '_transient_' . $transient; - if ( ! defined( 'WP_INSTALLING' ) ) { - // If option is not in alloptions, it is not autoloaded and thus has a timeout - $alloptions = wp_load_alloptions(); - if ( !isset( $alloptions[$transient_option] ) ) { - $transient_timeout = '_transient_timeout_' . $transient; - if ( get_option( $transient_timeout ) < time() ) { - delete_option( $transient_option ); - delete_option( $transient_timeout ); - return false; - } - } - } - - $value = get_option( $transient_option ); - } - - return apply_filters( 'transient_' . $transient, $value ); -} - -/** - * Set/update the value of a transient - * - * You do not need to serialize values. If the value needs to be serialized, then - * it will be serialized before it is set. - * - * @since 2.8.0 - * @package WordPress - * @subpackage Transient - * - * @uses apply_filters() Calls 'pre_set_transient_$transient' hook to allow overwriting the - * transient value to be stored. - * @uses do_action() Calls 'set_transient_$transient' and 'setted_transient' hooks on success. - * - * @param string $transient Transient name. Expected to not be SQL-escaped. - * @param mixed $value Transient value. Expected to not be SQL-escaped. - * @param int $expiration Time until expiration in seconds, default 0 - * @return bool False if value was not set and true if value was set. - */ -function set_transient( $transient, $value, $expiration = 0 ) { - global $_wp_using_ext_object_cache; - - $value = apply_filters( 'pre_set_transient_' . $transient, $value ); - - if ( $_wp_using_ext_object_cache ) { - $result = wp_cache_set( $transient, $value, 'transient', $expiration ); - } else { - $transient_timeout = '_transient_timeout_' . $transient; - $transient = '_transient_' . $transient; - if ( false === get_option( $transient ) ) { - $autoload = 'yes'; - if ( $expiration ) { - $autoload = 'no'; - add_option( $transient_timeout, time() + $expiration, '', 'no' ); - } - $result = add_option( $transient, $value, '', $autoload ); - } else { - if ( $expiration ) - update_option( $transient_timeout, time() + $expiration ); - $result = update_option( $transient, $value ); - } - } - if ( $result ) { - do_action( 'set_transient_' . $transient ); - do_action( 'setted_transient', $transient ); - } - return $result; -} - -/** - * Saves and restores user interface settings stored in a cookie. - * - * Checks if the current user-settings cookie is updated and stores it. When no - * cookie exists (different browser used), adds the last saved cookie restoring - * the settings. - * - * @package WordPress - * @subpackage Option - * @since 2.7.0 - */ -function wp_user_settings() { - - if ( ! is_admin() ) - return; - - if ( defined('DOING_AJAX') ) - return; - - if ( ! $user = wp_get_current_user() ) - return; - - $settings = get_user_option( 'user-settings', $user->ID ); - - if ( isset( $_COOKIE['wp-settings-' . $user->ID] ) ) { - $cookie = preg_replace( '/[^A-Za-z0-9=&_]/', '', $_COOKIE['wp-settings-' . $user->ID] ); - - if ( ! empty( $cookie ) && strpos( $cookie, '=' ) ) { - if ( $cookie == $settings ) - return; - - $last_time = (int) get_user_option( 'user-settings-time', $user->ID ); - $saved = isset( $_COOKIE['wp-settings-time-' . $user->ID]) ? preg_replace( '/[^0-9]/', '', $_COOKIE['wp-settings-time-' . $user->ID] ) : 0; - - if ( $saved > $last_time ) { - update_user_option( $user->ID, 'user-settings', $cookie, false ); - update_user_option( $user->ID, 'user-settings-time', time() - 5, false ); - return; - } - } - } - - setcookie( 'wp-settings-' . $user->ID, $settings, time() + 31536000, SITECOOKIEPATH ); - setcookie( 'wp-settings-time-' . $user->ID, time(), time() + 31536000, SITECOOKIEPATH ); - $_COOKIE['wp-settings-' . $user->ID] = $settings; -} - -/** - * Retrieve user interface setting value based on setting name. - * - * @package WordPress - * @subpackage Option - * @since 2.7.0 - * - * @param string $name The name of the setting. - * @param string $default Optional default value to return when $name is not set. - * @return mixed the last saved user setting or the default value/false if it doesn't exist. - */ -function get_user_setting( $name, $default = false ) { - - $all = get_all_user_settings(); - - return isset($all[$name]) ? $all[$name] : $default; -} - -/** - * Add or update user interface setting. - * - * Both $name and $value can contain only ASCII letters, numbers and underscores. - * This function has to be used before any output has started as it calls setcookie(). - * - * @package WordPress - * @subpackage Option - * @since 2.8.0 - * - * @param string $name The name of the setting. - * @param string $value The value for the setting. - * @return bool true if set successfully/false if not. - */ -function set_user_setting( $name, $value ) { - - if ( headers_sent() ) - return false; - - $all = get_all_user_settings(); - $name = preg_replace( '/[^A-Za-z0-9_]+/', '', $name ); - - if ( empty($name) ) - return false; - - $all[$name] = $value; - - return wp_set_all_user_settings($all); -} - -/** - * Delete user interface settings. - * - * Deleting settings would reset them to the defaults. - * This function has to be used before any output has started as it calls setcookie(). - * - * @package WordPress - * @subpackage Option - * @since 2.7.0 - * - * @param mixed $names The name or array of names of the setting to be deleted. - * @return bool true if deleted successfully/false if not. - */ -function delete_user_setting( $names ) { - - if ( headers_sent() ) - return false; - - $all = get_all_user_settings(); - $names = (array) $names; - - foreach ( $names as $name ) { - if ( isset($all[$name]) ) { - unset($all[$name]); - $deleted = true; - } - } - - if ( isset($deleted) ) - return wp_set_all_user_settings($all); - - return false; -} - -/** - * Retrieve all user interface settings. - * - * @package WordPress - * @subpackage Option - * @since 2.7.0 - * - * @return array the last saved user settings or empty array. - */ -function get_all_user_settings() { - global $_updated_user_settings; - - if ( ! $user = wp_get_current_user() ) - return array(); - - if ( isset($_updated_user_settings) && is_array($_updated_user_settings) ) - return $_updated_user_settings; - - $all = array(); - if ( isset($_COOKIE['wp-settings-' . $user->ID]) ) { - $cookie = preg_replace( '/[^A-Za-z0-9=&_]/', '', $_COOKIE['wp-settings-' . $user->ID] ); - - if ( $cookie && strpos($cookie, '=') ) // the '=' cannot be 1st char - parse_str($cookie, $all); - - } else { - $option = get_user_option('user-settings', $user->ID); - if ( $option && is_string($option) ) - parse_str( $option, $all ); - } - - return $all; -} - -/** - * Private. Set all user interface settings. - * - * @package WordPress - * @subpackage Option - * @since 2.8.0 - * - * @param unknown $all - * @return bool - */ -function wp_set_all_user_settings($all) { - global $_updated_user_settings; - - if ( ! $user = wp_get_current_user() ) - return false; - - $_updated_user_settings = $all; - $settings = ''; - foreach ( $all as $k => $v ) { - $v = preg_replace( '/[^A-Za-z0-9_]+/', '', $v ); - $settings .= $k . '=' . $v . '&'; - } - - $settings = rtrim($settings, '&'); - - update_user_option( $user->ID, 'user-settings', $settings, false ); - update_user_option( $user->ID, 'user-settings-time', time(), false ); - - return true; -} - -/** - * Delete the user settings of the current user. - * - * @package WordPress - * @subpackage Option - * @since 2.7.0 - */ -function delete_all_user_settings() { - if ( ! $user = wp_get_current_user() ) - return; - - update_user_option( $user->ID, 'user-settings', '', false ); - setcookie('wp-settings-' . $user->ID, ' ', time() - 31536000, SITECOOKIEPATH); -} - /** * Serialize data, if needed. * @@ -1037,6 +315,8 @@ function maybe_serialize( $data ) { if ( is_array( $data ) || is_object( $data ) ) return serialize( $data ); + // Double serialization is required for backward compatibility. + // See http://core.trac.wordpress.org/ticket/12930 if ( is_serialized( $data ) ) return serialize( $data ); @@ -1112,71 +392,6 @@ function xmlrpc_removepostdata( $content ) { return $content; } -/** - * Open the file handle for debugging. - * - * This function is used for XMLRPC feature, but it is general purpose enough - * to be used in anywhere. - * - * @see fopen() for mode options. - * @package WordPress - * @subpackage Debug - * @since 0.71 - * @uses $debug Used for whether debugging is enabled. - * - * @param string $filename File path to debug file. - * @param string $mode Same as fopen() mode parameter. - * @return bool|resource File handle. False on failure. - */ -function debug_fopen( $filename, $mode ) { - global $debug; - if ( 1 == $debug ) { - $fp = fopen( $filename, $mode ); - return $fp; - } else { - return false; - } -} - -/** - * Write contents to the file used for debugging. - * - * Technically, this can be used to write to any file handle when the global - * $debug is set to 1 or true. - * - * @package WordPress - * @subpackage Debug - * @since 0.71 - * @uses $debug Used for whether debugging is enabled. - * - * @param resource $fp File handle for debugging file. - * @param string $string Content to write to debug file. - */ -function debug_fwrite( $fp, $string ) { - global $debug; - if ( 1 == $debug ) - fwrite( $fp, $string ); -} - -/** - * Close the debugging file handle. - * - * Technically, this can be used to close any file handle when the global $debug - * is set to 1 or true. - * - * @package WordPress - * @subpackage Debug - * @since 0.71 - * @uses $debug Used for whether debugging is enabled. - * - * @param resource $fp Debug File handle. - */ -function debug_fclose( $fp ) { - global $debug; - if ( 1 == $debug ) - fclose( $fp ); -} - /** * Check content for video and audio links to add as enclosures. * @@ -1198,9 +413,7 @@ function do_enclose( $content, $post_ID ) { //TODO: Tidy this ghetto code up and make the debug code optional include_once( ABSPATH . WPINC . '/class-IXR.php' ); - $log = debug_fopen( ABSPATH . 'enclosures.log', 'a' ); $post_links = array(); - debug_fwrite( $log, 'BEGIN ' . date( 'YmdHis', time() ) . "\n" ); $pung = get_enclosed( $post_ID ); @@ -1211,15 +424,11 @@ function do_enclose( $content, $post_ID ) { preg_match_all( "{\b http : [$any] +? (?= [$punc] * [^$any] | $)}x", $content, $post_links_temp ); - debug_fwrite( $log, 'Post contents:' ); - debug_fwrite( $log, $content . "\n" ); - foreach ( $pung as $link_test ) { if ( !in_array( $link_test, $post_links_temp[0] ) ) { // link no longer in post - $mid = $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, like_escape( $link_test ) . '%') ); - do_action( 'delete_postmeta', $mid ); - $wpdb->query( $wpdb->prepare("DELETE FROM $wpdb->postmeta WHERE meta_id IN(%s)", implode( ',', $mid ) ) ); - do_action( 'deleted_postmeta', $mid ); + $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, like_escape( $link_test ) . '%') ); + foreach ( $mids as $mid ) + delete_metadata_by_mid( 'post', $mid ); } } @@ -1239,8 +448,8 @@ function do_enclose( $content, $post_ID ) { 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, like_escape( $url ) . '%' ) ) ) { if ( $headers = wp_get_http_headers( $url) ) { - $len = (int) $headers['content-length']; - $type = $headers['content-type']; + $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 @@ -1259,9 +468,7 @@ function do_enclose( $content, $post_ID ) { } if ( in_array( substr( $type, 0, strpos( $type, "/" ) ), $allowed_types ) ) { - $meta_value = "$url\n$len\n$type\n"; - $wpdb->insert($wpdb->postmeta, array('post_id' => $post_ID, 'meta_key' => 'enclosure', 'meta_value' => $meta_value) ); - do_action( 'added_postmeta', $wpdb->insert_id, $post_ID, 'enclosure', $meta_value ); + add_post_meta( $post_ID, 'enclosure', "$url\n$len\n$mime\n" ); } } } @@ -1391,7 +598,7 @@ function _http_build_query($data, $prefix=null, $sep=null, $key='', $urlencode=t $k = $prefix.$k; if ( !empty($key) ) $k = $key . '%5B' . $k . '%5D'; - if ( $v === NULL ) + if ( $v === null ) continue; elseif ( $v === FALSE ) $v = '0'; @@ -1404,7 +611,7 @@ function _http_build_query($data, $prefix=null, $sep=null, $key='', $urlencode=t array_push($ret, $k.'='.$v); } - if ( NULL === $sep ) + if ( null === $sep ) $sep = ini_get('arg_separator.output'); return implode($sep, $ret); @@ -1417,8 +624,9 @@ function _http_build_query($data, $prefix=null, $sep=null, $key='', $urlencode=t * using this function. You can also retrieve the full URL with query data. * * Adding a single key & value or an associative array. Setting a key value to - * emptystring removes the key. Omitting oldquery_or_uri uses the $_SERVER - * value. + * 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(). * * @since 1.5.0 * @@ -1794,7 +1002,7 @@ function do_feed_rdf() { } /** - * Load the RSS 1.0 Feed Template + * Load the RSS 1.0 Feed Template. * * @since 2.1.0 */ @@ -1831,27 +1039,28 @@ function do_feed_atom( $for_comments ) { } /** - * Display the robot.txt file content. + * Display the robots.txt file content. * * The echo content should be with usage of the permalinks or for creating the - * robot.txt file. + * robots.txt file. * * @since 2.1.0 - * @uses do_action() Calls 'do_robotstxt' hook for displaying robot.txt rules. + * @uses do_action() Calls 'do_robotstxt' hook for displaying robots.txt rules. */ function do_robots() { header( 'Content-Type: text/plain; charset=utf-8' ); do_action( 'do_robotstxt' ); - $output = ''; + $output = "User-agent: *\n"; $public = get_option( 'blog_public' ); - if ( '0' == $public ) { - $output .= "User-agent: *\n"; + if ( '0' == $public ) { $output .= "Disallow: /\n"; } else { - $output .= "User-agent: *\n"; - $output .= "Disallow:\n"; + $site_url = parse_url( site_url() ); + $path = ( !empty( $site_url['path'] ) ) ? $site_url['path'] : ''; + $output .= "Disallow: $path/wp-admin/\n"; + $output .= "Disallow: $path/wp-includes/\n"; } echo apply_filters('robots_txt', $output, $public); @@ -1895,32 +1104,37 @@ function is_blog_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(); - $tables = $wpdb->get_col('SHOW TABLES'); - $wpdb->suppress_errors( $suppress ); - $wp_tables = $wpdb->tables(); - // Loop over the WP tables. If none exist, then scratch install is allowed. + // Loop over the WP tables. If none exist, then scratch install is allowed. // If one or more exist, suggest table repair since we got here because the options // table could not be accessed. + $wp_tables = $wpdb->tables(); foreach ( $wp_tables as $table ) { - // If one of the WP tables exist, then we are in an insane state. - if ( in_array( $table, $tables ) ) { - // The existence of custom user tables shouldn't suggest an insane state or prevent a clean install. - if ( defined( 'CUSTOM_USER_TABLE' ) && CUSTOM_USER_TABLE == $table ) - continue; - if ( defined( 'CUSTOM_USER_META_TABLE' ) && CUSTOM_USER_META_TABLE == $table ) - continue; + // The existence of custom user tables shouldn't suggest an insane state or prevent a clean install. + if ( defined( 'CUSTOM_USER_TABLE' ) && CUSTOM_USER_TABLE == $table ) + continue; + if ( defined( 'CUSTOM_USER_META_TABLE' ) && CUSTOM_USER_META_TABLE == $table ) + continue; - // If visiting repair.php, return true and let it take over. - if ( defined('WP_REPAIRING') ) - return true; - // Die with a DB error. - $wpdb->error = sprintf( /*WP_I18N_NO_TABLES*/'One or more database tables are unavailable. The database may need to be repaired.'/*/WP_I18N_NO_TABLES*/, 'maint/repair.php?referrer=is_blog_installed' ); - dead_db(); - } + if ( ! $wpdb->get_results( "DESCRIBE $table;" ) ) + continue; + + // One or more tables exist. We are insane. + + wp_load_translations_early(); + + // Die with a DB error. + $wpdb->error = sprintf( __( 'One or more database tables are unavailable. The database may need to be repaired.' ), 'maint/repair.php?referrer=is_blog_installed' ); + dead_db(); } + $wpdb->suppress_errors( $suppress ); + wp_cache_set( 'is_blog_installed', false ); return false; @@ -2030,7 +1244,8 @@ function wp_original_referer_field( $echo = true, $jump_back_to = 'current' ) { } /** - * Retrieve referer from '_wp_http_referer', HTTP referer, or current page respectively. + * Retrieve referer from '_wp_http_referer' or HTTP referer. If it's the same + * as the current request URL, will return false. * * @package WordPress * @subpackage Security @@ -2039,13 +1254,13 @@ function wp_original_referer_field( $echo = true, $jump_back_to = 'current' ) { * @return string|bool False on failure. Referer URL on success. */ function wp_get_referer() { - $ref = ''; + $ref = false; if ( ! empty( $_REQUEST['_wp_http_referer'] ) ) $ref = $_REQUEST['_wp_http_referer']; else if ( ! empty( $_SERVER['HTTP_REFERER'] ) ) $ref = $_SERVER['HTTP_REFERER']; - if ( $ref !== $_SERVER['REQUEST_URI'] ) + if ( $ref && $ref !== $_SERVER['REQUEST_URI'] ) return $ref; return false; } @@ -2125,7 +1340,7 @@ function path_is_absolute( $path ) { return true; // a path starting with / or \ is absolute; anything else is relative - return (bool) preg_match('#^[/\\\\]#', $path); + return ( $path[0] == '/' || $path[0] == '\\' ); } /** @@ -2271,7 +1486,12 @@ function wp_upload_dir( $time = null ) { // Make sure we have an uploads dir if ( ! wp_mkdir_p( $uploads['path'] ) ) { - $message = sprintf( __( 'Unable to create directory %s. Is its parent directory writable by the server?' ), $uploads['path'] ); + if ( 0 === strpos( $uploads['basedir'], ABSPATH ) ) + $error_path = str_replace( ABSPATH, '', $uploads['basedir'] ) . $uploads['subdir']; + else + $error_path = basename( $uploads['basedir'] ) . $uploads['subdir']; + + $message = sprintf( __( 'Unable to create directory %s. Is its parent directory writable by the server?' ), $error_path ); return array( 'error' => $message ); } @@ -2389,7 +1609,12 @@ function wp_upload_bits( $name, $deprecated, $bits, $time = null ) { $new_file = $upload['path'] . "/$filename"; if ( ! wp_mkdir_p( dirname( $new_file ) ) ) { - $message = sprintf( __( 'Unable to create directory %s. Is its parent directory writable by the server?' ), dirname( $new_file ) ); + if ( 0 === strpos( $upload['basedir'], ABSPATH ) ) + $error_path = str_replace( ABSPATH, '', $upload['basedir'] ) . $upload['subdir']; + else + $error_path = basename( $upload['basedir'] ) . $upload['subdir']; + + $message = sprintf( __( 'Unable to create directory %s. Is its parent directory writable by the server?' ), $error_path ); return array( 'error' => $message ); } @@ -2432,7 +1657,7 @@ function wp_ext2type( $ext ) { 'spreadsheet' => array( 'numbers', 'ods', 'xls', 'xlsx', 'xlsb', 'xlsm' ), 'interactive' => array( 'key', 'ppt', 'pptx', 'pptm', 'odp', 'swf' ), 'text' => array( 'asc', 'csv', 'tsv', 'txt' ), - 'archive' => array( 'bz2', 'cab', 'dmg', 'gz', 'rar', 'sea', 'sit', 'sqx', 'tar', 'tgz', 'zip' ), + 'archive' => array( 'bz2', 'cab', 'dmg', 'gz', 'rar', 'sea', 'sit', 'sqx', 'tar', 'tgz', 'zip', '7z' ), 'code' => array( 'css', 'htm', 'html', 'php', 'js' ), )); foreach ( $ext2type as $type => $exts ) @@ -2598,6 +1823,8 @@ function get_allowed_mime_types() { 'tar' => 'application/x-tar', 'zip' => 'application/zip', 'gz|gzip' => 'application/x-gzip', + 'rar' => 'application/rar', + '7z' => 'application/x-7z-compressed', 'exe' => 'application/x-msdownload', // openoffice formats 'odt' => 'application/vnd.oasis.opendocument.text', @@ -2618,99 +1845,19 @@ function get_allowed_mime_types() { /** * Retrieve nonce action "Are you sure" message. * - * The action is split by verb and noun. The action format is as follows: - * verb-action_extra. The verb is before the first dash and has the format of - * letters and no spaces and numbers. The noun is after the dash and before the - * underscore, if an underscore exists. The noun is also only letters. - * - * The filter will be called for any action, which is not defined by WordPress. - * You may use the filter for your plugin to explain nonce actions to the user, - * when they get the "Are you sure?" message. The filter is in the format of - * 'explain_nonce_$verb-$noun' with the $verb replaced by the found verb and the - * $noun replaced by the found noun. The two parameters that are given to the - * hook are the localized "Are you sure you want to do this?" message with the - * extra text (the text after the underscore). + * Deprecated in 3.4.1 and 3.5.0. Backported to 3.3.3. * - * @package WordPress - * @subpackage Security * @since 2.0.4 + * @deprecated 3.4.1 + * @deprecated Use wp_nonce_ays() + * @see wp_nonce_ays() * * @param string $action Nonce action. * @return string Are you sure message. */ function wp_explain_nonce( $action ) { - if ( $action !== -1 && preg_match( '/([a-z]+)-([a-z]+)(_(.+))?/', $action, $matches ) ) { - $verb = $matches[1]; - $noun = $matches[2]; - - $trans = array(); - $trans['update']['attachment'] = array( __( 'Your attempt to edit this attachment: “%s” has failed.' ), 'get_the_title' ); - - $trans['add']['category'] = array( __( 'Your attempt to add this category has failed.' ), false ); - $trans['delete']['category'] = array( __( 'Your attempt to delete this category: “%s” has failed.' ), 'get_cat_name' ); - $trans['update']['category'] = array( __( 'Your attempt to edit this category: “%s” has failed.' ), 'get_cat_name' ); - - $trans['delete']['comment'] = array( __( 'Your attempt to delete this comment: “%s” has failed.' ), 'use_id' ); - $trans['unapprove']['comment'] = array( __( 'Your attempt to unapprove this comment: “%s” has failed.' ), 'use_id' ); - $trans['approve']['comment'] = array( __( 'Your attempt to approve this comment: “%s” has failed.' ), 'use_id' ); - $trans['update']['comment'] = array( __( 'Your attempt to edit this comment: “%s” has failed.' ), 'use_id' ); - $trans['bulk']['comments'] = array( __( 'Your attempt to bulk modify comments has failed.' ), false ); - $trans['moderate']['comments'] = array( __( 'Your attempt to moderate comments has failed.' ), false ); - - $trans['add']['bookmark'] = array( __( 'Your attempt to add this link has failed.' ), false ); - $trans['delete']['bookmark'] = array( __( 'Your attempt to delete this link: “%s” has failed.' ), 'use_id' ); - $trans['update']['bookmark'] = array( __( 'Your attempt to edit this link: “%s” has failed.' ), 'use_id' ); - $trans['bulk']['bookmarks'] = array( __( 'Your attempt to bulk modify links has failed.' ), false ); - - $trans['add']['page'] = array( __( 'Your attempt to add this page has failed.' ), false ); - $trans['delete']['page'] = array( __( 'Your attempt to delete this page: “%s” has failed.' ), 'get_the_title' ); - $trans['update']['page'] = array( __( 'Your attempt to edit this page: “%s” has failed.' ), 'get_the_title' ); - - $trans['edit']['plugin'] = array( __( 'Your attempt to edit this plugin file: “%s” has failed.' ), 'use_id' ); - $trans['activate']['plugin'] = array( __( 'Your attempt to activate this plugin: “%s” has failed.' ), 'use_id' ); - $trans['deactivate']['plugin'] = array( __( 'Your attempt to deactivate this plugin: “%s” has failed.' ), 'use_id' ); - $trans['upgrade']['plugin'] = array( __( 'Your attempt to update this plugin: “%s” has failed.' ), 'use_id' ); - - $trans['add']['post'] = array( __( 'Your attempt to add this post has failed.' ), false ); - $trans['delete']['post'] = array( __( 'Your attempt to delete this post: “%s” has failed.' ), 'get_the_title' ); - $trans['update']['post'] = array( __( 'Your attempt to edit this post: “%s” has failed.' ), 'get_the_title' ); - - $trans['add']['user'] = array( __( 'Your attempt to add this user has failed.' ), false ); - $trans['delete']['users'] = array( __( 'Your attempt to delete users has failed.' ), false ); - $trans['bulk']['users'] = array( __( 'Your attempt to bulk modify users has failed.' ), false ); - $trans['update']['user'] = array( __( 'Your attempt to edit this user: “%s” has failed.' ), 'get_the_author_meta', 'display_name' ); - $trans['update']['profile'] = array( __( 'Your attempt to modify the profile for: “%s” has failed.' ), 'get_the_author_meta', 'display_name' ); - - $trans['update']['options'] = array( __( 'Your attempt to edit your settings has failed.' ), false ); - $trans['update']['permalink'] = array( __( 'Your attempt to change your permalink structure to: %s has failed.' ), 'use_id' ); - $trans['edit']['file'] = array( __( 'Your attempt to edit this file: “%s” has failed.' ), 'use_id' ); - $trans['edit']['theme'] = array( __( 'Your attempt to edit this theme file: “%s” has failed.' ), 'use_id' ); - $trans['switch']['theme'] = array( __( 'Your attempt to switch to this theme: “%s” has failed.' ), 'use_id' ); - - $trans['log']['out'] = array( sprintf( __( 'You are attempting to log out of %s' ), get_bloginfo( 'sitename' ) ), false ); - - if ( isset( $trans[$verb][$noun] ) ) { - if ( !empty( $trans[$verb][$noun][1] ) ) { - $lookup = $trans[$verb][$noun][1]; - if ( isset($trans[$verb][$noun][2]) ) - $lookup_value = $trans[$verb][$noun][2]; - $object = $matches[4]; - if ( 'use_id' != $lookup ) { - if ( isset( $lookup_value ) ) - $object = call_user_func( $lookup, $lookup_value, $object ); - else - $object = call_user_func( $lookup, $object ); - } - return sprintf( $trans[$verb][$noun][0], esc_html($object) ); - } else { - return $trans[$verb][$noun][0]; - } - } - - return apply_filters( 'explain_nonce_' . $verb . '-' . $noun, __( 'Are you sure you want to do this?' ), isset($matches[4]) ? $matches[4] : '' ); - } else { - return apply_filters( 'explain_nonce_' . $action, __( 'Are you sure you want to do this?' ) ); - } + _deprecated_function( __FUNCTION__, '3.4.1', 'wp_nonce_ays()' ); + return __( 'Are you sure you want to do this?' ); } /** @@ -2727,16 +1874,18 @@ function wp_explain_nonce( $action ) { */ function wp_nonce_ays( $action ) { $title = __( 'WordPress Failure Notice' ); - $html = esc_html( wp_explain_nonce( $action ) ); - if ( 'log-out' == $action ) - $html .= "
" . sprintf( __( "Do you really want to log out?"), wp_logout_url() ); - elseif ( wp_get_referer() ) - $html .= "
" . __( 'Please try again.' ) . ""; + if ( 'log-out' == $action ) { + $html = sprintf( __( 'You are attempting to log out of %s' ), get_bloginfo( 'name' ) ) . '
'; + $html .= sprintf( __( "Do you really want to log out?"), wp_logout_url() ); + } else { + $html = __( 'Are you sure you want to do this?' ); + if ( wp_get_referer() ) + $html .= "
" . __( 'Please try again.' ) . ""; + } wp_die( $html, $title, array('response' => 403) ); } - /** * Kill WordPress execution and display HTML message with error message. * @@ -2744,23 +1893,23 @@ function wp_nonce_ays( $action ) { * 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 siliently. + * as possible silently. * * @since 2.0.4 * * @param string $message Error message. * @param string $title Error title. - * @param string|array $args Optional arguements to control behaviour. + * @param string|array $args Optional arguments to control behavior. */ -function wp_die( $message, $title = '', $args = array() ) { +function wp_die( $message = '', $title = '', $args = array() ) { if ( defined( 'DOING_AJAX' ) && DOING_AJAX ) - die('-1'); - - if ( function_exists( 'apply_filters' ) ) { - $function = apply_filters( 'wp_die_handler', '_default_wp_die_handler'); - } else { - $function = '_default_wp_die_handler'; - } + $function = apply_filters( 'wp_die_ajax_handler', '_ajax_wp_die_handler' ); + elseif ( defined( 'XMLRPC_REQUEST' ) && XMLRPC_REQUEST ) + $function = apply_filters( 'wp_die_xmlrpc_handler', '_xmlrpc_wp_die_handler' ); + elseif ( defined( 'APP_REQUEST' ) && APP_REQUEST ) + $function = apply_filters( 'wp_die_app_handler', '_scalar_wp_die_handler' ); + else + $function = apply_filters( 'wp_die_handler', '_default_wp_die_handler' ); call_user_func( $function, $message, $title, $args ); } @@ -2776,7 +1925,7 @@ function wp_die( $message, $title = '', $args = array() ) { * * @param string $message Error message. * @param string $title Error title. - * @param string|array $args Optional arguements to control behaviour. + * @param string|array $args Optional arguments to control behavior. */ function _default_wp_die_handler( $message, $title = '', $args = array() ) { $defaults = array( 'response' => 500 ); @@ -2808,48 +1957,123 @@ function _default_wp_die_handler( $message, $title = '', $args = array() ) { if ( isset( $r['back_link'] ) && $r['back_link'] ) { $back_text = $have_gettext? __('« Back') : '« Back'; - $message .= "\n
"; + $message .= "\n"; } - if ( defined( 'WP_SITEURL' ) && '' != WP_SITEURL ) - $admin_dir = WP_SITEURL . '/wp-admin/'; - elseif ( function_exists( 'get_bloginfo' ) && '' != get_bloginfo( 'wpurl' ) ) - $admin_dir = get_bloginfo( 'wpurl' ) . '/wp-admin/'; - elseif ( strpos( $_SERVER['PHP_SELF'], 'wp-admin' ) !== false ) - $admin_dir = ''; - else - $admin_dir = 'wp-admin/'; - - if ( !function_exists( 'did_action' ) || !did_action( 'admin_head' ) ) : - if ( !headers_sent() ) { - status_header( $r['response'] ); - nocache_headers(); - header( 'Content-Type: text/html; charset=utf-8' ); - } + if ( ! did_action( 'admin_head' ) ) : + if ( !headers_sent() ) { + status_header( $r['response'] ); + nocache_headers(); + header( 'Content-Type: text/html; charset=utf-8' ); + } - if ( empty($title) ) - $title = $have_gettext ? __('WordPress › Error') : 'WordPress › Error'; + if ( empty($title) ) + $title = $have_gettext ? __('WordPress › Error') : 'WordPress › Error'; - $text_direction = 'ltr'; - if ( isset($r['text_direction']) && 'rtl' == $r['text_direction'] ) - $text_direction = 'rtl'; - elseif ( function_exists( 'is_rtl' ) && is_rtl() ) - $text_direction = 'rtl'; + $text_direction = 'ltr'; + if ( isset($r['text_direction']) && 'rtl' == $r['text_direction'] ) + $text_direction = 'rtl'; + elseif ( function_exists( 'is_rtl' ) && is_rtl() ) + $text_direction = 'rtl'; ?> - - + + >