태터툴즈 1.1.2 Animato로 판올림 및 엔트리 패치

2007/03/16 17:19

어제 태터툴즈 1.1.2 Animato 가 배포됐다. 공지를 보고 바로 판올림할까 하는 생각도 해봤지만 필자는 현재 패치한 것이 많고 1.1.1에서 어떤 것을 패치했는지 기억이 나지않아 나중에 확인한 뒤 설치하기 위해 일단 설치를 보류하고 있었다.

그러나 오늘 Me2DayBlog API 기능을 시험해볼 생각으로 티스토리 의 블로그 API가 포함되어 있는 태터툴즈 1.1.2를 설치했다. 보통은 파일을 백업하고 판올림을 하는데 오늘 평상시 보다 많은 글을 올리다 보니 눈에 뭐가 쒸웠는지 백업도 하지 않은채로 판올림을 해 버렸다.

이렇게 판올림을 하니 지난 번에 무엇을 어떻게 패치했는지 생각이 나지 않아 기억을 더듬어 패치하고 예전과 비슷한 형태로 동작하는 것을 보고 이 글을 작성하려고 했다. 글을 쓰려고 관리자로 로그인하니 접속자가 100만명이 넘었다는 것을 알았다. 그래서 부랴 부랴 블로그 방문자 수가 백만명을 돌파했습니다라는 글을 올렸다.

이번에 태터툴즈 를 판올림하면서 한 패치는 다음과 같다. 필자가 한 패치는 이 페이지 끝에 첨부 파일로 제공된다. 따라서 패치에 자신이 없는 사람은 이 파일을 내려받아 사용해도 된다.

블로그 Index.php 파일
보통 http://offree.net/처럼 블로그의 주소를 입력하면 관리도구/스킨/출력 설정에서 설정한 한 쪽당 글 수에 따라 블로그 페이지가 표시된다. 그러나 필자는 한 쪽당 글 수를 1로 설정하고 있고 블로그에 접속하면 바로 가장 최근 글로 가도록 패치해서 사용하고 있다. 예를들어 주소에서 http://offree.net/을 치고 들어오면 자동으로 최근 글인 http://offree.net/entry/블로그-방문자- ··· EB%8B%A4로 연결된다.

이렇게 하는 이유는 간단하다. 글에 있는 모든 링크를 절대 주소로 만들기 위해서이다. 이 패치를 하지않으면 블로그 아래쪽의 페이저(|1|2|3|...|697|)의 링크는 http://offree.net/?page=1 처럼 표시되지만 이 패치를 해주면 아래쪽 페이저에도 http://offree.net/entry/Me2Day에-가입했습니다처럼 절대 주소로 표시되기 때문이다.

페이지도 절대 주소로 표시

이렇게 패치하는 방법은 간단하다. 일단 FTP를 지원하는 편집기(예: EditPlus )로 /blog/index.php 파일을 열고 가장 마지막의 print $view를 주석으로 처리한 뒤 다음처럼 두줄을 추가하면된다.

패치
//print $view;
if(ereg('MSIE 6',$_SERVER['HTTP_USER_AGENT'])) $slogan=iconv('UTF-8', 'EUC-KR', $entries[0]['slogan']);
else $slogan=$entries[0]['slogan'];
header("Location:".$blogURL."/entry/".$slogan);
?>

목록 한쪽 당 글 수 패치
태터툴즈 패치: 목록 한 쪽당 글 수에서 설명한 것처럼 태터툴즈 1.1 이상에서는 한 쪽당 글 수와 무관하게 목록 한 쪽당 글 수 만큼 블로그의 글이 출력된다. 따라서 필자는 검색시 출력되는 목록을 한쪽 당 글 수 만큼 출력하도록 패치해서 사용하고 있다. 물론 1.1.2에서는 목록만 출력할 것인지 아니면 페이지를 출력할 것인지를 설정할 수 있지만 필자는 이전에 사용한 방법이 편하기 때문에 이 패치를 사용한다. 검색시 출력되는 페이지를 한 쪽당 글 수로 설정하려면 좋아하는 편집기로 /blog/search/index.php 파일을 연 뒤 다음처럼 패치하면된다.
변경전
list($entries,$paging)=getEntriesWithPagingBySearch($owner,
	$search,$suri['page'],$blog['entriesOnList'],$blog['entriesOnList']);
