wordpressでサイトurlを変更した結果生じるパスを正規化

2013年09月09日

wordpressを使ってて思うのが、サイトurlを変更したり、
cssやjs・画像ファイルをwordpressのインストールディレクトリとは
別にした時、ソース上のパスが相対パスの嵐になってしまうので、
それを正規化するフィルターを一本ゴリ押しで書いてみた。

<?php
	// 適当にパスを突っ込む
	$real = 'http://hoge.jp/install_dir/wp-admin/wp-content/../../../css/test/../test.css?aaa=bbb&amp;amp;ccc=ddd#flag';
	var_dump(opt_path($real));

	// パスを正規化(http(s)://から始まる絶対パスのみ)
	function opt_path($base=''){
		// urlパース
		$parse = parse_url($base);
		// schemeに合わなければ何もしない
		if (!preg_match('/^https?\:\/\//',$base) ){
			return $base;
		}
		// パスを/で区切る
		$tmp = split('\/',$parse['path']);
		// 配列を定義
		$dirs = array();

		foreach($tmp as $pt){
			// 親ディレクトリの場合は前に積んだディレクトリをはずす
			if($pt == '..'){
				array_pop($dirs);
			}else if($pt == '.'){
				// カレントの場合は何もしない
				continue;
			}else{
				// それ以外はディレクトリ名として突っ込む
				//(隠しディレクトリもいけると思うけど無対応)
				array_push($dirs,$pt);
			}
		}

		// url組み立て開始
		$urls = $parse['scheme'] . '://' . $parse['host'] . implode('/',$dirs);

		// クエリがあれば付加
		if($parse['query']){
			$urls = $urls . '?' . $parse['query'];
		}
		// フラグメントがあれば付加
		if($parse['fragment']){
			$urls = $urls . '#' . $parse['fragment'];
		}

		return $urls;
	}
?>

コメント