PageRenderTime 87ms CodeModel.GetById 41ms app.highlight 26ms RepoModel.GetById 14ms app.codeStats 0ms

/wp-admin/includes/misc.php

https://bitbucket.org/Wallynm/iptb
PHP | 595 lines | 367 code | 67 blank | 161 comment | 99 complexity | 1fda2e9c81602beb20ac4ac1b50f9dad MD5 | raw file
  1<?php
  2/**
  3 * Misc WordPress Administration API.
  4 *
  5 * @package WordPress
  6 * @subpackage Administration
  7 */
  8
  9/**
 10 * {@internal Missing Short Description}}
 11 *
 12 * @since 2.0.0
 13 *
 14 * @return unknown
 15 */
 16function got_mod_rewrite() {
 17	$got_rewrite = apache_mod_loaded('mod_rewrite', true);
 18	return apply_filters('got_rewrite', $got_rewrite);
 19}
 20
 21/**
 22 * {@internal Missing Short Description}}
 23 *
 24 * @since 1.5.0
 25 *
 26 * @param unknown_type $filename
 27 * @param unknown_type $marker
 28 * @return array An array of strings from a file (.htaccess ) from between BEGIN and END markers.
 29 */
 30function extract_from_markers( $filename, $marker ) {
 31	$result = array ();
 32
 33	if (!file_exists( $filename ) ) {
 34		return $result;
 35	}
 36
 37	if ( $markerdata = explode( "\n", implode( '', file( $filename ) ) ));
 38	{
 39		$state = false;
 40		foreach ( $markerdata as $markerline ) {
 41			if (strpos($markerline, '# END ' . $marker) !== false)
 42				$state = false;
 43			if ( $state )
 44				$result[] = $markerline;
 45			if (strpos($markerline, '# BEGIN ' . $marker) !== false)
 46				$state = true;
 47		}
 48	}
 49
 50	return $result;
 51}
 52
 53/**
 54 * {@internal Missing Short Description}}
 55 *
 56 * Inserts an array of strings into a file (.htaccess ), placing it between
 57 * BEGIN and END markers. Replaces existing marked info. Retains surrounding
 58 * data. Creates file if none exists.
 59 *
 60 * @since 1.5.0
 61 *
 62 * @param unknown_type $filename
 63 * @param unknown_type $marker
 64 * @param unknown_type $insertion
 65 * @return bool True on write success, false on failure.
 66 */
 67function insert_with_markers( $filename, $marker, $insertion ) {
 68	if (!file_exists( $filename ) || is_writeable( $filename ) ) {
 69		if (!file_exists( $filename ) ) {
 70			$markerdata = '';
 71		} else {
 72			$markerdata = explode( "\n", implode( '', file( $filename ) ) );
 73		}
 74
 75		if ( !$f = @fopen( $filename, 'w' ) )
 76			return false;
 77
 78		$foundit = false;
 79		if ( $markerdata ) {
 80			$state = true;
 81			foreach ( $markerdata as $n => $markerline ) {
 82				if (strpos($markerline, '# BEGIN ' . $marker) !== false)
 83					$state = false;
 84				if ( $state ) {
 85					if ( $n + 1 < count( $markerdata ) )
 86						fwrite( $f, "{$markerline}\n" );
 87					else
 88						fwrite( $f, "{$markerline}" );
 89				}
 90				if (strpos($markerline, '# END ' . $marker) !== false) {
 91					fwrite( $f, "# BEGIN {$marker}\n" );
 92					if ( is_array( $insertion ))
 93						foreach ( $insertion as $insertline )
 94							fwrite( $f, "{$insertline}\n" );
 95					fwrite( $f, "# END {$marker}\n" );
 96					$state = true;
 97					$foundit = true;
 98				}
 99			}
100		}
101		if (!$foundit) {
102			fwrite( $f, "\n# BEGIN {$marker}\n" );
103			foreach ( $insertion as $insertline )
104				fwrite( $f, "{$insertline}\n" );
105			fwrite( $f, "# END {$marker}\n" );
106		}
107		fclose( $f );
108		return true;
109	} else {
110		return false;
111	}
112}
113
114/**
115 * Updates the htaccess file with the current rules if it is writable.
116 *
117 * Always writes to the file if it exists and is writable to ensure that we
118 * blank out old rules.
119 *
120 * @since 1.5.0
121 */
122function save_mod_rewrite_rules() {
123	if ( is_multisite() )
124		return;
125
126	global $wp_rewrite;
127
128	$home_path = get_home_path();
129	$htaccess_file = $home_path.'.htaccess';
130
131	// If the file doesn't already exist check for write access to the directory and whether we have some rules.
132	// else check for write access to the file.
133	if ((!file_exists($htaccess_file) && is_writable($home_path) && $wp_rewrite->using_mod_rewrite_permalinks()) || is_writable($htaccess_file)) {
134		if ( got_mod_rewrite() ) {
135			$rules = explode( "\n", $wp_rewrite->mod_rewrite_rules() );
136			return insert_with_markers( $htaccess_file, 'WordPress', $rules );
137		}
138	}
139
140	return false;
141}
142
143/**
144 * Updates the IIS web.config file with the current rules if it is writable.
145 * If the permalinks do not require rewrite rules then the rules are deleted from the web.config file.
146 *
147 * @since 2.8.0
148 *
149 * @return bool True if web.config was updated successfully
150 */
151function iis7_save_url_rewrite_rules(){
152	if ( is_multisite() )
153		return;
154
155	global $wp_rewrite;
156
157	$home_path = get_home_path();
158	$web_config_file = $home_path . 'web.config';
159
160	// Using win_is_writable() instead of is_writable() because of a bug in Windows PHP
161	if ( iis7_supports_permalinks() && ( ( ! file_exists($web_config_file) && win_is_writable($home_path) && $wp_rewrite->using_mod_rewrite_permalinks() ) || win_is_writable($web_config_file) ) ) {
162		$rule = $wp_rewrite->iis7_url_rewrite_rules(false, '', '');
163		if ( ! empty($rule) ) {
164			return iis7_add_rewrite_rule($web_config_file, $rule);
165		} else {
166			return iis7_delete_rewrite_rule($web_config_file);
167		}
168	}
169	return false;
170}
171
172/**
173 * {@internal Missing Short Description}}
174 *
175 * @since 1.5.0
176 *
177 * @param unknown_type $file
178 */
179function update_recently_edited( $file ) {
180	$oldfiles = (array ) get_option( 'recently_edited' );
181	if ( $oldfiles ) {
182		$oldfiles = array_reverse( $oldfiles );
183		$oldfiles[] = $file;
184		$oldfiles = array_reverse( $oldfiles );
185		$oldfiles = array_unique( $oldfiles );
186		if ( 5 < count( $oldfiles ))
187			array_pop( $oldfiles );
188	} else {
189		$oldfiles[] = $file;
190	}
191	update_option( 'recently_edited', $oldfiles );
192}
193
194/**
195 * If siteurl or home changed, flush rewrite rules.
196 *
197 * @since 2.1.0
198 *
199 * @param unknown_type $old_value
200 * @param unknown_type $value
201 */
202function update_home_siteurl( $old_value, $value ) {
203	global $wp_rewrite;
204
205	if ( defined( "WP_INSTALLING" ) )
206		return;
207
208	// If home changed, write rewrite rules to new location.
209	$wp_rewrite->flush_rules();
210}
211
212add_action( 'update_option_home', 'update_home_siteurl', 10, 2 );
213add_action( 'update_option_siteurl', 'update_home_siteurl', 10, 2 );
214
215/**
216 * Shorten an URL, to be used as link text
217 *
218 * @since 1.2.1
219 *
220 * @param string $url
221 * @return string
222 */
223function url_shorten( $url ) {
224	$short_url = str_replace( 'http://', '', stripslashes( $url ));
225	$short_url = str_replace( 'www.', '', $short_url );
226	$short_url = untrailingslashit( $short_url );
227	if ( strlen( $short_url ) > 35 )
228		$short_url = substr( $short_url, 0, 32 ) . '...';
229	return $short_url;
230}
231
232/**
233 * Resets global variables based on $_GET and $_POST
234 *
235 * This function resets global variables based on the names passed
236 * in the $vars array to the value of $_POST[$var] or $_GET[$var] or ''
237 * if neither is defined.
238 *
239 * @since 2.0.0
240 *
241 * @param array $vars An array of globals to reset.
242 */
243function wp_reset_vars( $vars ) {
244	for ( $i=0; $i<count( $vars ); $i += 1 ) {
245		$var = $vars[$i];
246		global $$var;
247
248		if ( empty( $_POST[$var] ) ) {
249			if ( empty( $_GET[$var] ) )
250				$$var = '';
251			else
252				$$var = $_GET[$var];
253		} else {
254			$$var = $_POST[$var];
255		}
256	}
257}
258
259/**
260 * {@internal Missing Short Description}}
261 *
262 * @since 2.1.0
263 *
264 * @param unknown_type $message
265 */
266function show_message($message) {
267	if ( is_wp_error($message) ){
268		if ( $message->get_error_data() )
269			$message = $message->get_error_message() . ': ' . $message->get_error_data();
270		else
271			$message = $message->get_error_message();
272	}
273	echo "<p>$message</p>\n";
274	wp_ob_end_flush_all();
275	flush();
276}
277
278function wp_doc_link_parse( $content ) {
279	if ( !is_string( $content ) || empty( $content ) )
280		return array();
281
282	if ( !function_exists('token_get_all') )
283		return array();
284
285	$tokens = token_get_all( $content );
286	$functions = array();
287	$ignore_functions = array();
288	for ( $t = 0, $count = count( $tokens ); $t < $count; $t++ ) {
289		if ( !is_array( $tokens[$t] ) ) continue;
290		if ( T_STRING == $tokens[$t][0] && ( '(' == $tokens[ $t + 1 ] || '(' == $tokens[ $t + 2 ] ) ) {
291			// If it's a function or class defined locally, there's not going to be any docs available
292			if ( ( isset( $tokens[ $t - 2 ][1] ) && in_array( $tokens[ $t - 2 ][1], array( 'function', 'class' ) ) ) || ( isset( $tokens[ $t - 2 ][0] ) && T_OBJECT_OPERATOR == $tokens[ $t - 1 ][0] ) ) {
293				$ignore_functions[] = $tokens[$t][1];
294			}
295			// Add this to our stack of unique references
296			$functions[] = $tokens[$t][1];
297		}
298	}
299
300	$functions = array_unique( $functions );
301	sort( $functions );
302	$ignore_functions = apply_filters( 'documentation_ignore_functions', $ignore_functions );
303	$ignore_functions = array_unique( $ignore_functions );
304
305	$out = array();
306	foreach ( $functions as $function ) {
307		if ( in_array( $function, $ignore_functions ) )
308			continue;
309		$out[] = $function;
310	}
311
312	return $out;
313}
314
315/**
316 * Saves option for number of rows when listing posts, pages, comments, etc.
317 *
318 * @since 2.8
319**/
320function set_screen_options() {
321
322	if ( isset($_POST['wp_screen_options']) && is_array($_POST['wp_screen_options']) ) {
323		check_admin_referer( 'screen-options-nonce', 'screenoptionnonce' );
324
325		if ( !$user = wp_get_current_user() )
326			return;
327		$option = $_POST['wp_screen_options']['option'];
328		$value = $_POST['wp_screen_options']['value'];
329
330		if ( !preg_match( '/^[a-z_-]+$/', $option ) )
331			return;
332
333		$option = str_replace('-', '_', $option);
334
335		$map_option = $option;
336		$type = str_replace('edit_', '', $map_option);
337		$type = str_replace('_per_page', '', $type);
338		if ( in_array($type, get_post_types()) )
339			$map_option = 'edit_per_page';
340		if ( in_array( $type, get_taxonomies()) )
341			$map_option = 'edit_tags_per_page';
342
343
344		switch ( $map_option ) {
345			case 'edit_per_page':
346			case 'users_per_page':
347			case 'edit_comments_per_page':
348			case 'upload_per_page':
349			case 'edit_tags_per_page':
350			case 'plugins_per_page':
351			// Network admin
352			case 'sites_network_per_page':
353			case 'users_network_per_page':
354			case 'site_users_network_per_page':
355			case 'plugins_network_per_page':
356			case 'themes_network_per_page':
357			case 'site_themes_network_per_page':
358				$value = (int) $value;
359				if ( $value < 1 || $value > 999 )
360					return;
361				break;
362			default:
363				$value = apply_filters('set-screen-option', false, $option, $value);
364				if ( false === $value )
365					return;
366				break;
367		}
368
369		update_user_meta($user->ID, $option, $value);
370		wp_safe_redirect( remove_query_arg( array('pagenum', 'apage', 'paged'), wp_get_referer() ) );
371		exit;
372	}
373}
374
375/**
376 * Check if rewrite rule for WordPress already exists in the IIS 7 configuration file
377 *
378 * @since 2.8.0
379 *
380 * @return bool
381 * @param string $filename The file path to the configuration file
382 */
383function iis7_rewrite_rule_exists($filename) {
384	if ( ! file_exists($filename) )
385		return false;
386	if ( ! class_exists('DOMDocument') )
387		return false;
388
389	$doc = new DOMDocument();
390	if ( $doc->load($filename) === false )
391		return false;
392	$xpath = new DOMXPath($doc);
393	$rules = $xpath->query('/configuration/system.webServer/rewrite/rules/rule[starts-with(@name,\'wordpress\')]');
394	if ( $rules->length == 0 )
395		return false;
396	else
397		return true;
398}
399
400/**
401 * Delete WordPress rewrite rule from web.config file if it exists there
402 *
403 * @since 2.8.0
404 *
405 * @param string $filename Name of the configuration file
406 * @return bool
407 */
408function iis7_delete_rewrite_rule($filename) {
409	// If configuration file does not exist then rules also do not exist so there is nothing to delete
410	if ( ! file_exists($filename) )
411		return true;
412
413	if ( ! class_exists('DOMDocument') )
414		return false;
415
416	$doc = new DOMDocument();
417	$doc->preserveWhiteSpace = false;
418
419	if ( $doc -> load($filename) === false )
420		return false;
421	$xpath = new DOMXPath($doc);
422	$rules = $xpath->query('/configuration/system.webServer/rewrite/rules/rule[starts-with(@name,\'wordpress\')]');
423	if ( $rules->length > 0 ) {
424		$child = $rules->item(0);
425		$parent = $child->parentNode;
426		$parent->removeChild($child);
427		$doc->formatOutput = true;
428		saveDomDocument($doc, $filename);
429	}
430	return true;
431}
432
433/**
434 * Add WordPress rewrite rule to the IIS 7 configuration file.
435 *
436 * @since 2.8.0
437 *
438 * @param string $filename The file path to the configuration file
439 * @param string $rewrite_rule The XML fragment with URL Rewrite rule
440 * @return bool
441 */
442function iis7_add_rewrite_rule($filename, $rewrite_rule) {
443	if ( ! class_exists('DOMDocument') )
444		return false;
445
446	// If configuration file does not exist then we create one.
447	if ( ! file_exists($filename) ) {
448		$fp = fopen( $filename, 'w');
449		fwrite($fp, '<configuration/>');
450		fclose($fp);
451	}
452
453	$doc = new DOMDocument();
454	$doc->preserveWhiteSpace = false;
455
456	if ( $doc->load($filename) === false )
457		return false;
458
459	$xpath = new DOMXPath($doc);
460
461	// First check if the rule already exists as in that case there is no need to re-add it
462	$wordpress_rules = $xpath->query('/configuration/system.webServer/rewrite/rules/rule[starts-with(@name,\'wordpress\')]');
463	if ( $wordpress_rules->length > 0 )
464		return true;
465
466	// Check the XPath to the rewrite rule and create XML nodes if they do not exist
467	$xmlnodes = $xpath->query('/configuration/system.webServer/rewrite/rules');
468	if ( $xmlnodes->length > 0 ) {
469		$rules_node = $xmlnodes->item(0);
470	} else {
471		$rules_node = $doc->createElement('rules');
472
473		$xmlnodes = $xpath->query('/configuration/system.webServer/rewrite');
474		if ( $xmlnodes->length > 0 ) {
475			$rewrite_node = $xmlnodes->item(0);
476			$rewrite_node->appendChild($rules_node);
477		} else {
478			$rewrite_node = $doc->createElement('rewrite');
479			$rewrite_node->appendChild($rules_node);
480
481			$xmlnodes = $xpath->query('/configuration/system.webServer');
482			if ( $xmlnodes->length > 0 ) {
483				$system_webServer_node = $xmlnodes->item(0);
484				$system_webServer_node->appendChild($rewrite_node);
485			} else {
486				$system_webServer_node = $doc->createElement('system.webServer');
487				$system_webServer_node->appendChild($rewrite_node);
488
489				$xmlnodes = $xpath->query('/configuration');
490				if ( $xmlnodes->length > 0 ) {
491					$config_node = $xmlnodes->item(0);
492					$config_node->appendChild($system_webServer_node);
493				} else {
494					$config_node = $doc->createElement('configuration');
495					$doc->appendChild($config_node);
496					$config_node->appendChild($system_webServer_node);
497				}
498			}
499		}
500	}
501
502	$rule_fragment = $doc->createDocumentFragment();
503	$rule_fragment->appendXML($rewrite_rule);
504	$rules_node->appendChild($rule_fragment);
505
506	$doc->encoding = "UTF-8";
507	$doc->formatOutput = true;
508	saveDomDocument($doc, $filename);
509
510	return true;
511}
512
513/**
514 * Saves the XML document into a file
515 *
516 * @since 2.8.0
517 *
518 * @param DOMDocument $doc
519 * @param string $filename
520 */
521function saveDomDocument($doc, $filename) {
522	$config = $doc->saveXML();
523	$config = preg_replace("/([^\r])\n/", "$1\r\n", $config);
524	$fp = fopen($filename, 'w');
525	fwrite($fp, $config);
526	fclose($fp);
527}
528
529/**
530 * Workaround for Windows bug in is_writable() function
531 *
532 * @since 2.8.0
533 *
534 * @param string $path
535 * @return bool
536 */
537function win_is_writable( $path ) {
538	/* will work in despite of Windows ACLs bug
539	 * NOTE: use a trailing slash for folders!!!
540	 * see http://bugs.php.net/bug.php?id=27609
541	 * see http://bugs.php.net/bug.php?id=30931
542	 */
543
544	if ( $path[strlen( $path ) - 1] == '/' ) // recursively return a temporary file path
545		return win_is_writable( $path . uniqid( mt_rand() ) . '.tmp');
546	else if ( is_dir( $path ) )
547		return win_is_writable( $path . '/' . uniqid( mt_rand() ) . '.tmp' );
548	// check tmp file for read/write capabilities
549	$should_delete_tmp_file = !file_exists( $path );
550	$f = @fopen( $path, 'a' );
551	if ( $f === false )
552		return false;
553	fclose( $f );
554	if ( $should_delete_tmp_file )
555		unlink( $path );
556	return true;
557}
558
559/**
560 * Display the default admin color scheme picker (Used in user-edit.php)
561 *
562 * @since 3.0.0
563 */
564function admin_color_scheme_picker() {
565	global $_wp_admin_css_colors, $user_id; ?>
566<fieldset><legend class="screen-reader-text"><span><?php _e('Admin Color Scheme')?></span></legend>
567<?php
568$current_color = get_user_option('admin_color', $user_id);
569if ( empty($current_color) )
570	$current_color = 'fresh';
571foreach ( $_wp_admin_css_colors as $color => $color_info ): ?>
572<div class="color-option"><input name="admin_color" id="admin_color_<?php echo $color; ?>" type="radio" value="<?php echo esc_attr($color) ?>" class="tog" <?php checked($color, $current_color); ?> />
573	<table class="color-palette">
574	<tr>
575	<?php foreach ( $color_info->colors as $html_color ): ?>
576	<td style="background-color: <?php echo $html_color ?>" title="<?php echo $color ?>">&nbsp;</td>
577	<?php endforeach; ?>
578	</tr>
579	</table>
580
581	<label for="admin_color_<?php echo $color; ?>"><?php echo $color_info->name ?></label>
582</div>
583	<?php endforeach; ?>
584</fieldset>
585<?php
586}
587
588function _ipad_meta() {
589	if ( strpos($_SERVER['HTTP_USER_AGENT'], 'iPad') !== false ) { ?>
590		<meta name="viewport" id="ipad-viewportmeta" content="width=device-width, initial-scale=1">
591	<?php
592	}
593}
594add_action('admin_head', '_ipad_meta');
595