변경후
list($entries,$paging)=getEntriesWithPagingBySearch($owner,
	$search,$suri['page'],$blog['entriesOnList'],$blog['entriesOnPage']);

절대 주소
필자는 얼마 전부터 절대 주소를 표시하는 방법을 숫자가 아닌 문자로 하고 있다. SEO에서 주장하는 것처럼 검색 엔진에 더 잘 검색되는지 확인하기 위한 것이다. 그런데 문제는 페이지의 절대 주소는 다 문자로 표시되는데 페이지 내의 최근 글, 댓글, 걸린 글은 문자가 아니라 숫자로 표시된다. 따라서 필자는 이 부분 역시 패치해서 사용하고 있다.

페이지내의 모든 링크를 문자로 표시

필자처럼 최근글, 댓글, 걸린글까지 문자로 표시하고 싶다면 좋아하는 편집기로 /blog/entry/index.php 파일을 연 뒤 다음처럼 패치하면 된다. 빨간색으로 표시된 부분이 바뀐 부분이다.

  • 최근글
    변경전
    getRecentEntries 함수
    $result=DBQuery::query("SELECT e.id, e.title, e.comments
    		FROM {$database['prefix']}Entries e
    		LEFT JOIN {$database['prefix']}Categories c ON e.owner = c.owner 
    		AND e.category = c.id
    		WHERE e.owner = $owner AND e.draft = 0 $visibility AND e.category >= 0
    		ORDER BY published DESC LIMIT {$skinSetting['entriesOnRecent']}");
    
    getRecentEntriesView 함수
    dress('rctps_rep_link',"$blogURL/{$entry['id']}",$view);
    변경후
    getRecentEntries 함수
    $result=DBQuery::query("SELECT e.id, e.title, e.comments, e.slogan
    		FROM {$database['prefix']}Entries e
    		LEFT JOIN {$database['prefix']}Categories c ON e.owner = c.owner 
    		AND e.category = c.id
    		WHERE e.owner = $owner AND e.draft = 0 $visibility AND e.category >= 0
    		ORDER BY published DESC LIMIT {$skinSetting['entriesOnRecent']}");
    
    getRecentEntriesView 함수
    dress('rctps_rep_link',"$blogURL/entry/{$entry['slogan']}",$view);

  • 댓글
    변경전
    getRecentComments 함수
    	$sql=doesHaveOwnership()?"SELECT * FROM
    			{$database['prefix']}Comments
    		WHERE
    			owner = $owner".($isGuestbook!=false?" AND entry=0":" AND entry>0")."
    			AND isFiltered = 0
    		ORDER BY
    			written
    		DESC LIMIT ".($count!=false?$count:$skinSetting['commentsOnRecent']):
    		"SELECT r.* 
    		FROM
    			{$database['prefix']}Comments r
    			LEFT JOIN {$database['prefix']}Entries e ON r.owner = e.owner 
    			AND r.entry = e.id
    			LEFT JOIN {$database['prefix']}Categories c ON e.owner = c.owner
    			AND e.category = c.id
    		WHERE
    			r.owner = $owner AND e.draft = 0 AND e.visibility >= 2 AND
    			(c.visibility > 1 OR e.category = 0) ".($isGuestbook!=false?"
    			AND r.entry = 0":" AND r.entry > 0")." AND isFiltered = 0
    		ORDER BY
    			r.written
    		DESC LIMIT
    			".($count!=false?$count:$skinSetting['commentsOnRecent']);
    
    getRecentCommentsView 함수
    dress('rctrp_rep_link',"$blogURL/{$comment['entry']}#comment{$comment['id']}",$view);
    변경후
    getRecentComments 함수
    	$sql=doesHaveOwnership()?"SELECT r.*, e.slogan
    		FROM
    			{$database['prefix']}Comments r, {$database['prefix']}Entries e
    		WHERE
    			r.owner = $owner".($isGuestbook!=false?" AND r.entry=0":" 
    			AND r.entry>0")."AND r.isFiltered = 0 AND r.entry = e.id
    		ORDER BY
    			r.written
    		DESC LIMIT ".($count!=false?$count:$skinSetting['commentsOnRecent']):
    		"SELECT r.*, e.slogan
    		FROM
    			{$database['prefix']}Comments r
    			LEFT JOIN {$database['prefix']}Entries e ON r.owner = e.owner 
    			AND r.entry = e.id
    			LEFT JOIN {$database['prefix']}Categories c ON e.owner = c.owner
    			AND e.category = c.id
    		WHERE
    			r.owner = $owner AND e.draft = 0 AND e.visibility >= 2 AND
    			(c.visibility > 1 OR e.category = 0) ".($isGuestbook!=false?"
    			AND r.entry = 0":" AND r.entry > 0")." AND isFiltered = 0
    		ORDER BY
    			r.written
    		DESC LIMIT
    			".($count!=false?$count:$skinSetting['commentsOnRecent']);
    
    getRecentCommentsView 함수
    dress('rctrp_rep_link',"$blogURL/entry/{$comment['slogan']}#comment{$comment['id']}",$view);

  • 걸린글
    변경전
    getRecentTrackbacks 함수
    	$sql=doesHaveOwnership()?"SELECT *
    		FROM
    			{$database['prefix']}Trackbacks
    		WHERE
    			owner = $owner AND isFiltered = 0
    		ORDER BY
    			written
    		DESC LIMIT ".($count!=false?$count:$skinSetting['trackbacksOnRecent']):
    		"SELECT t.*
    		FROM
    			{$database['prefix']}Trackbacks t
    			LEFT JOIN {$database['prefix']}Entries e ON t.owner = e.owner 
    			AND t.entry = e.id
    			LEFT JOIN {$database['prefix']}Categories c ON e.owner = c.owner
    			AND e.category = c.id
    		WHERE
    			t.owner = $owner AND e.draft = 0 AND e.visibility >= 2 AND
    			(c.visibility > 1 OR e.category = 0) AND t.isFiltered = 0
    		ORDER BY
    			t.written
    		DESC LIMIT ".($count=false?$count:$skinSetting['trackbacksOnRecent']);
    
    getRecentTrackbacksView 함수
    dress('rcttb_rep_link',"$blogURL/{$trackback['entry']}#trackback{$trackback['id']}",$view);
    변경후
    getRecentTrackbacks 함수
    	$sql=doesHaveOwnership()?"SELECT t.*, e.slogan
    		FROM
    			{$database['prefix']}Trackbacks t, {$database['prefix']}Entries e
    		WHERE
    			t.owner = $owner AND t.isFiltered = 0 AND t.entry = e.id
    		ORDER BY
    			t.written
    		DESC LIMIT ".($count!=false?$count:$skinSetting['trackbacksOnRecent']):
    		"SELECT t.*, e.slogan
    		FROM
    			{$database['prefix']}Trackbacks t
    			LEFT JOIN {$database['prefix']}Entries e ON t.owner = e.owner 
    			AND t.entry = e.id
    			LEFT JOIN {$database['prefix']}Categories c ON e.owner = c.owner
    			AND e.category = c.id
    		WHERE
    			t.owner = $owner AND e.draft = 0 AND e.visibility >= 2 AND
    			(c.visibility > 1 OR e.category = 0) AND t.isFiltered = 0
    		ORDER BY
    			t.written
    		DESC LIMIT ".($count=false?$count:$skinSetting['trackbacksOnRecent']);
    
    getRecentTrackbacksView 함수
    dress('rcttb_rep_link',"$blogURL/entry/{$trackback['slogan']}#trackback{$trackback['id']}",$view);

    myEolin
    사실 필자가 myEolin 기능 중 유일하게 사용하는 기능을 필자의 블로그 아래쪽에 달려있는 이올린에 북마크할 수 있는 책갈피이올린에 추천할 수 있는 추천이다. 그런데 이 기능은 ViewPost 핸들러를 사용해서 글의 끝부분에 붙기 때문에 위치를 마음대로 바꿀 수 없다. 따라서 필자는 이 위치를 마음대로 바꿀 수 있도록 태그로 만들어 사용하고 있다. 필자처럼 myEolin 플러그인을 패치해서 사용하려면 좋아하는 편집기로 /plugins/myEolin/index.php 파일을 연 뒤 다음처럼 바꾸면 된다.
    변경전
    Bm_myEolin 함수
    	global $hostURL, $blogURL, $pluginURL,$owner,$permalink,$entry,$configVal;
    
    	if($entry['visibility'] >= "2" ){
    		$target .= '<div class="EolinBmVote">';
    		$img = $pluginURL."/images/bookmarkToEolin.gif";
    		$img2 = $pluginURL."/images/voteToEolin.gif";
    		$permalink = $hostURL. (isset($permalink)?$permalink:'');
    		
    		$ownership = false;
    		if(true==function_exists('doesHaveOwnership')){
    			$ownership = doesHaveOwnership();
    		}
    
    		if($ownership != false){
    			$url = "http://api.eolin.com/myEolin/getEntryInfo.js?permalink="
    			.rawurlencode($permalink)."&id=".$entry['id']."&log=0";
    		}else{
    			$url = "http://api.eolin.com/myEolin/getEntryInfo.js?permalink="
    			.rawurlencode($permalink)."&id=".$entry['id']."&log=1";
    		}		
    		
    		$target .=  '<span class="EolinBookmarkBtn"><a href="#void"  
    		title="이올린에 북마크하기"	onclick="bookMarkEolin('.$entry['id'].
    		', ''.$permalink.'', 'bookmark');return false;">
    		<img src="'.$img.'" border="0" alt="이올린에 북마크하기"
    		style="vertical-align:middle;" /></a></span>';
    		if($entry['visibility'] == "3" && $getMyvote == 1){
    			$target .=  '(<span id="bookmarkEolin'.$entry['id'].'" 
    			class="EolinBookmarkCount">0</span>)
    			<span class="EolinVoteBtn"><a href="#void"  
    			title="이올린에 추천하기"
    			onclick="bookMarkEolin('.$entry['id'].',''.$permalink.'', 'vote')
    			;return false;">
    			<img src="'.$img2.'" border="0" alt="이올린에 추천하기"
    			style="vertical-align:middle;" />
    			</a></span>(<span id="voteEolin'.$entry['id'].
    			'" class="EolinVoteCount">0</span>)';
    			$target .= "<script language=\"JavaScript\"
    			type=\"text/javascript\">//<![CDATA[	
    						apiEolinURL.push(\"".$url."\");
    						//]]></script>";
    
    			//$target .= "<script src='".$url."' 
    			type='text/javascript' ></script>";
    		}
    		$target .= "</div>";
    	}
    변경후
    Bm_myEolin 함수
    	global $hostURL, $blogURL, $pluginURL,$owner,$permalink,$entry,$configVal,$entryView;
    
    	if($entry['visibility'] >= "2" ){
    		$myeolin .= '<div class="EolinBmVote">';
    		$img = $pluginURL."/images/bookmarkToEolin.gif";
    		$img2 = $pluginURL."/images/voteToEolin.gif";
    		$permalink = $hostURL. (isset($permalink)?$permalink:'');
    		
    		$ownership = false;
    		if(true==function_exists('doesHaveOwnership')){
    			$ownership = doesHaveOwnership();
    		}
    
    		if($ownership != false){
    			$url = "http://api.eolin.com/myEolin/getEntryInfo.js?permalink="
    			.rawurlencode($permalink)."&id=".$entry['id']."&log=0";
    		}else{
    			$url = "http://api.eolin.com/myEolin/getEntryInfo.js?permalink="
    			.rawurlencode($permalink)."&id=".$entry['id']."&log=1";
    		}		
    		
    		
    		$myeolin .=  '<span class="EolinBookmarkBtn"><a href="#void"  
    		title="이올린에 책갈피"	onclick="bookMarkEolin('.$entry['id'].
    		', ''.$permalink.'', 'bookmark');return false;">
    		<img src="'.$img.'" border="0" alt="이올린에 책갈피하기"
    		style="vertical-align:middle;" />책갈피</a>
    		</span>';
    		if($entry['visibility'] == "3" && $getMyvote == 1){
    			$myeolin .=  '(<span id="bookmarkEolin'.$entry['id'].'" 
    			class="EolinBookmarkCount">0</span>)
    			<span class="EolinVoteBtn"><a href="#void"  
    			title="이올린에 추천하기"
    			onclick="bookMarkEolin('.$entry['id'].',''.$permalink.'', 'vote');
    			return false;">
    			<img src="'.$img2.'" border="0" alt="이올린에 추천하기"
    			style="vertical-align:middle;" />
    			추천</a></span>(<span id="voteEolin'.$entry['id'].
    			'" class="EolinVoteCount">0</span>)';
    			$myeolin .= "<script language=\"JavaScript\"
    			type=\"text/javascript\">//<![CDATA[	
    						apiEolinURL.push(\"".$url."\");
    						//]]></script>";
    
    			//$myeolin .= "<script src='".$url.
    			"' 
    			type='text/javascript' ></script>";
    		}
    		$myeolin .= "</div>";
    	}
    	misc::dress('myeolin_vote', $myeolin, $entryView);
    	return $target;

    변경된 소스를 보면 알 수 있지만 전역 변수에 $entryView를 추가하고 if($entry['visibility'] >= "2" ){ 이하의 $target를 모두 $myeolin으로 바꾸고 return 문 앞에 misc::dress('myeolin_vote', $myeolin, $entryView);만 추가하면 된다.

    일단 이렇게 소스를 바꾼 뒤 책갈피와 추천 링크를 표시할 곳에 [ ##_myeolin_vote_## ] 치환자를 삽입하면 된다. [ ##_myeolin_vote_## ]는 공백없이 입력해야 한다.

  • 프로그램에 대한 지식이 전혀 없어 죽어도 소스를 패치할 수 없는 사람은 다음 링크에서 내려받아 사용하기 바란다. 필자와 똑 같이 사용하고 싶다면 폴더째 올려 덮어쓰면 되고 부분적으로 패치하고 싶은 사람은 파일별로 올려서 사용하면 된다.

    내려받기

    압축 파일에 포함된 파일은 다음과 같다.

    파일 목록
    blog/index.php		블로그 주소를 치고 들어오면 자동으로 최근글로 분기
    blog/search/index.php	검색 결과에서 페이지를 한 쪽 당 글수로 표시
    blog/entry/index.php	절대 주소를 문자로 한 경우 페이지내의 모든 링크를 문자로 표시
    plugins/myEolin/index.php	이올린의 책갈피와 추천 링크를 치환자로 변경
    저작권 정책 제 블로그의 글은 기본적으로 펌금지, 링크 허용의 정책을 취하고 있습니다. 특히 네이버로의 펌은 어떠한 경우에도 허용하지 않습니다. 자세한 이유는 알림글네이버에 대한 글을 참조하시기 바랍니다.
    구독 & 책갈피
    글이 마음에 드시나요? HanRSS구글 리더로 편하게 구독하세요!!! 참고로 고료는 추천으로 받습니다!!!
    책갈피WZD | 구글 | 네이버 | 뉴스2.0 | 다음 | 델리셔스 | 마가린 | 북마커 | 야후 | 한RSS | 정보
    컴관련
    오늘의글
    인기글

    Trackback

    Trackback Address :: http://offree.net/trackback/754

    1. Subject : 도메인 클릭시 최근글로 이동, 블로그내 절대주소 패치

      Tracked from 편집디자인과 컴퓨터 그리고 이야기 2007/06/11 19:18 del.

      웹주소란에 도메인 입력하여 사이트 방문시 바로 최근글로 링크되도록 하였습니다.블로그 내의 링크도 모두 절대주소로 링크되도록 하였습니다.이는 모두 도아님의 패치파일을 적용하였습..

    Comments

    1. 낚시광준초리 2007/03/16 20:25

      도아님 글 잘보았습니다. 저야 티스토리 써서 테터는 언젠간 설치 할겁니다..
      SEO에 관련해서 저도 퍼머넌트링크를 글제목으로 씁니다. 예전에 SEO에 관련된 자료를 보고 아마 도아님 글인듯 한데.. 그걸 보고 1월 2월 시범 적용 하니 놀랄만큼 검색엔진에서 많이 들어왔습니다.(요즘 왠지 네이버에서 티스토리 검색이 잘안되는것 같ㄴ지만..) 그래서 UTF-8을 지원하지 않으면 링크가 거의 끈어져버리는 위험성을 가지고 잇지만 끝까지 해보고 있습니다. 플톡에서 뵈요 ㅎㅎㅎ

      perm. |  mod/del. |  reply.
      • 도아 2007/03/17 06:41

        네이버의 블로그 검색은 소스가 올블로그이므로 올블에 문제가 있는 것으로 봐야 할 것 같습니다.

        저 역시 꽤 오래전부터 테스트를 하고 있는데 사용자의 증가 때문인지 링크 때문인지는 아직 확인 중입니다.

    2. 유마 2007/03/16 21:07

      적용했습니다. 다 잘 됩니다.
      한가지는.. 도아님 블로그도 똑같은 걸 보니, 원래 그렇게 되나봅니다. 블로그 주소로 오면 최신글로 연결된다고 하셨는데, 엔트리나 다른 곳은 다 한글이 정상 출력이 되는데 블로그 주소로는 깨져서 나오네요.

      perm. |  mod/del. |  reply.
      • 도아 2007/03/17 06:42

        깨지는 것이 아니라 URL 인코딩 된 것입니다.

        $slogan=urlencode(iconv('UTF-8', 'EUC-KR', $entries[0]['slogan']));

        에서 urlencode 함수를 제거하면 정상적으로 표시되지만 IE7에서는 분기하지 못하는 문제가 있습니다.

      • 유마 2007/03/17 13:25

        아하, 알겠습니다.!

    3. 유마 2007/03/17 18:33

      도아님 혹시 센터에 보시면 오른쪽 부근에 넓은 흰줄이 보이시지 않으세요?
      센터에 이상하게 넓은 흰줄이 보여서 뭔가 확인해봤더니, myeolin 플러그인을 설정하니까 그렇게 되네요.
      마이이올린 플러그인은.. 도아님 플러그인 패치한 것 밖엔 없는데..

      perm. |  mod/del. |  reply.
      • 도아 2007/03/17 19:39

        패치는 투표 링크에만 적용되기 때문에 패치의 문제아닙니다. 패치되지 않은 플러그인을 사용해도 같은 증상이 발생하는 것을 알 수 있습니다.

      • 유마 2007/03/17 19:53

        아하, 업데이트하면서 바로 적용해버렸더니.. 그럼 이건 TNF로 가야 되겠군요. .. 감사~

    4. 맑게개인오후 2007/03/18 11:13

      도아님, 이 패치 너무 좋습니다. ^^)/
      그런데 카테고리 및 tag, location, notice, search으로 들어간후에 다시 최근글 댓글 걸린글을 보니 숫자로 바뀌던데 blog/catagory(tag,location,notice,search)/index.php도 패치해야하는 거죠?

      perm. |  mod/del. |  reply.
      • 도아 2007/03/18 11:55

        그 부분도 해야하지만 직접 패치하기에는 조금 무리가 있습니다. entry 파일은 제목으로 주소를 표시하기 위한 파일이지만 나머지는 주소가 문자든 숫자든 모든 경우에 사용되는 파일이기 때문입니다. 이 경우 주소 표시 형식을 읽은 뒤 SQL문 생성해야 하는데 이러면 너무 봅잡합니다.

        일단 제가 테스트 해보 다시 패치를 올리도록 하겠습니다.

    5. 유마 2007/03/19 20:15

      절대 주소가 보이는 건, 메인 화면에 인사문구가 보이지 않아 안쓸려고 했었습니다.
      그런데, 한번 써보고 나니까 이거 완전 중독이네요. 옆에 댓글을 보면서도 혹은, 트랙백을 마우스로 슬쩍 건드려도 어디 부분의 댓글이고, 트랙백이고 가 다 나오니까.. 이거 안쓸래야 안 쓸수 없게 만드는 '플레이톡' 같은 중독이 있네요.

      아, 메인 화면의 인사문구를 포기 해야 될까봐요.. ㅜ.ㅜ

      perm. |  mod/del. |  reply.
      • 도아 2007/03/20 10:07

        검색엔진에 더 훨씬 더 잘 검색되는 것으로 나와있습니다. 사실이 이 패치는 SEO때문에 하게된 패치입니다.

    6. 비밀방문자 2007/03/23 13:38

      관리자만 볼 수 있는 댓글입니다.

      perm. |  mod/del. |  reply.
      • 도아 2007/03/23 13:47

        blog/index.php 파일을 다시 패치하기 바랍니다. MSIE 6과 7이 처리하는 방법이 달라 수정해 두었습니다.

    쥐박이가 아니라면 소통하세요!!!

    댓글 입력 폼

    글을 올릴 때 [b], [i], [url], [img]와 같은 BBCode를 사용할 수 있습니다.