1 | <?php |
2 | /** |
3 | * These functions are needed to load WordPress. |
4 | * |
5 | * @package WordPress |
6 | */ |
7 | |
8 | /** |
9 | * Turn register globals off. |
10 | * |
11 | * @access private |
12 | * @since 2.1.0 |
13 | * @return null Will return null if register_globals PHP directive was disabled |
14 | */ |
15 | function wp_unregister_GLOBALS() { |
16 | if ( !ini_get( 'register_globals' ) ) |
17 | return; |
18 | |
19 | if ( isset( $_REQUEST['GLOBALS'] ) ) |
20 | die( /*WP_I18N_GLOBALS_OVERWRITE*/'GLOBALS overwrite attempt detected'/*/WP_I18N_GLOBALS_OVERWRITE*/ ); |
21 | |
22 | // Variables that shouldn't be unset |
23 | $no_unset = array( 'GLOBALS', '_GET', '_POST', '_COOKIE', '_REQUEST', '_SERVER', '_ENV', '_FILES', 'table_prefix' ); |
24 | |
25 | $input = array_merge( $_GET, $_POST, $_COOKIE, $_SERVER, $_ENV, $_FILES, isset( $_SESSION ) && is_array( $_SESSION ) ? $_SESSION : array() ); |
26 | foreach ( $input as $k => $v ) |
27 | if ( !in_array( $k, $no_unset ) && isset( $GLOBALS[$k] ) ) { |
28 | $GLOBALS[$k] = null; |
29 | unset( $GLOBALS[$k] ); |
30 | } |
31 | } |
32 | |
33 | /** |
34 | * Fix $_SERVER variables for various setups. |
35 | * |
36 | * @access private |
37 | * @since 3.0.0 |
38 | */ |
39 | function wp_fix_server_vars() { |
40 | global $PHP_SELF; |
41 | |
42 | $default_server_values = array( |
43 | 'SERVER_SOFTWARE' => '', |
44 | 'REQUEST_URI' => '', |
45 | ); |
46 | |
47 | $_SERVER = array_merge( $default_server_values, $_SERVER ); |
48 | |
49 | // Fix for IIS when running with PHP ISAPI |
50 | if ( empty( $_SERVER['REQUEST_URI'] ) || ( php_sapi_name() != 'cgi-fcgi' && preg_match( '/^Microsoft-IIS\//', $_SERVER['SERVER_SOFTWARE'] ) ) ) { |
51 | |
52 | // IIS Mod-Rewrite |
53 | if ( isset( $_SERVER['HTTP_X_ORIGINAL_URL'] ) ) { |
54 | $_SERVER['REQUEST_URI'] = $_SERVER['HTTP_X_ORIGINAL_URL']; |
55 | } |
56 | // IIS Isapi_Rewrite |
57 | else if ( isset( $_SERVER['HTTP_X_REWRITE_URL'] ) ) { |
58 | $_SERVER['REQUEST_URI'] = $_SERVER['HTTP_X_REWRITE_URL']; |
59 | } else { |
60 | // Use ORIG_PATH_INFO if there is no PATH_INFO |
61 | if ( !isset( $_SERVER['PATH_INFO'] ) && isset( $_SERVER['ORIG_PATH_INFO'] ) ) |
62 | $_SERVER['PATH_INFO'] = $_SERVER['ORIG_PATH_INFO']; |
63 | |
64 | // Some IIS + PHP configurations puts the script-name in the path-info (No need to append it twice) |
65 | if ( isset( $_SERVER['PATH_INFO'] ) ) { |
66 | if ( $_SERVER['PATH_INFO'] == $_SERVER['SCRIPT_NAME'] ) |
67 | $_SERVER['REQUEST_URI'] = $_SERVER['PATH_INFO']; |
68 | else |
69 | $_SERVER['REQUEST_URI'] = $_SERVER['SCRIPT_NAME'] . $_SERVER['PATH_INFO']; |
70 | } |
71 | |
72 | // Append the query string if it exists and isn't null |
73 | if ( ! empty( $_SERVER['QUERY_STRING'] ) ) { |
74 | $_SERVER['REQUEST_URI'] .= '?' . $_SERVER['QUERY_STRING']; |
75 | } |
76 | } |
77 | } |
78 | |
79 | // Fix for PHP as CGI hosts that set SCRIPT_FILENAME to something ending in php.cgi for all requests |
80 | if ( isset( $_SERVER['SCRIPT_FILENAME'] ) && ( strpos( $_SERVER['SCRIPT_FILENAME'], 'php.cgi' ) == strlen( $_SERVER['SCRIPT_FILENAME'] ) - 7 ) ) |
81 | $_SERVER['SCRIPT_FILENAME'] = $_SERVER['PATH_TRANSLATED']; |
82 | |
83 | // Fix for Dreamhost and other PHP as CGI hosts |
84 | if ( strpos( $_SERVER['SCRIPT_NAME'], 'php.cgi' ) !== false ) |
85 | unset( $_SERVER['PATH_INFO'] ); |
86 | |
87 | // Fix empty PHP_SELF |
88 | $PHP_SELF = $_SERVER['PHP_SELF']; |
89 | if ( empty( $PHP_SELF ) ) |
90 | $_SERVER['PHP_SELF'] = $PHP_SELF = preg_replace( '/(\?.*)?$/', '', $_SERVER["REQUEST_URI"] ); |
91 | } |
92 | |
93 | /** |
94 | * Check for the required PHP version, and the MySQL extension or a database drop-in. |
95 | * |
96 | * Dies if requirements are not met. |
97 | * |
98 | * @access private |
99 | * @since 3.0.0 |
100 | */ |
101 | function wp_check_php_mysql_versions() { |
102 | // we can probably extend this function to check if wp_die() exists then use translated strings, and then use it in install.php etc. |
103 | |
104 | global $required_php_version, $wp_version; | //Arbitrary code inclusion
|
105 | $php_version = phpversion(); |
106 | if ( version_compare( $required_php_version, $php_version, '>' ) ) |
107 | die( sprintf( /*WP_I18N_OLD_PHP*/'Your server is running PHP version %1$s but WordPress %2$s requires at least %3$s.'/*/WP_I18N_OLD_PHP*/, $php_version, $wp_version, $required_php_version ) ); | //Arbitrary code inclusion
|
108 | |
109 | if ( !extension_loaded( 'mysql' ) && !file_exists( WP_CONTENT_DIR . '/db.php' ) ) |
110 | die( /*WP_I18N_OLD_MYSQL*/'Your PHP installation appears to be missing the MySQL extension which is required by WordPress.'/*/WP_I18N_OLD_MYSQL*/ ); |
111 | } |
112 | |
113 | /** |
114 | * Don't load all of WordPress when handling a favicon.ico request. |
115 | * Instead, send the headers for a zero-length favicon and bail. |
116 | * |
117 | * @since 3.0.0 |
118 | */ |
119 | function wp_favicon_request() { |
120 | if ( '/favicon.ico' == $_SERVER['REQUEST_URI'] ) { |
121 | header('Content-Type: image/vnd.microsoft.icon'); |
122 | header('Content-Length: 0'); |
123 | exit; |
124 | } |
125 | } |
126 | |
127 | /** |
128 | * Dies with a maintenance message when conditions are met. |
129 | * |
130 | * Checks for a file in the WordPress root directory named ".maintenance". |
131 | * This file will contain the variable $upgrading, set to the time the file |
132 | * was created. If the file was created less than 10 minutes ago, WordPress |
133 | * enters maintenance mode and displays a message. |
134 | * |
135 | * The default message can be replaced by using a drop-in (maintenance.php in |
136 | * the wp-content directory). |
137 | * |
138 | * @access private |
139 | * @since 3.0.0 |
140 | */ |
141 | function wp_maintenance() { |
142 | if ( !file_exists( ABSPATH . '.maintenance' ) || defined( 'WP_INSTALLING' ) ) |
143 | return; |
144 | |
145 | global $upgrading; |
146 | |
147 | include( ABSPATH . '.maintenance' ); |
148 | // If the $upgrading timestamp is older than 10 minutes, don't die. |
149 | if ( ( time() - $upgrading ) >= 600 ) |
150 | return; |
151 | |
152 | if ( file_exists( WP_CONTENT_DIR . '/maintenance.php' ) ) { |
153 | require_once( WP_CONTENT_DIR . '/maintenance.php' ); |
154 | die(); |
155 | } |
156 | |
157 | $protocol = $_SERVER["SERVER_PROTOCOL"]; |
158 | if ( 'HTTP/1.1' != $protocol && 'HTTP/1.0' != $protocol ) |
159 | $protocol = 'HTTP/1.0'; |
160 | header( "$protocol 503 Service Unavailable", true, 503 ); | //Cross Site Scripting
|
161 | header( 'Content-Type: text/html; charset=utf-8' ); |
162 | header( 'Retry-After: 600' ); |
163 | ?> |
164 | <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> |
165 | <html xmlns="http://www.w3.org/1999/xhtml"> |
166 | <head> |
167 | <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> |
168 | <title><?php echo /*WP_I18N_MAINTENANCE*/'Maintenance'/*/WP_I18N_MAINTENANCE*/; ?></title> |
169 | |
170 | </head> |
171 | <body> |
172 | <h1><?php echo /*WP_I18N_MAINT_MSG*/'Briefly unavailable for scheduled maintenance. Check back in a minute.'/*/WP_I18N_MAINT_MSG*/; ?></h1> |
173 | </body> |
174 | </html> |
175 | <?php |
176 | die(); |
177 | } |
178 | |
179 | /** |
180 | * PHP 4 standard microtime start capture. |
181 | * |
182 | * @access private |
183 | * @since 0.71 |
184 | * @global int $timestart Seconds and Microseconds added together from when function is called. |
185 | * @return bool Always returns true. |
186 | */ |
187 | function timer_start() { |
188 | global $timestart; |
189 | $mtime = explode( ' ', microtime() ); |
190 | $timestart = $mtime[1] + $mtime[0]; |
191 | return true; |
192 | } |
193 | |
194 | /** |
195 | * Return and/or display the time from the page start to when function is called. |
196 | * |
197 | * You can get the results and print them by doing: |
198 | * <code> |
199 | * $nTimePageTookToExecute = timer_stop(); |
200 | * echo $nTimePageTookToExecute; | //Cross Site Scripting
|
201 | * </code> |
202 | * |
203 | * Or instead, you can do: |
204 | * <code> |
205 | * timer_stop(1); |
206 | * </code> |
207 | * which will do what the above does. If you need the result, you can assign it to a variable, but |
208 | * most cases, you only need to echo it. |
209 | * |
210 | * @since 0.71 |
211 | * @global int $timestart Seconds and Microseconds added together from when timer_start() is called |
212 | * @global int $timeend Seconds and Microseconds added together from when function is called |
213 | * |
214 | * @param int $display Use '0' or null to not echo anything and 1 to echo the total time |
215 | * @param int $precision The amount of digits from the right of the decimal to display. Default is 3. |
216 | * @return float The "second.microsecond" finished time calculation |
217 | */ |
218 | function timer_stop( $display = 0, $precision = 3 ) { // if called like timer_stop(1), will echo $timetotal |
219 | global $timestart, $timeend; |
220 | $mtime = microtime(); |
221 | $mtime = explode( ' ', $mtime ); |
222 | $timeend = $mtime[1] + $mtime[0]; |
223 | $timetotal = $timeend - $timestart; |
224 | $r = ( function_exists( 'number_format_i18n' ) ) ? number_format_i18n( $timetotal, $precision ) : number_format( $timetotal, $precision ); |
225 | if ( $display ) |
226 | echo $r; | //Cross Site Scripting
|
227 | return $r; |
228 | } |
229 | |
230 | /** |
231 | * Sets PHP error handling and handles WordPress debug mode. |
232 | * |
233 | * Uses three constants: WP_DEBUG, WP_DEBUG_DISPLAY, and WP_DEBUG_LOG. All three can be |
234 | * defined in wp-config.php. Example: <code> define( 'WP_DEBUG', true ); </code> |
235 | * |
236 | * WP_DEBUG_DISPLAY and WP_DEBUG_LOG perform no function unless WP_DEBUG is true. |
237 | * WP_DEBUG defaults to false. |
238 | * |
239 | * When WP_DEBUG is true, all PHP notices are reported. WordPress will also display |
240 | * notices, including one when a deprecated WordPress function, function argument, |
241 | * or file is used. Deprecated code may be removed from a later version. |
242 | * |
243 | * It is strongly recommended that plugin and theme developers use WP_DEBUG in their |
244 | * development environments. |
245 | * |
246 | * When WP_DEBUG_DISPLAY is true, WordPress will force errors to be displayed. |
247 | * WP_DEBUG_DISPLAY defaults to true. Defining it as false prevents WordPress from |
248 | * changing the global configuration setting. (Defining WP_DEBUG_DISPLAY as false |
249 | * will never force errors to be hidden.) |
250 | * |
251 | * When WP_DEBUG_LOG is true, errors will be logged to wp-content/debug.log. |
252 | * WP_DEBUG_LOG defaults to false. |
253 | * |
254 | * @access private |
255 | * @since 3.0.0 |
256 | */ |
257 | function wp_debug_mode() { |
258 | if ( WP_DEBUG ) { |
259 | if ( defined( 'E_DEPRECATED' ) ) |
260 | error_reporting( E_ALL & ~E_DEPRECATED & ~E_STRICT ); |
261 | else |
262 | error_reporting( E_ALL ); |
263 | |
264 | if ( WP_DEBUG_DISPLAY ) |
265 | ini_set( 'display_errors', 1 ); |
266 | |
267 | if ( WP_DEBUG_LOG ) { |
268 | ini_set( 'log_errors', 1 ); |
269 | ini_set( 'error_log', WP_CONTENT_DIR . '/debug.log' ); |
270 | } |
271 | } else { |
272 | if ( defined( 'E_RECOVERABLE_ERROR' ) ) |
273 | error_reporting( E_CORE_ERROR | E_CORE_WARNING | E_COMPILE_ERROR | E_ERROR | E_WARNING | E_PARSE | E_USER_ERROR | E_USER_WARNING | E_RECOVERABLE_ERROR ); |
274 | else |
275 | error_reporting( E_CORE_ERROR | E_CORE_WARNING | E_COMPILE_ERROR | E_ERROR | E_WARNING | E_PARSE | E_USER_ERROR | E_USER_WARNING ); |
276 | } |
277 | } |
278 | |
279 | /** |
280 | * Sets the location of the language directory. |
281 | * |
282 | * To set directory manually, define <code>WP_LANG_DIR</code> in wp-config.php. |
283 | * |
284 | * First looks for language folder in WP_CONTENT_DIR and uses that folder if it |
285 | * exists. Or it uses the "languages" folder in WPINC. |
286 | * |
287 | * The WP_LANG_DIR constant was introduced in 2.1.0. |
288 | * |
289 | * @access private |
290 | * @since 3.0.0 |
291 | */ |
292 | function wp_set_lang_dir() { |
293 | if ( !defined( 'WP_LANG_DIR' ) ) { |
294 | if ( file_exists( WP_CONTENT_DIR . '/languages' ) && @is_dir( WP_CONTENT_DIR . '/languages' ) ) { |
295 | define( 'WP_LANG_DIR', WP_CONTENT_DIR . '/languages' ); // no leading slash, no trailing slash, full path, not relative to ABSPATH |
296 | if ( !defined( 'LANGDIR' ) ) { |
297 | // Old static relative path maintained for limited backwards compatibility - won't work in some cases |
298 | define( 'LANGDIR', 'wp-content/languages' ); |
299 | } |
300 | } else { |
301 | define( 'WP_LANG_DIR', ABSPATH . WPINC . '/languages' ); // no leading slash, no trailing slash, full path, not relative to ABSPATH |
302 | if ( !defined( 'LANGDIR' ) ) { |
303 | // Old relative path maintained for backwards compatibility |
304 | define( 'LANGDIR', WPINC . '/languages' ); |
305 | } |
306 | } |
307 | } |
308 | } |
309 | |
310 | /** |
311 | * Sets the database table prefix and the format specifiers for database table columns. |
312 | * |
313 | * Columns not listed here default to %s. |
314 | * |
315 | * @see wpdb::$field_types Since 2.8.0 |
316 | * @see wpdb::prepare() |
317 | * @see wpdb::insert() |
318 | * @see wpdb::update() |
319 | * @see wpdb::set_prefix() |
320 | * |
321 | * @access private |
322 | * @since 3.0.0 |
323 | */ |
324 | function wp_set_wpdb_vars() { |
325 | global $wpdb, $table_prefix; |
326 | if ( !empty( $wpdb->error ) ) |
327 | dead_db(); |
328 | |
329 | $wpdb->field_types = array( 'post_author' => '%d', 'post_parent' => '%d', 'menu_order' => '%d', 'term_id' => '%d', 'term_group' => '%d', 'term_taxonomy_id' => '%d', |
330 | 'parent' => '%d', 'count' => '%d','object_id' => '%d', 'term_order' => '%d', 'ID' => '%d', 'commment_ID' => '%d', 'comment_post_ID' => '%d', 'comment_parent' => '%d', |
331 | 'user_id' => '%d', 'link_id' => '%d', 'link_owner' => '%d', 'link_rating' => '%d', 'option_id' => '%d', 'blog_id' => '%d', 'meta_id' => '%d', 'post_id' => '%d', |
332 | 'user_status' => '%d', 'umeta_id' => '%d', 'comment_karma' => '%d', 'comment_count' => '%d', |
333 | // multisite: |
334 | 'active' => '%d', 'cat_id' => '%d', 'deleted' => '%d', 'lang_id' => '%d', 'mature' => '%d', 'public' => '%d', 'site_id' => '%d', 'spam' => '%d', |
335 | ); |
336 | |
337 | $prefix = $wpdb->set_prefix( $table_prefix ); |
338 | |
339 | if ( is_wp_error( $prefix ) ) |
340 | wp_die( /*WP_I18N_BAD_PREFIX*/'<strong>ERROR</strong>: <code>$table_prefix</code> in <code>wp-config.php</code> can only contain numbers, letters, and underscores.'/*/WP_I18N_BAD_PREFIX*/ ); |
341 | } |
342 | |
343 | /** |
344 | * Starts the WordPress object cache. |
345 | * |
346 | * If an object-cache.php file exists in the wp-content directory, |
347 | * it uses that drop-in as an external object cache. |
348 | * |
349 | * @access private |
350 | * @since 3.0.0 |
351 | */ |
352 | function wp_start_object_cache() { |
353 | global $_wp_using_ext_object_cache; |
354 | |
355 | $first_init = false; |
356 | if ( ! function_exists( 'wp_cache_init' ) ) { |
357 | if ( file_exists( WP_CONTENT_DIR . '/object-cache.php' ) ) { |
358 | require_once ( WP_CONTENT_DIR . '/object-cache.php' ); |
359 | $_wp_using_ext_object_cache = true; |
360 | } else { |
361 | require_once ( ABSPATH . WPINC . '/cache.php' ); |
362 | $_wp_using_ext_object_cache = false; |
363 | } |
364 | $first_init = true; |
365 | } else if ( !$_wp_using_ext_object_cache && file_exists( WP_CONTENT_DIR . '/object-cache.php' ) ) { |
366 | // Sometimes advanced-cache.php can load object-cache.php before it is loaded here. |
367 | // This breaks the function_exists check above and can result in $_wp_using_ext_object_cache |
368 | // being set incorrectly. Double check if an external cache exists. |
369 | $_wp_using_ext_object_cache = true; |
370 | } |
371 | |
372 | // If cache supports reset, reset instead of init if already initialized. |
373 | // Reset signals to the cache that global IDs have changed and it may need to update keys |
374 | // and cleanup caches. |
375 | if ( !$first_init && function_exists('wp_cache_reset') ) |
376 | wp_cache_reset(); |
377 | else |
378 | wp_cache_init(); |
379 | |
380 | if ( function_exists( 'wp_cache_add_global_groups' ) ) { |
381 | wp_cache_add_global_groups( array( 'users', 'userlogins', 'usermeta', 'site-transient', 'site-options', 'site-lookup', 'blog-lookup', 'blog-details', 'rss', 'global-posts' ) ); |
382 | wp_cache_add_non_persistent_groups( array( 'comment', 'counts', 'plugins' ) ); |
383 | } |
384 | } |
385 | |
386 | /** |
387 | * Redirects to the installer if WordPress is not installed. |
388 | * |
389 | * Dies with an error message when multisite is enabled. |
390 | * |
391 | * @access private |
392 | * @since 3.0.0 |
393 | */ |
394 | function wp_not_installed() { |
395 | if ( is_multisite() ) { |
396 | if ( ! is_blog_installed() && ! defined( 'WP_INSTALLING' ) ) |
397 | wp_die( __( 'The site you have requested is not installed properly. Please contact the system administrator.' ) ); |
398 | } elseif ( ! is_blog_installed() && false === strpos( $_SERVER['PHP_SELF'], 'install.php' ) && !defined( 'WP_INSTALLING' ) ) { |
399 | if ( defined( 'WP_SITEURL' ) ) |
400 | $link = WP_SITEURL . '/wp-admin/install.php'; |
401 | elseif ( false !== strpos( $_SERVER['PHP_SELF'], 'wp-admin' ) ) |
402 | $link = preg_replace( '|/wp-admin/?.*?$|', '/', $_SERVER['PHP_SELF'] ) . 'wp-admin/install.php'; |
403 | else |
404 | $link = preg_replace( '|/[^/]+?$|', '/', $_SERVER['PHP_SELF'] ) . 'wp-admin/install.php'; |
405 | require( ABSPATH . WPINC . '/kses.php' ); |
406 | require( ABSPATH . WPINC . '/pluggable.php' ); |
407 | require( ABSPATH . WPINC . '/formatting.php' ); |
408 | wp_redirect( $link ); |
409 | die(); |
410 | } |
411 | } |
412 | |
413 | /** |
414 | * Returns array of must-use plugin files to be included in global scope. |
415 | * |
416 | * The default directory is wp-content/mu-plugins. To change the default directory |
417 | * manually, define <code>WPMU_PLUGIN_DIR</code> and <code>WPMU_PLUGIN_URL</code> |
418 | * in wp-config.php. |
419 | * |
420 | * @access private |
421 | * @since 3.0.0 |
422 | * @return array Files to include |
423 | */ |
424 | function wp_get_mu_plugins() { |
425 | $mu_plugins = array(); |
426 | if ( !is_dir( WPMU_PLUGIN_DIR ) ) |
427 | return $mu_plugins; |
428 | if ( ! $dh = opendir( WPMU_PLUGIN_DIR ) ) |
429 | return $mu_plugins; |
430 | while ( ( $plugin = readdir( $dh ) ) !== false ) { |
431 | if ( substr( $plugin, -4 ) == '.php' ) |
432 | $mu_plugins[] = WPMU_PLUGIN_DIR . '/' . $plugin; |
433 | } |
434 | closedir( $dh ); |
435 | sort( $mu_plugins ); |
436 | |
437 | return $mu_plugins; |
438 | } |
439 | |
440 | /** |
441 | * Returns array of plugin files to be included in global scope. |
442 | * |
443 | * The default directory is wp-content/plugins. To change the default directory |
444 | * manually, define <code>WP_PLUGIN_DIR</code> and <code>WP_PLUGIN_URL</code> |
445 | * in wp-config.php. |
446 | * |
447 | * @access private |
448 | * @since 3.0.0 |
449 | * @return array Files to include |
450 | */ |
451 | function wp_get_active_and_valid_plugins() { |
452 | $plugins = array(); |
453 | $active_plugins = (array) get_option( 'active_plugins', array() ); |
454 | |
455 | // Get active network plugins |
456 | if ( is_multisite() ) { |
457 | $active_sitewide_plugins = (array) get_site_option( 'active_sitewide_plugins', array() ); |
458 | if ( !empty($active_sitewide_plugins) ) { |
459 | $active_plugins = array_merge( $active_plugins, array_keys( $active_sitewide_plugins ) ); |
460 | sort( $active_plugins ); |
461 | } |
462 | } |
463 | |
464 | // Check for hacks file if the option is enabled |
465 | if ( get_option( 'hack_file' ) && file_exists( ABSPATH . 'my-hacks.php' ) ) { |
466 | _deprecated_file( 'my-hacks.php', '1.5' ); |
467 | array_unshift( $plugins, ABSPATH . 'my-hacks.php' ); |
468 | } |
469 | |
470 | if ( empty( $active_plugins ) || defined( 'WP_INSTALLING' ) ) |
471 | return $plugins; |
472 | |
473 | foreach ( $active_plugins as $plugin ) { |
474 | if ( ! validate_file( $plugin ) // $plugin must validate as file |
475 | && '.php' == substr( $plugin, -4 ) // $plugin must end with '.php' |
476 | && file_exists( WP_PLUGIN_DIR . '/' . $plugin ) // $plugin must exist |
477 | ) |
478 | $plugins[] = WP_PLUGIN_DIR . '/' . $plugin; |
479 | } |
480 | return $plugins; |
481 | } |
482 | |
483 | /** |
484 | * Sets internal encoding using mb_internal_encoding(). |
485 | * |
486 | * In most cases the default internal encoding is latin1, which is of no use, |
487 | * since we want to use the mb_ functions for utf-8 strings. |
488 | * |
489 | * @access private |
490 | * @since 3.0.0 |
491 | */ |
492 | function wp_set_internal_encoding() { |
493 | if ( function_exists( 'mb_internal_encoding' ) ) { |
494 | if ( !@mb_internal_encoding( get_option( 'blog_charset' ) ) ) |
495 | mb_internal_encoding( 'UTF-8' ); |
496 | } |
497 | } |
498 | |
499 | /** |
500 | * Add magic quotes to $_GET, $_POST, $_COOKIE, and $_SERVER. |
501 | * |
502 | * Also forces $_REQUEST to be $_GET + $_POST. If $_SERVER, $_COOKIE, |
503 | * or $_ENV are needed, use those superglobals directly. |
504 | * |
505 | * @access private |
506 | * @since 3.0.0 |
507 | */ |
508 | function wp_magic_quotes() { |
509 | // If already slashed, strip. |
510 | if ( get_magic_quotes_gpc() ) { |
511 | $_GET = stripslashes_deep( $_GET ); |
512 | $_POST = stripslashes_deep( $_POST ); |
513 | $_COOKIE = stripslashes_deep( $_COOKIE ); |
514 | } |
515 | |
516 | // Escape with wpdb. |
517 | $_GET = add_magic_quotes( $_GET ); |
518 | $_POST = add_magic_quotes( $_POST ); |
519 | $_COOKIE = add_magic_quotes( $_COOKIE ); |
520 | $_SERVER = add_magic_quotes( $_SERVER ); |
521 | |
522 | // Force REQUEST to be GET + POST. |
523 | $_REQUEST = array_merge( $_GET, $_POST ); |
524 | } |
525 | |
526 | /** |
527 | * Runs just before PHP shuts down execution. |
528 | * |
529 | * @access private |
530 | * @since 1.2.0 |
531 | */ |
532 | function shutdown_action_hook() { |
533 | do_action( 'shutdown' ); |
534 | wp_cache_close(); |
535 | } |
536 | |
537 | /** |
538 | * Copy an object. |
539 | * |
540 | * Returns a cloned copy of an object. |
541 | * |
542 | * @since 2.7.0 |
543 | * |
544 | * @param object $object The object to clone |
545 | * @return object The cloned object |
546 | */ |
547 | function wp_clone( $object ) { |
548 | static $can_clone; |
549 | if ( !isset( $can_clone ) ) |
550 | $can_clone = version_compare( phpversion(), '5.0', '>=' ); |
551 | |
552 | return $can_clone ? clone( $object ) : $object; |
553 | } |
554 | |
555 | /** |
556 | * Whether the current request is in WordPress admin Panel |
557 | * |
558 | * Does not inform on whether the user is an admin! Use capability checks to |
559 | * tell if the user should be accessing a section or not. |
560 | * |
561 | * @since 1.5.1 |
562 | * |
563 | * @return bool True if inside WordPress administration pages. |
564 | */ |
565 | function is_admin() { |
566 | if ( defined( 'WP_ADMIN' ) ) |
567 | return WP_ADMIN; |
568 | return false; |
569 | } |
570 | |
571 | /** |
572 | * Whether Multisite support is enabled |
573 | * |
574 | * @since 3.0.0 |
575 | * |
576 | * @return bool True if multisite is enabled, false otherwise. |
577 | */ |
578 | function is_multisite() { |
579 | if ( defined( 'MULTISITE' ) ) |
580 | return MULTISITE; |
581 | |
582 | if ( defined( 'VHOST' ) || defined( 'SUNRISE' ) ) |
583 | return true; |
584 | |
585 | return false; |
586 | } |
587 | |
588 | ?> |
589 | |