2003-04-21 21:37:11 +00:00
<? php
2008-06-15 09:38:32 +00:00
/**
* Main WordPress API
*
* @package WordPress
*/
2003-04-21 21:37:11 +00:00
2008-06-15 09:38:32 +00:00
/**
* Converts MySQL DATETIME field to user specified date 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.
*
* 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.
*
* @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).
*/
2007-10-11 05:46:57 +00:00
function mysql2date ( $dateformatstring , $mysqlstring , $translate = true ) {
2003-04-21 21:37:11 +00:00
$m = $mysqlstring ;
2007-10-11 05:46:57 +00:00
if ( empty ( $m ) )
2003-04-21 21:37:11 +00:00
return false ;
2008-03-02 20:17:30 +00:00
2010-06-29 23:54:39 +00:00
if ( 'G' == $dateformatstring )
2009-01-22 21:05:55 +00:00
return strtotime ( $m . ' +0000' );
2008-03-02 20:17:30 +00:00
2009-01-22 21:05:55 +00:00
$i = strtotime ( $m );
2006-02-12 07:53:23 +00:00
2010-01-11 22:08:49 +00:00
if ( 'U' == $dateformatstring )
2006-03-07 21:24:49 +00:00
return $i ;
2006-11-19 07:56:05 +00:00
2010-06-29 23:54:39 +00:00
if ( $translate )
2010-06-29 23:52:33 +00:00
return date_i18n ( $dateformatstring , $i );
2009-02-04 21:45:55 +00:00
else
2010-06-29 23:52:33 +00:00
return date ( $dateformatstring , $i );
2003-04-21 21:37:11 +00:00
}
2008-06-15 09:38:32 +00:00
/**
* Retrieve the current time based on specified type.
*
* The 'mysql' type will return the time in the format for MySQL DATETIME field.
* The 'timestamp' type will return the current timestamp.
*
2009-02-03 23:04:31 +00:00
* If $gmt is set to either '1' or 'true', then both types will use GMT time.
* if $gmt is false, the output is adjusted with the GMT offset in the WordPress option.
2008-06-15 09:38:32 +00:00
*
* @since 1.0.0
*
* @param string $type Either 'mysql' or 'timestamp'.
2009-02-03 23:04:31 +00:00
* @param int|bool $gmt Optional. Whether to use GMT timezone. Default is false.
2008-08-10 16:45:50 +00:00
* @return int|string String if $type is 'gmt', int if $type is 'timestamp'.
2008-06-15 09:38:32 +00:00
*/
2007-10-11 05:46:57 +00:00
function current_time ( $type , $gmt = 0 ) {
switch ( $type ) {
2003-11-15 08:58:18 +00:00
case 'mysql' :
2007-10-11 05:46:57 +00:00
return ( $gmt ) ? gmdate ( 'Y-m-d H:i:s' ) : gmdate ( 'Y-m-d H:i:s' , ( time () + ( get_option ( 'gmt_offset' ) * 3600 ) ) );
2003-11-15 08:58:18 +00:00
break ;
case 'timestamp' :
2007-10-11 05:46:57 +00:00
return ( $gmt ) ? time () : time () + ( get_option ( 'gmt_offset' ) * 3600 );
2003-11-15 08:58:18 +00:00
break ;
}
}
2008-06-30 03:23:44 +00:00
/**
* Retrieve the date in localized format, based on timestamp.
*
* 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.
*
* @since 0.71
*
2009-01-22 21:05:55 +00:00
* @param string $dateformatstring Format to display the date.
* @param int $unixtimestamp Optional. Unix timestamp.
* @param bool $gmt Optional, default is false. Whether to convert to GMT for time.
2008-06-30 03:23:44 +00:00
* @return string The date, translated if locale specifies it.
*/
2008-11-11 20:40:36 +00:00
function date_i18n ( $dateformatstring , $unixtimestamp = false , $gmt = false ) {
2006-04-02 00:20:11 +00:00
global $wp_locale ;
2005-10-10 09:25:38 +00:00
$i = $unixtimestamp ;
2008-06-26 18:34:28 +00:00
// Sanity check for PHP 5.1.0-
2008-11-17 21:31:46 +00:00
if ( false === $i || intval ( $i ) < 0 ) {
if ( ! $gmt )
$i = current_time ( 'timestamp' );
else
$i = time ();
// we should not let date() interfere with our
// specially computed timestamp
$gmt = true ;
}
2009-04-20 18:18:39 +00:00
2009-04-08 19:56:58 +00:00
// store original value for language with untypical grammars
// see http://core.trac.wordpress.org/ticket/9396
$req_format = $dateformatstring ;
2009-04-20 18:18:39 +00:00
2008-11-17 21:31:46 +00:00
$datefunc = $gmt ? 'gmdate' : 'date' ;
2008-08-09 04:51:51 +00:00
2007-10-11 05:46:57 +00:00
if ( ( ! empty ( $wp_locale -> month ) ) && ( ! empty ( $wp_locale -> weekday ) ) ) {
2008-11-17 21:31:46 +00:00
$datemonth = $wp_locale -> get_month ( $datefunc ( 'm' , $i ) );
2007-10-11 05:46:57 +00:00
$datemonth_abbrev = $wp_locale -> get_month_abbrev ( $datemonth );
2008-11-17 21:31:46 +00:00
$dateweekday = $wp_locale -> get_weekday ( $datefunc ( 'w' , $i ) );
2007-10-11 05:46:57 +00:00
$dateweekday_abbrev = $wp_locale -> get_weekday_abbrev ( $dateweekday );
2008-11-17 21:31:46 +00:00
$datemeridiem = $wp_locale -> get_meridiem ( $datefunc ( 'a' , $i ) );
$datemeridiem_capital = $wp_locale -> get_meridiem ( $datefunc ( 'A' , $i ) );
2003-04-21 21:37:11 +00:00
$dateformatstring = ' ' . $dateformatstring ;
2007-10-11 05:46:57 +00:00
$dateformatstring = preg_replace ( "/([^ \\ \])D/" , " \\ 1" . backslashit ( $dateweekday_abbrev ), $dateformatstring );
$dateformatstring = preg_replace ( "/([^ \\ \])F/" , " \\ 1" . backslashit ( $datemonth ), $dateformatstring );
$dateformatstring = preg_replace ( "/([^ \\ \])l/" , " \\ 1" . backslashit ( $dateweekday ), $dateformatstring );
$dateformatstring = preg_replace ( "/([^ \\ \])M/" , " \\ 1" . backslashit ( $datemonth_abbrev ), $dateformatstring );
$dateformatstring = preg_replace ( "/([^ \\ \])a/" , " \\ 1" . backslashit ( $datemeridiem ), $dateformatstring );
$dateformatstring = preg_replace ( "/([^ \\ \])A/" , " \\ 1" . backslashit ( $datemeridiem_capital ), $dateformatstring );
$dateformatstring = substr ( $dateformatstring , 1 , strlen ( $dateformatstring ) - 1 );
2003-04-21 21:37:11 +00:00
}
2010-11-05 11:19:06 +00:00
$timezone_formats = array ( 'P' , 'I' , 'O' , 'T' , 'Z' , 'e' );
2010-11-17 18:47:34 +00:00
$timezone_formats_re = implode ( '|' , $timezone_formats );
2010-11-05 11:19:06 +00:00
if ( preg_match ( "/ $timezone_formats_re /" , $dateformatstring ) && wp_timezone_supported () ) {
$timezone_string = get_option ( 'timezone_string' );
if ( $timezone_string ) {
$timezone_object = timezone_open ( $timezone_string );
$date_object = date_create ( null , $timezone_object );
foreach ( $timezone_formats as $timezone_format ) {
if ( false !== strpos ( $dateformatstring , $timezone_format ) ) {
$formatted = date_format ( $date_object , $timezone_format );
$dateformatstring = ' ' . $dateformatstring ;
$dateformatstring = preg_replace ( "/([^ \\ \]) $timezone_format /" , " \\ 1" . backslashit ( $formatted ), $dateformatstring );
$dateformatstring = substr ( $dateformatstring , 1 , strlen ( $dateformatstring ) - 1 );
}
2010-11-17 18:47:34 +00:00
}
2010-11-05 11:19:06 +00:00
}
2010-11-17 18:47:34 +00:00
}
2008-11-17 21:31:46 +00:00
$j = @ $datefunc ( $dateformatstring , $i );
2009-04-08 19:56:58 +00:00
// allow plugins to redo this entirely for languages with untypical grammars
2009-05-14 02:00:32 +00:00
$j = apply_filters ( 'date_i18n' , $j , $req_format , $i , $gmt );
2003-04-21 21:37:11 +00:00
return $j ;
2006-04-02 00:20:11 +00:00
}
2003-04-21 21:37:11 +00:00
2008-06-15 09:38:32 +00:00
/**
2010-04-21 21:41:20 +00:00
* Convert integer number to format based on the locale.
2008-06-15 09:38:32 +00:00
*
* @since 2.3.0
*
2010-04-21 21:41:20 +00:00
* @param int $number The number to convert based on locale.
2010-04-22 21:39:37 +00:00
* @param int $decimals Precision of the number of decimal places.
2008-06-15 09:38:32 +00:00
* @return string Converted number in string format.
*/
2010-04-22 21:39:37 +00:00
function number_format_i18n ( $number , $decimals = 0 ) {
2007-04-25 00:49:57 +00:00
global $wp_locale ;
2010-04-22 21:39:37 +00:00
$formatted = number_format ( $number , absint ( $decimals ), $wp_locale -> number_format [ 'decimal_point' ], $wp_locale -> number_format [ 'thousands_sep' ] );
2010-04-21 21:41:20 +00:00
return apply_filters ( 'number_format_i18n' , $formatted );
2007-04-25 00:49:57 +00:00
}
2008-06-15 09:38:32 +00:00
/**
* Convert number of bytes largest unit bytes will fit into.
*
* It is easier to read 1kB than 1024 bytes and 1MB than 1048576 bytes. Converts
* 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.
* @link http://en.wikipedia.org/wiki/Byte
*
* @since 2.3.0
*
* @param int|string $bytes Number of bytes. Note max integer size for integers.
2010-04-21 21:41:20 +00:00
* @param int $decimals Precision of number of decimal places. Deprecated.
2008-08-10 16:45:50 +00:00
* @return bool|string False on failure. Number string on success.
2008-06-15 09:38:32 +00:00
*/
2010-04-22 21:39:37 +00:00
function size_format ( $bytes , $decimals = 0 ) {
2007-07-15 17:52:50 +00:00
$quant = array (
2007-10-11 05:46:57 +00:00
// ========================= Origin ====
'TB' => 1099511627776 , // pow( 1024, 4)
'GB' => 1073741824 , // pow( 1024, 3)
'MB' => 1048576 , // pow( 1024, 2)
'kB' => 1024 , // pow( 1024, 1)
'B ' => 1 , // pow( 1024, 0)
2007-07-15 17:52:50 +00:00
);
2007-10-11 05:46:57 +00:00
foreach ( $quant as $unit => $mag )
2008-01-28 04:55:54 +00:00
if ( doubleval ( $bytes ) >= $mag )
2010-04-22 21:39:37 +00:00
return number_format_i18n ( $bytes / $mag , $decimals ) . ' ' . $unit ;
2008-01-28 04:55:54 +00:00
return false ;
2007-07-15 17:52:50 +00:00
}
2008-08-09 04:51:51 +00:00
/**
* 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 $start_of_week Optional. Start of the week as an integer.
* @return array Keys are 'start' and 'end'.
*/
2007-12-06 19:49:33 +00:00
function get_weekstartend ( $mysqlstring , $start_of_week = '' ) {
2008-08-09 04:51:51 +00:00
$my = substr ( $mysqlstring , 0 , 4 ); // Mysql string Year
$mm = substr ( $mysqlstring , 8 , 2 ); // Mysql string Month
$md = substr ( $mysqlstring , 5 , 2 ); // Mysql string day
$day = mktime ( 0 , 0 , 0 , $md , $mm , $my ); // The timestamp for mysqlstring day.
$weekday = date ( 'w' , $day ); // The day of the week from the timestamp
2010-01-11 22:08:49 +00:00
if ( ! is_numeric ( $start_of_week ) )
2007-12-06 19:49:33 +00:00
$start_of_week = get_option ( 'start_of_week' );
2005-04-10 20:07:46 +00:00
2007-12-06 19:49:33 +00:00
if ( $weekday < $start_of_week )
2010-05-07 05:01:29 +00:00
$weekday += 7 ;
2005-04-10 20:07:46 +00:00
2010-05-07 05:01:29 +00:00
$start = $day - 86400 * ( $weekday - $start_of_week ); // The most recent week start day on or before $day
$end = $start + 604799 ; // $start + 7 days - 1 second
return compact ( 'start' , 'end' );
2003-04-21 21:37:11 +00:00
}
2008-06-15 09:38:32 +00:00
/**
* Unserialize value only if it was serialized.
*
* @since 2.0.0
*
* @param string $original Maybe unserialized original, if is needed.
* @return mixed Unserialized data can be any type.
*/
2007-10-11 05:46:57 +00:00
function maybe_unserialize ( $original ) {
if ( is_serialized ( $original ) ) // don't attempt to unserialize data that wasn't serialized going in
2009-04-16 21:03:18 +00:00
return @ unserialize ( $original );
2006-10-12 23:54:36 +00:00
return $original ;
}
2008-06-15 09:38:32 +00:00
/**
* 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 mixed $data Value to check to see if was serialized.
* @return bool False if not serialized and true if it was.
*/
2007-10-11 05:46:57 +00:00
function is_serialized ( $data ) {
2009-12-22 13:42:58 +00:00
// if it isn't a string, it isn't serialized
2010-11-11 16:10:16 +00:00
if ( ! is_string ( $data ) )
2009-12-22 13:42:58 +00:00
return false ;
$data = trim ( $data );
2010-09-20 18:11:06 +00:00
if ( 'N;' == $data )
2009-12-22 13:42:58 +00:00
return true ;
2010-11-11 16:10:16 +00:00
$length = strlen ( $data );
if ( $length < 4 )
2009-12-22 13:42:58 +00:00
return false ;
2010-11-11 16:10:16 +00:00
if ( ':' !== $data [ 1 ] )
return false ;
$lastc = $data [ $length - 1 ];
if ( ';' !== $lastc && '}' !== $lastc )
return false ;
$token = $data [ 0 ];
switch ( $token ) {
case 's' :
if ( '"' !== $data [ $length - 2 ] )
return false ;
2009-12-22 13:42:58 +00:00
case 'a' :
case 'O' :
2010-11-11 16:10:16 +00:00
return ( bool ) preg_match ( "/^ { $token } :[0-9]+:/s" , $data );
2009-12-22 13:42:58 +00:00
case 'b' :
case 'i' :
case 'd' :
2010-11-11 16:10:16 +00:00
return ( bool ) preg_match ( "/^ { $token } :[0-9.E-]+; \$ /" , $data );
2009-12-22 13:42:58 +00:00
}
return false ;
2006-10-12 23:54:36 +00:00
}
2008-06-15 09:38:32 +00:00
/**
* Check whether serialized data is of string type.
*
* @since 2.0.5
*
* @param mixed $data Serialized data
* @return bool False if not a serialized string, true if it is.
*/
2007-10-11 05:46:57 +00:00
function is_serialized_string ( $data ) {
2006-10-31 08:24:09 +00:00
// if it isn't a string, it isn't a serialized string
2007-10-11 05:46:57 +00:00
if ( ! is_string ( $data ) )
2006-10-12 23:54:36 +00:00
return false ;
2007-10-11 05:46:57 +00:00
$data = trim ( $data );
if ( preg_match ( '/^s:[0-9]+:.*;$/s' , $data ) ) // this should fetch all serialized strings
2006-10-12 23:54:36 +00:00
return true ;
return false ;
2005-11-29 07:58:50 +00:00
}
2008-06-15 09:38:32 +00:00
/**
2010-02-14 07:21:15 +00:00
* Retrieve option value based on name of option.
2008-06-15 09:38:32 +00:00
*
2008-06-30 03:23:44 +00:00
* 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.
*
2010-02-14 07:21:15 +00:00
* If the option was serialized then it will be unserialized when it is returned.
2008-08-10 16:45:50 +00:00
*
2008-06-15 09:38:32 +00:00
* @since 1.5.0
* @package WordPress
* @subpackage Option
2010-02-14 07:21:15 +00:00
* @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.
2008-06-15 09:38:32 +00:00
*
2010-03-11 21:49:56 +00:00
* @param string $option Name of option to retrieve. Expected to not be SQL-escaped.
2008-06-15 09:38:32 +00:00
* @return mixed Value set for the option.
*/
2010-02-14 06:17:42 +00:00
function get_option ( $option , $default = false ) {
2005-11-09 21:30:40 +00:00
global $wpdb ;
2004-02-17 04:56:29 +00:00
2007-01-30 18:34:18 +00:00
// Allow plugins to short-circuit options.
2010-02-14 06:17:42 +00:00
$pre = apply_filters ( 'pre_option_' . $option , false );
2007-09-03 23:32:58 +00:00
if ( false !== $pre )
return $pre ;
2007-01-30 18:34:18 +00:00
2010-03-28 03:10:37 +00:00
$option = trim ( $option );
if ( empty ( $option ) )
return false ;
2010-05-03 06:28:05 +00:00
if ( defined ( 'WP_SETUP_CONFIG' ) )
return false ;
2010-05-08 18:05:16 +00:00
if ( ! defined ( 'WP_INSTALLING' ) ) {
// prevent non-existent options from triggering multiple queries
2010-01-11 22:08:49 +00:00
$notoptions = wp_cache_get ( 'notoptions' , 'options' );
2010-02-14 06:17:42 +00:00
if ( isset ( $notoptions [ $option ] ) )
2010-01-11 22:08:49 +00:00
return $default ;
2007-02-01 08:53:08 +00:00
2010-02-05 17:59:24 +00:00
$alloptions = wp_load_alloptions ();
2007-02-01 08:53:08 +00:00
2010-05-08 18:05:16 +00:00
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 ;
2010-05-07 18:32:20 +00:00
wp_cache_add ( $option , $value , 'options' );
2010-05-08 18:05:16 +00:00
} else { // option does not exist, so we must cache its non-existence
$notoptions [ $option ] = true ;
wp_cache_set ( 'notoptions' , $notoptions , 'options' );
return $default ;
}
2007-02-01 08:53:08 +00:00
}
2005-11-14 09:08:27 +00:00
}
2010-05-08 18:05:16 +00:00
} 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 ;
2005-11-09 21:30:40 +00:00
}
2004-09-29 20:33:05 +00:00
2005-11-09 21:30:40 +00:00
// If home is not set use siteurl.
2010-02-14 06:17:42 +00:00
if ( 'home' == $option && '' == $value )
2007-10-11 05:46:57 +00:00
return get_option ( 'siteurl' );
2004-09-29 20:33:05 +00:00
2010-02-14 06:17:42 +00:00
if ( in_array ( $option , array ( 'siteurl' , 'home' , 'category_base' , 'tag_base' ) ) )
2007-10-11 05:46:57 +00:00
$value = untrailingslashit ( $value );
2004-11-28 19:53:11 +00:00
2010-02-14 06:17:42 +00:00
return apply_filters ( 'option_' . $option , maybe_unserialize ( $value ) );
2003-04-21 21:37:11 +00:00
}
2008-06-15 09:38:32 +00:00
/**
* Protect WordPress special option from being modified.
*
2008-08-10 16:45:50 +00:00
* Will die if $option is in protected list. Protected options are 'alloptions'
* and 'notoptions' options.
2008-06-15 09:38:32 +00:00
*
* @since 2.2.0
* @package WordPress
* @subpackage Option
*
* @param string $option Option name.
*/
2007-10-11 05:46:57 +00:00
function wp_protect_special_option ( $option ) {
$protected = array ( 'alloptions' , 'notoptions' );
if ( in_array ( $option , $protected ) )
2010-02-14 07:21:15 +00:00
wp_die ( sprintf ( __ ( '%s is a protected WP option and may not be modified' ), esc_html ( $option ) ) );
2007-02-01 08:53:08 +00:00
}
2008-06-15 09:38:32 +00:00
/**
* Print option value after sanitizing for forms.
*
2009-04-28 05:58:45 +00:00
* @uses attr Sanitizes value.
2008-06-15 09:38:32 +00:00
* @since 1.5.0
* @package WordPress
* @subpackage Option
*
* @param string $option Option name.
*/
2007-10-11 05:46:57 +00:00
function form_option ( $option ) {
2010-02-14 07:21:15 +00:00
echo esc_attr ( get_option ( $option ) );
2004-09-05 00:24:28 +00:00
}
2008-06-30 03:23:44 +00:00
/**
* Loads and caches all autoloaded options, if available or all options.
*
* @since 2.2.0
* @package WordPress
* @subpackage Option
*
2010-01-08 08:29:55 +00:00
* @return array List of all options.
2008-06-30 03:23:44 +00:00
*/
2007-02-01 08:53:08 +00:00
function wp_load_alloptions () {
global $wpdb ;
2010-01-11 21:49:40 +00:00
if ( ! defined ( 'WP_INSTALLING' ) || ! is_multisite () )
2010-01-11 22:08:49 +00:00
$alloptions = wp_cache_get ( 'alloptions' , 'options' );
2010-01-26 20:42:37 +00:00
else
$alloptions = false ;
2007-02-01 08:53:08 +00:00
if ( ! $alloptions ) {
2008-03-19 23:17:23 +00:00
$suppress = $wpdb -> suppress_errors ();
2007-10-11 05:46:57 +00:00
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 " );
2008-03-19 23:17:23 +00:00
$wpdb -> suppress_errors ( $suppress );
2007-02-01 08:53:08 +00:00
$alloptions = array ();
2010-09-19 11:08:20 +00:00
foreach ( ( array ) $alloptions_db as $o ) {
2007-02-01 08:53:08 +00:00
$alloptions [ $o -> option_name ] = $o -> option_value ;
2010-09-19 11:08:20 +00:00
}
if ( ! defined ( 'WP_INSTALLING' ) || ! is_multisite () )
wp_cache_add ( 'alloptions' , $alloptions , 'options' );
2007-02-01 08:53:08 +00:00
}
2010-01-26 20:42:37 +00:00
2007-02-01 08:53:08 +00:00
return $alloptions ;
}
2010-02-12 20:23:06 +00:00
/**
* 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.
*/
2010-02-12 17:06:43 +00:00
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 ;
2010-10-07 19:34:18 +00:00
$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' );
2010-02-12 17:06:43 +00:00
$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' );
}
}
2008-06-30 03:23:44 +00:00
/**
* Update the value of an option that was already added.
*
2010-02-14 07:21:15 +00:00
* You do not need to serialize values. If the value needs to be serialized, then
2008-08-10 16:45:50 +00:00
* it will be serialized before it is inserted into the database. Remember,
* resources can not be serialized or added as an option.
*
2008-06-30 03:23:44 +00:00
* 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
2010-02-14 07:21:15 +00:00
* to set whether an option is autoloaded, then you need to use the add_option().
2008-06-30 03:23:44 +00:00
*
* @since 1.0.0
* @package WordPress
* @subpackage Option
*
2010-02-14 07:21:15 +00:00
* @uses apply_filters() Calls 'pre_update_option_$option' hook to allow overwriting the
* option value to be stored.
2010-02-14 10:39:46 +00:00
* @uses do_action() Calls 'update_option' hook before updating the option.
2010-02-14 07:21:15 +00:00
* @uses do_action() Calls 'update_option_$option' and 'updated_option' hooks on success.
*
2010-03-11 21:49:56 +00:00
* @param string $option Option name. Expected to not be SQL-escaped.
* @param mixed $newvalue Option value. Expected to not be SQL-escaped.
2008-06-30 03:23:44 +00:00
* @return bool False if value was not updated and true if value was updated.
*/
2010-02-14 06:17:42 +00:00
function update_option ( $option , $newvalue ) {
2005-11-09 21:30:40 +00:00
global $wpdb ;
2004-07-23 09:14:30 +00:00
2010-03-28 03:10:37 +00:00
$option = trim ( $option );
if ( empty ( $option ) )
return false ;
2010-02-14 06:17:42 +00:00
wp_protect_special_option ( $option );
2007-02-01 08:53:08 +00:00
2010-05-21 14:15:59 +00:00
if ( is_object ( $newvalue ) )
$newvalue = wp_clone ( $newvalue );
2010-02-14 06:17:42 +00:00
$newvalue = sanitize_option ( $option , $newvalue );
2010-03-11 21:49:56 +00:00
$oldvalue = get_option ( $option );
2010-02-14 06:17:42 +00:00
$newvalue = apply_filters ( 'pre_update_option_' . $option , $newvalue , $oldvalue );
2008-07-03 15:51:53 +00:00
// If the new and old values are the same, no need to update.
2007-10-11 05:46:57 +00:00
if ( $newvalue === $oldvalue )
2005-11-12 09:36:20 +00:00
return false ;
2005-07-16 21:13:14 +00:00
2010-02-14 06:17:42 +00:00
if ( false === $oldvalue )
return add_option ( $option , $newvalue );
2005-11-11 02:24:09 +00:00
2007-10-11 05:46:57 +00:00
$notoptions = wp_cache_get ( 'notoptions' , 'options' );
2010-02-14 06:17:42 +00:00
if ( is_array ( $notoptions ) && isset ( $notoptions [ $option ] ) ) {
unset ( $notoptions [ $option ] );
2007-10-11 05:46:57 +00:00
wp_cache_set ( 'notoptions' , $notoptions , 'options' );
2007-02-01 08:53:08 +00:00
}
2006-03-25 21:46:53 +00:00
$_newvalue = $newvalue ;
2007-10-11 05:46:57 +00:00
$newvalue = maybe_serialize ( $newvalue );
2008-12-31 22:10:41 +00:00
2010-02-28 19:32:17 +00:00
do_action ( 'update_option' , $option , $oldvalue , $_newvalue );
2010-02-05 17:59:24 +00:00
if ( ! defined ( 'WP_INSTALLING' ) ) {
$alloptions = wp_load_alloptions ();
2010-02-14 06:17:42 +00:00
if ( isset ( $alloptions [ $option ] ) ) {
2010-03-11 21:49:56 +00:00
$alloptions [ $option ] = $_newvalue ;
2010-03-11 23:28:12 +00:00
wp_cache_set ( 'alloptions' , $alloptions , 'options' );
2010-02-05 17:59:24 +00:00
} else {
2010-03-11 21:49:56 +00:00
wp_cache_set ( $option , $_newvalue , 'options' );
2010-02-05 17:59:24 +00:00
}
2007-02-01 08:53:08 +00:00
}
2005-11-07 21:56:03 +00:00
2010-02-14 06:17:42 +00:00
$result = $wpdb -> update ( $wpdb -> options , array ( 'option_value' => $newvalue ), array ( 'option_name' => $option ) );
2009-03-06 04:27:51 +00:00
2010-02-14 06:17:42 +00:00
if ( $result ) {
do_action ( "update_option_ { $option } " , $oldvalue , $_newvalue );
do_action ( 'updated_option' , $option , $oldvalue , $_newvalue );
2006-01-25 06:46:21 +00:00
return true ;
}
return false ;
2003-10-26 00:19:23 +00:00
}
2008-06-30 03:23:44 +00:00
/**
* Add a new option.
*
2010-02-14 07:21:15 +00:00
* You do not need to serialize values. If the value needs to be serialized, then
2008-08-10 16:45:50 +00:00
* it will be serialized before it is inserted into the database. Remember,
* resources can not be serialized or added as an option.
*
2008-06-30 03:23:44 +00:00
* 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
2010-02-14 07:21:15 +00:00
* options the same as the ones which are protected and to not add options
2008-06-30 03:23:44 +00:00
* that were already added.
*
* @package WordPress
* @subpackage Option
* @since 1.0.0
*
2010-02-14 10:39:46 +00:00
* @uses do_action() Calls 'add_option' hook before adding the option.
2010-02-14 07:21:15 +00:00
* @uses do_action() Calls 'add_option_$option' and 'added_option' hooks on success.
*
2010-03-11 21:49:56 +00:00
* @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.
2008-06-30 03:23:44 +00:00
* @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.
*/
2010-02-14 06:17:42 +00:00
function add_option ( $option , $value = '' , $deprecated = '' , $autoload = 'yes' ) {
2010-03-28 03:10:37 +00:00
global $wpdb ;
2009-12-30 16:23:39 +00:00
if ( ! empty ( $deprecated ) )
_deprecated_argument ( __FUNCTION__ , '2.3' );
2010-03-28 03:10:37 +00:00
$option = trim ( $option );
if ( empty ( $option ) )
return false ;
2005-09-08 21:08:48 +00:00
2010-02-14 06:17:42 +00:00
wp_protect_special_option ( $option );
2010-05-21 14:15:59 +00:00
if ( is_object ( $value ) )
$value = wp_clone ( $value );
2010-02-14 06:17:42 +00:00
$value = sanitize_option ( $option , $value );
2007-02-01 08:53:08 +00:00
2007-07-07 04:06:29 +00:00
// Make sure the option doesn't already exist. We can check the 'notoptions' cache before we ask for a db query
2007-10-11 05:46:57 +00:00
$notoptions = wp_cache_get ( 'notoptions' , 'options' );
2010-02-14 06:17:42 +00:00
if ( ! is_array ( $notoptions ) || ! isset ( $notoptions [ $option ] ) )
2010-03-11 21:49:56 +00:00
if ( false !== get_option ( $option ) )
2007-02-01 08:53:08 +00:00
return ;
2005-09-08 21:08:48 +00:00
2010-02-26 18:51:37 +00:00
$_value = $value ;
2007-10-11 05:46:57 +00:00
$value = maybe_serialize ( $value );
2007-06-12 20:57:58 +00:00
$autoload = ( 'no' === $autoload ) ? 'no' : 'yes' ;
2010-02-28 19:32:17 +00:00
do_action ( 'add_option' , $option , $_value );
2010-02-05 17:59:24 +00:00
if ( ! defined ( 'WP_INSTALLING' ) ) {
if ( 'yes' == $autoload ) {
$alloptions = wp_load_alloptions ();
2010-02-14 06:17:42 +00:00
$alloptions [ $option ] = $value ;
2010-02-05 17:59:24 +00:00
wp_cache_set ( 'alloptions' , $alloptions , 'options' );
} else {
2010-02-14 06:17:42 +00:00
wp_cache_set ( $option , $value , 'options' );
2010-02-05 17:59:24 +00:00
}
2007-02-01 08:53:08 +00:00
}
2005-11-09 21:30:40 +00:00
2007-07-07 04:06:29 +00:00
// This option exists now
2007-10-11 05:46:57 +00:00
$notoptions = wp_cache_get ( 'notoptions' , 'options' ); // yes, again... we need it to be fresh
2010-02-14 06:17:42 +00:00
if ( is_array ( $notoptions ) && isset ( $notoptions [ $option ] ) ) {
unset ( $notoptions [ $option ] );
2007-10-11 05:46:57 +00:00
wp_cache_set ( 'notoptions' , $notoptions , 'options' );
2007-07-07 04:06:29 +00:00
}
2008-12-31 22:10:41 +00:00
2010-02-14 06:17:42 +00:00
$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 ) );
2004-04-16 21:17:09 +00:00
2010-02-14 07:21:15 +00:00
if ( $result ) {
2010-02-26 18:51:37 +00:00
do_action ( "add_option_ { $option } " , $option , $_value );
do_action ( 'added_option' , $option , $_value );
2010-02-14 07:21:15 +00:00
return true ;
}
return false ;
2003-10-26 00:19:23 +00:00
}
2008-06-30 03:23:44 +00:00
/**
2010-02-14 06:17:42 +00:00
* Removes option by name. Prevents removal of protected WordPress options.
2008-06-30 03:23:44 +00:00
*
* @package WordPress
2010-02-21 00:03:42 +00:00
* @subpackage Option
2008-08-10 16:45:50 +00:00
* @since 1.2.0
2008-06-30 03:23:44 +00:00
*
2010-02-14 07:21:15 +00:00
* @uses do_action() Calls 'delete_option' hook before option is deleted.
2010-02-14 10:39:46 +00:00
* @uses do_action() Calls 'deleted_option' and 'delete_option_$option' hooks on success.
2010-02-14 07:21:15 +00:00
*
2010-03-11 21:49:56 +00:00
* @param string $option Name of option to remove. Expected to not be SQL-escaped.
2010-02-14 10:39:46 +00:00
* @return bool True, if option is successfully deleted. False on failure.
2008-06-30 03:23:44 +00:00
*/
2010-02-14 06:17:42 +00:00
function delete_option ( $option ) {
2004-05-24 08:22:18 +00:00
global $wpdb ;
2007-02-01 08:53:08 +00:00
2010-02-14 06:17:42 +00:00
wp_protect_special_option ( $option );
2007-02-01 08:53:08 +00:00
2004-04-24 21:21:19 +00:00
// Get the ID, if no ID then return
2010-04-24 03:04:05 +00:00
$row = $wpdb -> get_row ( $wpdb -> prepare ( "SELECT autoload FROM $wpdb->options WHERE option_name = %s" , $option ) );
2010-02-14 06:17:42 +00:00
if ( is_null ( $row ) )
2007-10-11 05:46:57 +00:00
return false ;
2010-02-14 06:17:42 +00:00
do_action ( 'delete_option' , $option );
2010-04-24 03:04:05 +00:00
$result = $wpdb -> query ( $wpdb -> prepare ( "DELETE FROM $wpdb->options WHERE option_name = %s" , $option ) );
2010-02-05 17:59:24 +00:00
if ( ! defined ( 'WP_INSTALLING' ) ) {
2010-02-14 06:17:42 +00:00
if ( 'yes' == $row -> autoload ) {
2010-02-05 17:59:24 +00:00
$alloptions = wp_load_alloptions ();
2010-05-02 06:02:54 +00:00
if ( is_array ( $alloptions ) && isset ( $alloptions [ $option ] ) ) {
2010-02-14 06:17:42 +00:00
unset ( $alloptions [ $option ] );
2010-02-05 17:59:24 +00:00
wp_cache_set ( 'alloptions' , $alloptions , 'options' );
}
} else {
2010-02-14 06:17:42 +00:00
wp_cache_delete ( $option , 'options' );
2007-02-01 08:53:08 +00:00
}
}
2010-02-14 07:21:15 +00:00
if ( $result ) {
2010-02-14 10:39:46 +00:00
do_action ( "delete_option_ $option " , $option );
2010-02-14 07:21:15 +00:00
do_action ( 'deleted_option' , $option );
return true ;
}
return false ;
2004-04-24 21:21:19 +00:00
}
2009-02-05 21:59:37 +00:00
/**
* Delete a transient
*
* @since 2.8.0
* @package WordPress
* @subpackage Transient
*
2010-02-14 10:39:46 +00:00
* @uses do_action() Calls 'delete_transient_$transient' hook before transient is deleted.
* @uses do_action() Calls 'deleted_transient' hook on success.
*
2010-03-11 21:49:56 +00:00
* @param string $transient Transient name. Expected to not be SQL-escaped.
2009-02-05 21:59:37 +00:00
* @return bool true if successful, false otherwise
*/
2010-02-14 06:17:42 +00:00
function delete_transient ( $transient ) {
global $_wp_using_ext_object_cache ;
2009-02-05 21:59:37 +00:00
2010-06-30 00:05:18 +00:00
do_action ( 'delete_transient_' . $transient , $transient );
2010-01-11 21:49:40 +00:00
2009-02-05 21:59:37 +00:00
if ( $_wp_using_ext_object_cache ) {
2010-02-14 10:39:46 +00:00
$result = wp_cache_delete ( $transient , 'transient' );
2009-02-05 21:59:37 +00:00
} else {
2010-04-01 10:42:03 +00:00
$option_timeout = '_transient_timeout_' . $transient ;
2010-03-11 21:49:56 +00:00
$option = '_transient_' . $transient ;
2010-02-14 10:39:46 +00:00
$result = delete_option ( $option );
2010-04-01 10:42:03 +00:00
if ( $result )
delete_option ( $option_timeout );
2009-02-05 21:59:37 +00:00
}
2010-02-14 10:39:46 +00:00
if ( $result )
do_action ( 'deleted_transient' , $transient );
return $result ;
2009-02-05 21:59:37 +00:00
}
/**
* 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.
2009-03-18 02:43:45 +00:00
*
2010-02-14 07:21:15 +00:00
* @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.
*
2009-02-05 21:59:37 +00:00
* @since 2.8.0
* @package WordPress
* @subpackage Transient
*
* @param string $transient Transient name. Expected to not be SQL-escaped
* @return mixed Value of transient
*/
2010-02-14 06:17:42 +00:00
function get_transient ( $transient ) {
global $_wp_using_ext_object_cache ;
2009-02-05 21:59:37 +00:00
2009-04-03 16:19:25 +00:00
$pre = apply_filters ( 'pre_transient_' . $transient , false );
if ( false !== $pre )
return $pre ;
2009-02-05 21:59:37 +00:00
if ( $_wp_using_ext_object_cache ) {
2010-02-14 06:17:42 +00:00
$value = wp_cache_get ( $transient , 'transient' );
2009-02-05 21:59:37 +00:00
} else {
2010-03-11 21:49:56 +00:00
$transient_option = '_transient_' . $transient ;
2010-02-05 17:59:24 +00:00
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 ] ) ) {
2010-03-11 21:49:56 +00:00
$transient_timeout = '_transient_timeout_' . $transient ;
2010-02-14 06:17:42 +00:00
if ( get_option ( $transient_timeout ) < time () ) {
delete_option ( $transient_option );
delete_option ( $transient_timeout );
2010-02-05 17:59:24 +00:00
return false ;
}
2009-02-20 02:23:11 +00:00
}
}
2010-02-14 06:17:42 +00:00
$value = get_option ( $transient_option );
2009-02-05 21:59:37 +00:00
}
2009-02-10 06:26:46 +00:00
2010-02-14 06:17:42 +00:00
return apply_filters ( 'transient_' . $transient , $value );
2009-02-05 21:59:37 +00:00
}
/**
* Set/update the value of a transient
*
2010-02-14 06:17:42 +00:00
* You do not need to serialize values. If the value needs to be serialized, then
2009-02-05 21:59:37 +00:00
* it will be serialized before it is set.
*
* @since 2.8.0
* @package WordPress
* @subpackage Transient
*
2010-02-14 07:21:15 +00:00
* @uses apply_filters() Calls 'pre_set_transient_$transient' hook to allow overwriting the
* transient value to be stored.
2010-02-14 10:39:46 +00:00
* @uses do_action() Calls 'set_transient_$transient' and 'setted_transient' hooks on success.
2010-02-14 07:21:15 +00:00
*
2010-03-11 21:49:56 +00:00
* @param string $transient Transient name. Expected to not be SQL-escaped.
* @param mixed $value Transient value. Expected to not be SQL-escaped.
2009-02-20 02:23:11 +00:00
* @param int $expiration Time until expiration in seconds, default 0
2009-02-05 21:59:37 +00:00
* @return bool False if value was not set and true if value was set.
*/
2010-02-14 06:17:42 +00:00
function set_transient ( $transient , $value , $expiration = 0 ) {
global $_wp_using_ext_object_cache ;
2009-02-05 21:59:37 +00:00
2010-06-30 00:05:18 +00:00
$value = apply_filters ( 'pre_set_transient_' . $transient , $value );
2010-01-11 21:49:40 +00:00
2009-02-05 21:59:37 +00:00
if ( $_wp_using_ext_object_cache ) {
2010-02-14 10:39:46 +00:00
$result = wp_cache_set ( $transient , $value , 'transient' , $expiration );
2009-02-05 21:59:37 +00:00
} else {
2009-02-20 02:23:11 +00:00
$transient_timeout = '_transient_timeout_' . $transient ;
2009-02-05 21:59:37 +00:00
$transient = '_transient_' . $transient ;
2010-03-11 21:49:56 +00:00
if ( false === get_option ( $transient ) ) {
2009-02-20 02:23:11 +00:00
$autoload = 'yes' ;
2010-02-14 06:17:42 +00:00
if ( $expiration ) {
2009-03-18 02:43:45 +00:00
$autoload = 'no' ;
2010-02-14 10:39:46 +00:00
add_option ( $transient_timeout , time () + $expiration , '' , 'no' );
2009-02-20 02:23:11 +00:00
}
2010-02-14 10:39:46 +00:00
$result = add_option ( $transient , $value , '' , $autoload );
2009-02-20 02:23:11 +00:00
} else {
2010-02-14 06:17:42 +00:00
if ( $expiration )
update_option ( $transient_timeout , time () + $expiration );
2010-02-14 10:39:46 +00:00
$result = update_option ( $transient , $value );
2009-02-20 02:23:11 +00:00
}
2009-02-05 21:59:37 +00:00
}
2010-02-14 10:39:46 +00:00
if ( $result ) {
do_action ( 'set_transient_' . $transient );
do_action ( 'setted_transient' , $transient );
}
return $result ;
2009-02-05 21:59:37 +00:00
}
2008-08-31 06:34:43 +00:00
/**
* Saves and restores user interface settings stored in a cookie.
*
2008-10-18 20:46:30 +00:00
* 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.
*
2008-08-31 06:34:43 +00:00
* @package WordPress
* @subpackage Option
* @since 2.7.0
*/
function wp_user_settings () {
if ( ! is_admin () )
return ;
2008-12-05 05:10:05 +00:00
if ( defined ( 'DOING_AJAX' ) )
return ;
2008-08-31 06:34:43 +00:00
if ( ! $user = wp_get_current_user () )
return ;
2010-01-07 00:01:52 +00:00
$settings = get_user_option ( 'user-settings' , $user -> ID );
2008-08-31 06:34:43 +00:00
2008-12-06 07:14:22 +00:00
if ( isset ( $_COOKIE [ 'wp-settings-' . $user -> ID ] ) ) {
$cookie = preg_replace ( '/[^A-Za-z0-9=&_]/' , '' , $_COOKIE [ 'wp-settings-' . $user -> ID ] );
2008-08-31 06:34:43 +00:00
2008-12-06 07:14:22 +00:00
if ( ! empty ( $cookie ) && strpos ( $cookie , '=' ) ) {
2008-08-31 06:34:43 +00:00
if ( $cookie == $settings )
return ;
2010-01-07 00:01:52 +00:00
$last_time = ( int ) get_user_option ( 'user-settings-time' , $user -> ID );
2008-12-06 07:14:22 +00:00
$saved = isset ( $_COOKIE [ 'wp-settings-time-' . $user -> ID ]) ? preg_replace ( '/[^0-9]/' , '' , $_COOKIE [ 'wp-settings-time-' . $user -> ID ] ) : 0 ;
2008-08-31 06:34:43 +00:00
if ( $saved > $last_time ) {
2008-12-07 04:51:22 +00:00
update_user_option ( $user -> ID , 'user-settings' , $cookie , false );
update_user_option ( $user -> ID , 'user-settings-time' , time () - 5 , false );
2008-08-31 06:34:43 +00:00
return ;
}
}
}
2008-12-06 07:18:04 +00:00
setcookie ( 'wp-settings-' . $user -> ID , $settings , time () + 31536000 , SITECOOKIEPATH );
setcookie ( 'wp-settings-time-' . $user -> ID , time (), time () + 31536000 , SITECOOKIEPATH );
2009-06-01 23:31:34 +00:00
$_COOKIE [ 'wp-settings-' . $user -> ID ] = $settings ;
2008-08-31 06:34:43 +00:00
}
/**
* Retrieve user interface setting value based on setting name.
*
* @package WordPress
* @subpackage Option
2008-10-18 20:46:30 +00:00
* @since 2.7.0
*
2008-08-31 06:34:43 +00:00
* @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 ) {
2009-06-01 23:31:34 +00:00
$all = get_all_user_settings ();
2008-08-31 06:34:43 +00:00
2009-06-01 23:31:34 +00:00
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 );
2008-08-31 06:34:43 +00:00
}
/**
* Delete user interface settings.
*
2008-10-18 20:46:30 +00:00
* Deleting settings would reset them to the defaults.
2009-06-01 23:31:34 +00:00
* This function has to be used before any output has started as it calls setcookie().
2008-10-18 20:46:30 +00:00
*
2008-08-31 06:34:43 +00:00
* @package WordPress
* @subpackage Option
* @since 2.7.0
*
* @param mixed $names The name or array of names of the setting to be deleted.
2009-06-01 23:31:34 +00:00
* @return bool true if deleted successfully/false if not.
2008-08-31 06:34:43 +00:00
*/
function delete_user_setting ( $names ) {
2009-06-01 23:31:34 +00:00
if ( headers_sent () )
return false ;
$all = get_all_user_settings ();
2008-08-31 06:34:43 +00:00
$names = ( array ) $names ;
foreach ( $names as $name ) {
2009-06-01 23:31:34 +00:00
if ( isset ( $all [ $name ]) ) {
unset ( $all [ $name ]);
$deleted = true ;
2008-08-31 06:34:43 +00:00
}
}
2009-06-01 23:31:34 +00:00
if ( isset ( $deleted ) )
return wp_set_all_user_settings ( $all );
2008-08-31 06:34:43 +00:00
2009-06-01 23:31:34 +00:00
return false ;
2008-08-31 06:34:43 +00:00
}
/**
* 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 () {
2009-06-01 23:31:34 +00:00
global $_updated_user_settings ;
2008-08-31 06:34:43 +00:00
if ( ! $user = wp_get_current_user () )
return array ();
2009-06-01 23:31:34 +00:00
if ( isset ( $_updated_user_settings ) && is_array ( $_updated_user_settings ) )
return $_updated_user_settings ;
$all = array ();
2009-04-29 05:43:03 +00:00
if ( isset ( $_COOKIE [ 'wp-settings-' . $user -> ID ]) ) {
$cookie = preg_replace ( '/[^A-Za-z0-9=&_]/' , '' , $_COOKIE [ 'wp-settings-' . $user -> ID ] );
2008-08-31 06:34:43 +00:00
2009-04-29 05:43:03 +00:00
if ( $cookie && strpos ( $cookie , '=' ) ) // the '=' cannot be 1st char
2009-06-01 23:31:34 +00:00
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
*
2010-02-19 01:08:39 +00:00
* @param unknown $all
* @return bool
2009-06-01 23:31:34 +00:00
*/
function wp_set_all_user_settings ( $all ) {
global $_updated_user_settings ;
2009-04-29 05:43:03 +00:00
2009-06-01 23:31:34 +00:00
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 . '&' ;
2008-08-31 06:34:43 +00:00
}
2009-06-01 23:31:34 +00:00
$settings = rtrim ( $settings , '&' );
update_user_option ( $user -> ID , 'user-settings' , $settings , false );
update_user_option ( $user -> ID , 'user-settings-time' , time (), false );
return true ;
2008-08-31 06:34:43 +00:00
}
2008-10-18 20:46:30 +00:00
/**
* Delete the user settings of the current user.
*
* @package WordPress
* @subpackage Option
* @since 2.7.0
*/
2008-08-31 06:34:43 +00:00
function delete_all_user_settings () {
if ( ! $user = wp_get_current_user () )
return ;
2009-06-01 23:31:34 +00:00
update_user_option ( $user -> ID , 'user-settings' , '' , false );
setcookie ( 'wp-settings-' . $user -> ID , ' ' , time () - 31536000 , SITECOOKIEPATH );
2008-08-31 06:34:43 +00:00
}
2008-06-30 03:23:44 +00:00
/**
* Serialize data, if needed.
*
2008-08-10 16:45:50 +00:00
* @since 2.0.5
*
2008-06-30 03:23:44 +00:00
* @param mixed $data Data that might be serialized.
* @return mixed A scalar data
*/
2007-10-11 05:46:57 +00:00
function maybe_serialize ( $data ) {
2010-04-11 17:07:20 +00:00
if ( is_array ( $data ) || is_object ( $data ) )
return serialize ( $data );
if ( is_serialized ( $data ) )
2007-10-11 05:46:57 +00:00
return serialize ( $data );
2008-07-18 16:43:23 +00:00
2006-10-12 23:54:36 +00:00
return $data ;
}
2008-08-09 04:51:51 +00:00
/**
* 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.
*
* @package WordPress
* @subpackage XMLRPC
2008-08-10 16:45:50 +00:00
* @since 0.71
2008-08-09 04:51:51 +00:00
*
* @global string $post_default_title Default XMLRPC post title.
*
* @param string $content XMLRPC XML Request content
* @return string Post title
*/
2007-10-11 05:46:57 +00:00
function xmlrpc_getposttitle ( $content ) {
2003-04-21 21:37:11 +00:00
global $post_default_title ;
2007-10-11 05:46:57 +00:00
if ( preg_match ( '/<title>(.+?)<\/title>/is' , $content , $matchtitle ) ) {
2009-04-20 22:15:14 +00:00
$post_title = $matchtitle [ 1 ];
2003-04-21 21:37:11 +00:00
} else {
$post_title = $post_default_title ;
}
2003-06-07 17:19:38 +00:00
return $post_title ;
2003-04-21 21:37:11 +00:00
}
2005-10-10 09:25:38 +00:00
2008-08-09 04:51:51 +00:00
/**
* 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.
*
* @package WordPress
* @subpackage XMLRPC
2008-08-10 16:45:50 +00:00
* @since 0.71
2008-08-09 04:51:51 +00:00
*
* @global string $post_default_category Default XMLRPC post category.
*
* @param string $content XMLRPC XML Request content
* @return string|array List of categories or category name.
*/
2007-10-11 05:46:57 +00:00
function xmlrpc_getpostcategory ( $content ) {
2003-04-21 21:37:11 +00:00
global $post_default_category ;
2007-10-11 05:46:57 +00:00
if ( preg_match ( '/<category>(.+?)<\/category>/is' , $content , $matchcat ) ) {
$post_category = trim ( $matchcat [ 1 ], ',' );
$post_category = explode ( ',' , $post_category );
2003-04-21 21:37:11 +00:00
} else {
$post_category = $post_default_category ;
}
2003-06-07 17:19:38 +00:00
return $post_category ;
2003-04-21 21:37:11 +00:00
}
2008-08-09 04:51:51 +00:00
/**
* XMLRPC XML content without title and category elements.
*
* @package WordPress
* @subpackage XMLRPC
2008-08-10 16:45:50 +00:00
* @since 0.71
2008-08-09 04:51:51 +00:00
*
* @param string $content XMLRPC XML Request content
* @return string XMLRPC XML Request content without title and category elements.
*/
2007-10-11 05:46:57 +00:00
function xmlrpc_removepostdata ( $content ) {
$content = preg_replace ( '/<title>(.+?)<\/title>/si' , '' , $content );
$content = preg_replace ( '/<category>(.+?)<\/category>/si' , '' , $content );
$content = trim ( $content );
2003-06-07 17:19:38 +00:00
return $content ;
2003-04-21 21:37:11 +00:00
}
2008-06-30 03:23:44 +00:00
/**
* 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
2008-08-10 16:45:50 +00:00
* @since 0.71
2008-06-30 03:23:44 +00:00
* @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.
*/
2007-10-11 05:46:57 +00:00
function debug_fopen ( $filename , $mode ) {
2003-04-21 21:37:11 +00:00
global $debug ;
2007-10-11 05:46:57 +00:00
if ( 1 == $debug ) {
$fp = fopen ( $filename , $mode );
2003-04-21 21:37:11 +00:00
return $fp ;
} else {
return false ;
}
}
2008-06-30 03:23:44 +00:00
/**
* 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
2008-08-10 16:45:50 +00:00
* @since 0.71
2008-06-30 03:23:44 +00:00
* @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.
*/
2007-10-11 05:46:57 +00:00
function debug_fwrite ( $fp , $string ) {
2003-04-21 21:37:11 +00:00
global $debug ;
2007-10-11 05:46:57 +00:00
if ( 1 == $debug )
fwrite ( $fp , $string );
2003-04-21 21:37:11 +00:00
}
2008-06-30 03:23:44 +00:00
/**
* 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
2008-08-10 16:45:50 +00:00
* @since 0.71
2008-06-30 03:23:44 +00:00
* @uses $debug Used for whether debugging is enabled.
*
* @param resource $fp Debug File handle.
*/
2007-10-11 05:46:57 +00:00
function debug_fclose ( $fp ) {
2003-04-21 21:37:11 +00:00
global $debug ;
2007-10-11 05:46:57 +00:00
if ( 1 == $debug )
fclose ( $fp );
2003-04-21 21:37:11 +00:00
}
2008-08-10 16:45:50 +00:00
/**
2008-08-10 20:31:49 +00:00
* Check content for video and audio links to add as enclosures.
2008-08-10 16:45:50 +00:00
*
2009-05-13 05:15:27 +00:00
* Will not add enclosures that have already been added and will
* remove enclosures that are no longer in the post. This is called as
2008-08-10 20:31:49 +00:00
* pingbacks and trackbacks.
2008-08-10 16:45:50 +00:00
*
* @package WordPress
* @since 1.5.0
*
* @uses $wpdb
*
2008-08-10 20:31:49 +00:00
* @param string $content Post Content
2008-08-10 16:45:50 +00:00
* @param int $post_ID Post ID
*/
2004-10-18 12:09:20 +00:00
function do_enclose ( $content , $post_ID ) {
2007-12-06 19:49:33 +00:00
global $wpdb ;
2010-11-17 18:47:34 +00:00
2010-10-28 22:00:53 +00:00
//TODO: Tidy this ghetto code up and make the debug code optional
2007-10-11 05:46:57 +00:00
include_once ( ABSPATH . WPINC . '/class-IXR.php' );
2004-10-18 12:09:20 +00:00
2007-10-11 05:46:57 +00:00
$log = debug_fopen ( ABSPATH . 'enclosures.log' , 'a' );
2004-10-18 12:09:20 +00:00
$post_links = array ();
2007-10-11 05:46:57 +00:00
debug_fwrite ( $log , 'BEGIN ' . date ( 'YmdHis' , time () ) . " \n " );
2004-10-18 12:09:20 +00:00
2005-02-12 08:58:10 +00:00
$pung = get_enclosed ( $post_ID );
2004-10-18 12:09:20 +00:00
$ltrs = '\w' ;
$gunk = '/#~:.?+=&%@!\-' ;
$punc = '.:?\-' ;
$any = $ltrs . $gunk . $punc ;
2007-10-11 05:46:57 +00:00
preg_match_all ( "{\b http : [ $any ] +? (?= [ $punc ] * [^ $any ] | $)}x" , $content , $post_links_temp );
2004-10-18 12:09:20 +00:00
2007-10-11 05:46:57 +00:00
debug_fwrite ( $log , 'Post contents:' );
debug_fwrite ( $log , $content . " \n " );
2004-10-18 12:09:20 +00:00
2009-05-13 05:15:27 +00:00
foreach ( $pung as $link_test ) {
if ( ! in_array ( $link_test , $post_links_temp [ 0 ] ) ) { // link no longer in post
2009-09-24 17:10:28 +00:00
$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 , $link_test . '%' ) );
do_action ( 'delete_postmeta' , $mid );
2010-05-10 09:02:15 +00:00
$wpdb -> query ( $wpdb -> prepare ( "DELETE FROM $wpdb->postmeta WHERE meta_id IN(%s)" , implode ( ',' , $mid ) ) );
2009-09-24 17:10:28 +00:00
do_action ( 'deleted_postmeta' , $mid );
2009-05-13 05:15:27 +00:00
}
}
2008-08-06 20:31:54 +00:00
foreach ( ( array ) $post_links_temp [ 0 ] as $link_test ) {
2007-10-11 05:46:57 +00:00
if ( ! in_array ( $link_test , $pung ) ) { // If we haven't pung it already
2010-04-16 19:48:30 +00:00
$test = @ parse_url ( $link_test );
if ( false === $test )
continue ;
2007-10-11 05:46:57 +00:00
if ( isset ( $test [ 'query' ] ) )
2004-10-18 12:09:20 +00:00
$post_links [] = $link_test ;
2010-10-29 07:07:28 +00:00
elseif ( isset ( $test [ 'path' ]) && ( $test [ 'path' ] != '/' ) && ( $test [ 'path' ] != '' ) )
2004-10-18 12:09:20 +00:00
$post_links [] = $link_test ;
2007-10-11 05:46:57 +00:00
}
}
2004-10-18 12:09:20 +00:00
2008-08-06 20:31:54 +00:00
foreach ( ( array ) $post_links as $url ) {
2007-10-11 05:46:57 +00:00
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 , $url . '%' ) ) ) {
2009-12-30 07:36:17 +00:00
2005-03-07 08:56:47 +00:00
if ( $headers = wp_get_http_headers ( $url ) ) {
2005-10-10 09:25:38 +00:00
$len = ( int ) $headers [ 'content-length' ];
2009-03-06 04:27:51 +00:00
$type = $headers [ 'content-type' ];
2005-03-07 08:56:47 +00:00
$allowed_types = array ( 'video' , 'audio' );
2009-12-30 07:36:17 +00:00
// Check to see if we can figure out the mime type from
// the extension
2010-04-16 19:48:30 +00:00
$url_parts = @ parse_url ( $url );
if ( false !== $url_parts ) {
$extension = pathinfo ( $url_parts [ 'path' ], PATHINFO_EXTENSION );
if ( ! empty ( $extension ) ) {
foreach ( get_allowed_mime_types ( ) as $exts => $mime ) {
if ( preg_match ( '!^(' . $exts . ')$!i' , $extension ) ) {
$type = $mime ;
break ;
}
2009-12-30 07:36:17 +00:00
}
}
}
2005-10-10 09:25:38 +00:00
if ( in_array ( substr ( $type , 0 , strpos ( $type , "/" ) ), $allowed_types ) ) {
2005-03-07 08:56:47 +00:00
$meta_value = " $url \n $len \n $type \n " ;
2009-03-06 04:27:51 +00:00
$wpdb -> insert ( $wpdb -> postmeta , array ( 'post_id' => $post_ID , 'meta_key' => 'enclosure' , 'meta_value' => $meta_value ) );
2009-09-24 17:10:28 +00:00
do_action ( 'added_postmeta' , $wpdb -> insert_id , $post_ID , 'enclosure' , $meta_value );
2005-03-07 08:56:47 +00:00
}
}
}
2007-10-11 05:46:57 +00:00
}
2005-03-07 08:56:47 +00:00
}
2008-06-15 09:38:32 +00:00
/**
* Perform a HTTP HEAD or GET request.
*
* If $file_path is a writable filename, this will do a GET request and write
* the file to that path.
*
2008-08-10 16:45:50 +00:00
* @since 2.5.0
2008-06-15 09:38:32 +00:00
*
2008-09-27 21:41:19 +00:00
* @param string $url URL to fetch.
2008-06-15 09:38:32 +00:00
* @param string|bool $file_path Optional. File path to write request to.
2010-02-14 11:23:32 +00:00
* @param int $red (private) The number of Redirects followed, Upon 5 being hit, returns false.
2008-06-15 09:38:32 +00:00
* @return bool|string False on failure and string of headers if HEAD request.
*/
2010-02-14 11:23:32 +00:00
function wp_get_http ( $url , $file_path = false , $red = 1 ) {
2005-10-10 09:25:38 +00:00
@ set_time_limit ( 60 );
2005-10-19 06:09:23 +00:00
2010-02-14 11:23:32 +00:00
if ( $red > 5 )
return false ;
2008-09-27 21:41:19 +00:00
$options = array ();
$options [ 'redirection' ] = 5 ;
2005-03-07 08:56:47 +00:00
2008-09-27 21:41:19 +00:00
if ( false == $file_path )
$options [ 'method' ] = 'HEAD' ;
2007-12-16 21:34:48 +00:00
else
2008-09-27 21:41:19 +00:00
$options [ 'method' ] = 'GET' ;
2005-03-07 08:56:47 +00:00
2008-09-27 21:41:19 +00:00
$response = wp_remote_request ( $url , $options );
2008-02-05 06:47:27 +00:00
2008-10-02 00:32:21 +00:00
if ( is_wp_error ( $response ) )
return false ;
2008-09-27 21:41:19 +00:00
$headers = wp_remote_retrieve_headers ( $response );
2008-10-24 18:22:43 +00:00
$headers [ 'response' ] = $response [ 'response' ][ 'code' ];
2010-02-14 11:23:32 +00:00
// WP_HTTP no longer follows redirects for HEAD requests.
if ( 'HEAD' == $options [ 'method' ] && in_array ( $headers [ 'response' ], array ( 301 , 302 )) && isset ( $headers [ 'location' ] ) ) {
return wp_get_http ( $headers [ 'location' ], $file_path , ++ $red );
}
2008-09-27 21:41:19 +00:00
if ( false == $file_path )
2007-12-16 21:34:48 +00:00
return $headers ;
2008-02-05 06:47:27 +00:00
2008-10-23 19:39:17 +00:00
// GET request - write it to the supplied filename
2007-12-16 21:34:48 +00:00
$out_fp = fopen ( $file_path , 'w' );
2008-10-23 19:39:17 +00:00
if ( ! $out_fp )
return $headers ;
2008-02-05 06:47:27 +00:00
2008-10-23 19:39:17 +00:00
fwrite ( $out_fp , $response [ 'body' ]);
2007-12-16 21:34:48 +00:00
fclose ( $out_fp );
2010-06-02 14:01:21 +00:00
clearstatcache ();
2008-09-27 21:41:19 +00:00
2005-03-07 08:56:47 +00:00
return $headers ;
2004-10-18 12:09:20 +00:00
}
2008-06-15 09:38:32 +00:00
/**
* Retrieve HTTP Headers from URL.
*
* @since 1.5.1
*
* @param string $url
2008-09-27 21:41:19 +00:00
* @param bool $deprecated Not Used.
2008-06-15 09:38:32 +00:00
* @return bool|string False on failure, headers on success.
*/
2008-09-27 21:41:19 +00:00
function wp_get_http_headers ( $url , $deprecated = false ) {
2009-12-30 16:23:39 +00:00
if ( ! empty ( $deprecated ) )
2010-01-09 10:03:55 +00:00
_deprecated_argument ( __FUNCTION__ , '2.7' );
2009-12-30 16:23:39 +00:00
2008-09-27 21:41:19 +00:00
$response = wp_remote_head ( $url );
2008-10-02 00:32:21 +00:00
if ( is_wp_error ( $response ) )
return false ;
2008-09-27 21:41:19 +00:00
return wp_remote_retrieve_headers ( $response );
2007-12-16 21:34:48 +00:00
}
2008-06-15 09:38:32 +00:00
/**
* Whether today is a new day.
*
* @since 0.71
* @uses $day Today
* @uses $previousday Previous day
*
* @return int 1 when new day, 0 if not a new day.
*/
2003-10-27 07:00:42 +00:00
function is_new_day () {
2010-11-11 16:22:18 +00:00
global $currentday , $previousday ;
if ( $currentday != $previousday )
2007-10-11 05:46:57 +00:00
return 1 ;
else
return 0 ;
2003-10-27 07:00:42 +00:00
}
2008-06-30 03:23:44 +00:00
/**
* 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.
*
* @see _http_build_query() Used to build the query
* @link http://us2.php.net/manual/en/function.http-build-query.php more on what
* http_build_query() does.
*
2008-08-10 16:45:50 +00:00
* @since 2.3.0
2008-06-30 03:23:44 +00:00
*
* @param array $data URL-encode key/value pairs.
* @return string URL encoded string
*/
2007-10-11 05:46:57 +00:00
function build_query ( $data ) {
2008-08-09 04:51:51 +00:00
return _http_build_query ( $data , null , '&' , '' , false );
2007-09-08 14:27:24 +00:00
}
2008-06-15 09:38:32 +00:00
/**
2008-06-30 03:23:44 +00:00
* Retrieve a modified URL query string.
2008-06-15 09:38:32 +00:00
*
2008-06-30 03:23:44 +00:00
* You can rebuild the URL and append a new query variable to the URL query by
* using this function. You can also retrieve the full URL with query data.
2008-06-15 09:38:32 +00:00
*
2008-06-30 03:23:44 +00:00
* 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.
2008-06-15 09:38:32 +00:00
*
* @since 1.5.0
*
* @param mixed $param1 Either newkey or an associative_array
* @param mixed $param2 Either newvalue or oldquery or uri
* @param mixed $param3 Optional. Old query or uri
2008-08-09 04:51:51 +00:00
* @return string New URL query string.
2008-06-15 09:38:32 +00:00
*/
2004-10-20 21:28:37 +00:00
function add_query_arg () {
$ret = '' ;
2007-10-11 05:46:57 +00:00
if ( is_array ( func_get_arg ( 0 ) ) ) {
if ( @ func_num_args () < 2 || false === @ func_get_arg ( 1 ) )
2006-01-23 23:42:25 +00:00
$uri = $_SERVER [ 'REQUEST_URI' ];
else
2007-10-11 05:46:57 +00:00
$uri = @ func_get_arg ( 1 );
2005-10-10 09:25:38 +00:00
} else {
2007-10-11 05:46:57 +00:00
if ( @ func_num_args () < 3 || false === @ func_get_arg ( 2 ) )
2004-11-21 06:03:19 +00:00
$uri = $_SERVER [ 'REQUEST_URI' ];
2005-10-10 09:25:38 +00:00
else
2007-10-11 05:46:57 +00:00
$uri = @ func_get_arg ( 2 );
2004-10-20 21:28:37 +00:00
}
2004-11-21 06:03:19 +00:00
2007-10-11 05:46:57 +00:00
if ( $frag = strstr ( $uri , '#' ) )
$uri = substr ( $uri , 0 , - strlen ( $frag ) );
2006-08-30 01:02:45 +00:00
else
$frag = '' ;
2007-10-11 05:46:57 +00:00
if ( preg_match ( '|^https?://|i' , $uri , $matches ) ) {
2006-06-08 18:36:05 +00:00
$protocol = $matches [ 0 ];
2007-10-11 05:46:57 +00:00
$uri = substr ( $uri , strlen ( $protocol ) );
2006-06-08 18:36:05 +00:00
} else {
$protocol = '' ;
}
2007-10-11 05:46:57 +00:00
if ( strpos ( $uri , '?' ) !== false ) {
$parts = explode ( '?' , $uri , 2 );
if ( 1 == count ( $parts ) ) {
2004-10-20 21:28:37 +00:00
$base = '?' ;
$query = $parts [ 0 ];
2005-10-10 09:25:38 +00:00
} else {
2004-10-20 21:28:37 +00:00
$base = $parts [ 0 ] . '?' ;
$query = $parts [ 1 ];
}
2007-10-11 05:46:57 +00:00
} elseif ( ! empty ( $protocol ) || strpos ( $uri , '=' ) === false ) {
2004-10-20 21:28:37 +00:00
$base = $uri . '?' ;
$query = '' ;
2005-04-01 05:42:46 +00:00
} else {
$base = '' ;
$query = $uri ;
2004-10-20 21:28:37 +00:00
}
2005-04-01 05:42:46 +00:00
2007-10-11 05:46:57 +00:00
wp_parse_str ( $query , $qs );
$qs = urlencode_deep ( $qs ); // this re-URL-encodes things that were already in the query string
if ( is_array ( func_get_arg ( 0 ) ) ) {
$kayvees = func_get_arg ( 0 );
$qs = array_merge ( $qs , $kayvees );
2005-10-10 09:25:38 +00:00
} else {
2007-10-11 05:46:57 +00:00
$qs [ func_get_arg ( 0 )] = func_get_arg ( 1 );
2004-10-20 21:28:37 +00:00
}
2005-10-10 09:25:38 +00:00
2008-08-06 20:31:54 +00:00
foreach ( ( array ) $qs as $k => $v ) {
2007-09-01 03:41:50 +00:00
if ( $v === false )
2007-10-11 05:46:57 +00:00
unset ( $qs [ $k ] );
2005-10-10 09:25:38 +00:00
}
2007-09-01 03:41:50 +00:00
2007-10-11 05:46:57 +00:00
$ret = build_query ( $qs );
$ret = trim ( $ret , '?' );
$ret = preg_replace ( '#=(&|$)#' , '$1' , $ret );
2006-08-30 01:02:45 +00:00
$ret = $protocol . $base . $ret . $frag ;
2007-10-11 05:46:57 +00:00
$ret = rtrim ( $ret , '?' );
2007-04-06 04:21:21 +00:00
return $ret ;
2004-10-20 21:28:37 +00:00
}
2008-06-15 09:38:32 +00:00
/**
* Removes an item or list from the query string.
*
* @since 1.5.0
*
* @param string|array $key Query key or keys to remove.
* @param bool $query When false uses the $_SERVER value.
2008-08-09 04:51:51 +00:00
* @return string New URL query string.
2008-06-15 09:38:32 +00:00
*/
function remove_query_arg ( $key , $query = false ) {
2007-10-11 05:46:57 +00:00
if ( is_array ( $key ) ) { // removing multiple keys
2008-08-06 20:31:54 +00:00
foreach ( $key as $k )
2008-06-15 09:38:32 +00:00
$query = add_query_arg ( $k , false , $query );
2006-06-08 18:36:05 +00:00
return $query ;
}
2008-06-15 09:38:32 +00:00
return add_query_arg ( $key , false , $query );
2004-10-20 21:28:37 +00:00
}
2004-12-04 00:12:08 +00:00
2008-06-15 09:38:32 +00:00
/**
* Walks the array while sanitizing the contents.
*
2008-08-10 16:45:50 +00:00
* @since 0.71
2008-06-15 09:38:32 +00:00
*
* @param array $array Array to used to walk while sanitizing contents.
* @return array Sanitized $array.
*/
2007-10-11 05:46:57 +00:00
function add_magic_quotes ( $array ) {
2008-08-06 20:31:54 +00:00
foreach ( ( array ) $array as $k => $v ) {
2007-10-11 05:46:57 +00:00
if ( is_array ( $v ) ) {
$array [ $k ] = add_magic_quotes ( $v );
2004-12-16 02:57:05 +00:00
} else {
2010-02-04 23:05:13 +00:00
$array [ $k ] = addslashes ( $v );
2004-12-16 02:57:05 +00:00
}
}
return $array ;
}
2008-06-30 03:23:44 +00:00
/**
* HTTP request for URI to retrieve content.
*
2008-08-10 16:45:50 +00:00
* @since 1.5.1
2008-09-27 21:41:19 +00:00
* @uses wp_remote_get()
2008-06-30 03:23:44 +00:00
*
* @param string $uri URI/URL of web page to retrieve.
2008-10-02 00:32:21 +00:00
* @return bool|string HTTP content. False on failure.
2008-06-30 03:23:44 +00:00
*/
2005-05-03 07:52:11 +00:00
function wp_remote_fopen ( $uri ) {
2007-10-11 05:46:57 +00:00
$parsed_url = @ parse_url ( $uri );
2007-01-16 18:41:05 +00:00
2007-10-11 05:46:57 +00:00
if ( ! $parsed_url || ! is_array ( $parsed_url ) )
2007-01-16 18:41:05 +00:00
return false ;
2008-09-27 21:41:19 +00:00
$options = array ();
$options [ 'timeout' ] = 10 ;
2007-01-16 18:41:05 +00:00
2008-09-27 21:41:19 +00:00
$response = wp_remote_get ( $uri , $options );
2007-01-16 18:41:05 +00:00
2008-10-02 00:32:21 +00:00
if ( is_wp_error ( $response ) )
return false ;
2008-09-27 21:41:19 +00:00
return $response [ 'body' ];
2005-05-03 07:52:11 +00:00
}
2008-08-09 04:51:51 +00:00
/**
2010-03-17 04:39:50 +00:00
* Set up the WordPress query.
2008-08-09 04:51:51 +00:00
*
* @since 2.0.0
*
* @param string $query_vars Default WP_Query arguments.
*/
2007-10-11 05:46:57 +00:00
function wp ( $query_vars = '' ) {
2007-10-12 21:47:34 +00:00
global $wp , $wp_query , $wp_the_query ;
2007-10-11 05:46:57 +00:00
$wp -> main ( $query_vars );
2007-10-12 21:47:34 +00:00
2010-01-11 22:08:49 +00:00
if ( ! isset ( $wp_the_query ) )
2007-10-12 21:47:34 +00:00
$wp_the_query = $wp_query ;
2005-06-10 23:15:13 +00:00
}
2008-06-15 09:38:32 +00:00
/**
* Retrieve the description for the HTTP status.
*
* @since 2.3.0
*
* @param int $code HTTP status code.
* @return string Empty string if not found, or description if found.
*/
2007-05-11 03:34:50 +00:00
function get_status_header_desc ( $code ) {
global $wp_header_to_desc ;
2007-06-14 02:25:30 +00:00
2007-10-11 05:46:57 +00:00
$code = absint ( $code );
2007-06-14 02:25:30 +00:00
2007-10-11 05:46:57 +00:00
if ( ! isset ( $wp_header_to_desc ) ) {
2007-09-13 04:48:41 +00:00
$wp_header_to_desc = array (
100 => 'Continue' ,
101 => 'Switching Protocols' ,
2009-03-07 21:05:54 +00:00
102 => 'Processing' ,
2007-09-13 04:48:41 +00:00
200 => 'OK' ,
201 => 'Created' ,
202 => 'Accepted' ,
203 => 'Non-Authoritative Information' ,
204 => 'No Content' ,
205 => 'Reset Content' ,
206 => 'Partial Content' ,
2009-03-07 21:05:54 +00:00
207 => 'Multi-Status' ,
226 => 'IM Used' ,
2007-09-13 04:48:41 +00:00
300 => 'Multiple Choices' ,
301 => 'Moved Permanently' ,
302 => 'Found' ,
303 => 'See Other' ,
304 => 'Not Modified' ,
305 => 'Use Proxy' ,
2009-03-07 21:05:54 +00:00
306 => 'Reserved' ,
2007-09-13 04:48:41 +00:00
307 => 'Temporary Redirect' ,
400 => 'Bad Request' ,
401 => 'Unauthorized' ,
2009-03-07 21:05:54 +00:00
402 => 'Payment Required' ,
2007-09-13 04:48:41 +00:00
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' ,
2009-03-07 21:05:54 +00:00
422 => 'Unprocessable Entity' ,
423 => 'Locked' ,
424 => 'Failed Dependency' ,
426 => 'Upgrade Required' ,
2007-09-13 04:48:41 +00:00
500 => 'Internal Server Error' ,
501 => 'Not Implemented' ,
502 => 'Bad Gateway' ,
503 => 'Service Unavailable' ,
504 => 'Gateway Timeout' ,
2009-03-07 21:05:54 +00:00
505 => 'HTTP Version Not Supported' ,
506 => 'Variant Also Negotiates' ,
507 => 'Insufficient Storage' ,
510 => 'Not Extended'
2007-09-13 04:48:41 +00:00
);
}
2007-10-11 05:46:57 +00:00
if ( isset ( $wp_header_to_desc [ $code ] ) )
2007-05-11 03:34:50 +00:00
return $wp_header_to_desc [ $code ];
2007-10-11 05:46:57 +00:00
else
2007-05-11 03:34:50 +00:00
return '' ;
}
2008-06-30 03:23:44 +00:00
/**
* Set HTTP status header.
*
2008-08-10 16:45:50 +00:00
* @since 2.0.0
2008-06-30 03:23:44 +00:00
* @uses apply_filters() Calls 'status_header' on status header string, HTTP
* HTTP code, HTTP code description, and protocol string as separate
* parameters.
*
* @param int $header HTTP status code
2010-02-19 01:08:39 +00:00
* @return unknown
2008-06-30 03:23:44 +00:00
*/
2005-06-09 00:17:43 +00:00
function status_header ( $header ) {
2007-05-11 04:02:30 +00:00
$text = get_status_header_desc ( $header );
2007-06-14 02:25:30 +00:00
2007-05-12 21:55:14 +00:00
if ( empty ( $text ) )
2007-05-11 03:34:50 +00:00
return false ;
2007-05-12 21:55:14 +00:00
$protocol = $_SERVER [ "SERVER_PROTOCOL" ];
2007-10-11 05:46:57 +00:00
if ( 'HTTP/1.1' != $protocol && 'HTTP/1.0' != $protocol )
2007-05-12 21:55:14 +00:00
$protocol = 'HTTP/1.0' ;
$status_header = " $protocol $header $text " ;
2007-10-11 05:46:57 +00:00
if ( function_exists ( 'apply_filters' ) )
$status_header = apply_filters ( 'status_header' , $status_header , $header , $text , $protocol );
2007-05-12 21:55:14 +00:00
2009-02-21 17:22:18 +00:00
return @ header ( $status_header , true , $header );
2005-06-09 00:17:43 +00:00
}
2009-02-21 21:39:06 +00:00
/**
* Gets the header information to prevent caching.
*
* The several different headers cover the different ways cache prevention is handled
* by different browsers
*
2010-12-01 19:24:38 +00:00
* @since 2.8.0
2009-02-21 21:39:06 +00:00
*
* @uses apply_filters()
* @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' ,
'Last-Modified' => gmdate ( 'D, d M Y H:i:s' ) . ' GMT' ,
'Cache-Control' => 'no-cache, must-revalidate, max-age=0' ,
'Pragma' => 'no-cache' ,
);
2009-03-18 02:43:45 +00:00
2009-02-22 10:09:30 +00:00
if ( function_exists ( 'apply_filters' ) ) {
2010-10-29 22:39:53 +00:00
$headers = ( array ) apply_filters ( 'nocache_headers' , $headers );
2009-02-22 10:09:30 +00:00
}
return $headers ;
2009-02-21 21:39:06 +00:00
}
2008-06-15 09:38:32 +00:00
/**
* Sets 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
2009-02-21 21:39:06 +00:00
* @uses wp_get_nocache_headers()
2008-06-15 09:38:32 +00:00
*/
2005-06-09 00:17:43 +00:00
function nocache_headers () {
2009-02-21 21:39:06 +00:00
$headers = wp_get_nocache_headers ();
2010-10-29 22:39:53 +00:00
foreach ( $headers as $name => $field_value )
2009-03-18 02:43:45 +00:00
@ header ( " { $name } : { $field_value } " );
2005-06-09 00:17:43 +00:00
}
2008-06-15 09:38:32 +00:00
/**
* Set the headers for caching for 10 days with JavaScript content type.
*
* @since 2.1.0
*/
2006-08-22 17:31:53 +00:00
function cache_javascript_headers () {
$expiresOffset = 864000 ; // 10 days
2007-10-11 05:46:57 +00:00
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" );
2006-08-22 17:31:53 +00:00
}
2008-06-15 09:38:32 +00:00
/**
* Retrieve the number of database queries during the WordPress execution.
*
* @since 2.0.0
*
* @return int Number of database queries
*/
2005-11-16 23:48:12 +00:00
function get_num_queries () {
global $wpdb ;
return $wpdb -> num_queries ;
}
2008-06-15 09:38:32 +00:00
/**
* Whether input is yes or no. Must be 'y' to be true.
*
* @since 1.0.0
*
* @param string $yn Character string containing either 'y' or 'n'
* @return bool True if yes, false on anything else
*/
2007-05-28 17:11:42 +00:00
function bool_from_yn ( $yn ) {
return ( strtolower ( $yn ) == 'y' );
2006-02-27 04:57:30 +00:00
}
2006-03-12 22:57:00 +00:00
2008-08-09 04:51:51 +00:00
/**
* Loads 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
* @uses $wp_query Used to tell if the use a comment feed.
* @uses do_action() Calls 'do_feed_$feed' hook, if a hook exists for the feed.
*/
2006-03-12 22:57:00 +00:00
function do_feed () {
2007-02-24 07:33:29 +00:00
global $wp_query ;
2007-10-11 05:46:57 +00:00
$feed = get_query_var ( 'feed' );
2006-03-12 22:57:00 +00:00
// Remove the pad, if present.
2007-10-11 05:46:57 +00:00
$feed = preg_replace ( '/^_+/' , '' , $feed );
2006-03-12 22:57:00 +00:00
2007-02-23 08:18:30 +00:00
if ( $feed == '' || $feed == 'feed' )
2007-12-06 19:58:15 +00:00
$feed = get_default_feed ();
2006-03-12 22:57:00 +00:00
$hook = 'do_feed_' . $feed ;
2008-02-26 10:05:05 +00:00
if ( ! has_action ( $hook ) ) {
2010-01-21 21:37:43 +00:00
$message = sprintf ( __ ( 'ERROR: %s is not a valid feed template.' ), esc_html ( $feed ));
2010-02-25 21:16:07 +00:00
wp_die ( $message , '' , array ( 'response' => 404 ) );
2008-02-26 10:05:05 +00:00
}
2008-03-02 20:17:30 +00:00
do_action ( $hook , $wp_query -> is_comment_feed );
2006-03-12 22:57:00 +00:00
}
2008-06-15 09:38:32 +00:00
/**
* Load the RDF RSS 0.91 Feed template.
*
* @since 2.1.0
*/
2006-03-12 22:57:00 +00:00
function do_feed_rdf () {
2007-10-11 05:46:57 +00:00
load_template ( ABSPATH . WPINC . '/feed-rdf.php' );
2006-03-12 22:57:00 +00:00
}
2008-06-15 09:38:32 +00:00
/**
* Load the RSS 1.0 Feed Template
*
* @since 2.1.0
*/
2006-03-12 22:57:00 +00:00
function do_feed_rss () {
2007-10-11 05:46:57 +00:00
load_template ( ABSPATH . WPINC . '/feed-rss.php' );
2006-03-12 22:57:00 +00:00
}
2008-06-15 09:38:32 +00:00
/**
* Load either the RSS2 comment feed or the RSS2 posts feed.
*
* @since 2.1.0
*
* @param bool $for_comments True for the comment feed, false for normal feed.
*/
2007-10-11 05:46:57 +00:00
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' );
2006-03-12 22:57:00 +00:00
}
2008-06-15 09:38:32 +00:00
/**
* Load either Atom comment feed or Atom posts feed.
*
* @since 2.1.0
*
* @param bool $for_comments True for the comment feed, false for normal feed.
*/
2007-10-11 05:46:57 +00:00
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' );
2006-03-12 22:57:00 +00:00
}
2006-03-31 08:07:39 +00:00
2008-06-15 09:38:32 +00:00
/**
* Display the robot.txt file content.
*
* The echo content should be with usage of the permalinks or for creating the
* robot.txt file.
*
* @since 2.1.0
* @uses do_action() Calls 'do_robotstxt' hook for displaying robot.txt rules.
*/
2006-05-22 22:06:06 +00:00
function do_robots () {
2007-10-11 05:46:57 +00:00
header ( 'Content-Type: text/plain; charset=utf-8' );
2007-03-27 16:44:36 +00:00
2007-10-11 05:46:57 +00:00
do_action ( 'do_robotstxt' );
2007-03-27 16:44:36 +00:00
2010-03-30 15:48:52 +00:00
$output = '' ;
$public = get_option ( 'blog_public' );
if ( '0' == $public ) {
$output .= "User-agent: * \n " ;
$output .= "Disallow: / \n " ;
2006-05-22 22:06:06 +00:00
} else {
2010-03-30 15:48:52 +00:00
$output .= "User-agent: * \n " ;
$output .= "Disallow: \n " ;
2006-05-22 22:06:06 +00:00
}
2010-03-30 15:48:52 +00:00
echo apply_filters ( 'robots_txt' , $output , $public );
2006-05-22 22:06:06 +00:00
}
2008-08-09 04:51:51 +00:00
/**
* Test whether blog 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 option siteurl for whether WordPress is installed.
*
* @since 2.1.0
* @uses $wpdb
*
* @return bool Whether blog is already installed.
*/
2006-03-31 08:07:39 +00:00
function is_blog_installed () {
2007-10-14 09:38:12 +00:00
global $wpdb ;
2007-10-13 18:39:28 +00:00
2008-08-09 04:51:51 +00:00
// Check cache first. If options table goes away and we have true cached, oh well.
2009-04-17 01:43:53 +00:00
if ( wp_cache_get ( 'is_blog_installed' ) )
2007-10-14 07:57:56 +00:00
return true ;
2007-10-13 18:39:28 +00:00
2008-03-12 22:41:43 +00:00
$suppress = $wpdb -> suppress_errors ();
2010-02-05 17:59:24 +00:00
if ( ! defined ( 'WP_INSTALLING' ) ) {
$alloptions = wp_load_alloptions ();
}
2009-04-17 01:43:53 +00:00
// If siteurl is not set to autoload, check it specifically
if ( ! isset ( $alloptions [ 'siteurl' ] ) )
2009-04-16 22:00:39 +00:00
$installed = $wpdb -> get_var ( "SELECT option_value FROM $wpdb->options WHERE option_name = 'siteurl'" );
2009-04-20 18:18:39 +00:00
else
2009-04-16 22:00:39 +00:00
$installed = $alloptions [ 'siteurl' ];
2009-04-17 01:43:53 +00:00
$wpdb -> suppress_errors ( $suppress );
2007-03-23 17:45:40 +00:00
2009-04-17 01:43:53 +00:00
$installed = ! empty ( $installed );
wp_cache_set ( 'is_blog_installed' , $installed );
2007-10-14 07:57:56 +00:00
2009-09-06 18:46:27 +00:00
if ( $installed )
return true ;
$suppress = $wpdb -> suppress_errors ();
$tables = $wpdb -> get_col ( 'SHOW TABLES' );
$wpdb -> suppress_errors ( $suppress );
2010-03-03 07:27:18 +00:00
$wp_tables = $wpdb -> tables ();
2009-09-06 18:46:27 +00:00
// 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.
2010-02-19 19:57:03 +00:00
foreach ( $wp_tables as $table ) {
2009-09-06 18:46:27 +00:00
// If one of the WP tables exist, then we are in an insane state.
2010-02-19 19:57:03 +00:00
if ( in_array ( $table , $tables ) ) {
2010-03-03 07:27:18 +00:00
// 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 )
2010-03-17 16:27:25 +00:00
continue ;
2010-03-03 07:27:18 +00:00
2009-09-06 18:46:27 +00:00
// If visiting repair.php, return true and let it take over.
if ( defined ( 'WP_REPAIRING' ) )
return true ;
// Die with a DB error.
2010-03-22 06:51:49 +00:00
$wpdb -> error = sprintf ( /*WP_I18N_NO_TABLES*/ 'One or more database tables are unavailable. The database may need to be <a href="%s">repaired</a>.' /*/WP_I18N_NO_TABLES*/ , 'maint/repair.php?referrer=is_blog_installed' );
2009-09-06 18:46:27 +00:00
dead_db ();
}
}
wp_cache_set ( 'is_blog_installed' , false );
return false ;
2006-03-31 08:07:39 +00:00
}
2006-04-19 03:03:27 +00:00
2008-08-09 04:51:51 +00:00
/**
* Retrieve URL with nonce added to URL query.
*
2008-08-10 16:45:50 +00:00
* @package WordPress
* @subpackage Security
2008-08-09 04:51:51 +00:00
* @since 2.0.4
*
* @param string $actionurl URL to add nonce action
* @param string $action Optional. Nonce action name
* @return string URL with nonce action added.
*/
2007-10-11 05:46:57 +00:00
function wp_nonce_url ( $actionurl , $action = - 1 ) {
$actionurl = str_replace ( '&' , '&' , $actionurl );
2009-05-18 15:11:07 +00:00
return esc_html ( add_query_arg ( '_wpnonce' , wp_create_nonce ( $action ), $actionurl ) );
2006-05-02 22:08:34 +00:00
}
2008-08-10 16:45:50 +00:00
/**
* Retrieve or display nonce hidden field for forms.
*
* The nonce field is used to validate that the contents of the form came from
* the location on the current site and not somewhere else. The nonce does not
* offer absolute protection, but should protect against most cases. It is very
* important to use nonce field in forms.
*
* If you set $echo to true and set $referer to true, then you will need to
* retrieve the {@link wp_referer_field() wp referer field}. If you have the
* $referer set to true and are echoing the nonce field, it will also echo the
* referer field.
*
* The $action and $name are optional, but if you want to have better security,
* it is strongly suggested to set those two parameters. It is easier to just
* call the function without any parameters, because validation of the nonce
* doesn't require any parameters, but since crackers know what the default is
* it won't be difficult for them to find a way around your nonce and cause
* damage.
*
* The input name will be whatever $name value you gave. The input value will be
* the nonce creation value.
*
* @package WordPress
* @subpackage Security
* @since 2.0.4
*
* @param string $action Optional. Action name.
* @param string $name Optional. Nonce name.
* @param bool $referer Optional, default true. Whether to set the referer field for validation.
* @param bool $echo Optional, default true. Whether to display or return hidden form field.
* @return string Nonce field.
*/
2008-03-15 22:44:34 +00:00
function wp_nonce_field ( $action = - 1 , $name = "_wpnonce" , $referer = true , $echo = true ) {
2009-05-05 19:43:53 +00:00
$name = esc_attr ( $name );
2008-03-15 22:44:34 +00:00
$nonce_field = '<input type="hidden" id="' . $name . '" name="' . $name . '" value="' . wp_create_nonce ( $action ) . '" />' ;
if ( $echo )
echo $nonce_field ;
2008-08-09 05:36:14 +00:00
2007-03-14 23:10:57 +00:00
if ( $referer )
2010-05-09 07:22:10 +00:00
wp_referer_field ( $echo );
2008-08-09 05:36:14 +00:00
2008-03-15 22:44:34 +00:00
return $nonce_field ;
2006-06-24 05:38:37 +00:00
}
2008-08-10 16:45:50 +00:00
/**
* Retrieve or display referer hidden field for forms.
*
* The referer link is the current Request URI from the server super global. The
* input name is '_wp_http_referer', in case you wanted to check manually.
*
* @package WordPress
* @subpackage Security
* @since 2.0.4
*
* @param bool $echo Whether to echo or return the referer field.
* @return string Referer field.
*/
2010-05-09 07:22:10 +00:00
function wp_referer_field ( $echo = true ) {
2009-05-05 19:43:53 +00:00
$ref = esc_attr ( $_SERVER [ 'REQUEST_URI' ] );
2008-03-15 22:44:34 +00:00
$referer_field = '<input type="hidden" name="_wp_http_referer" value="' . $ref . '" />' ;
if ( $echo )
echo $referer_field ;
return $referer_field ;
2006-06-24 05:38:37 +00:00
}
2008-08-10 16:45:50 +00:00
/**
* Retrieve or display original referer hidden field for forms.
*
* The input name is '_wp_original_http_referer' and will be either the same
* value of {@link wp_referer_field()}, if that was posted already or it will
* be the current page, if it doesn't exist.
*
* @package WordPress
* @subpackage Security
* @since 2.0.4
*
* @param bool $echo Whether to echo the original http referer
* @param string $jump_back_to Optional, default is 'current'. Can be 'previous' or page you want to jump back to.
* @return string Original referer field.
*/
2008-03-21 03:31:12 +00:00
function wp_original_referer_field ( $echo = true , $jump_back_to = 'current' ) {
$jump_back_to = ( 'previous' == $jump_back_to ) ? wp_get_referer () : $_SERVER [ 'REQUEST_URI' ];
$ref = ( wp_get_original_referer () ) ? wp_get_original_referer () : $jump_back_to ;
2009-05-05 19:43:53 +00:00
$orig_referer_field = '<input type="hidden" name="_wp_original_http_referer" value="' . esc_attr ( stripslashes ( $ref ) ) . '" />' ;
2008-03-15 22:44:34 +00:00
if ( $echo )
echo $orig_referer_field ;
return $orig_referer_field ;
2006-06-24 05:38:37 +00:00
}
2008-08-10 16:45:50 +00:00
/**
* Retrieve referer from '_wp_http_referer', HTTP referer, or current page respectively.
*
* @package WordPress
* @subpackage Security
* @since 2.0.4
*
* @return string|bool False on failure. Referer URL on success.
*/
2006-06-24 05:38:37 +00:00
function wp_get_referer () {
2008-08-08 17:05:10 +00:00
$ref = '' ;
2008-01-10 20:51:07 +00:00
if ( ! empty ( $_REQUEST [ '_wp_http_referer' ] ) )
2008-03-21 03:31:12 +00:00
$ref = $_REQUEST [ '_wp_http_referer' ];
2008-02-05 06:47:27 +00:00
else if ( ! empty ( $_SERVER [ 'HTTP_REFERER' ] ) )
2008-03-21 03:31:12 +00:00
$ref = $_SERVER [ 'HTTP_REFERER' ];
if ( $ref !== $_SERVER [ 'REQUEST_URI' ] )
return $ref ;
2006-06-24 05:38:37 +00:00
return false ;
}
2008-08-10 16:45:50 +00:00
/**
* Retrieve original referer that was posted, if it exists.
*
* @package WordPress
* @subpackage Security
* @since 2.0.4
*
* @return string|bool False if no original referer or original referer if set.
*/
2006-06-24 05:38:37 +00:00
function wp_get_original_referer () {
2007-10-11 05:46:57 +00:00
if ( ! empty ( $_REQUEST [ '_wp_original_http_referer' ] ) )
2006-06-24 05:38:37 +00:00
return $_REQUEST [ '_wp_original_http_referer' ];
return false ;
2006-05-02 22:08:34 +00:00
}
2008-08-10 16:45:50 +00:00
/**
* Recursive directory creation based on full path.
*
* Will attempt to set permissions on folders.
*
* @since 2.0.1
*
* @param string $target Full path to attempt to create.
2010-02-24 20:13:23 +00:00
* @return bool Whether the path was created. True if path already exists.
2008-08-10 16:45:50 +00:00
*/
2007-10-11 05:46:57 +00:00
function wp_mkdir_p ( $target ) {
2006-06-07 23:17:59 +00:00
// from php.net/mkdir user contributed notes
2008-03-21 18:27:56 +00:00
$target = str_replace ( '//' , '/' , $target );
2010-01-17 02:44:47 +00:00
2010-01-17 02:57:59 +00:00
// safe mode fails with a trailing slash under certain PHP versions.
2010-04-23 16:10:48 +00:00
$target = rtrim ( $target , '/' ); // Use rtrim() instead of untrailingslashit to avoid formatting.php dependency.
2010-01-17 02:44:47 +00:00
if ( empty ( $target ) )
$target = '/' ;
2007-10-11 05:46:57 +00:00
if ( file_exists ( $target ) )
return @ is_dir ( $target );
2006-06-07 23:17:59 +00:00
// Attempting to create the directory may clutter up our display.
2007-10-11 05:46:57 +00:00
if ( @ mkdir ( $target ) ) {
$stat = @ stat ( dirname ( $target ) );
2006-06-07 23:17:59 +00:00
$dir_perms = $stat [ 'mode' ] & 0007777 ; // Get the permission bits.
2007-10-11 05:46:57 +00:00
@ chmod ( $target , $dir_perms );
2006-06-07 23:17:59 +00:00
return true ;
2007-10-11 05:46:57 +00:00
} elseif ( is_dir ( dirname ( $target ) ) ) {
2006-06-07 23:17:59 +00:00
return false ;
}
// If the above failed, attempt to create the parent node, then try again.
2008-11-29 23:24:20 +00:00
if ( ( $target != '/' ) && ( wp_mkdir_p ( dirname ( $target ) ) ) )
2007-10-11 05:46:57 +00:00
return wp_mkdir_p ( $target );
2008-12-09 18:03:31 +00:00
2006-06-07 23:17:59 +00:00
return false ;
}
2008-08-09 04:51:51 +00:00
/**
* Test if a give filesystem path is absolute ('/foo/bar', 'c:\windows').
*
2008-08-10 16:45:50 +00:00
* @since 2.5.0
2008-08-09 04:51:51 +00:00
*
* @param string $path File path
* @return bool True if path is absolute, false is not absolute.
*/
2008-02-22 17:46:03 +00:00
function path_is_absolute ( $path ) {
// this is definitive if true but fails if $path does not exist or contains a symbolic link
if ( realpath ( $path ) == $path )
return true ;
2010-11-13 09:53:55 +00:00
if ( strlen ( $path ) == 0 || $path [ 0 ] == '.' )
2008-02-22 17:46:03 +00:00
return false ;
2008-03-02 20:17:30 +00:00
2008-02-22 17:46:03 +00:00
// windows allows absolute paths like this
if ( preg_match ( '#^[a-zA-Z]:\\\\#' , $path ) )
return true ;
// a path starting with / or \ is absolute; anything else is relative
return ( bool ) preg_match ( '#^[/\\\\]#' , $path );
}
2008-08-09 04:51:51 +00:00
/**
* Join two filesystem paths together (e.g. 'give me $path relative to $base').
*
* If the $path is absolute, then it the full path is returned.
*
2008-08-10 16:45:50 +00:00
* @since 2.5.0
2008-08-09 04:51:51 +00:00
*
* @param string $base
* @param string $path
* @return string The path with the base or absolute path.
*/
2008-02-22 17:46:03 +00:00
function path_join ( $base , $path ) {
if ( path_is_absolute ( $path ) )
return $path ;
2008-03-02 20:17:30 +00:00
2008-02-22 17:46:03 +00:00
return rtrim ( $base , '/' ) . '/' . ltrim ( $path , '/' );
}
2007-10-11 05:46:57 +00:00
2008-08-09 04:51:51 +00:00
/**
2008-08-10 16:45:50 +00:00
* Get an array containing the current upload directory's path and url.
2008-08-09 04:51:51 +00:00
*
2008-08-10 16:45:50 +00:00
* Checks the 'upload_path' option, which should be from the web root folder,
* and if it isn't empty it will be used. If it is empty, then the path will be
* 'WP_CONTENT_DIR/uploads'. If the 'UPLOADS' constant is defined, then it will
* override the 'upload_path' option and 'WP_CONTENT_DIR/uploads' path.
*
* The upload URL path is set either by the 'upload_url_path' option or by using
* the 'WP_CONTENT_URL' constant and appending '/uploads' to the path.
*
* If the 'uploads_use_yearmonth_folders' is set to true (checkbox if checked in
* the administration settings panel), then the time will be used. The format
* will be year first and then month.
*
* If the path couldn't be created, then an error will be returned with the key
* 'error' containing the error message. The error suggests that the parent
* directory is not writable by the server.
*
* On success, the returned array will have many indices:
* 'path' - base directory and sub directory or full path to upload directory.
* 'url' - base url and sub directory or absolute URL to upload directory.
* 'subdir' - sub directory if uploads use year/month folders option is on.
* 'basedir' - path without subdir.
* 'baseurl' - URL path without subdir.
* 'error' - set to false.
2008-08-09 04:51:51 +00:00
*
* @since 2.0.0
2008-08-10 16:45:50 +00:00
* @uses apply_filters() Calls 'upload_dir' on returned array.
2008-08-09 04:51:51 +00:00
*
2008-08-10 16:45:50 +00:00
* @param string $time Optional. Time formatted in 'yyyy/mm'.
* @return array See above for description.
2008-08-09 04:51:51 +00:00
*/
function wp_upload_dir ( $time = null ) {
2010-05-07 22:50:05 +00:00
global $switched ;
2007-10-11 05:46:57 +00:00
$siteurl = get_option ( 'siteurl' );
2008-03-03 04:14:16 +00:00
$upload_path = get_option ( 'upload_path' );
2008-07-16 16:49:22 +00:00
$upload_path = trim ( $upload_path );
2010-09-10 20:29:19 +00:00
$main_override = is_multisite () && defined ( 'MULTISITE' ) && is_main_site ();
2009-12-15 17:53:51 +00:00
if ( empty ( $upload_path ) ) {
2008-07-16 16:49:22 +00:00
$dir = WP_CONTENT_DIR . '/uploads' ;
2009-12-15 17:53:51 +00:00
} else {
2008-07-16 16:49:22 +00:00
$dir = $upload_path ;
2009-12-15 17:53:51 +00:00
if ( 'wp-content/uploads' == $upload_path ) {
$dir = WP_CONTENT_DIR . '/uploads' ;
} elseif ( 0 !== strpos ( $dir , ABSPATH ) ) {
// $dir is absolute, $upload_path is (maybe) relative to ABSPATH
$dir = path_join ( ABSPATH , $dir );
}
}
2008-08-09 05:36:14 +00:00
2008-07-16 16:49:22 +00:00
if ( ! $url = get_option ( 'upload_url_path' ) ) {
2009-12-15 17:53:51 +00:00
if ( empty ( $upload_path ) || ( 'wp-content/uploads' == $upload_path ) || ( $upload_path == $dir ) )
2008-07-16 16:49:22 +00:00
$url = WP_CONTENT_URL . '/uploads' ;
else
$url = trailingslashit ( $siteurl ) . $upload_path ;
}
2006-06-07 23:17:59 +00:00
2010-06-10 19:37:51 +00:00
if ( defined ( 'UPLOADS' ) && ! $main_override && ( ! isset ( $switched ) || $switched === false ) ) {
2006-06-07 23:17:59 +00:00
$dir = ABSPATH . UPLOADS ;
2007-10-11 05:46:57 +00:00
$url = trailingslashit ( $siteurl ) . UPLOADS ;
2006-06-07 23:17:59 +00:00
}
2008-07-07 23:53:54 +00:00
2010-06-10 19:37:51 +00:00
if ( is_multisite () && ! $main_override && ( ! isset ( $switched ) || $switched === false ) ) {
2010-01-26 20:02:11 +00:00
if ( defined ( 'BLOGUPLOADDIR' ) )
$dir = untrailingslashit ( BLOGUPLOADDIR );
$url = str_replace ( UPLOADS , 'files' , $url );
}
2010-01-26 19:04:55 +00:00
2008-08-09 05:36:14 +00:00
$bdir = $dir ;
2008-07-07 23:53:54 +00:00
$burl = $url ;
2008-02-22 17:46:03 +00:00
$subdir = '' ;
2007-10-11 05:46:57 +00:00
if ( get_option ( 'uploads_use_yearmonth_folders' ) ) {
2006-06-07 23:17:59 +00:00
// Generate the yearly and monthly dirs
2007-12-16 21:34:48 +00:00
if ( ! $time )
$time = current_time ( 'mysql' );
2006-06-07 23:17:59 +00:00
$y = substr ( $time , 0 , 4 );
$m = substr ( $time , 5 , 2 );
2008-02-22 17:46:03 +00:00
$subdir = "/ $y / $m " ;
2006-06-07 23:17:59 +00:00
}
2008-03-02 20:17:30 +00:00
2008-02-22 17:46:03 +00:00
$dir .= $subdir ;
$url .= $subdir ;
2006-06-07 23:17:59 +00:00
2009-05-30 10:02:01 +00:00
$uploads = apply_filters ( 'upload_dir' , array ( 'path' => $dir , 'url' => $url , 'subdir' => $subdir , 'basedir' => $bdir , 'baseurl' => $burl , 'error' => false ) );
2006-06-07 23:17:59 +00:00
// Make sure we have an uploads dir
2009-05-30 10:02:01 +00:00
if ( ! wp_mkdir_p ( $uploads [ 'path' ] ) ) {
$message = sprintf ( __ ( 'Unable to create directory %s. Is its parent directory writable by the server?' ), $uploads [ 'path' ] );
2007-10-11 05:46:57 +00:00
return array ( 'error' => $message );
2006-06-07 23:17:59 +00:00
}
2008-08-09 05:36:14 +00:00
2009-05-30 10:02:01 +00:00
return $uploads ;
2006-06-07 23:17:59 +00:00
}
2008-08-09 04:51:51 +00:00
/**
* Get a filename that is sanitized and unique for the given directory.
*
2008-08-10 16:45:50 +00:00
* If the filename is not unique, then a number will be added to the filename
* before the extension, and will continue adding numbers until the filename is
* unique.
*
2010-10-27 22:27:06 +00:00
* The callback is passed three parameters, the first one is the directory, the
* second is the filename, and the third is the extension.
2008-08-09 04:51:51 +00:00
*
2010-12-01 19:24:38 +00:00
* @since 2.5.0
2008-08-09 04:51:51 +00:00
*
* @param string $dir
* @param string $filename
2010-10-27 22:27:06 +00:00
* @param mixed $unique_filename_callback Callback.
2008-08-10 16:45:50 +00:00
* @return string New filename, if given wasn't unique.
2008-08-09 04:51:51 +00:00
*/
function wp_unique_filename ( $dir , $filename , $unique_filename_callback = null ) {
2009-05-04 20:20:48 +00:00
// sanitize the file name before we begin processing
$filename = sanitize_file_name ( $filename );
2007-12-18 03:32:43 +00:00
// separate the filename into a name and extension
$info = pathinfo ( $filename );
2009-11-25 05:04:30 +00:00
$ext = ! empty ( $info [ 'extension' ]) ? '.' . $info [ 'extension' ] : '' ;
$name = basename ( $filename , $ext );
2009-05-24 23:47:49 +00:00
2008-03-21 04:03:33 +00:00
// edge case: if file is named '.ext', treat as an empty name
2010-01-11 22:08:49 +00:00
if ( $name === $ext )
2008-03-21 04:03:33 +00:00
$name = '' ;
2008-02-05 06:47:27 +00:00
2010-10-27 22:27:06 +00:00
// Increment the file number until we have a unique file to save in $dir. Use callback if supplied.
2010-04-02 23:54:56 +00:00
if ( $unique_filename_callback && is_callable ( $unique_filename_callback ) ) {
2010-10-27 22:27:06 +00:00
$filename = call_user_func ( $unique_filename_callback , $dir , $name , $ext );
2007-12-16 21:34:48 +00:00
} else {
$number = '' ;
2008-03-21 04:03:33 +00:00
2009-11-25 05:04:30 +00:00
// change '.ext' to lower case
if ( $ext && strtolower ( $ext ) != $ext ) {
$ext2 = strtolower ( $ext );
$filename2 = preg_replace ( '|' . preg_quote ( $ext ) . '$|' , $ext2 , $filename );
// check for both lower and upper case extension or image sub-sizes may be overwritten
while ( file_exists ( $dir . "/ $filename " ) || file_exists ( $dir . "/ $filename2 " ) ) {
$new_number = $number + 1 ;
$filename = str_replace ( " $number$ext " , " $new_number$ext " , $filename );
$filename2 = str_replace ( " $number$ext2 " , " $new_number$ext2 " , $filename2 );
$number = $new_number ;
}
return $filename2 ;
}
2008-03-21 04:03:33 +00:00
2007-12-16 21:34:48 +00:00
while ( file_exists ( $dir . "/ $filename " ) ) {
if ( '' == " $number$ext " )
$filename = $filename . ++ $number . $ext ;
else
$filename = str_replace ( " $number$ext " , ++ $number . $ext , $filename );
}
}
2008-02-05 06:47:27 +00:00
2007-12-16 21:34:48 +00:00
return $filename ;
}
2008-08-10 16:45:50 +00:00
/**
* Create a file in the upload folder with given content.
*
* If there is an error, then the key 'error' will exist with the error message.
* If success, then the key 'file' will have the unique file path, the 'url' key
* will have the link to the new file. and the 'error' key will be set to false.
*
* This function will not move an uploaded file to the upload folder. It will
* create a new file with the content in $bits parameter. If you move the upload
* file, read the content of the uploaded file, and then you can give the
* filename and content to this function, which will add it to the upload
* folder.
*
* The permissions will be set on the new file automatically by this function.
*
* @since 2.0.0
*
* @param string $name
2010-01-09 10:03:55 +00:00
* @param null $deprecated Never used. Set to null.
2008-08-10 16:45:50 +00:00
* @param mixed $bits File content
* @param string $time Optional. Time formatted in 'yyyy/mm'.
* @return array
*/
2008-08-09 04:51:51 +00:00
function wp_upload_bits ( $name , $deprecated , $bits , $time = null ) {
2009-12-30 16:23:39 +00:00
if ( ! empty ( $deprecated ) )
2010-01-09 10:03:55 +00:00
_deprecated_argument ( __FUNCTION__ , '2.0' );
2009-12-30 16:23:39 +00:00
2007-10-11 05:46:57 +00:00
if ( empty ( $name ) )
2008-10-21 23:54:18 +00:00
return array ( 'error' => __ ( 'Empty filename' ) );
2006-06-21 23:17:19 +00:00
2007-10-11 05:46:57 +00:00
$wp_filetype = wp_check_filetype ( $name );
2006-06-21 23:17:19 +00:00
if ( ! $wp_filetype [ 'ext' ] )
2008-10-21 23:54:18 +00:00
return array ( 'error' => __ ( 'Invalid file type' ) );
2006-06-07 23:17:59 +00:00
2007-12-16 21:34:48 +00:00
$upload = wp_upload_dir ( $time );
2006-06-07 23:17:59 +00:00
if ( $upload [ 'error' ] !== false )
return $upload ;
2008-02-05 06:47:27 +00:00
2010-01-11 22:08:49 +00:00
$upload_bits_error = apply_filters ( 'wp_upload_bits' , array ( 'name' => $name , 'bits' => $bits , 'time' => $time ) );
if ( ! is_array ( $upload_bits_error ) ) {
$upload [ 'error' ] = $upload_bits_error ;
return $upload ;
}
2010-01-11 21:49:40 +00:00
2007-12-18 03:32:43 +00:00
$filename = wp_unique_filename ( $upload [ 'path' ], $name );
2006-06-07 23:17:59 +00:00
2007-03-09 20:14:52 +00:00
$new_file = $upload [ 'path' ] . "/ $filename " ;
2007-10-11 05:46:57 +00:00
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 ) );
return array ( 'error' => $message );
2006-06-07 23:17:59 +00:00
}
2007-10-11 05:46:57 +00:00
$ifp = @ fopen ( $new_file , 'wb' );
2006-06-07 23:17:59 +00:00
if ( ! $ifp )
2007-10-11 05:46:57 +00:00
return array ( 'error' => sprintf ( __ ( 'Could not write file %s' ), $new_file ) );
2006-06-07 23:17:59 +00:00
2007-12-06 19:49:33 +00:00
@ fwrite ( $ifp , $bits );
2007-10-11 05:46:57 +00:00
fclose ( $ifp );
2010-06-02 14:01:21 +00:00
clearstatcache ();
2010-06-02 20:04:07 +00:00
2006-06-07 23:17:59 +00:00
// Set correct file permissions
2007-10-11 05:46:57 +00:00
$stat = @ stat ( dirname ( $new_file ) );
2006-06-07 23:17:59 +00:00
$perms = $stat [ 'mode' ] & 0007777 ;
$perms = $perms & 0000666 ;
2007-10-11 05:46:57 +00:00
@ chmod ( $new_file , $perms );
2010-06-02 14:01:21 +00:00
clearstatcache ();
2006-06-07 23:17:59 +00:00
2007-03-09 20:14:52 +00:00
// Compute the URL
2006-06-07 23:17:59 +00:00
$url = $upload [ 'url' ] . "/ $filename " ;
2007-10-11 05:46:57 +00:00
return array ( 'file' => $new_file , 'url' => $url , 'error' => false );
2006-06-07 23:17:59 +00:00
}
2008-08-09 04:51:51 +00:00
/**
* Retrieve the file type based on the extension name.
*
* @package WordPress
2008-08-10 16:45:50 +00:00
* @since 2.5.0
2008-08-09 04:51:51 +00:00
* @uses apply_filters() Calls 'ext2type' hook on default supported types.
*
* @param string $ext The extension to search.
* @return string|null The file type, example: audio, video, document, spreadsheet, etc. Null if not found.
*/
2008-02-29 06:54:15 +00:00
function wp_ext2type ( $ext ) {
2009-12-30 07:59:33 +00:00
$ext2type = apply_filters ( 'ext2type' , array (
2010-02-23 23:26:30 +00:00
'audio' => array ( 'aac' , 'ac3' , 'aif' , 'aiff' , 'm3a' , 'm4a' , 'm4b' , 'mka' , 'mp1' , 'mp2' , 'mp3' , 'ogg' , 'oga' , 'ram' , 'wav' , 'wma' ),
'video' => array ( 'asf' , 'avi' , 'divx' , 'dv' , 'flv' , 'm4v' , 'mkv' , 'mov' , 'mp4' , 'mpeg' , 'mpg' , 'mpv' , 'ogm' , 'ogv' , 'qt' , 'rm' , 'vob' , 'wmv' ),
2010-04-11 08:50:23 +00:00
'document' => array ( 'doc' , 'docx' , 'docm' , 'dotm' , 'odt' , 'pages' , 'pdf' , 'rtf' , 'wp' , 'wpd' ),
2009-12-30 07:59:33 +00:00
'spreadsheet' => array ( 'numbers' , 'ods' , 'xls' , 'xlsx' , 'xlsb' , 'xlsm' ),
'interactive' => array ( 'key' , 'ppt' , 'pptx' , 'pptm' , 'odp' , 'swf' ),
2010-04-11 02:11:29 +00:00
'text' => array ( 'asc' , 'csv' , 'tsv' , 'txt' ),
2010-01-13 10:06:02 +00:00
'archive' => array ( 'bz2' , 'cab' , 'dmg' , 'gz' , 'rar' , 'sea' , 'sit' , 'sqx' , 'tar' , 'tgz' , 'zip' ),
2010-04-11 08:50:23 +00:00
'code' => array ( 'css' , 'htm' , 'html' , 'php' , 'js' ),
2008-02-29 06:54:15 +00:00
));
foreach ( $ext2type as $type => $exts )
2009-12-30 07:59:33 +00:00
if ( in_array ( $ext , $exts ) )
2008-02-29 06:54:15 +00:00
return $type ;
}
2007-10-11 05:46:57 +00:00
2008-08-09 04:51:51 +00:00
/**
* Retrieve the file type from the file name.
*
* You can optionally define the mime array, if needed.
*
* @since 2.0.4
*
* @param string $filename File name or path.
* @param array $mimes Optional. Key is the file extension with value as the mime type.
* @return array Values with extension first and mime type.
*/
2007-10-11 05:46:57 +00:00
function wp_check_filetype ( $filename , $mimes = null ) {
2009-11-12 05:20:48 +00:00
if ( empty ( $mimes ) )
2009-11-11 23:07:29 +00:00
$mimes = get_allowed_mime_types ();
$type = false ;
$ext = false ;
foreach ( $mimes as $ext_preg => $mime_match ) {
$ext_preg = '!\.(' . $ext_preg . ')$!i' ;
if ( preg_match ( $ext_preg , $filename , $ext_matches ) ) {
$type = $mime_match ;
$ext = $ext_matches [ 1 ];
break ;
}
}
return compact ( 'ext' , 'type' );
}
2010-05-15 04:47:03 +00:00
/**
* Attempt to determine the real file type of a file.
* If unable to, the file name extension will be used to determine type.
*
* If it's determined that the extension does not match the file's real type,
* then the "proper_filename" value will be set with a proper filename and extension.
*
* Currently this function only supports validating images known to getimagesize().
*
* @since 3.0.0
*
* @param string $file Full path to the image.
* @param string $filename The filename of the image (may differ from $file due to $file being in a tmp directory)
* @param array $mimes Optional. Key is the file extension with value as the mime type.
* @return array Values for the extension, MIME, and either a corrected filename or false if original $filename is valid
*/
function wp_check_filetype_and_ext ( $file , $filename , $mimes = null ) {
$proper_filename = false ;
// Do basic extension validation and MIME mapping
$wp_filetype = wp_check_filetype ( $filename , $mimes );
extract ( $wp_filetype );
// We can't do any further validation without a file to work with
if ( ! file_exists ( $file ) )
return compact ( 'ext' , 'type' , 'proper_filename' );
// We're able to validate images using GD
if ( $type && 0 === strpos ( $type , 'image/' ) && function_exists ( 'getimagesize' ) ) {
// Attempt to figure out what type of image it actually is
$imgstats = @ getimagesize ( $file );
// If getimagesize() knows what kind of image it really is and if the real MIME doesn't match the claimed MIME
if ( ! empty ( $imgstats [ 'mime' ]) && $imgstats [ 'mime' ] != $type ) {
// This is a simplified array of MIMEs that getimagesize() can detect and their extensions
// You shouldn't need to use this filter, but it's here just in case
$mime_to_ext = apply_filters ( 'getimagesize_mimes_to_exts' , array (
'image/jpeg' => 'jpg' ,
'image/png' => 'png' ,
'image/gif' => 'gif' ,
'image/bmp' => 'bmp' ,
'image/tiff' => 'tif' ,
) );
// Replace whatever is after the last period in the filename with the correct extension
if ( ! empty ( $mime_to_ext [ $imgstats [ 'mime' ] ] ) ) {
$filename_parts = explode ( '.' , $filename );
array_pop ( $filename_parts );
$filename_parts [] = $mime_to_ext [ $imgstats [ 'mime' ] ];
$new_filename = implode ( '.' , $filename_parts );
if ( $new_filename != $filename )
$proper_filename = $new_filename ; // Mark that it changed
// Redefine the extension / MIME
$wp_filetype = wp_check_filetype ( $new_filename , $mimes );
extract ( $wp_filetype );
}
}
}
// Let plugins try and validate other types of files
// Should return an array in the style of array( 'ext' => $ext, 'type' => $type, 'proper_filename' => $proper_filename )
return apply_filters ( 'wp_check_filetype_and_ext' , compact ( 'ext' , 'type' , 'proper_filename' ), $file , $filename , $mimes );
}
2009-11-11 23:07:29 +00:00
/**
* Retrieve list of allowed mime types and file extensions.
*
* @since 2.8.6
*
* @return array Array of mime types keyed by the file extension regex corresponding to those types.
*/
function get_allowed_mime_types () {
static $mimes = false ;
if ( ! $mimes ) {
// Accepted MIME types are set here as PCRE unless provided.
$mimes = apply_filters ( 'upload_mimes' , array (
2006-06-21 23:17:19 +00:00
'jpg|jpeg|jpe' => 'image/jpeg' ,
'gif' => 'image/gif' ,
'png' => 'image/png' ,
'bmp' => 'image/bmp' ,
2008-12-18 03:34:29 +00:00
'tif|tiff' => 'image/tiff' ,
2006-06-21 23:17:19 +00:00
'ico' => 'image/x-icon' ,
'asf|asx|wax|wmv|wmx' => 'video/asf' ,
'avi' => 'video/avi' ,
2008-11-20 01:11:45 +00:00
'divx' => 'video/divx' ,
2009-11-20 04:19:44 +00:00
'flv' => 'video/x-flv' ,
2006-06-21 23:17:19 +00:00
'mov|qt' => 'video/quicktime' ,
2009-04-15 19:36:09 +00:00
'mpeg|mpg|mpe' => 'video/mpeg' ,
2009-12-30 07:59:33 +00:00
'txt|asc|c|cc|h' => 'text/plain' ,
2010-04-03 08:24:13 +00:00
'csv' => 'text/csv' ,
2010-04-11 02:11:29 +00:00
'tsv' => 'text/tab-separated-values' ,
2006-06-21 23:17:19 +00:00
'rtx' => 'text/richtext' ,
'css' => 'text/css' ,
'htm|html' => 'text/html' ,
2010-01-13 10:06:02 +00:00
'mp3|m4a|m4b' => 'audio/mpeg' ,
2009-04-15 19:36:09 +00:00
'mp4|m4v' => 'video/mp4' ,
2006-06-21 23:17:19 +00:00
'ra|ram' => 'audio/x-realaudio' ,
'wav' => 'audio/wav' ,
2010-02-23 23:26:30 +00:00
'ogg|oga' => 'audio/ogg' ,
'ogv' => 'video/ogg' ,
2006-06-21 23:17:19 +00:00
'mid|midi' => 'audio/midi' ,
'wma' => 'audio/wma' ,
2010-01-15 22:11:12 +00:00
'mka' => 'audio/x-matroska' ,
'mkv' => 'video/x-matroska' ,
2006-06-21 23:17:19 +00:00
'rtf' => 'application/rtf' ,
'js' => 'application/javascript' ,
'pdf' => 'application/pdf' ,
2008-11-13 15:17:26 +00:00
'doc|docx' => 'application/msword' ,
2009-12-30 07:59:33 +00:00
'pot|pps|ppt|pptx|ppam|pptm|sldm|ppsm|potm' => 'application/vnd.ms-powerpoint' ,
2006-06-21 23:17:19 +00:00
'wri' => 'application/vnd.ms-write' ,
2009-12-30 07:59:33 +00:00
'xla|xls|xlsx|xlt|xlw|xlam|xlsb|xlsm|xltm' => 'application/vnd.ms-excel' ,
2006-06-21 23:17:19 +00:00
'mdb' => 'application/vnd.ms-access' ,
'mpp' => 'application/vnd.ms-project' ,
2009-12-30 07:59:33 +00:00
'docm|dotm' => 'application/vnd.ms-word' ,
'pptx|sldx|ppsx|potx' => 'application/vnd.openxmlformats-officedocument.presentationml' ,
'xlsx|xltx' => 'application/vnd.openxmlformats-officedocument.spreadsheetml' ,
'docx|dotx' => 'application/vnd.openxmlformats-officedocument.wordprocessingml' ,
'onetoc|onetoc2|onetmp|onepkg' => 'application/onenote' ,
2006-06-21 23:17:19 +00:00
'swf' => 'application/x-shockwave-flash' ,
'class' => 'application/java' ,
'tar' => 'application/x-tar' ,
'zip' => 'application/zip' ,
'gz|gzip' => 'application/x-gzip' ,
2007-08-23 18:28:14 +00:00
'exe' => 'application/x-msdownload' ,
// openoffice formats
'odt' => 'application/vnd.oasis.opendocument.text' ,
'odp' => 'application/vnd.oasis.opendocument.presentation' ,
'ods' => 'application/vnd.oasis.opendocument.spreadsheet' ,
'odg' => 'application/vnd.oasis.opendocument.graphics' ,
'odc' => 'application/vnd.oasis.opendocument.chart' ,
'odb' => 'application/vnd.oasis.opendocument.database' ,
'odf' => 'application/vnd.oasis.opendocument.formula' ,
2010-04-11 08:50:23 +00:00
// wordperfect formats
'wp|wpd' => 'application/wordperfect' ,
2009-11-11 23:07:29 +00:00
) );
2006-06-21 23:17:19 +00:00
}
2009-11-11 23:07:29 +00:00
return $mimes ;
2006-06-21 23:17:19 +00:00
}
2009-11-12 05:20:48 +00:00
2008-08-09 04:51:51 +00:00
/**
* 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).
*
2008-08-10 16:45:50 +00:00
* @package WordPress
* @subpackage Security
2008-08-09 04:51:51 +00:00
* @since 2.0.4
*
* @param string $action Nonce action.
* @return string Are you sure message.
*/
2007-10-11 05:46:57 +00:00
function wp_explain_nonce ( $action ) {
if ( $action !== - 1 && preg_match ( '/([a-z]+)-([a-z]+)(_(.+))?/' , $action , $matches ) ) {
2006-06-27 08:06:00 +00:00
$verb = $matches [ 1 ];
$noun = $matches [ 2 ];
$trans = array ();
2009-05-05 04:28:05 +00:00
$trans [ 'update' ][ 'attachment' ] = array ( __ ( 'Your attempt to edit this attachment: “%s” has failed.' ), 'get_the_title' );
2008-02-13 17:39:40 +00:00
$trans [ 'add' ][ 'category' ] = array ( __ ( 'Your attempt to add this category has failed.' ), false );
2009-05-05 04:28:05 +00:00
$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' );
2008-02-13 17:39:40 +00:00
2009-05-05 04:28:05 +00:00
$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' );
2008-02-13 17:39:40 +00:00
$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 );
2009-05-05 04:28:05 +00:00
$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' );
2008-02-13 17:39:40 +00:00
$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 );
2009-05-05 04:28:05 +00:00
$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' );
2008-02-13 17:39:40 +00:00
2009-05-05 04:28:05 +00:00
$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' );
2010-12-02 21:45:47 +00:00
$trans [ 'upgrade' ][ 'plugin' ] = array ( __ ( 'Your attempt to update this plugin: “%s” has failed.' ), 'use_id' );
2008-02-13 17:39:40 +00:00
$trans [ 'add' ][ 'post' ] = array ( __ ( 'Your attempt to add this post has failed.' ), false );
2009-05-05 04:28:05 +00:00
$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' );
2008-02-13 17:39:40 +00:00
$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 );
2009-05-16 22:32:48 +00:00
$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' );
2008-02-13 17:39:40 +00:00
$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' );
2009-05-05 04:28:05 +00:00
$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' );
2007-10-11 05:46:57 +00:00
2008-09-28 21:05:37 +00:00
$trans [ 'log' ][ 'out' ] = array ( sprintf ( __ ( 'You are attempting to log out of %s' ), get_bloginfo ( 'sitename' ) ), false );
2007-10-11 05:46:57 +00:00
if ( isset ( $trans [ $verb ][ $noun ] ) ) {
if ( ! empty ( $trans [ $verb ][ $noun ][ 1 ] ) ) {
2006-06-27 08:06:00 +00:00
$lookup = $trans [ $verb ][ $noun ][ 1 ];
2009-05-16 22:32:48 +00:00
if ( isset ( $trans [ $verb ][ $noun ][ 2 ]) )
$lookup_value = $trans [ $verb ][ $noun ][ 2 ];
2006-06-27 08:06:00 +00:00
$object = $matches [ 4 ];
2009-05-16 22:32:48 +00:00
if ( 'use_id' != $lookup ) {
if ( isset ( $lookup_value ) )
$object = call_user_func ( $lookup , $lookup_value , $object );
else
$object = call_user_func ( $lookup , $object );
}
2009-05-18 15:11:07 +00:00
return sprintf ( $trans [ $verb ][ $noun ][ 0 ], esc_html ( $object ) );
2006-06-27 08:06:00 +00:00
} else {
return $trans [ $verb ][ $noun ][ 0 ];
}
}
2009-09-23 06:51:19 +00:00
return apply_filters ( 'explain_nonce_' . $verb . '-' . $noun , __ ( 'Are you sure you want to do this?' ), isset ( $matches [ 4 ]) ? $matches [ 4 ] : '' );
2009-04-01 05:52:05 +00:00
} else {
return apply_filters ( 'explain_nonce_' . $action , __ ( 'Are you sure you want to do this?' ) );
}
2006-06-27 08:06:00 +00:00
}
2008-08-09 04:51:51 +00:00
/**
* Display "Are You Sure" message to confirm the action being taken.
*
* If the action has the nonce explain message, then it will be displayed along
* with the "Are you sure?" message.
*
2008-08-10 16:45:50 +00:00
* @package WordPress
* @subpackage Security
2008-08-09 04:51:51 +00:00
* @since 2.0.4
*
* @param string $action The nonce action.
*/
2007-10-11 05:46:57 +00:00
function wp_nonce_ays ( $action ) {
2008-02-13 17:39:40 +00:00
$title = __ ( 'WordPress Failure Notice' );
2009-05-18 15:11:07 +00:00
$html = esc_html ( wp_explain_nonce ( $action ) );
2009-12-01 21:21:31 +00:00
if ( 'log-out' == $action )
2009-04-14 18:31:49 +00:00
$html .= "</p><p>" . sprintf ( __ ( "Do you really want to <a href='%s'>log out</a>?" ), wp_logout_url () );
2009-12-01 21:21:31 +00:00
elseif ( wp_get_referer () )
$html .= "</p><p><a href='" . esc_url ( remove_query_arg ( 'updated' , wp_get_referer () ) ) . "'>" . __ ( 'Please try again.' ) . "</a>" ;
2008-09-28 21:05:37 +00:00
2009-12-01 21:21:31 +00:00
wp_die ( $html , $title , array ( 'response' => 403 ) );
2006-06-27 08:06:00 +00:00
}
2010-01-21 22:13:20 +00:00
2008-08-09 04:51:51 +00:00
/**
* Kill WordPress execution and display HTML message with error message.
*
2010-01-21 22:13:20 +00:00
* This function complements the die() PHP function. The difference is that
2008-08-09 04:51:51 +00:00
* 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.
*
* @since 2.0.4
*
* @param string $message Error message.
* @param string $title Error title.
2008-10-24 21:00:40 +00:00
* @param string|array $args Optional arguements to control behaviour.
2008-08-09 04:51:51 +00:00
*/
2008-10-24 21:00:40 +00:00
function wp_die ( $message , $title = '' , $args = array () ) {
2010-08-12 23:21:05 +00:00
if ( defined ( 'DOING_AJAX' ) && DOING_AJAX )
die ( '-1' );
2010-01-21 22:13:20 +00:00
if ( function_exists ( 'apply_filters' ) ) {
$function = apply_filters ( 'wp_die_handler' , '_default_wp_die_handler' );
2010-08-12 23:21:05 +00:00
} else {
2010-01-21 22:13:20 +00:00
$function = '_default_wp_die_handler' ;
}
call_user_func ( $function , $message , $title , $args );
}
/**
* Kill WordPress execution and display HTML message with error message.
*
* This is the default handler for wp_die if you want a custom one for your
* site then you can overload using the wp_die_handler filter in wp_die
*
* @since 3.0.0
2010-05-03 13:27:15 +00:00
* @access private
2010-01-25 22:09:43 +00:00
*
2010-01-21 22:13:20 +00:00
* @param string $message Error message.
* @param string $title Error title.
* @param string|array $args Optional arguements to control behaviour.
*/
function _default_wp_die_handler ( $message , $title = '' , $args = array () ) {
2008-10-24 21:00:40 +00:00
$defaults = array ( 'response' => 500 );
$r = wp_parse_args ( $args , $defaults );
2009-05-24 23:47:49 +00:00
2009-05-15 17:49:35 +00:00
$have_gettext = function_exists ( '__' );
2008-10-24 21:00:40 +00:00
2007-05-21 22:50:32 +00:00
if ( function_exists ( 'is_wp_error' ) && is_wp_error ( $message ) ) {
2007-10-11 05:46:57 +00:00
if ( empty ( $title ) ) {
2007-02-20 01:24:31 +00:00
$error_data = $message -> get_error_data ();
2007-10-11 05:46:57 +00:00
if ( is_array ( $error_data ) && isset ( $error_data [ 'title' ] ) )
2007-02-20 01:24:31 +00:00
$title = $error_data [ 'title' ];
}
$errors = $message -> get_error_messages ();
2007-10-11 05:46:57 +00:00
switch ( count ( $errors ) ) :
2007-02-20 01:24:31 +00:00
case 0 :
$message = '' ;
break ;
case 1 :
$message = "<p> { $errors [ 0 ] } </p>" ;
break ;
default :
$message = "<ul> \n\t\t <li>" . join ( "</li> \n\t\t <li>" , $errors ) . "</li> \n\t </ul>" ;
break ;
endswitch ;
2007-10-11 05:46:57 +00:00
} elseif ( is_string ( $message ) ) {
2007-02-20 01:24:31 +00:00
$message = "<p> $message </p>" ;
}
2009-05-24 23:47:49 +00:00
2009-05-15 17:49:35 +00:00
if ( isset ( $r [ 'back_link' ] ) && $r [ 'back_link' ] ) {
$back_text = $have_gettext ? __ ( '« Back' ) : '« Back' ;
$message .= " \n <p><a href='javascript:history.back()'> $back_text </p>" ;
}
2009-05-24 23:47:49 +00:00
2008-02-05 06:47:27 +00:00
if ( defined ( 'WP_SITEURL' ) && '' != WP_SITEURL )
$admin_dir = WP_SITEURL . '/wp-admin/' ;
2007-10-11 05:46:57 +00:00
elseif ( function_exists ( 'get_bloginfo' ) && '' != get_bloginfo ( 'wpurl' ) )
2008-02-05 06:47:27 +00:00
$admin_dir = get_bloginfo ( 'wpurl' ) . '/wp-admin/' ;
2007-10-11 05:46:57 +00:00
elseif ( strpos ( $_SERVER [ 'PHP_SELF' ], 'wp-admin' ) !== false )
2007-05-07 23:24:44 +00:00
$admin_dir = '' ;
else
$admin_dir = 'wp-admin/' ;
2007-10-11 05:46:57 +00:00
if ( ! function_exists ( 'did_action' ) || ! did_action ( 'admin_head' ) ) :
2010-04-01 10:30:58 +00:00
if ( ! headers_sent () ) {
2008-10-24 21:00:40 +00:00
status_header ( $r [ 'response' ] );
2007-09-19 04:27:56 +00:00
nocache_headers ();
2007-10-11 05:46:57 +00:00
header ( 'Content-Type: text/html; charset=utf-8' );
2007-09-19 04:27:56 +00:00
}
2009-05-24 23:47:49 +00:00
2010-04-01 10:30:58 +00:00
if ( empty ( $title ) )
$title = $have_gettext ? __ ( 'WordPress › Error' ) : 'WordPress › Error' ;
2006-09-18 23:40:19 +00:00
2009-05-20 16:32:22 +00:00
$text_direction = 'ltr' ;
2010-04-01 10:30:58 +00:00
if ( isset ( $r [ 'text_direction' ]) && 'rtl' == $r [ 'text_direction' ] )
$text_direction = 'rtl' ;
2010-05-03 05:49:19 +00:00
elseif ( function_exists ( 'is_rtl' ) && is_rtl () )
2010-04-01 10:30:58 +00:00
$text_direction = 'rtl' ;
2006-07-10 05:29:10 +00:00
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
2009-12-01 21:21:31 +00:00
<!-- Ticket #11289, IE bug fix: always pad the error page with enough characters such that it is greater than 512 bytes, even after gzip compression abcdefghijklmnopqrstuvwxyz1234567890aabbccddeeffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz11223344556677889900abacbcbdcdcededfefegfgfhghgihihjijikjkjlklkmlmlnmnmononpopoqpqprqrqsrsrtstsubcbcdcdedefefgfabcadefbghicjkldmnoepqrfstugvwxhyz1i234j567k890laabmbccnddeoeffpgghqhiirjjksklltmmnunoovppqwqrrxsstytuuzvvw0wxx1yyz2z113223434455666777889890091abc2def3ghi4jkl5mno6pqr7stu8vwx9yz11aab2bcc3dd4ee5ff6gg7hh8ii9j0jk1kl2lmm3nnoo4p5pq6qrr7ss8tt9uuvv0wwx1x2yyzz13aba4cbcb5dcdc6dedfef8egf9gfh0ghg1ihi2hji3jik4jkj5lkl6kml7mln8mnm9ono -->
2010-11-15 20:13:05 +00:00
<html xmlns="http://www.w3.org/1999/xhtml" <?php if ( function_exists( 'language_attributes' ) && function_exists( 'is_rtl' ) ) language_attributes(); else echo "dir='$text_direction'"; ?>>
2006-07-10 05:29:10 +00:00
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
2008-01-06 19:15:33 +00:00
<title><?php echo $title ?></title>
2007-06-13 06:33:17 +00:00
<link rel="stylesheet" href="<?php echo $admin_dir; ?>css/install.css" type="text/css" />
2007-09-03 23:32:58 +00:00
<?php
2009-05-20 16:32:22 +00:00
if ( 'rtl' == $text_direction ) : ?>
2007-06-13 06:33:17 +00:00
<link rel="stylesheet" href="<?php echo $admin_dir; ?>css/install-rtl.css" type="text/css" />
2006-10-07 19:12:33 +00:00
<?php endif; ?>
2006-07-10 05:29:10 +00:00
</head>
2008-02-24 04:33:51 +00:00
<body id="error-page">
2007-05-07 23:24:44 +00:00
<?php endif; ?>
2007-02-20 01:24:31 +00:00
<?php echo $message; ?>
2006-07-10 05:29:10 +00:00
</body>
</html>
<?php
2006-07-05 19:13:26 +00:00
die();
}
2008-08-09 04:51:51 +00:00
/**
* Retrieve the WordPress home page URL.
*
* If the constant named 'WP_HOME' exists, then it willl be used and returned by
* the function. This can be used to counter the redirection on your local
* development environment.
*
* @access private
* @package WordPress
* @since 2.2.0
*
* @param string $url URL for the home location
* @return string Homepage location.
*/
2007-10-11 05:46:57 +00:00
function _config_wp_home( $url = '' ) {
2007-09-03 23:32:58 +00:00
if ( defined( 'WP_HOME' ) )
2007-03-23 17:45:40 +00:00
return WP_HOME;
2007-10-11 05:46:57 +00:00
return $url;
2007-03-23 17:45:40 +00:00
}
2008-08-09 04:51:51 +00:00
/**
* Retrieve the WordPress site URL.
*
* If the constant named 'WP_SITEURL' is defined, then the value in that
* constant will always be returned. This can be used for debugging a site on
* your localhost while not having to change the database to your URL.
*
* @access private
* @package WordPress
* @since 2.2.0
*
* @param string $url URL to set the WordPress site location.
* @return string The WordPress Site URL
*/
2007-10-11 05:46:57 +00:00
function _config_wp_siteurl( $url = '' ) {
2007-09-03 23:32:58 +00:00
if ( defined( 'WP_SITEURL' ) )
2007-03-23 17:45:40 +00:00
return WP_SITEURL;
2007-10-11 05:46:57 +00:00
return $url;
2007-03-23 17:45:40 +00:00
}
2008-08-09 04:51:51 +00:00
/**
* Set the localized direction for MCE plugin.
*
* Will only set the direction to 'rtl', if the WordPress locale has the text
* direction set to 'rtl'.
*
* Fills in the 'directionality', 'plugins', and 'theme_advanced_button1' array
* keys. These keys are then returned in the $input array.
*
* @access private
* @package WordPress
* @subpackage MCE
* @since 2.1.0
*
* @param array $input MCE plugin array.
* @return array Direction set for 'rtl', if needed by locale.
*/
2008-02-11 17:45:18 +00:00
function _mce_set_direction( $input ) {
2010-05-03 05:49:19 +00:00
if ( is_rtl() ) {
2008-02-11 17:45:18 +00:00
$input['directionality'] = 'rtl';
$input['plugins'] .= ',directionality';
2008-02-29 23:27:02 +00:00
$input['theme_advanced_buttons1'] .= ',ltr';
2006-09-21 00:34:34 +00:00
}
return $input;
}
2007-03-12 21:31:24 +00:00
2009-01-06 18:20:47 +00:00
2008-08-09 04:51:51 +00:00
/**
* Convert smiley code to the icon graphic file equivalent.
*
* You can turn off smilies, by going to the write setting screen and unchecking
* the box, or by setting 'use_smilies' option to false or removing the option.
*
* Plugins may override the default smiley list by setting the $wpsmiliestrans
* to an array, with the key the code the blogger types in and the value the
* image file.
*
2009-01-06 18:20:47 +00:00
* The $wp_smiliessearch global is for the regular expression and is set each
* time the function is called.
2008-08-09 04:51:51 +00:00
*
* The full list of smilies can be found in the function and won't be listed in
* the description. Probably should create a Codex page for it, so that it is
* available.
*
* @global array $wpsmiliestrans
* @global array $wp_smiliessearch
* @since 2.2.0
*/
2007-03-12 21:31:24 +00:00
function smilies_init() {
2009-01-06 18:20:47 +00:00
global $wpsmiliestrans, $wp_smiliessearch;
2007-03-12 21:31:24 +00:00
// don't bother setting up smilies if they are disabled
2007-10-11 05:46:57 +00:00
if ( !get_option( 'use_smilies' ) )
2007-03-12 21:31:24 +00:00
return;
2007-10-11 05:46:57 +00:00
if ( !isset( $wpsmiliestrans ) ) {
2007-03-12 21:31:24 +00:00
$wpsmiliestrans = array(
2009-07-22 00:18:09 +00:00
':mrgreen:' => 'icon_mrgreen.gif',
':neutral:' => 'icon_neutral.gif',
':twisted:' => 'icon_twisted.gif',
':arrow:' => 'icon_arrow.gif',
':shock:' => 'icon_eek.gif',
':smile:' => 'icon_smile.gif',
':???:' => 'icon_confused.gif',
':cool:' => 'icon_cool.gif',
':evil:' => 'icon_evil.gif',
':grin:' => 'icon_biggrin.gif',
':idea:' => 'icon_idea.gif',
':oops:' => 'icon_redface.gif',
':razz:' => 'icon_razz.gif',
':roll:' => 'icon_rolleyes.gif',
':wink:' => 'icon_wink.gif',
':cry:' => 'icon_cry.gif',
':eek:' => 'icon_surprised.gif',
':lol:' => 'icon_lol.gif',
':mad:' => 'icon_mad.gif',
':sad:' => 'icon_sad.gif',
'8-)' => 'icon_cool.gif',
'8-O' => 'icon_eek.gif',
':-(' => 'icon_sad.gif',
':-)' => 'icon_smile.gif',
':-?' => 'icon_confused.gif',
':-D' => 'icon_biggrin.gif',
':-P' => 'icon_razz.gif',
':-o' => 'icon_surprised.gif',
':-x' => 'icon_mad.gif',
':-|' => 'icon_neutral.gif',
';-)' => 'icon_wink.gif',
'8)' => 'icon_cool.gif',
'8O' => 'icon_eek.gif',
':(' => 'icon_sad.gif',
':)' => 'icon_smile.gif',
':?' => 'icon_confused.gif',
':D' => 'icon_biggrin.gif',
':P' => 'icon_razz.gif',
':o' => 'icon_surprised.gif',
':x' => 'icon_mad.gif',
':|' => 'icon_neutral.gif',
';)' => 'icon_wink.gif',
':!:' => 'icon_exclaim.gif',
':?:' => 'icon_question.gif',
2007-03-12 21:31:24 +00:00
);
}
2009-01-06 18:20:47 +00:00
if (count($wpsmiliestrans) == 0) {
return;
}
/*
* NOTE: we sort the smilies in reverse key order. This is to make sure
* we match the longest possible smilie (:???: vs :?) as the regular
* expression used below is first-match
*/
krsort($wpsmiliestrans);
$wp_smiliessearch = '/(?:\s|^)';
$subchar = '';
2007-03-12 21:31:24 +00:00
foreach ( (array) $wpsmiliestrans as $smiley => $img ) {
2009-01-06 18:20:47 +00:00
$firstchar = substr($smiley, 0, 1);
$rest = substr($smiley, 1);
// new subpattern?
if ($firstchar != $subchar) {
if ($subchar != '') {
2009-02-06 03:42:48 +00:00
$wp_smiliessearch .= ')|(?:\s|^)';
2009-01-06 18:20:47 +00:00
}
$subchar = $firstchar;
$wp_smiliessearch .= preg_quote($firstchar, '/') . '(?:';
} else {
$wp_smiliessearch .= '|';
}
2009-06-23 22:10:46 +00:00
$wp_smiliessearch .= preg_quote($rest, '/');
2007-03-12 21:31:24 +00:00
}
2009-01-06 18:20:47 +00:00
2009-02-06 03:42:48 +00:00
$wp_smiliessearch .= ')(?:\s|$)/m';
2007-03-12 21:31:24 +00:00
}
2008-06-15 09:38:32 +00:00
/**
* Merge user defined arguments into defaults array.
*
* This function is used throughout WordPress to allow for both string or array
* to be merged into another array.
*
* @since 2.2.0
*
* @param string|array $args Value to merge with $defaults
* @param array $defaults Array that serves as the defaults.
* @return array Merged user defined values with defaults.
*/
2007-04-10 19:52:15 +00:00
function wp_parse_args( $args, $defaults = '' ) {
2007-10-11 05:46:57 +00:00
if ( is_object( $args ) )
$r = get_object_vars( $args );
elseif ( is_array( $args ) )
2007-04-10 19:52:15 +00:00
$r =& $args;
2007-06-14 22:46:59 +00:00
else
wp_parse_str( $args, $r );
2007-06-14 02:25:30 +00:00
2007-06-14 22:46:59 +00:00
if ( is_array( $defaults ) )
2007-05-10 02:33:01 +00:00
return array_merge( $defaults, $r );
2007-10-11 05:46:57 +00:00
return $r;
2007-04-10 19:52:15 +00:00
}
2010-01-08 08:44:45 +00:00
/**
* Clean up an array, comma- or space-separated list of IDs
*
* @since 3.0.0
*
* @param array|string $list
* @return array Sanitized array of IDs
*/
2010-04-16 14:08:58 +00:00
function wp_parse_id_list( $list ) {
2010-01-08 08:44:45 +00:00
if ( !is_array($list) )
$list = preg_split('/[\s,]+/', $list);
return array_unique(array_map('absint', $list));
}
2010-09-05 18:47:25 +00:00
/**
* Extract a slice of an array, given a list of keys
*
* @since 3.1.0
*
* @param array $array The original array
* @param array $keys The list of keys
* @return array The array slice
*/
function wp_array_slice_assoc( $array, $keys ) {
$slice = array();
foreach ( $keys as $key )
if ( isset( $array[ $key ] ) )
$slice[ $key ] = $array[ $key ];
return $slice;
}
2010-04-16 14:08:58 +00:00
/**
* Filters a list of objects, based on a set of key => value arguments
*
* @since 3.0.0
*
* @param array $list An array of objects to filter
* @param array $args An array of key => value arguments to match against each object
2010-05-03 20:26:11 +00:00
* @param string $operator The logical operation to perform. 'or' means only one element
2010-04-16 14:08:58 +00:00
* from the array needs to match; 'and' means all elements must match. The default is 'and'.
* @param bool|string $field A field from the object to place instead of the entire object
* @return array A list of objects or object fields
*/
function wp_filter_object_list( $list, $args = array(), $operator = 'and', $field = false ) {
2010-10-02 18:48:51 +00:00
$list = wp_list_filter( $list, $args, $operator );
2010-04-16 14:08:58 +00:00
2010-10-02 18:48:51 +00:00
if ( $field )
$list = wp_list_pluck( $list, $field );
return $list;
}
2010-04-16 14:08:58 +00:00
2010-10-02 18:48:51 +00:00
/**
* Filters a list of objects, based on a set of key => value arguments
*
* @since 3.1.0
*
* @param array $list An array of objects to filter
* @param array $args An array of key => value arguments to match against each object
* @param string $operator The logical operation to perform. 'or' means only one element
* from the array needs to match; 'and' means all elements must match. The default is 'and'.
* @return array
*/
function wp_list_filter( $list, $args = array(), $operator = 'and' ) {
if ( empty( $args ) )
return $list;
2010-04-16 14:08:58 +00:00
2010-10-02 18:48:51 +00:00
$count = count( $args );
2010-04-16 14:08:58 +00:00
$filtered = array();
foreach ( $list as $key => $obj ) {
2010-10-02 18:48:51 +00:00
$matched = count( array_intersect_assoc( (array) $obj, $args ) );
2010-05-07 03:24:47 +00:00
if ( ('and' == $operator && $matched == $count) || ('or' == $operator && $matched <= $count) ) {
2010-10-02 18:48:51 +00:00
$filtered[$key] = $obj;
2010-05-07 03:24:47 +00:00
}
2010-04-16 14:08:58 +00:00
}
return $filtered;
}
2010-10-02 18:48:51 +00:00
/**
* Pluck a certain field out of each object in a list
*
* @since 3.1.0
*
* @param array $list A list of objects or arrays
* @param int|string $field A field from the object to place instead of the entire object
* @return array
*/
function wp_list_pluck( $list, $field ) {
foreach ( $list as $key => $value ) {
$value = (array) $value;
$list[ $key ] = $value[ $field ];
}
return $list;
}
2009-10-13 17:04:22 +00:00
/**
* Determines if default embed handlers should be loaded.
*
* Checks to make sure that the embeds library hasn't already been loaded. If
* it hasn't, then it will load the embeds library.
*
2010-03-26 19:23:39 +00:00
* @since 2.9.0
2009-10-13 17:04:22 +00:00
*/
function wp_maybe_load_embeds() {
if ( ! apply_filters('load_default_embeds', true) )
return;
require_once( ABSPATH . WPINC . '/default-embeds.php' );
}
2008-06-15 09:38:32 +00:00
/**
* Determines if Widgets library should be loaded.
*
* Checks to make sure that the widgets library hasn't already been loaded. If
* it hasn't, then it will load the widgets library and run an action hook.
*
* @since 2.2.0
* @uses add_action() Calls '_admin_menu' hook with 'wp_widgets_add_menu' value.
*/
2007-05-01 01:58:18 +00:00
function wp_maybe_load_widgets() {
2009-03-16 22:02:40 +00:00
if ( ! apply_filters('load_default_widgets', true) )
return;
require_once( ABSPATH . WPINC . '/default-widgets.php' );
add_action( '_admin_menu', 'wp_widgets_add_menu' );
2007-05-01 01:13:06 +00:00
}
2008-06-15 09:38:32 +00:00
/**
* Append the Widgets menu to the themes main menu.
*
* @since 2.2.0
* @uses $submenu The administration submenu list.
*/
2007-05-06 20:36:11 +00:00
function wp_widgets_add_menu() {
2007-05-03 00:52:14 +00:00
global $submenu;
2010-05-12 19:19:57 +00:00
$submenu['themes.php'][7] = array( __( 'Widgets' ), 'edit_theme_options', 'widgets.php' );
2007-10-11 05:46:57 +00:00
ksort( $submenu['themes.php'], SORT_NUMERIC );
2007-05-03 00:52:14 +00:00
}
2008-06-15 09:38:32 +00:00
/**
* Flush all output buffers for PHP 5.2.
*
* Make sure all output buffers are flushed before our singletons our destroyed.
*
* @since 2.2.0
2008-06-15 19:11:15 +00:00
*/
2007-10-11 05:46:57 +00:00
function wp_ob_end_flush_all() {
2009-05-24 23:47:49 +00:00
$levels = ob_get_level();
for ($i=0; $i<$levels; $i++)
ob_end_flush();
2007-05-12 22:06:31 +00:00
}
2008-06-15 09:38:32 +00:00
/**
* Load custom DB error or display WordPress DB error.
*
* If a file exists in the wp-content directory named db-error.php, then it will
* be loaded instead of displaying the WordPress DB error. If it is not found,
* then the WordPress DB error will be displayed instead.
*
* The WordPress DB error sets the HTTP status header to 500 to try to prevent
* search engines from caching the message. Custom DB messages should do the
* same.
*
2008-08-10 16:45:50 +00:00
* This function was backported to the the WordPress 2.3.2, but originally was
* added in WordPress 2.5.0.
*
* @since 2.3.2
2008-06-15 09:38:32 +00:00
* @uses $wpdb
*/
2007-12-21 02:53:57 +00:00
function dead_db() {
global $wpdb;
// Load custom DB error template, if present.
2008-05-27 17:55:24 +00:00
if ( file_exists( WP_CONTENT_DIR . '/db-error.php' ) ) {
require_once( WP_CONTENT_DIR . '/db-error.php' );
2007-12-21 02:53:57 +00:00
die();
}
// If installing or in the admin, provide the verbose message.
if ( defined('WP_INSTALLING') || defined('WP_ADMIN') )
wp_die($wpdb->error);
// Otherwise, be terse.
status_header( 500 );
nocache_headers();
header( 'Content-Type: text/html; charset=utf-8' );
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" <?php if ( function_exists( 'language_attributes' ) ) language_attributes(); ?>>
<head>
2008-01-06 19:15:33 +00:00
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
2007-12-21 02:53:57 +00:00
<title>Database Error</title>
2008-02-05 06:47:27 +00:00
2007-12-21 02:53:57 +00:00
</head>
<body>
<h1>Error establishing a database connection</h1>
</body>
</html>
<?php
die();
}
2007-10-11 05:46:57 +00:00
2007-10-10 22:11:18 +00:00
/**
2009-02-10 21:17:44 +00:00
* Converts value to nonnegative integer.
2008-06-15 09:38:32 +00:00
*
2008-08-10 16:45:50 +00:00
* @since 2.5.0
2008-08-09 04:51:51 +00:00
*
2009-02-10 21:17:44 +00:00
* @param mixed $maybeint Data you wish to have convered to an nonnegative integer
* @return int An nonnegative integer
2007-10-10 22:11:18 +00:00
*/
2007-10-11 05:46:57 +00:00
function absint( $maybeint ) {
return abs( intval( $maybeint ) );
2007-10-10 22:11:18 +00:00
}
2007-11-17 11:21:34 +00:00
/**
2008-06-15 09:38:32 +00:00
* Determines if the blog can be accessed over SSL.
*
* Determines if blog can be accessed over SSL by using cURL to access the site
* using the https in the siteurl. Requires cURL extension to work correctly.
*
2008-08-10 16:45:50 +00:00
* @since 2.5.0
2008-06-15 09:38:32 +00:00
*
2010-02-19 01:08:39 +00:00
* @param string $url
2010-02-24 20:13:23 +00:00
* @return bool Whether SSL access is available
2007-11-17 11:21:34 +00:00
*/
function url_is_accessable_via_ssl($url)
{
if (in_array('curl', get_loaded_extensions())) {
2008-08-09 04:51:51 +00:00
$ssl = preg_replace( '/^http:\/\//', 'https://', $url );
2007-11-17 11:21:34 +00:00
2008-08-09 04:51:51 +00:00
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $ssl);
curl_setopt($ch, CURLOPT_FAILONERROR, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
2009-03-23 22:05:04 +00:00
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5);
2007-11-17 11:21:34 +00:00
2008-08-09 04:51:51 +00:00
curl_exec($ch);
2007-11-17 11:21:34 +00:00
2008-08-09 04:51:51 +00:00
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close ($ch);
2007-11-17 11:21:34 +00:00
2008-08-09 04:51:51 +00:00
if ($status == 200 || $status == 401) {
return true;
}
2007-11-17 11:21:34 +00:00
}
return false;
}
2008-06-15 09:38:32 +00:00
/**
* Secure URL, if available or the given URL.
*
2008-08-10 16:45:50 +00:00
* @since 2.5.0
2008-06-15 09:38:32 +00:00
*
* @param string $url Complete URL path with transport.
* @return string Secure or regular URL path.
*/
2007-11-17 11:21:34 +00:00
function atom_service_url_filter($url)
{
if ( url_is_accessable_via_ssl($url) )
2008-06-15 09:38:32 +00:00
return preg_replace( '/^http:\/\//', 'https://', $url );
2007-11-17 11:27:01 +00:00
else
return $url;
2007-11-17 11:21:34 +00:00
}
2007-12-21 02:53:57 +00:00
2007-12-28 21:17:42 +00:00
/**
2008-06-15 09:38:32 +00:00
* Marks a function as deprecated and informs when it has been used.
2007-12-28 21:17:42 +00:00
*
2008-06-15 09:38:32 +00:00
* There is a hook deprecated_function_run that will be called that can be used
* to get the backtrace up to what file and function called the deprecated
* function.
2007-12-28 21:17:42 +00:00
*
2009-11-18 08:22:49 +00:00
* The current behavior is to trigger an user error if WP_DEBUG is true.
2008-02-05 06:47:27 +00:00
*
2007-12-28 21:17:42 +00:00
* This function is to be used in every function in depreceated.php
*
* @package WordPress
2010-01-09 10:03:55 +00:00
* @subpackage Debug
2008-08-10 16:45:50 +00:00
* @since 2.5.0
2007-12-28 21:17:42 +00:00
* @access private
*
2010-01-09 10:03:55 +00:00
* @uses do_action() Calls 'deprecated_function_run' and passes the function name, what to use instead,
* and the version the function was deprecated in.
* @uses apply_filters() Calls 'deprecated_function_trigger_error' and expects boolean value of true to do
* trigger or false to not trigger error.
2007-12-28 21:17:42 +00:00
*
* @param string $function The function that was called
2008-08-09 04:51:51 +00:00
* @param string $version The version of WordPress that deprecated the function
2007-12-28 21:17:42 +00:00
* @param string $replacement Optional. The function that should have been called
*/
2010-01-09 10:03:55 +00:00
function _deprecated_function( $function, $version, $replacement=null ) {
2007-12-28 21:17:42 +00:00
2010-01-09 10:03:55 +00:00
do_action( 'deprecated_function_run', $function, $replacement, $version );
2007-12-28 21:17:42 +00:00
// Allow plugin to filter the output error trigger
2010-01-09 10:03:55 +00:00
if ( WP_DEBUG && apply_filters( 'deprecated_function_trigger_error', true ) ) {
if ( ! is_null($replacement) )
2008-05-04 10:44:44 +00:00
trigger_error( sprintf( __('%1$s is <strong>deprecated</strong> since version %2$s! Use %3$s instead.'), $function, $version, $replacement ) );
2007-12-28 21:17:42 +00:00
else
2008-05-04 10:44:44 +00:00
trigger_error( sprintf( __('%1$s is <strong>deprecated</strong> since version %2$s with no alternative available.'), $function, $version ) );
2007-12-28 21:17:42 +00:00
}
}
/**
2008-06-15 09:38:32 +00:00
* Marks a file as deprecated and informs when it has been used.
2007-12-28 21:17:42 +00:00
*
2008-06-15 09:38:32 +00:00
* There is a hook deprecated_file_included that will be called that can be used
* to get the backtrace up to what file and function included the deprecated
* file.
2007-12-28 21:17:42 +00:00
*
2009-11-18 08:22:49 +00:00
* The current behavior is to trigger an user error if WP_DEBUG is true.
2008-02-05 06:47:27 +00:00
*
2007-12-28 21:17:42 +00:00
* This function is to be used in every file that is depreceated
*
* @package WordPress
2010-01-09 10:03:55 +00:00
* @subpackage Debug
2008-08-10 16:45:50 +00:00
* @since 2.5.0
2007-12-28 21:17:42 +00:00
* @access private
*
2010-01-09 10:03:55 +00:00
* @uses do_action() Calls 'deprecated_file_included' and passes the file name, what to use instead,
2010-02-05 21:40:22 +00:00
* the version in which the file was deprecated, and any message regarding the change.
2010-01-09 10:03:55 +00:00
* @uses apply_filters() Calls 'deprecated_file_trigger_error' and expects boolean value of true to do
* trigger or false to not trigger error.
2007-12-28 21:17:42 +00:00
*
* @param string $file The file that was included
2009-12-24 10:53:34 +00:00
* @param string $version The version of WordPress that deprecated the file
2009-12-24 10:48:32 +00:00
* @param string $replacement Optional. The file that should have been included based on ABSPATH
2010-02-05 21:40:22 +00:00
* @param string $message Optional. A message regarding the change
2007-12-28 21:17:42 +00:00
*/
2010-02-05 21:40:22 +00:00
function _deprecated_file( $file, $version, $replacement = null, $message = '' ) {
2007-12-28 21:17:42 +00:00
2010-02-05 21:40:22 +00:00
do_action( 'deprecated_file_included', $file, $replacement, $version, $message );
2007-12-28 21:17:42 +00:00
// Allow plugin to filter the output error trigger
2010-01-09 10:03:55 +00:00
if ( WP_DEBUG && apply_filters( 'deprecated_file_trigger_error', true ) ) {
2010-02-05 21:40:22 +00:00
$message = empty( $message ) ? '' : ' ' . $message;
2010-01-09 10:03:55 +00:00
if ( ! is_null( $replacement ) )
2010-02-05 21:40:22 +00:00
trigger_error( sprintf( __('%1$s is <strong>deprecated</strong> since version %2$s! Use %3$s instead.'), $file, $version, $replacement ) . $message );
2007-12-28 21:17:42 +00:00
else
2010-02-05 21:40:22 +00:00
trigger_error( sprintf( __('%1$s is <strong>deprecated</strong> since version %2$s with no alternative available.'), $file, $version ) . $message );
2007-12-28 21:17:42 +00:00
}
}
2009-12-24 11:06:00 +00:00
/**
* Marks a function argument as deprecated and informs when it has been used.
*
* This function is to be used whenever a deprecated function argument is used.
* Before this function is called, the argument must be checked for whether it was
* used by comparing it to its default value or evaluating whether it is empty.
* For example:
* <code>
* if ( !empty($deprecated) )
2010-01-09 10:03:55 +00:00
* _deprecated_argument( __FUNCTION__, '3.0' );
2009-12-24 11:06:00 +00:00
* </code>
*
* There is a hook deprecated_argument_run that will be called that can be used
* to get the backtrace up to what file and function used the deprecated
* argument.
*
* The current behavior is to trigger an user error if WP_DEBUG is true.
*
* @package WordPress
2010-01-09 10:03:55 +00:00
* @subpackage Debug
2009-12-24 11:06:00 +00:00
* @since 3.0.0
* @access private
*
2010-01-09 10:03:55 +00:00
* @uses do_action() Calls 'deprecated_argument_run' and passes the function name, a message on the change,
* and the version in which the argument was deprecated.
* @uses apply_filters() Calls 'deprecated_argument_trigger_error' and expects boolean value of true to do
* trigger or false to not trigger error.
2009-12-24 11:06:00 +00:00
*
* @param string $function The function that was called
2009-12-30 16:23:39 +00:00
* @param string $version The version of WordPress that deprecated the argument used
2009-12-24 11:06:00 +00:00
* @param string $message Optional. A message regarding the change.
*/
2010-01-09 10:03:55 +00:00
function _deprecated_argument( $function, $version, $message = null ) {
2009-12-24 11:06:00 +00:00
2010-01-10 15:02:12 +00:00
do_action( 'deprecated_argument_run', $function, $message, $version );
2009-12-24 11:06:00 +00:00
// Allow plugin to filter the output error trigger
2010-01-09 10:03:55 +00:00
if ( WP_DEBUG && apply_filters( 'deprecated_argument_trigger_error', true ) ) {
if ( ! is_null( $message ) )
2009-12-30 16:23:39 +00:00
trigger_error( sprintf( __('%1$s was called with an argument that is <strong>deprecated</strong> since version %2$s! %3$s'), $function, $version, $message ) );
2009-12-24 11:06:00 +00:00
else
2009-12-30 16:23:39 +00:00
trigger_error( sprintf( __('%1$s was called with an argument that is <strong>deprecated</strong> since version %2$s with no alternative available.'), $function, $version ) );
2009-12-24 11:06:00 +00:00
}
}
2008-03-20 00:33:59 +00:00
/**
2008-06-15 09:38:32 +00:00
* Is the server running earlier than 1.5.0 version of lighttpd
*
2008-08-10 16:45:50 +00:00
* @since 2.5.0
2008-03-20 00:33:59 +00:00
*
* @return bool Whether the server is running lighttpd < 1.5.0
*/
function is_lighttpd_before_150() {
$server_parts = explode( '/', isset( $_SERVER['SERVER_SOFTWARE'] )? $_SERVER['SERVER_SOFTWARE'] : '' );
$server_parts[1] = isset( $server_parts[1] )? $server_parts[1] : '';
return 'lighttpd' == $server_parts[0] && -1 == version_compare( $server_parts[1], '1.5.0' );
}
2008-03-21 04:10:01 +00:00
/**
2008-06-15 09:38:32 +00:00
* Does the specified module exist in the apache config?
*
2008-08-10 16:45:50 +00:00
* @since 2.5.0
2008-03-21 04:10:01 +00:00
*
* @param string $mod e.g. mod_rewrite
2008-03-25 00:22:37 +00:00
* @param bool $default The default return value if the module is not found
2008-03-21 04:10:01 +00:00
* @return bool
*/
2008-03-25 00:22:37 +00:00
function apache_mod_loaded($mod, $default = false) {
2008-03-21 04:10:01 +00:00
global $is_apache;
if ( !$is_apache )
return false;
if ( function_exists('apache_get_modules') ) {
$mods = apache_get_modules();
if ( in_array($mod, $mods) )
return true;
2008-03-25 00:22:37 +00:00
} elseif ( function_exists('phpinfo') ) {
2008-03-21 04:10:01 +00:00
ob_start();
phpinfo(8);
$phpinfo = ob_get_clean();
if ( false !== strpos($phpinfo, $mod) )
return true;
}
2008-03-25 00:22:37 +00:00
return $default;
2008-03-21 04:10:01 +00:00
}
2008-06-15 09:38:32 +00:00
/**
* File validates against allowed set of defined rules.
*
* A return value of '1' means that the $file contains either '..' or './'. A
* return value of '2' means that the $file contains ':' after the first
* character. A return value of '3' means that the file is not in the allowed
* files list.
*
2008-08-10 16:45:50 +00:00
* @since 1.2.0
2008-06-15 09:38:32 +00:00
*
* @param string $file File path.
* @param array $allowed_files List of allowed files.
* @return int 0 means nothing is wrong, greater than 0 means something was wrong.
*/
2008-05-12 23:51:54 +00:00
function validate_file( $file, $allowed_files = '' ) {
if ( false !== strpos( $file, '..' ))
return 1;
if ( false !== strpos( $file, './' ))
return 1;
if (!empty ( $allowed_files ) && (!in_array( $file, $allowed_files ) ) )
return 3;
2009-12-01 22:03:13 +00:00
if (':' == substr( $file, 1, 1 ))
return 2;
2008-05-12 23:51:54 +00:00
return 0;
}
2008-06-15 09:38:32 +00:00
/**
* Determine if SSL is used.
*
2008-08-10 16:45:50 +00:00
* @since 2.6.0
2008-06-15 09:38:32 +00:00
*
* @return bool True if SSL, false if not used.
*/
2008-05-27 17:46:01 +00:00
function is_ssl() {
2008-12-17 17:58:07 +00:00
if ( isset($_SERVER['HTTPS']) ) {
if ( 'on' == strtolower($_SERVER['HTTPS']) )
return true;
if ( '1' == $_SERVER['HTTPS'] )
return true;
} elseif ( isset($_SERVER['SERVER_PORT']) && ( '443' == $_SERVER['SERVER_PORT'] ) ) {
return true;
}
return false;
2008-05-27 17:46:01 +00:00
}
2008-06-11 17:25:55 +00:00
2008-06-15 09:38:32 +00:00
/**
* Whether SSL login should be forced.
*
2008-08-10 16:45:50 +00:00
* @since 2.6.0
2008-06-15 09:38:32 +00:00
*
* @param string|bool $force Optional.
* @return bool True if forced, false if not forced.
*/
2009-09-08 14:46:06 +00:00
function force_ssl_login( $force = null ) {
static $forced = false;
2008-06-11 17:25:55 +00:00
2009-09-08 14:46:06 +00:00
if ( !is_null( $force ) ) {
2008-06-14 20:58:43 +00:00
$old_forced = $forced;
2008-06-11 17:25:55 +00:00
$forced = $force;
return $old_forced;
}
return $forced;
}
2008-06-15 09:38:32 +00:00
/**
* Whether to force SSL used for the Administration Panels.
*
2008-08-10 16:45:50 +00:00
* @since 2.6.0
2008-06-15 09:38:32 +00:00
*
* @param string|bool $force
* @return bool True if forced, false if not forced.
*/
2009-09-08 14:46:06 +00:00
function force_ssl_admin( $force = null ) {
static $forced = false;
2008-06-11 17:25:55 +00:00
2009-09-08 14:46:06 +00:00
if ( !is_null( $force ) ) {
2008-06-14 20:58:43 +00:00
$old_forced = $forced;
2008-06-11 17:25:55 +00:00
$forced = $force;
return $old_forced;
}
return $forced;
}
2008-06-30 03:23:44 +00:00
/**
* Guess the URL for the site.
*
* Will remove wp-admin links to retrieve only return URLs not in the wp-admin
* directory.
*
2008-08-10 16:45:50 +00:00
* @since 2.6.0
2008-06-30 03:23:44 +00:00
*
* @return string
*/
2008-06-24 17:36:21 +00:00
function wp_guess_url() {
if ( defined('WP_SITEURL') && '' != WP_SITEURL ) {
$url = WP_SITEURL;
} else {
2010-02-26 06:21:47 +00:00
$schema = is_ssl() ? 'https://' : 'http://';
2008-06-24 17:36:21 +00:00
$url = preg_replace('|/wp-admin/.*|i', '', $schema . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI']);
}
2010-10-02 03:08:02 +00:00
return rtrim($url, '/');
2008-06-24 17:36:21 +00:00
}
2008-10-09 00:50:52 +00:00
/**
* Suspend cache invalidation.
*
* Turns cache invalidation on and off. Useful during imports where you don't wont to do invalidations
* every time a post is inserted. Callers must be sure that what they are doing won't lead to an inconsistent
* cache when invalidation is suspended.
*
* @since 2.7.0
*
* @param bool $suspend Whether to suspend or enable cache invalidation
* @return bool The current suspend setting
*/
function wp_suspend_cache_invalidation($suspend = true) {
global $_wp_suspend_cache_invalidation;
$current_suspend = $_wp_suspend_cache_invalidation;
$_wp_suspend_cache_invalidation = $suspend;
return $current_suspend;
}
2010-02-13 08:59:04 +00:00
/**
2010-02-14 06:17:42 +00:00
* Retrieve site option value based on name of option.
2010-02-13 08:59:04 +00:00
*
2010-02-14 06:17:42 +00:00
* @see get_option()
* @package WordPress
* @subpackage Option
* @since 2.8.0
2010-02-13 08:59:04 +00:00
*
2010-02-14 07:21:15 +00:00
* @uses apply_filters() Calls 'pre_site_option_$option' before checking the option.
* Any value other than false will "short-circuit" the retrieval of the option
* and return the returned value.
* @uses apply_filters() Calls 'site_option_$option', after checking the option, with
* the option value.
*
2010-03-11 21:49:56 +00:00
* @param string $option Name of option to retrieve. Expected to not be SQL-escaped.
2010-02-14 06:17:42 +00:00
* @param mixed $default Optional value to return if option doesn't exist. Default false.
* @param bool $use_cache Whether to use cache. Multisite only. Default true.
* @return mixed Value set for the option.
2010-02-13 08:59:04 +00:00
*/
2010-02-14 06:17:42 +00:00
function get_site_option( $option, $default = false, $use_cache = true ) {
2010-01-06 23:57:35 +00:00
global $wpdb;
2009-10-15 20:26:21 +00:00
// Allow plugins to short-circuit site options.
2010-02-14 06:17:42 +00:00
$pre = apply_filters( 'pre_site_option_' . $option, false );
2009-10-15 20:26:21 +00:00
if ( false !== $pre )
return $pre;
2010-01-06 23:57:35 +00:00
if ( !is_multisite() ) {
2010-02-14 06:17:42 +00:00
$value = get_option($option, $default);
2010-01-06 23:57:35 +00:00
} else {
2010-02-14 06:17:42 +00:00
$cache_key = "{$wpdb->siteid}:$option";
2010-02-12 17:06:43 +00:00
if ( $use_cache )
$value = wp_cache_get($cache_key, 'site-options');
2010-01-06 23:57:35 +00:00
2010-04-16 13:15:39 +00:00
if ( !isset($value) || (false === $value) ) {
2010-05-03 21:02:32 +00:00
$row = $wpdb->get_row( $wpdb->prepare("SELECT meta_value FROM $wpdb->sitemeta WHERE meta_key = %s AND site_id = %d", $option, $wpdb->siteid ) );
2010-01-06 23:57:35 +00:00
2010-05-03 21:02:32 +00:00
// Has to be get_row instead of get_var because of funkiness with 0, false, null values
if ( is_object( $row ) )
$value = $row->meta_value;
else
2010-02-12 17:06:43 +00:00
$value = $default;
2010-01-06 23:57:35 +00:00
2010-02-12 17:06:43 +00:00
$value = maybe_unserialize( $value );
2010-01-06 23:57:35 +00:00
2010-02-12 17:06:43 +00:00
wp_cache_set( $cache_key, $value, 'site-options' );
}
2010-01-06 23:57:35 +00:00
}
2009-10-15 20:26:21 +00:00
2010-02-14 06:17:42 +00:00
return apply_filters( 'site_option_' . $option, $value );
2009-02-18 23:38:11 +00:00
}
2010-02-13 08:59:04 +00:00
/**
2010-02-14 06:17:42 +00:00
* Add a new site option.
2010-02-13 08:59:04 +00:00
*
2010-02-14 06:17:42 +00:00
* @see add_option()
* @package WordPress
* @subpackage Option
* @since 2.8.0
2010-02-13 08:59:04 +00:00
*
2010-02-14 07:21:15 +00:00
* @uses apply_filters() Calls 'pre_add_site_option_$option' hook to allow overwriting the
* option value to be stored.
* @uses do_action() Calls 'add_site_option_$option' and 'add_site_option' hooks on success.
*
2010-03-11 21:49:56 +00:00
* @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.
2010-02-14 06:17:42 +00:00
* @return bool False if option was not added and true if option was added.
2010-02-13 08:59:04 +00:00
*/
2010-02-14 06:17:42 +00:00
function add_site_option( $option, $value ) {
2010-01-06 23:57:35 +00:00
global $wpdb;
2010-02-14 06:17:42 +00:00
$value = apply_filters( 'pre_add_site_option_' . $option, $value );
2010-01-06 23:57:35 +00:00
if ( !is_multisite() ) {
2010-02-14 06:17:42 +00:00
$result = add_option( $option, $value );
2010-01-06 23:57:35 +00:00
} else {
2010-02-14 06:17:42 +00:00
$cache_key = "{$wpdb->siteid}:$option";
2010-01-06 23:57:35 +00:00
2010-02-14 06:17:42 +00:00
if ( $wpdb->get_row( $wpdb->prepare( "SELECT meta_value FROM $wpdb->sitemeta WHERE meta_key = %s AND site_id = %d", $option, $wpdb->siteid ) ) )
return update_site_option( $option, $value );
2010-01-06 23:57:35 +00:00
2010-02-14 06:17:42 +00:00
$value = sanitize_option( $option, $value );
wp_cache_set( $cache_key, $value, 'site-options' );
2010-01-06 23:57:35 +00:00
2010-02-26 18:51:37 +00:00
$_value = $value;
2010-01-06 23:57:35 +00:00
$value = maybe_serialize($value);
2010-02-14 06:17:42 +00:00
$result = $wpdb->insert( $wpdb->sitemeta, array('site_id' => $wpdb->siteid, 'meta_key' => $option, 'meta_value' => $value ) );
2010-02-26 19:26:51 +00:00
$value = $_value;
2010-01-06 23:57:35 +00:00
}
2010-02-26 19:26:51 +00:00
do_action( "add_site_option_{$option}", $option, $value );
do_action( "add_site_option", $option, $value );
2010-01-06 23:57:35 +00:00
2009-10-03 21:40:27 +00:00
return $result;
2009-02-18 23:38:11 +00:00
}
2010-02-13 08:59:04 +00:00
/**
2010-02-14 06:17:42 +00:00
* Removes site option by name.
2010-02-13 08:59:04 +00:00
*
2010-02-14 06:17:42 +00:00
* @see delete_option()
* @package WordPress
* @subpackage Option
* @since 2.8.0
2010-02-13 08:59:04 +00:00
*
2010-02-14 07:21:15 +00:00
* @uses do_action() Calls 'pre_delete_site_option_$option' hook before option is deleted.
* @uses do_action() Calls 'delete_site_option' and 'delete_site_option_$option'
* hooks on success.
*
2010-03-11 21:49:56 +00:00
* @param string $option Name of option to remove. Expected to not be SQL-escaped.
2010-02-14 06:17:42 +00:00
* @return bool True, if succeed. False, if failure.
2010-02-13 08:59:04 +00:00
*/
2010-02-14 06:17:42 +00:00
function delete_site_option( $option ) {
2010-01-06 23:57:35 +00:00
global $wpdb;
2010-02-14 06:17:42 +00:00
// ms_protect_special_option( $option ); @todo
2010-01-06 23:57:35 +00:00
2010-02-14 06:17:42 +00:00
do_action( 'pre_delete_site_option_' . $option );
2010-01-06 23:57:35 +00:00
if ( !is_multisite() ) {
2010-02-14 06:17:42 +00:00
$result = delete_option( $option );
2010-01-06 23:57:35 +00:00
} else {
2010-02-14 23:30:31 +00:00
$row = $wpdb->get_row( $wpdb->prepare( "SELECT meta_id FROM {$wpdb->sitemeta} WHERE meta_key = %s AND site_id = %d", $option, $wpdb->siteid ) );
if ( is_null( $row ) || !$row->meta_id )
2010-01-06 23:57:35 +00:00
return false;
2010-02-14 06:17:42 +00:00
$cache_key = "{$wpdb->siteid}:$option";
2010-01-06 23:57:35 +00:00
wp_cache_delete( $cache_key, 'site-options' );
2010-02-14 06:17:42 +00:00
$result = $wpdb->query( $wpdb->prepare( "DELETE FROM {$wpdb->sitemeta} WHERE meta_key = %s AND site_id = %d", $option, $wpdb->siteid ) );
2010-01-06 23:57:35 +00:00
}
2010-02-14 10:39:46 +00:00
if ( $result ) {
do_action( "delete_site_option_{$option}", $option );
do_action( "delete_site_option", $option );
return true;
}
return false;
2009-10-29 21:53:57 +00:00
}
2010-02-13 08:59:04 +00:00
/**
2010-02-14 06:17:42 +00:00
* Update the value of a site option that was already added.
2010-02-13 08:59:04 +00:00
*
2010-02-14 06:17:42 +00:00
* @see update_option()
2010-02-13 08:59:04 +00:00
* @since 2.8.0
2010-02-14 06:17:42 +00:00
* @package WordPress
* @subpackage Option
2010-02-13 08:59:04 +00:00
*
2010-02-14 07:21:15 +00:00
* @uses apply_filters() Calls 'pre_update_site_option_$option' hook to allow overwriting the
* option value to be stored.
* @uses do_action() Calls 'update_site_option_$option' and 'update_site_option' hooks on success.
*
2010-03-11 21:49:56 +00:00
* @param string $option Name of option. Expected to not be SQL-escaped.
* @param mixed $value Option value. Expected to not be SQL-escaped.
2010-02-14 06:17:42 +00:00
* @return bool False if value was not updated and true if value was updated.
2010-02-13 08:59:04 +00:00
*/
2010-02-14 06:17:42 +00:00
function update_site_option( $option, $value ) {
2010-01-06 23:57:35 +00:00
global $wpdb;
2010-02-14 06:17:42 +00:00
$oldvalue = get_site_option( $option );
$value = apply_filters( 'pre_update_site_option_' . $option, $value, $oldvalue );
2010-01-06 23:57:35 +00:00
2010-02-14 06:17:42 +00:00
if ( $value === $oldvalue )
2010-01-06 23:57:35 +00:00
return false;
if ( !is_multisite() ) {
2010-02-14 06:17:42 +00:00
$result = update_option( $option, $value );
2010-01-06 23:57:35 +00:00
} else {
2010-02-14 06:17:42 +00:00
$cache_key = "{$wpdb->siteid}:$option";
2010-01-06 23:57:35 +00:00
2010-02-14 06:17:42 +00:00
if ( $value && !$wpdb->get_row( $wpdb->prepare( "SELECT meta_value FROM $wpdb->sitemeta WHERE meta_key = %s AND site_id = %d", $option, $wpdb->siteid ) ) )
return add_site_option( $option, $value );
$value = sanitize_option( $option, $value );
2010-01-06 23:57:35 +00:00
wp_cache_set( $cache_key, $value, 'site-options' );
2010-02-26 18:51:37 +00:00
$_value = $value;
2010-02-14 06:17:42 +00:00
$value = maybe_serialize( $value );
$result = $wpdb->update( $wpdb->sitemeta, array( 'meta_value' => $value ), array( 'site_id' => $wpdb->siteid, 'meta_key' => $option ) );
2010-02-26 18:51:37 +00:00
$value = $_value;
2010-01-06 23:57:35 +00:00
}
2010-02-14 07:21:15 +00:00
if ( $result ) {
do_action( "update_site_option_{$option}", $option, $value );
do_action( "update_site_option", $option, $value );
return true;
}
return false;
2009-02-18 23:38:11 +00:00
}
2009-10-29 21:53:57 +00:00
/**
* Delete a site transient
*
2010-02-13 08:59:04 +00:00
* @since 2.9.0
2009-10-29 21:53:57 +00:00
* @package WordPress
* @subpackage Transient
*
2010-02-14 10:39:46 +00:00
* @uses do_action() Calls 'delete_site_transient_$transient' hook before transient is deleted.
* @uses do_action() Calls 'deleted_site_transient' hook on success.
*
2010-03-11 21:49:56 +00:00
* @param string $transient Transient name. Expected to not be SQL-escaped.
2010-02-14 06:17:42 +00:00
* @return bool True if successful, false otherwise
2009-10-29 21:53:57 +00:00
*/
2010-02-14 06:17:42 +00:00
function delete_site_transient( $transient ) {
global $_wp_using_ext_object_cache;
2009-10-29 21:53:57 +00:00
2010-02-14 10:39:46 +00:00
do_action( 'delete_site_transient_' . $transient, $transient );
2009-10-29 21:53:57 +00:00
if ( $_wp_using_ext_object_cache ) {
2010-02-14 06:17:42 +00:00
$result = wp_cache_delete( $transient, 'site-transient' );
2009-10-29 21:53:57 +00:00
} else {
2010-04-01 10:42:03 +00:00
$option_timeout = '_site_transient_timeout_' . $transient;
2010-03-11 21:49:56 +00:00
$option = '_site_transient_' . $transient;
2010-02-14 10:39:46 +00:00
$result = delete_site_option( $option );
2010-04-01 10:42:03 +00:00
if ( $result )
delete_site_option( $option_timeout );
2009-10-29 21:53:57 +00:00
}
2010-02-14 10:39:46 +00:00
if ( $result )
do_action( 'deleted_site_transient', $transient );
2010-02-14 06:17:42 +00:00
return $result;
2009-10-29 21:53:57 +00:00
}
/**
* Get the value of a site transient
*
* If the transient does not exist or does not have a value, then the return value
* will be false.
2010-01-15 22:11:12 +00:00
*
2010-02-14 06:17:42 +00:00
* @see get_transient()
2009-10-29 21:53:57 +00:00
* @since 2.9.0
* @package WordPress
* @subpackage Transient
*
2010-02-14 07:21:15 +00:00
* @uses apply_filters() Calls 'pre_site_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 'site_transient_$option' hook, after checking the transient, with
* the transient value.
*
2010-03-11 21:49:56 +00:00
* @param string $transient Transient name. Expected to not be SQL-escaped.
2009-10-29 21:53:57 +00:00
* @return mixed Value of transient
*/
2010-02-14 06:17:42 +00:00
function get_site_transient( $transient ) {
global $_wp_using_ext_object_cache;
2009-10-29 21:53:57 +00:00
$pre = apply_filters( 'pre_site_transient_' . $transient, false );
if ( false !== $pre )
return $pre;
if ( $_wp_using_ext_object_cache ) {
2010-02-14 06:17:42 +00:00
$value = wp_cache_get( $transient, 'site-transient' );
2009-10-29 21:53:57 +00:00
} else {
2010-02-11 19:43:22 +00:00
// Core transients that do not have a timeout. Listed here so querying timeouts can be avoided.
$no_timeout = array('update_core', 'update_plugins', 'update_themes');
2010-03-11 21:49:56 +00:00
$transient_option = '_site_transient_' . $transient;
2010-02-14 06:17:42 +00:00
if ( ! in_array( $transient, $no_timeout ) ) {
2010-03-11 21:49:56 +00:00
$transient_timeout = '_site_transient_timeout_' . $transient;
2010-02-14 06:17:42 +00:00
$timeout = get_site_option( $transient_timeout );
2010-02-11 19:43:22 +00:00
if ( false !== $timeout && $timeout < time() ) {
2010-02-14 06:17:42 +00:00
delete_site_option( $transient_option );
delete_site_option( $transient_timeout );
2010-02-11 19:43:22 +00:00
return false;
}
2009-10-29 21:53:57 +00:00
}
2010-02-14 06:17:42 +00:00
$value = get_site_option( $transient_option );
2009-10-29 21:53:57 +00:00
}
2010-02-14 06:17:42 +00:00
return apply_filters( 'site_transient_' . $transient, $value );
2009-10-29 21:53:57 +00:00
}
/**
* Set/update the value of a site transient
*
* You do not need to serialize values, if the value needs to be serialize, then
* it will be serialized before it is set.
*
2010-02-14 06:17:42 +00:00
* @see set_transient()
2009-10-29 21:53:57 +00:00
* @since 2.9.0
* @package WordPress
* @subpackage Transient
*
2010-02-14 10:39:46 +00:00
* @uses apply_filters() Calls 'pre_set_site_transient_$transient' hook to allow overwriting the
* transient value to be stored.
* @uses do_action() Calls 'set_site_transient_$transient' and 'setted_site_transient' hooks on success.
*
2010-03-11 21:49:56 +00:00
* @param string $transient Transient name. Expected to not be SQL-escaped.
* @param mixed $value Transient value. Expected to not be SQL-escaped.
2009-10-29 21:53:57 +00:00
* @param int $expiration Time until expiration in seconds, default 0
* @return bool False if value was not set and true if value was set.
*/
2010-02-14 06:17:42 +00:00
function set_site_transient( $transient, $value, $expiration = 0 ) {
global $_wp_using_ext_object_cache;
2009-10-29 21:53:57 +00:00
2010-06-30 00:05:18 +00:00
$value = apply_filters( 'pre_set_site_transient_' . $transient, $value );
2010-02-14 10:39:46 +00:00
2009-10-29 21:53:57 +00:00
if ( $_wp_using_ext_object_cache ) {
2010-02-14 06:17:42 +00:00
$result = wp_cache_set( $transient, $value, 'site-transient', $expiration );
2009-10-29 21:53:57 +00:00
} else {
$transient_timeout = '_site_transient_timeout_' . $transient;
$transient = '_site_transient_' . $transient;
2010-03-11 21:49:56 +00:00
if ( false === get_site_option( $transient ) ) {
2010-02-14 06:17:42 +00:00
if ( $expiration )
add_site_option( $transient_timeout, time() + $expiration );
$result = add_site_option( $transient, $value );
2009-10-29 21:53:57 +00:00
} else {
2010-02-14 06:17:42 +00:00
if ( $expiration )
update_site_option( $transient_timeout, time() + $expiration );
$result = update_site_option( $transient, $value );
2009-10-29 21:53:57 +00:00
}
}
2010-02-14 10:39:46 +00:00
if ( $result ) {
do_action( 'set_site_transient_' . $transient );
do_action( 'setted_site_transient', $transient );
}
2010-02-14 06:17:42 +00:00
return $result;
2009-10-29 21:53:57 +00:00
}
2010-01-12 21:52:51 +00:00
/**
* is main site
*
*
* @since 3.0.0
* @package WordPress
*
* @param int $blog_id optional blog id to test (default current blog)
* @return bool True if not multisite or $blog_id is main site
*/
function is_main_site( $blog_id = '' ) {
global $current_site, $current_blog;
if ( !is_multisite() )
return true;
if ( !$blog_id )
$blog_id = $current_blog->blog_id;
return $blog_id == $current_site->blog_id;
}
2010-03-16 17:17:55 +00:00
/**
2010-05-24 20:45:59 +00:00
* Whether global terms are enabled.
2010-03-16 17:17:55 +00:00
*
*
* @since 3.0.0
* @package WordPress
*
* @return bool True if multisite and global terms enabled
*/
function global_terms_enabled() {
2010-05-02 22:08:05 +00:00
if ( ! is_multisite() )
return false;
2010-03-16 17:17:55 +00:00
2010-05-02 22:08:05 +00:00
static $global_terms = null;
2010-05-24 20:45:59 +00:00
if ( is_null( $global_terms ) ) {
$filter = apply_filters( 'global_terms_enabled', null );
if ( ! is_null( $filter ) )
$global_terms = (bool) $filter;
else
$global_terms = (bool) get_site_option( 'global_terms_enabled', false );
}
2010-05-02 22:08:05 +00:00
return $global_terms;
2010-03-16 17:17:55 +00:00
}
2009-03-10 00:50:00 +00:00
/**
* gmt_offset modification for smart timezone handling
2009-03-18 02:43:45 +00:00
*
2009-03-10 00:50:00 +00:00
* Overrides the gmt_offset option if we have a timezone_string available
2010-02-13 08:59:04 +00:00
*
2010-02-19 01:08:39 +00:00
* @since 2.8.0
2010-02-13 08:59:04 +00:00
*
2010-02-19 01:08:39 +00:00
* @return float|bool
2009-03-10 00:50:00 +00:00
*/
function wp_timezone_override_offset() {
2009-06-18 17:40:40 +00:00
if ( !wp_timezone_supported() ) {
return false;
}
if ( !$timezone_string = get_option( 'timezone_string' ) ) {
return false;
}
2009-03-18 02:43:45 +00:00
2009-06-18 17:40:40 +00:00
$timezone_object = timezone_open( $timezone_string );
$datetime_object = date_create();
if ( false === $timezone_object || false === $datetime_object ) {
return false;
}
return round( timezone_offset_get( $timezone_object, $datetime_object ) / 3600, 2 );
2009-03-10 00:50:00 +00:00
}
/**
* Check for PHP timezone support
2010-02-13 08:59:04 +00:00
*
2010-02-19 01:08:39 +00:00
* @since 2.9.0
2010-02-13 08:59:04 +00:00
*
2010-02-19 01:08:39 +00:00
* @return bool
2009-03-10 00:50:00 +00:00
*/
function wp_timezone_supported() {
2009-06-18 17:40:40 +00:00
$support = false;
if (
2010-03-07 02:51:55 +00:00
function_exists( 'date_create' ) &&
2009-06-18 17:40:40 +00:00
function_exists( 'date_default_timezone_set' ) &&
function_exists( 'timezone_identifiers_list' ) &&
function_exists( 'timezone_open' ) &&
function_exists( 'timezone_offset_get' )
) {
$support = true;
}
return apply_filters( 'timezone_support', $support );
}
2010-02-13 08:59:04 +00:00
/**
* {@internal Missing Short Description}}
*
2010-02-19 01:08:39 +00:00
* @since 2.9.0
2010-02-13 08:59:04 +00:00
*
* @param unknown_type $a
* @param unknown_type $b
2010-02-19 01:08:39 +00:00
* @return int
2010-02-13 08:59:04 +00:00
*/
2009-06-18 17:40:40 +00:00
function _wp_timezone_choice_usort_callback( $a, $b ) {
// Don't use translated versions of Etc
if ( 'Etc' === $a['continent'] && 'Etc' === $b['continent'] ) {
// Make the order of these more like the old dropdown
if ( 'GMT+' === substr( $a['city'], 0, 4 ) && 'GMT+' === substr( $b['city'], 0, 4 ) ) {
return -1 * ( strnatcasecmp( $a['city'], $b['city'] ) );
}
if ( 'UTC' === $a['city'] ) {
if ( 'GMT+' === substr( $b['city'], 0, 4 ) ) {
return 1;
}
return -1;
}
if ( 'UTC' === $b['city'] ) {
if ( 'GMT+' === substr( $a['city'], 0, 4 ) ) {
return -1;
}
return 1;
}
return strnatcasecmp( $a['city'], $b['city'] );
}
if ( $a['t_continent'] == $b['t_continent'] ) {
if ( $a['t_city'] == $b['t_city'] ) {
return strnatcasecmp( $a['t_subcity'], $b['t_subcity'] );
}
return strnatcasecmp( $a['t_city'], $b['t_city'] );
} else {
// Force Etc to the bottom of the list
if ( 'Etc' === $a['continent'] ) {
return 1;
}
if ( 'Etc' === $b['continent'] ) {
return -1;
}
return strnatcasecmp( $a['t_continent'], $b['t_continent'] );
}
2009-03-10 00:50:00 +00:00
}
/**
* Gives a nicely formatted list of timezone strings // temporary! Not in final
*
2010-02-19 01:08:39 +00:00
* @since 2.9.0
2009-03-10 00:50:00 +00:00
*
2010-02-13 08:59:04 +00:00
* @param string $selected_zone Selected Zone
* @return string
2009-03-10 00:50:00 +00:00
*/
2009-06-18 17:40:40 +00:00
function wp_timezone_choice( $selected_zone ) {
2009-05-14 18:58:37 +00:00
static $mo_loaded = false;
2009-12-23 14:16:36 +00:00
$continents = array( 'Africa', 'America', 'Antarctica', 'Arctic', 'Asia', 'Atlantic', 'Australia', 'Europe', 'Indian', 'Pacific');
2009-03-10 15:26:52 +00:00
2009-05-14 18:58:37 +00:00
// Load translations for continents and cities
2009-06-18 17:40:40 +00:00
if ( !$mo_loaded ) {
2009-05-14 18:58:37 +00:00
$locale = get_locale();
2009-06-18 17:40:40 +00:00
$mofile = WP_LANG_DIR . '/continents-cities-' . $locale . '.mo';
load_textdomain( 'continents-cities', $mofile );
2009-05-14 18:58:37 +00:00
$mo_loaded = true;
}
2009-06-18 17:40:40 +00:00
$zonen = array();
foreach ( timezone_identifiers_list() as $zone ) {
$zone = explode( '/', $zone );
if ( !in_array( $zone[0], $continents ) ) {
2009-03-10 15:26:52 +00:00
continue;
2009-06-18 17:40:40 +00:00
}
2009-03-10 00:50:00 +00:00
2009-06-18 17:40:40 +00:00
// This determines what gets set and translated - we don't translate Etc/* strings here, they are done later
$exists = array(
2010-03-19 21:15:00 +00:00
0 => ( isset( $zone[0] ) && $zone[0] ),
1 => ( isset( $zone[1] ) && $zone[1] ),
2 => ( isset( $zone[2] ) && $zone[2] ),
2009-06-18 17:40:40 +00:00
);
2010-03-19 21:15:00 +00:00
$exists[3] = ( $exists[0] && 'Etc' !== $zone[0] );
$exists[4] = ( $exists[1] && $exists[3] );
$exists[5] = ( $exists[2] && $exists[3] );
2009-06-18 17:40:40 +00:00
$zonen[] = array(
'continent' => ( $exists[0] ? $zone[0] : '' ),
'city' => ( $exists[1] ? $zone[1] : '' ),
'subcity' => ( $exists[2] ? $zone[2] : '' ),
't_continent' => ( $exists[3] ? translate( str_replace( '_', ' ', $zone[0] ), 'continents-cities' ) : '' ),
't_city' => ( $exists[4] ? translate( str_replace( '_', ' ', $zone[1] ), 'continents-cities' ) : '' ),
't_subcity' => ( $exists[5] ? translate( str_replace( '_', ' ', $zone[2] ), 'continents-cities' ) : '' )
);
}
usort( $zonen, '_wp_timezone_choice_usort_callback' );
$structure = array();
if ( empty( $selected_zone ) ) {
$structure[] = '<option selected="selected" value="">' . __( 'Select a city' ) . '</option>';
}
foreach ( $zonen as $key => $zone ) {
// Build value in an array to join later
$value = array( $zone['continent'] );
if ( empty( $zone['city'] ) ) {
// It's at the continent level (generally won't happen)
$display = $zone['t_continent'];
2009-03-10 00:50:00 +00:00
} else {
2009-06-18 17:40:40 +00:00
// It's inside a continent group
2009-09-14 14:03:32 +00:00
2009-06-18 17:40:40 +00:00
// Continent optgroup
if ( !isset( $zonen[$key - 1] ) || $zonen[$key - 1]['continent'] !== $zone['continent'] ) {
2009-12-23 14:16:36 +00:00
$label = $zone['t_continent'];
2009-06-18 17:40:40 +00:00
$structure[] = '<optgroup label="'. esc_attr( $label ) .'">';
}
2009-09-14 14:03:32 +00:00
2009-06-18 17:40:40 +00:00
// Add the city to the value
$value[] = $zone['city'];
2009-12-23 14:16:36 +00:00
$display = $zone['t_city'];
if ( !empty( $zone['subcity'] ) ) {
// Add the subcity to the value
$value[] = $zone['subcity'];
$display .= ' - ' . $zone['t_subcity'];
2009-06-18 17:40:40 +00:00
}
}
// Build the value
$value = join( '/', $value );
$selected = '';
if ( $value === $selected_zone ) {
$selected = 'selected="selected" ';
}
$structure[] = '<option ' . $selected . 'value="' . esc_attr( $value ) . '">' . esc_html( $display ) . "</option>";
2009-09-14 14:03:32 +00:00
2009-06-18 17:40:40 +00:00
// Close continent optgroup
2009-07-01 17:59:19 +00:00
if ( !empty( $zone['city'] ) && ( !isset($zonen[$key + 1]) || (isset( $zonen[$key + 1] ) && $zonen[$key + 1]['continent'] !== $zone['continent']) ) ) {
2009-06-18 17:40:40 +00:00
$structure[] = '</optgroup>';
2009-03-10 00:50:00 +00:00
}
}
2009-12-23 14:16:36 +00:00
// Do UTC
$structure[] = '<optgroup label="'. esc_attr__( 'UTC' ) .'">';
$selected = '';
if ( 'UTC' === $selected_zone )
$selected = 'selected="selected" ';
$structure[] = '<option ' . $selected . 'value="' . esc_attr( 'UTC' ) . '">' . __('UTC') . '</option>';
$structure[] = '</optgroup>';
// Do manual UTC offsets
$structure[] = '<optgroup label="'. esc_attr__( 'Manual Offsets' ) .'">';
$offset_range = array (-12, -11.5, -11, -10.5, -10, -9.5, -9, -8.5, -8, -7.5, -7, -6.5, -6, -5.5, -5, -4.5, -4, -3.5, -3, -2.5, -2, -1.5, -1, -0.5,
0, 0.5, 1, 1.5, 2, 2.5, 3, 3.5, 4, 4.5, 5, 5.5, 5.75, 6, 6.5, 7, 7.5, 8, 8.5, 8.75, 9, 9.5, 10, 10.5, 11, 11.5, 12, 12.75, 13, 13.75, 14);
foreach ( $offset_range as $offset ) {
if ( 0 <= $offset )
$offset_name = '+' . $offset;
else
$offset_name = (string) $offset;
$offset_value = $offset_name;
$offset_name = str_replace(array('.25','.5','.75'), array(':15',':30',':45'), $offset_name);
$offset_name = 'UTC' . $offset_name;
$offset_value = 'UTC' . $offset_value;
$selected = '';
if ( $offset_value === $selected_zone )
$selected = 'selected="selected" ';
$structure[] = '<option ' . $selected . 'value="' . esc_attr( $offset_value ) . '">' . esc_html( $offset_name ) . "</option>";
2010-01-15 22:11:12 +00:00
2009-12-23 14:16:36 +00:00
}
$structure[] = '</optgroup>';
2009-06-18 17:40:40 +00:00
return join( "\n", $structure );
2009-03-10 00:50:00 +00:00
}
2009-05-04 09:33:58 +00:00
/**
* Strip close comment and close php tags from file headers used by WP
* See http://core.trac.wordpress.org/ticket/8497
*
2010-02-19 01:08:39 +00:00
* @since 2.8.0
*
* @param string $str
* @return string
*/
2009-05-04 09:33:58 +00:00
function _cleanup_header_comment($str) {
return trim(preg_replace("/\s*(?:\*\/|\?>).*/", '', $str));
}
2009-07-24 07:23:11 +00:00
/**
2009-07-30 13:39:34 +00:00
* Permanently deletes posts, pages, attachments, and comments which have been in the trash for EMPTY_TRASH_DAYS.
2009-09-14 14:03:32 +00:00
*
2009-07-24 07:23:11 +00:00
* @since 2.9.0
*/
function wp_scheduled_delete() {
2009-08-25 22:05:15 +00:00
global $wpdb;
$delete_timestamp = time() - (60*60*24*EMPTY_TRASH_DAYS);
2009-09-14 14:03:32 +00:00
2009-08-25 22:05:15 +00:00
$posts_to_delete = $wpdb->get_results($wpdb->prepare("SELECT post_id FROM $wpdb->postmeta WHERE meta_key = '_wp_trash_meta_time' AND meta_value < '%d'", $delete_timestamp), ARRAY_A);
2009-09-14 14:03:32 +00:00
2009-08-25 22:05:15 +00:00
foreach ( (array) $posts_to_delete as $post ) {
2009-12-16 01:35:29 +00:00
$post_id = (int) $post['post_id'];
if ( !$post_id )
continue;
$del_post = get_post($post_id);
if ( !$del_post || 'trash' != $del_post->post_status ) {
delete_post_meta($post_id, '_wp_trash_meta_status');
delete_post_meta($post_id, '_wp_trash_meta_time');
} else {
wp_delete_post($post_id);
}
2009-08-25 22:05:15 +00:00
}
2009-09-17 20:51:12 +00:00
$comments_to_delete = $wpdb->get_results($wpdb->prepare("SELECT comment_id FROM $wpdb->commentmeta WHERE meta_key = '_wp_trash_meta_time' AND meta_value < '%d'", $delete_timestamp), ARRAY_A);
2009-09-24 17:19:13 +00:00
2009-09-17 20:51:12 +00:00
foreach ( (array) $comments_to_delete as $comment ) {
2009-12-16 01:35:29 +00:00
$comment_id = (int) $comment['comment_id'];
if ( !$comment_id )
continue;
$del_comment = get_comment($comment_id);
if ( !$del_comment || 'trash' != $del_comment->comment_approved ) {
delete_comment_meta($comment_id, '_wp_trash_meta_time');
delete_comment_meta($comment_id, '_wp_trash_meta_status');
} else {
wp_delete_comment($comment_id);
}
2009-07-30 13:39:34 +00:00
}
2009-07-24 07:23:11 +00:00
}
2009-10-15 21:07:00 +00:00
/**
2010-12-06 03:44:36 +00:00
* Retrieve metadata from a file.
2009-10-15 21:07:00 +00:00
*
2010-12-06 03:44:36 +00:00
* Searches for metadata in the first 8kiB of a file, such as a plugin or theme.
* Each piece of metadata must be on its own line. Fields can not span multple
* lines, the value will get cut at the end of the first line.
*
* If the file data is not within that first 8kiB, then the author should correct
* their plugin file and move the data headers to the top.
2009-10-15 21:07:00 +00:00
*
2010-12-06 03:44:36 +00:00
* @see http://codex.wordpress.org/File_Header
2009-10-15 21:07:00 +00:00
*
* @since 2.9.0
* @param string $file Path to the file
2010-12-09 03:30:23 +00:00
* @param array $default_headers List of headers, in the format array('HeaderKey' => 'Header Name')
* @param string $context If specified adds filter hook "extra_{$context}_headers"
2009-10-15 21:07:00 +00:00
*/
function get_file_data( $file, $default_headers, $context = '' ) {
// We don't need to write to the file, so just open for reading.
$fp = fopen( $file, 'r' );
// Pull only the first 8kiB of the file in.
$file_data = fread( $fp, 8192 );
// PHP will close file handle, but we are good citizens.
fclose( $fp );
2010-01-11 22:08:49 +00:00
if ( $context != '' ) {
2010-11-25 02:14:33 +00:00
$extra_headers = apply_filters( "extra_{$context}_headers", array() );
2009-10-15 21:07:00 +00:00
$extra_headers = array_flip( $extra_headers );
foreach( $extra_headers as $key=>$value ) {
$extra_headers[$key] = $key;
}
2010-11-15 06:38:10 +00:00
$all_headers = array_merge( $extra_headers, (array) $default_headers );
2009-10-15 21:07:00 +00:00
} else {
$all_headers = $default_headers;
}
foreach ( $all_headers as $field => $regex ) {
2010-11-23 19:37:31 +00:00
preg_match( '/^[ \t\/*#]*' . preg_quote( $regex, '/' ) . ':(.*)$/mi', $file_data, ${$field});
2009-10-15 21:07:00 +00:00
if ( !empty( ${$field} ) )
${$field} = _cleanup_header_comment( ${$field}[1] );
else
${$field} = '';
}
$file_data = compact( array_keys( $all_headers ) );
2010-01-15 22:11:12 +00:00
2009-10-15 21:07:00 +00:00
return $file_data;
}
2010-08-11 21:54:51 +00:00
2009-10-18 11:50:59 +00:00
/*
* Used internally to tidy up the search terms
2010-01-15 22:11:12 +00:00
*
2010-05-03 13:27:15 +00:00
* @access private
2009-10-18 11:50:59 +00:00
* @since 2.9.0
2010-02-19 01:08:39 +00:00
*
* @param string $t
* @return string
2009-10-18 11:50:59 +00:00
*/
function _search_terms_tidy($t) {
2010-02-04 21:54:24 +00:00
return trim($t, "\"'\n\r ");
2009-10-18 11:50:59 +00:00
}
2010-02-25 21:56:28 +00:00
2010-03-01 08:50:27 +00:00
/**
* Returns true
*
* Useful for returning true to filters easily
*
2010-05-14 16:46:53 +00:00
* @since 3.0.0
2010-03-01 08:50:27 +00:00
* @see __return_false()
* @return bool true
*/
function __return_true() {
return true;
}
2010-02-25 21:56:28 +00:00
/**
* Returns false
*
* Useful for returning false to filters easily
2010-03-01 08:50:27 +00:00
*
2010-05-14 16:46:53 +00:00
* @since 3.0.0
2010-03-01 08:50:27 +00:00
* @see __return_true()
2010-02-25 21:56:28 +00:00
* @return bool false
*/
function __return_false() {
return false;
2010-03-23 19:13:58 +00:00
}
2010-05-14 16:46:53 +00:00
/**
* Returns 0
*
* Useful for returning 0 to filters easily
*
* @since 3.0.0
* @see __return_zero()
* @return int 0
*/
function __return_zero() {
return 0;
}
2010-05-14 16:55:26 +00:00
/**
* Returns an empty array
*
* Useful for returning an empty array to filters easily
*
* @since 3.0.0
* @see __return_zero()
* @return array Empty array
*/
function __return_empty_array() {
return array();
}
2010-03-23 19:13:58 +00:00
/**
* Send a HTTP header to disable content type sniffing in browsers which support it.
*
* @link http://blogs.msdn.com/ie/archive/2008/07/02/ie8-security-part-v-comprehensive-protection.aspx
* @link http://src.chromium.org/viewvc/chrome?view=rev&revision=6985
*
* @since 3.0.0
* @return none
*/
function send_nosniff_header() {
@header( 'X-Content-Type-Options: nosniff' );
}
2010-05-07 05:01:29 +00:00
/**
* Returns a MySQL expression for selecting the week number based on the start_of_week option.
*
* @internal
* @since 3.0.0
* @param string $column
* @return string
*/
function _wp_mysql_week( $column ) {
switch ( $start_of_week = (int) get_option( 'start_of_week' ) ) {
default :
case 0 :
return "WEEK( $column, 0 )";
case 1 :
return "WEEK( $column, 1 )";
case 2 :
case 3 :
case 4 :
case 5 :
case 6 :
return "WEEK( DATE_SUB( $column, INTERVAL $start_of_week DAY ), 0 )";
}
}
2010-10-14 15:09:04 +00:00
/**
2010-10-19 08:16:10 +00:00
* Finds hierarchy loops using a callback function that maps object IDs to parent IDs.
2010-10-14 15:09:04 +00:00
*
2010-10-19 07:38:42 +00:00
* @since 3.1.0
2010-10-19 07:48:22 +00:00
* @access private
2010-10-14 15:09:04 +00:00
*
2010-10-19 08:16:10 +00:00
* @param callback $callback function that accepts ( ID, $callback_args ) and outputs parent_ID
2010-11-18 19:12:48 +00:00
* @param int $start The ID to start the loop check at
* @param int $start_parent the parent_ID of $start to use instead of calling $callback( $start ). Use null to always use $callback
2010-10-19 08:16:10 +00:00
* @param array $callback_args optional additional arguments to send to $callback
2010-10-14 15:09:04 +00:00
* @return array IDs of all members of loop
*/
function wp_find_hierarchy_loop( $callback, $start, $start_parent, $callback_args = array() ) {
$override = is_null( $start_parent ) ? array() : array( $start => $start_parent );
if ( !$arbitrary_loop_member = wp_find_hierarchy_loop_tortoise_hare( $callback, $start, $override, $callback_args ) )
return array();
return wp_find_hierarchy_loop_tortoise_hare( $callback, $arbitrary_loop_member, $override, $callback_args, true );
}
/**
* Uses the "The Tortoise and the Hare" algorithm to detect loops.
*
* For every step of the algorithm, the hare takes two steps and the tortoise one.
* If the hare ever laps the tortoise, there must be a loop.
*
2010-10-19 07:38:42 +00:00
* @since 3.1.0
* @access private
2010-10-14 15:09:04 +00:00
*
* @param callback $callback function that accupts ( ID, callback_arg, ... ) and outputs parent_ID
2010-11-18 19:12:48 +00:00
* @param int $start The ID to start the loop check at
2010-10-14 15:09:04 +00:00
* @param array $override an array of ( ID => parent_ID, ... ) to use instead of $callback
* @param array $callback_args optional additional arguments to send to $callback
* @param bool $_return_loop Return loop members or just detect presence of loop?
* Only set to true if you already know the given $start is part of a loop
* (otherwise the returned array might include branches)
* @return mixed scalar ID of some arbitrary member of the loop, or array of IDs of all members of loop if $_return_loop
*/
function wp_find_hierarchy_loop_tortoise_hare( $callback, $start, $override = array(), $callback_args = array(), $_return_loop = false ) {
$tortoise = $hare = $evanescent_hare = $start;
$return = array();
// Set evanescent_hare to one past hare
// Increment hare two steps
while (
$tortoise
&&
( $evanescent_hare = isset( $override[$hare] ) ? $override[$hare] : call_user_func_array( $callback, array_merge( array( $hare ), $callback_args ) ) )
&&
( $hare = isset( $override[$evanescent_hare] ) ? $override[$evanescent_hare] : call_user_func_array( $callback, array_merge( array( $evanescent_hare ), $callback_args ) ) )
) {
if ( $_return_loop )
$return[$tortoise] = $return[$evanescent_hare] = $return[$hare] = true;
// tortoise got lapped - must be a loop
if ( $tortoise == $evanescent_hare || $tortoise == $hare )
return $_return_loop ? $return : $tortoise;
// Increment tortoise by one step
$tortoise = isset( $override[$tortoise] ) ? $override[$tortoise] : call_user_func_array( $callback, array_merge( array( $tortoise ), $callback_args ) );
}
return false;
}
2010-10-18 17:58:36 +00:00
/**
2010-10-28 11:48:22 +00:00
* Set the display status of the admin bar
2010-10-18 17:58:36 +00:00
*
* This can be called immediately upon plugin load. It does not need to be called from a function hooked to the init action.
*
* @since 3.1.0
2010-10-28 11:48:22 +00:00
*
* @param bool $show Whether to allow the admin bar to show.
* @return void
2010-10-18 17:58:36 +00:00
*/
2010-10-28 11:48:22 +00:00
function show_admin_bar( $show ) {
global $show_admin_bar;
$show_admin_bar = (bool) $show;
2010-10-18 21:54:39 +00:00
}
2010-10-28 11:48:22 +00:00